转载请表明作者:http://blog.csdn.net/lansefeiyang08/article/details/46468743

知道Android L对蓝牙对了一些改进。包含加入A2dp sink、HFP client、BLE Peripheral功能等等。

我花了一天多时间对Android L BLE Peripheral SDK进行了研究,网上的资料非常少,有一个介绍的还不够清晰,所以就自己写了一个測试应用。希望能够对理解BLE Peripheral有一定的帮助。

此贴主要以解说代码为主,我会把项目代码也传到CSDN中,帮助大家測试。

首先说明一点。并非Android L的系统就能够支持BLE Peripheral,这个和硬件也是有关系的(曾经有人告诉我支持BLE Peripheral是纯软件的东西,要不就是扯淡,要不就是我測得有问题)。

我用我手上的Pad(支持BLE central,android5.0)发现直接不支持,Android5.0 SDK已经開始支持check手机是否支持BLE Peripheral。后面代码会提到。

好了,以下我就直接上代码了。为了代码简单整洁。我用一个Activity来完毕最主要的功能,假设还有其它需求,仅仅要略微改一下就能够了。

我在写这个代码的时候。第一个困惑是BLE Peripheral操作流程是什么?代码流程怎么写?我相信大家和我应该是一样的困惑。

所以我不所有贴代码(我上传后,代码直接下载好了)。我依照流程给大家说一下我写的思路。

首先,我去查SDK的接口,我发如今android L SDK中多了一个package:android.bluetooth.le;里面多了Peripheral和Scanner。Scanner我会后面更新。

第二步開始写代码。代码里首先检查是否支持BLE、BLE Peripheral。代码例如以下:

private void init(){

if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)){

Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_LONG).show();

finish();

}

final BluetoothManager mBluetoothManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);

mBluetoothAdapter = mBluetoothManager.getAdapter();

if(mBluetoothAdapter == null){

Toast.makeText(this, R.string.bluetooth_not_supported, Toast.LENGTH_LONG).show();

finish();

}

mBluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();

if(mBluetoothLeAdvertiser == null){

Toast.makeText(this, "the device not support peripheral", Toast.LENGTH_SHORT).show();

Log.e(TAG, "the device not support peripheral");

finish();

}

}前几段代码我就不说了。搞过BLE的基本都是通用的,可是你会发如今代码里多了一句mBluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();

这一句代码会直接推断你的设备究竟支持不支持BLE Peripheral。假如此返回值非空。你才干够继续有机会开发,假设返回空,那说明你的设备搞不了BLE Peripheral(当然。我的代码里没有推断是否打开了蓝牙,这个为了节省时间,你们自己能够加入上)。

支持不支持BLE Peripheral,你也能够用BluetoothAdapter类的isMultipleAdvertisementSupported()函数去check,实际上getBluetoothLeAdvetiser()也会运行上面的isMultipleAdvertisementSupported函数,所以我就直接一步到位了,可是原理大家要懂。

第三。你的设备已经支持BLE Peripheral了,那么下一步就是要考虑我怎么发广播了。可是你在发广播之前,要先准备自己的数据,比方你自己是什么service。里面有什么data等等。

我们先来看看发广播的函数长得什么样子:

mBluetoothLeAdvertiser.startAdvertising(createAdvSettings(true, 0), createAdvertiseData(), mAdvertiseCallback);从广播函数应该能够看到所须要的參数,一个是广播设置參数,一个是广播数据。另一个是Callback。当然startAdvertising有两种格式,第二种能够获得广播数据的response。

以下我们来看一下AdvertiseSettings:

/** create AdvertiseSettings */

public static AdvertiseSettings createAdvSettings(boolean connectable, int timeoutMillis) {

AdvertiseSettings.Builder mSettingsbuilder = new AdvertiseSettings.Builder();

mSettingsbuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED);

mSettingsbuilder.setConnectable(connectable);

mSettingsbuilder.setTimeout(timeoutMillis);

mSettingsbuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH);

AdvertiseSettings mAdvertiseSettings = mSettingsbuilder.build();

if(mAdvertiseSettings == null){

if(D){

Toast.makeText(mContext, "mAdvertiseSettings == null", Toast.LENGTH_LONG).show();

Log.e(TAG,"mAdvertiseSettings == null");

}

}

return mAdvertiseSettings;

}这里面一共同拥有四个參数。AdvertiseMode、Connectable、Timeout、TxPowerLevel。当然我们能够设置我们须要的,其它的參数会使用默认的值。

