蓝牙开发经验总结

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

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

文章部分转自
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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 关于开源的RTP——jrtplib的使用

    关于开源的RTP——jrtplib的使用

    2021年11月28日
    43
  • 关于 sso 博客大巴的神仙的一点思路

    关于 sso 博客大巴的神仙的一点思路
    聊天中的一些片段。。。可以记录参考下
     
    1每个应用独立维护自己的session
     
    2用户中心是一个特殊的应用,负责用户登录验证某个需要登录的应用发现没有登录状态就跳到用户中心用户中心判断有没在自己这里登录过,登录过就返回用户信息,没登陆过就先登录,然后记自己的session别的应用收到以后根据用户信息记自己的session之后只要自己的session还在,就不关用户中心的事了

    2022年7月12日
    16
  • centos搭建YApi接口管理平台

    centos搭建YApi接口管理平台

    2021年6月4日
    130
  • pycharm多行代码同时注释、去除注释_vs如何统计代码行数

    pycharm多行代码同时注释、去除注释_vs如何统计代码行数使用pycharm编写Python脚本的时候,先选中需要注释的行,然后同时按键盘右下角的—-Ctrl和Ctrl键正上方的‘/’键—可以实现多行注释注意:1、只有在pycharm中编写Python代码(以.py结尾的文件)才能用此方法去多行注释2、在选中行的时候不管是全部选中,还是只选中了该行中的的部分代码,都能实现多行注释,如下图:注释前:注释后:…

    2022年8月28日
    6
  • python粒子群算法的实现「建议收藏」

    python粒子群算法的实现「建议收藏」参考博客:http://blog.csdn.net/zuochao_2013/article/details/53431767?ref=myreadhttp://blog.csdn.net/chen_jp/article/details/7947059算法介绍粒子群算法(particleswarmoptimization,PSO)由Kennedy和Eberhart在1995年…

    2022年5月8日
    47
  • python知识推理知识图谱_知识图谱系列–知识推理

    python知识推理知识图谱_知识图谱系列–知识推理摘要本文接着知识图谱系列–实体链接技术(1)[1]介绍知识推理方法。知识推理就是通过各种方法获取新的知识或者结论,这些知识和结论满足语义,其具体任务可分为可满足性(satisfiability)、分类(classification)、实例化(materialization)。[2]paper:Das,R.,Neelakantan,A.,Belanger,D.,&Mccal…

    2022年6月6日
    41

发表回复

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

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