蓝牙开发经验总结

蓝牙开发经验总结蓝牙开发经验总结

大家好,又见面了,我是你们的朋友全栈君。

文章部分转自
https://my.oschina.net/oywk/blog/701362
http://www.cnblogs.com/shang53880/p/4624955.html
https://github.com/xiaoyaoyou1212/BLE

1、不能使用BluetoothAdapter.startLeScan(UUID[] serviceUuids, LeScanCallback callback)函数扫描自定义UUID的蓝牙模块。亲测了很久,网络上也没有解决方案,源码上也追踪不到
这里写图片描述
源码如下
这里写图片描述
这里我用的UUID是从pc串口中更改好之后读出的
这里写图片描述
这里写图片描述
http://blog.csdn.net/u010800708/article/details/52243359

备注:BluetoothAdapter.startLeScan(UUID[] serviceUuids, LeScanCallback callback)的解决办法BluetoothDevice.connectGatt()在连接成功之后有一个BluetoothGattCallback回调接口,在BluetoothGattCallback回调接口中有onConnectionStateChange回调方法,这个方法在设备与app连接好之后会执行,而且相关蓝牙的服务在此可以获取bluetoothGatt.discoverServices();本人认为,由于没有产生连接所以不会返回蓝牙服务,所以BluetoothAdapter.startLeScan(UUID[] serviceUuids, LeScanCallback callback)过滤指定UUID设备的做法也就不行了,所以需要在onServicesDiscovered回调方法这里采用BluetoothGattService bluetoothGattService = bluetoothGatt.getService(UUID.fromString(Constant.UUID_STR));来获取蓝牙的tx,rx通道,并过滤指定UUID蓝牙设备。

2、在使用 BluetoothDevice.connectGatt() 或者 BluetoothGatt.connect() 等建立 BluetoothGatt 连接的时候,在任何时刻都只能最多一个设备在尝试建立连接。如果同时对多个蓝牙设备发起建立 Gatt 连接请求。如果前面的设备连接失败了,后面的设备请求会被永远阻塞住,不会有任何连接回调。
开发建议:如果要对多个设备发起连接请求,最好是有一个同一个的设备连接管理,把发起连接请求序列化起来。前一个设备请求建立连接,后面请求在队列中等待。如果连接成功了,就处理下一个连接请求。如果连接失败了(例如出错,或者连接超时失败),就马上调用 BluetoothGatt.disconnect() 来释放建立连接请求,然后处理下一个设备连接请求。

3、对BluetoothGatt 操作 (read/write)Characteristic(), (read/write)Descriptor() 和 readRemoteRssi() 都是异步操作。需要特别注意的是,同时只能有一个操作,也就是等上一个操作回调(例如onCharacteristicWrite())以后,再进行下一个操作。
开发建议:把这写操作都封装成同步操作,一个操作回调之前,阻塞主其他调用。或者用标志位来标志状态

4、BLE设备的建立和断开连接的操作,例如 BluetoothDevice.connectGatt(), BluetoothGatt.connect(), BluetoothGatt.disconnect(),BluetoothGatt.discoverServices()等操作最好都放在主线程中,否则你会遇到很多意想不到的麻烦。
开发建议:对 BluetoothGatt 的连接和断开请求,都通过发送消息到 Android 的主线程中,让主线程来执行具体的操作。例如创建一个 new Handler(context.getMainLooper());,把消息发送到这个 Handler 中。

5、Android 作为中心设备,最多只能同时连接 6 个 BLE 外围设备(可能不同的设备这个数字不一样),超过 6 个,就会连接不上了。现在 BLE 设备越来越多,其实并不够用,所以在开发的过程中,需要特别的谨慎使用。
开发建议:按照需要连接设备,如果设备使用完了,应该马上释放连接(调用BluetoothGatt.close()),腾出系统资源给其他可能的设备连接。

6、发起蓝牙Gatt连接 BluetoothDevice.connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback),这里有一个参数autoConnect,如果为 true 的话,系统就会发起一个后台连接,等到系统发现了一个设备,就会自动连上,通常这个过程是非常慢的。为 false 的话,就会直接连接,通常会比较快。同样,BluetoothGatt.connect()只能发起一个后台连接,不是直接连接。所以这个地方需要小心。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149680.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • git查看分支图_git分支代码

    git查看分支图_git分支代码gitlog–oneline–graph–decorate–all–oneline 日志单行显示–graph 分支图显示–decorate 可显示分支名称–all 显示所有分支

    2022年9月30日
    1
  • html右浮动代码_html+css+js

    html右浮动代码_html+css+js网上一般的网页浮动广告代码都是基于jquery的,受jiquery版本及浏览器限制,非常容易出现不兼容的情况,本站分享一段纯js网页浮动广告代码,简单兼容。html代码:javascript代码:window.onload=function(){varx=50,y=60;varxin=true,yin=true;varstep=1;vardelay=10;varobj=docu…

    2022年9月20日
    4
  • idea2020.3永久激活【2021.10最新】

    (idea2020.3永久激活)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~09…

    2022年3月28日
    321
  • 使用Windows PE的U盘安装win7

    前年刚去公司的时候用PE装过好多系统,最近又装一台华硕的,碰到了一个问题,一起记录了下。华硕X45,Bios已经改为U盘启动了,但就是进不去,因为知道可能还有个选磁盘启动项的键,找了半天原来按Esc就

    2021年12月21日
    53
  • js 给元素添加自定义属性

    js 给元素添加自定义属性给元素添加自定义属性obj.setAttribute(‘attr_name’,’attr_value’);//例如obj.setAttribute(‘class’,’snow-container’)给元素添加class属性的三种方法document.getElementsByTagName(‘body’)[0].className=’snow-container’;//设置为新的…

    2022年6月22日
    134
  • SparkIV「建议收藏」

    SparkIV「建议收藏」SparkIVSparkIV是知名游戏GTA4的一款游戏资源读取/导入/导出/编辑/修改的修改软件。很多玩家使用SparkIV为GTA4安装车辆MOD,人物MOD,武器MOD等。不过Spar

    2022年8月5日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号