再就是格式非常重要。我们一定要是AdvertiseSettings.builder。不然你仅仅能设置一个參数。

再就是AdvertiseData:

public static AdvertiseData createAdvertiseData(){

AdvertiseData.Builder mDataBuilder = new AdvertiseData.Builder();

mDataBuilder.addServiceUuid(ParcelUuid.fromString(HEART_RATE_SERVICE));

AdvertiseData mAdvertiseData = mDataBuilder.build();

if(mAdvertiseData==null){

if(D){

Toast.makeText(mContext, "mAdvertiseSettings == null", Toast.LENGTH_LONG).show();

Log.e(TAG,"mAdvertiseSettings == null");

}

}

return mAdvertiseData;

}这里面就须要设置非常多參数了,我这里为了简单。仅仅广播心跳的UUID,可是没有数据。假设你们有自己的数据等等,能够再这里面去设置。自己定义函数也在AdvertiseData类里。

最后一步就是准备Callback函数:

private AdvertiseCallback mAdvertiseCallback = new AdvertiseCallback() {

@Override

public void onStartSuccess(AdvertiseSettings settingsInEffect) {

super.onStartSuccess(settingsInEffect);

if (settingsInEffect != null) {

Log.d(TAG, "onStartSuccess TxPowerLv=" + settingsInEffect.getTxPowerLevel() + " mode=" + settingsInEffect.getMode()

+ " timeout=" + settingsInEffect.getTimeout());

} else {

Log.e(TAG, "onStartSuccess, settingInEffect is null");

}

Log.e(TAG,"onStartSuccess settingsInEffect" + settingsInEffect);

}

@Override

public void onStartFailure(int errorCode) {

super.onStartFailure(errorCode);

if(D) Log.e(TAG,"onStartFailure errorCode" + errorCode);

if(errorCode == ADVERTISE_FAILED_DATA_TOO_LARGE){

if(D){

Toast.makeText(mContext, R.string.advertise_failed_data_too_large, Toast.LENGTH_LONG).show();

Log.e(TAG,"Failed to start advertising as the advertise data to be broadcasted is larger than 31 bytes.");

}

}else if(errorCode == ADVERTISE_FAILED_TOO_MANY_ADVERTISERS){

if(D){

Toast.makeText(mContext, R.string.advertise_failed_too_many_advertises, Toast.LENGTH_LONG).show();

Log.e(TAG,"Failed to start advertising because no advertising instance is available.");

}

}else if(errorCode == ADVERTISE_FAILED_ALREADY_STARTED){

if(D){

Toast.makeText(mContext, R.string.advertise_failed_already_started, Toast.LENGTH_LONG).show();

Log.e(TAG,"Failed to start advertising as the advertising is already started");

}

}else if(errorCode == ADVERTISE_FAILED_INTERNAL_ERROR){

if(D){

Toast.makeText(mContext, R.string.advertise_failed_internal_error, Toast.LENGTH_LONG).show();

Log.e(TAG,"Operation failed due to an internal error");

}

}else if(errorCode == ADVERTISE_FAILED_FEATURE_UNSUPPORTED){

if(D){

Toast.makeText(mContext, R.string.advertise_failed_feature_unsupported, Toast.LENGTH_LONG).show();

Log.e(TAG,"This feature is not supported on this platform");

}

}

}

};当你广播成功,会受到onStartSuccess的回调。回调的參数也是AdvertiseSettings设置的參数。假设你还有你自己想做的,能够再这里面去做。

为了大家方便,我把errorcode可能遇到的问题,都做了推断,仅仅有这五种错误情况。

最后一步就是关闭了,开了广播要关闭,不然会造成未知问题:

private void stopAdvertise() {

if (mBluetoothLeAdvertiser != null) {

mBluetoothLeAdvertiser.stopAdvertising(mAdvertiseCallback);

mBluetoothLeAdvertiser = null;

}

}ok,代码就是这么简单。仅仅要熟悉流程就能够搞定。希望对大家有帮助。

代码路径为:http://download.csdn.net/detail/lansefeiyang08/8799027

