蓝牙开发经验总结

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

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

文章部分转自
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()只能发起一个后台连接,不是直接连接。所以这个地方需要小心。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

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