蓝牙开发经验总结

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

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

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


相关推荐

  • JSONArray转list对象

    JSONArray转list对象List<InspectionBill>dataArr=JSONArray.parseArray(result,InspectionBill.class);importcom.alibaba.fastjson.JSONArray;

    2022年6月23日
    45
  • 大数据分析及工具应用总结「建议收藏」

    大数据分析及工具应用总结「建议收藏」概述数据分析即从数据、信息到知识的过程,数据分析需要数学理论、行业经验以及计算机工具三者结合数据分析工具:各种厂商开发了数据分析的工具、模块,将分析模型封装,使不了解技术的人也能够快捷的实现数学建模,快速响应分析需求传统分析:在数据量较少时,传统的数据分析已能够发现数据中包含的知识,包括结构分析、杜邦分析等模型,方法成熟,应用广泛。数据挖掘:就是充分利用了统计学和人工智能技术的应用程序,并把这些高深复杂的技术封装起来,使人们不用自己掌握这些技术也能完成同样的功能,并且…

    2022年5月3日
    55
  • 使用 Python 程序实现摩斯密码翻译器「建议收藏」

    作者主页:海拥作者简介:CSDN全栈领域优质创作者、HDZ核心组成员、蝉联C站周榜前十粉丝福利:往期获奖记录每周送6~9本书,不定期送各种小礼品(搪瓷杯、抱枕、鼠标垫、马克杯等)摩斯密码是一种将文本信息作为一系列通断的音调、灯光或咔嗒声传输的方法,无需特殊设备,熟记的小伙伴即可直接翻译。它以电报发明者SamuelF.B.Morse的名字命名。算法算法非常简单。英语中的每个字符都被一系列“点”和“破折号”代替,或者有时只是单数的“点”或“

    2022年4月14日
    51
  • TinyProxy:移动联通电信各个卡定向免流方法教程[通俗易懂]

    下载地址:https://www.lanzoui.com/i0Tsigfiv7c开始以电信星卡为例:打开软件右上角设置下高级模式然后返回复制下这模式【百度直连】免歪卡、星卡、小歪卡、小抖卡、大圣卡、百度系可免listen_port=65080; daemon=on; worker_proc=0; uid=3004; http_ip=112.80.255.21; http_port=443; http_del=”X-Online-Host,Host”..

    2022年4月15日
    395
  • 在ubuntu系统下安装python

    在ubuntu系统下安装python

    2021年10月6日
    37
  • debian系统版本查看_DEBIAN

    debian系统版本查看_DEBIANdebian官方默认只提供最新的版本下载,有时需要找一些旧的版本的debian,着实费用。下面这个debianiso镜像站可以下载各个版本的debian下载:debian系统各个版本ISO下载http://cdimage.debian.org/cdimage/archive/…

    2022年9月25日
    1

发表回复

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

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