android ble peripheral,android5.0(Lollipop) BLE Peripheral牛刀小试相关推荐

  1. android+5.0+ble,android5.0(Lollipop) BLE Peripheral牛刀小试(示例代码)

    转载请表明作者:http://blog.csdn.net/lansefeiyang08/article/details/46468743 知道Android L对蓝牙对了一些改进.包含加入A2dp s ...

  2. android5.0(Lollipop) BLE Peripheral牛刀小试

    转载请表明作者:http://blog.csdn.net/lansefeiyang08/article/details/46468743 知道Android L对蓝牙对了一些改进,包括添加A2dp s ...

  3. android5.0(Lollipop) BLE Peripheral深入理解系统篇之提高篇

    上一篇文章讲到了广播之前系统需要进行的准备工作,那接下来我们就来真正的启动广播.首先还是先看一下上一篇文章结束的地方:@Override public void onClientRegistered( ...

  4. Android5.0 Lollipop(棒棒糖)

    Android Lollipop 重点开发特色 材料设计 业绩焦点 通知 你在大屏幕上的应用程序 以文档为中心的应用程序 先进的连接 高性能显卡 更强大的音频 增强的照相和摄像机 屏幕捕捉和分享 新类 ...

  5. 【Android多媒体】Android5.0 NuPlayer多媒体框架【1】

    原址 Android流媒体框架在Gingerbread Android2.3版本的时候加入的,其中实现的核心就是NuPlayer.在之前的版本中一般认为Local Playback就用Stagefri ...

  6. android架构 vold,Android5.0 vold-整体架构

    概述 该篇文章主要讲解vold的整体框架和工作流程,不会涉及到具体的实现. 具体的实现(从framework到Native再到协议族)会在如下的后续文章里提及. Android5.0 vold-启动过 ...

  7. android BLE Peripheral 手机模拟设备发出BLE广播 BluetoothLeAdvertiser

    android 从4.3系统开始可以连接BLE设备,这个大家都知道了.iOS是从7.0版本开始支持BLE.android 进入5.0时代时,开放了一个新功能,手机可以模拟设备发出BLE广播, 这个新功 ...

  8. android BLE Peripheral 模拟 ibeacon 发出ble 广播

    原文地址: https://www.cnblogs.com/CharlesGrant/p/7155211.html Android对外模模式(peripheral)的支持: 从Android 5.0+ ...

  9. Android BLE蓝牙4.0开发 实现扫描、连接、通讯、获取通知、特性等 (一、打开蓝牙 进行扫描)

    目录 首先说下蓝牙4.0 目前android蓝牙有2种: ble蓝牙开发流程: 1.首先当然是进行权限申请啦: 2.获取蓝牙适配器 BluetoothAdapter 3.打开蓝牙 4.关闭蓝牙 5.在 ...

最新文章

  1. mysql 自定义提示符
  2. 关于医网联影像工作站3.0(ProDicom Workstation 3.0)的版权及注册问题说明
  3. 反Secure Boot垄断:兼谈如何在Windows 8电脑上安装Linux
  4. Java异常之try,catch,finally,throw,throws
  5. python更新到哪个版本了_将Python自带版本(2.6.6)升级到2.7.9
  6. MFC UI库知多少
  7. linux非阻塞输入函数,Linux fcntl函数设置阻塞与非阻塞
  8. mysql5.4升级5.6_Laravel5.4 升级到 5.6
  9. 【bzoj1045】【HAOI2008】 糖果传递
  10. MQTT、CoAP 还是 LwM2M?主流物联网协议如何选择
  11. 如何高效开发一款微信小程序
  12. Nitux OS 折腾记录
  13. 中国版的Google被阉割掉多少?
  14. linux快捷键锁定屏幕,天天Linux-Ctrl+S快捷键锁定屏幕的问题
  15. 01-如何写SCI论文
  16. Rclone的介绍和使用
  17. Java基础篇:什么是hashCode 以及 hashCode()与equals()的联系
  18. Java实现给图片局部打马赛克
  19. 石家庄铁道大学 2016 上半年软件工程课助教总结
  20. 怎么下载电脑自带的office版本

热门文章

  1. 计算机网络基础 第二章
  2. 使用Qt创建一个时钟
  3. 【前端大屏实战1】Vue+Echarts -- 大屏简介初体验 => 大屏自适应缩放解决方案 => 使用transform:scale => 组件化抽离ScaleBox=>【两分钟实现大屏宽高等比例】
  4. 调试时出现:undefined Expecting 'EOF','}',',',']', got STRING以下错误的解决方法
  5. “物联网开发实战”学习笔记-(二)手机控制智能电灯
  6. android华为手机虚拟键盘盖住底部,Android 虚拟键盘遮挡住页面问题我遇到的坑及个人解决办法...
  7. CodeScene - 软件质量可视化工具
  8. Linux—系统关机命令详解
  9. [HNOI2001] 产品加工
  10. 304、bootstrap 之 图片样式