
安卓系统优化不是很好,另外安卓手机必须购买高配置的手机才能流畅,因为随着安装的东西过多,后台运行的东西也越来越多,会拖慢手机速度。苹果系统不是真正的多任务系统,且不允许第三方系统软件安装及运行,加上优化比较好(以界面响应为主优化),所以速度才快。
iOS搜索到蓝牙时,蓝牙的mac地址已经被隐藏了,我们打印出来的外设信息中是没有mac地址的,苹果提供给我们识别蓝牙的是identifier
但是安卓的是有mac地址的,客户就要求我们iOS也必须显示mac地址,可是我们的应用层无法实现该功能。通过查阅网上的资料发现有的说可以在服务里添加MAC地址,可是这样的话还是无法实现搜索的时候显示MAC地址,与客户的需求不符合。
然后我们的同事找到一个同牌子开发版的手环可以实现显示MAC地址,然后我拿来他们的手环进行测试,发现他们的MAC地址是放在了广播包里面。
然后将这个告知了需求方,让硬件配合开发此功能,现在我们的硬件也实现了该功能:
这样的话,我们可以通过获得广播包里的MAC地址来展示给用户。
所以如果有这个需求的要跟硬件的沟通,让他们把MAC地址加入到广播包中,我们iOS才可以实现这个功能。
①目的:如果说蓝牙 40主打的是省电特性的话,那么此次升级蓝牙41应当是IOT(全联网),也就是把所有设备都联网的意思,改善数据传输,迎合可穿戴设备需求。
②传输速率:蓝牙41在蓝牙40 LE基础上进行了升级,使得批量数据可以以更高的速率传输。但是也只是相对提高那么一丢丢而已!
③
角色:蓝牙40 LE的设备角色早就被安排好了为逗Bluetooth Smart地 和逗Bluetooth Smart
Ready地;而在蓝牙41中,就允许设备同时充当逗Bluetooth Smart地 和逗Bluetooth Smart
Ready地两个角色的功能,这就意味着能够让多款设备连接到一个蓝牙设备上。这样玩起来就有意思多了!
④上网:穿戴设备上网不易的问题,也可以通过蓝牙41进行解决。估计还需要一个过程!
⑤连接:两款带有蓝牙41的设备之前已经成功配对,重新连接时只要将这两款设备靠近,即可实现重新连接,完全不需要任何手动 *** 作。
⑥兼容性:蓝牙41不仅可以向下兼容蓝牙40,更重要的是对现有的蓝牙40设备来说,不需要更换芯片,只需要升级固件就可以升级到蓝牙41。老用户不用花钱就能升级呀!
万物互联的物联网时代的已经来临,ble蓝牙开发在其中扮演着举重若轻的角色。最近刚好闲一点,抽时间梳理下这块的知识点。
涉及ble蓝牙通讯的客户端(开启、扫描、连接、发送和接收数据、分包解包)和服务端(初始化广播数据、开始广播、配置Services、Server回调 *** 作)整个环节以及一些常见的问题即踩过的一些坑。
比如
1、在Android不同版本或不同手机的适配问题,扫描不到蓝牙设备
2、如何避免ble蓝牙连接出现133错误?
3、单次写的数据大小有20字节限制,如何发送长数据
蓝牙有传统(经典)蓝牙和低功耗蓝牙BLE(Bluetooth Low Energy)之分,两者的开发的API不一样,本文主讲Ble蓝牙开发,传统蓝牙不展开,有需要的可以自行了解。
相对传统蓝牙,BLE低功耗蓝牙,主要特点是快速搜索,快速连接,超低功耗保持连接和数据传输。
客户端
服务端
Android43(API Level 18)开始引入BLE的核心功能并提供了相应的 API。应用程序通过这些 API 扫描蓝牙设备、查询 services、读写设备的 characteristics(属性特征)等 *** 作。
BLE蓝牙协议是GATT协议, BLE相关类不多, 全都位于androidbluetooth包和androidbluetoothle包的几个类:
androidbluetooth
BluetoothGattService 包含多个Characteristic(属性特征值), 含有唯一的UUID作为标识
BluetoothGattCharacteristic 包含单个值和多个Descriptor, 含有唯一的UUID作为标识
BluetoothGattDescriptor 对Characteristic进行描述, 含有唯一的UUID作为标识
BluetoothGatt 客户端相关
BluetoothGattCallback 客户端连接回调
BluetoothGattServer 服务端相关
BluetoothGattServerCallback 服务端连接回调
androidbluetoothle
AdvertiseCallback 服务端的广播回调
AdvertiseData 服务端的广播数据
AdvertiseSettings 服务端的广播设置
BluetoothLeAdvertiser 服务端的广播
BluetoothLeScanner 客户端扫描相关(Android50新增)
ScanCallback 客户端扫描回调
ScanFilter 客户端扫描过滤
ScanRecord 客户端扫描结果的广播数据
ScanResult 客户端扫描结果
ScanSettings 客户端扫描设置
BLE设备分为两种设备: 客户端(也叫主机/中心设备/Central), 服务端(也叫从机/外围设备/peripheral)
客户端的核心类是 BluetoothGatt
服务端的核心类是 BluetoothGattServer 和 BluetoothLeAdvertiser
BLE数据的核心类是 BluetoothGattCharacteristic 和 BluetoothGattDescriptor
下面详细讲解下客户端和服务端的开发步骤流程
安卓手机涉及蓝牙权限问题,蓝牙开发需要在AndroidManifestxml文件中添加权限声明:
在搜索设备之前需要询问打开手机蓝牙:
注意: BLE设备地址是动态变化(每隔一段时间都会变化),而经典蓝牙设备是出厂就固定不变了!
通过扫描BLE设备,根据设备名称区分出目标设备targetDevice,下一步实现与目标设备的连接,在连接设备之前要停止搜索蓝牙;停止搜索一般需要一定的时间来完成,最好调用停止搜索函数之后加以100ms的延时,保证系统能够完全停止搜索蓝牙设备。停止搜索之后启动连接过程;
BLE蓝牙的连接方法相对简单只需调用connectGatt方法;
参数说明
与设备建立连接之后与设备通信,整个通信过程都是在BluetoothGattCallback的异步回调函数中完成;
BluetoothGattCallback中主要回调函数如下:
上述几个回调函数是BLE开发中不可缺少的;
当调用targetdDeviceconnectGatt(context, false, gattCallback)后系统会主动发起与BLE蓝牙设备的连接,若成功连接到设备将回调onConnectionStateChange方法,其处理过程如下:
判断newState == BluetoothGattSTATE_CONNECTED表明此时已经成功连接到设备;
mBluetoothGattdiscoverServices();
扫描BLE设备服务是安卓系统中关于BLE蓝牙开发的重要一步,一般在设备连接成功后调用,扫描到设备服务后回调onServicesDiscovered()函数,函数原型如下:
BLE蓝牙开发主要有负责通信的BluetoothGattService完成的。当且称为通信服务。通信服务通过硬件工程师提供的UUID获取。获取方式如下:
具体 *** 作方式如下:
开启监听,即建立与设备的通信的首发数据通道,BLE开发中只有当客户端成功开启监听后才能与服务端收发数据。开启监听的方式如下:
BLE单次写的数据量大小是有限制的, 通常是20字节 ,可以尝试通过requestMTU增大,但不保证能成功。分包写是一种解决方案,需要定义分包协议,假设每个包大小20字节,分两种包,数据包和非数据包。对于数据包,头两个字节表示包的序号,剩下的都填充数据。对于非数据包,主要是发送一些控制信息。
监听成功后通过向 writeCharacteristic写入数据实现与服务端的通信。写入方式如下:
其中:value一般为Hex格式指令,其内容由设备通信的蓝牙通信协议规定;
若写入指令成功则回调BluetoothGattCallback中的onCharacteristicWrite()方法,说明将数据已经发送给下位机;
若发送的数据符合通信协议,则服务端会向客户端回复相应的数据。发送的数据通过回调onCharacteristicChanged()方法获取,其处理方式如下:
通过向服务端发送指令获取服务端的回复数据,即可完成与设备的通信过程;
当与设备完成通信之后之后一定要断开与设备的连接。调用以下方法断开与设备的连接:
源码上传在CSDN上了,有需要的可以借鉴。
=====> Android蓝牙Ble通讯Demo示例源码–扫描,连接,发送和接收数据,分包解包
BLE单次写的数据量大小是有限制的,通常是20字节,可以尝试通过requestMTU增大,但不保证能成功。分包写是一种解决方案,需要定义分包协议,假设每个包大小20字节,分两种包,数据包和非数据包。对于数据包,头两个字节表示包的序号,剩下的都填充数据。对于非数据包,主要是发送一些控制信息。
总体流程如下:
1、定义通讯协议,如下(这里只是个举例,可以根据项目需求扩展)
2、封装通用发送数据接口(拆包)
该接口根据会发送数据内容按最大字节数拆分(一般20字节)放入队列,拆分完后,依次从队列里取出发送
3、封装通用接收数据接口(组包)
该接口根据从接收的数据按协议里的定义解析数据长度判读是否完整包,不是的话把每条消息累加起来
4、解析完整的数据包,进行业务逻辑处理
5、协议还可以引入加密解密,需要注意的选算法参数的时候,加密后的长度最好跟原数据长度一致,这样不会影响拆包组包
一般都是Android版本适配以及不同ROM机型(小米/红米、华为/荣耀等)(EMUI、MIUI、ColorOS等)的权限问题
蓝牙开发中有很多问题,要静下心分析问题,肯定可以解决的,一起加油;
1提升数据传输率
相比蓝牙40,蓝牙41单包数据传输最大值从20字节上调到23字节,提升了15%的数据传输率。
2主从共存
链路层Link layer拓扑结构做了更新,允许单设备主从同时共存(时间片轮转方式),以及一主对多从设备的连接拓扑。
3支持32-Bit UUID
32-Bit UUID指的是广播包携带的UUID,并不是指我们所说的针对属性列表的16 bit and 128 bit UUID。可以通过广播的32-Bit UUID映射得到完整的128 Bit UUID从而使得广播包内有效广播数据长度更多。
4、自动重连
两款带有蓝牙41的设备之前已经成功配对,重新连接时只要将这两款设备靠近,即可实现重新连接,完全不需要任何手动 *** 作。
5、与4G不再冲突
蓝牙41和4G网络同时在传输数据的情况,那么蓝牙41就会自动协调两者的传输信息,从而减少其它信号对蓝牙41的干扰。
直接采集数据的蓝牙模式是BLE(Bluetooth Low Energy)模式。BLE是一种低功耗的蓝牙技术,它可以在消耗极低的电量下传输数据,并支持多种传输速率和连接方式。在BLE模式下,设备可以通过广播数据或建立连接来传输数据,这种模式适用于需要长时间运行,并且需要消耗较少电量的设备,例如智能手表、健康追踪器等。同时,BLE还具有更高的安全性,因为它支持128位和256位的加密算法,可以有效保护用户隐私和数据安全。
以上就是关于为什么同样的硬件 安卓可以收到蓝牙广播包但是ios收不到全部的内容,包括:为什么同样的硬件 安卓可以收到蓝牙广播包但是ios收不到、iOS蓝牙小知识——mac地址、蓝牙 le 广播数据是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)