Android-Ble蓝牙开发Demo示例–扫描,连接,发送和接收数据,分包解包(附源码)

Android-Ble蓝牙开发Demo示例–扫描,连接,发送和接收数据,分包解包(附源码),第1张

万物互联的物联网时代的已经来临,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 蓝牙与WIFI的区别一:

1、蓝牙在早期也称之为蓝芽,是一种新兴无线通讯技术是一个标准的无线通讯协议,基于低成本设备的收发器芯片,近距离传输、功耗低。被广泛应用于物联网智能家居系统、智能可穿戴设备。升润科技是专门针对低功耗蓝牙研发解决方案的企业。

2、Wi-Fi为IEEE定义的一个无线网络通信的工业标准,是一种无线网络他在局域网里面的范畴是指“无线相容性认证”其实是一种商业认证,同时也是一种无线联网技术。

蓝牙与WIFI的区别二:

1、蓝牙使用的是跳频扩谱方式,一般每秒钟跳变1650次,将835MHz的频带划分至79个频带信道,而每个时刻只占1MHz的带宽。调制方式是GFSK,经典蓝牙是可以同时进行数据和语音的无线通讯,而蓝牙传输带宽是1Mbps,他的通信距离一般都是10米,在2016年5月份推出的最新的版本Bluetooth50传输距离可以达到150米。蓝牙通讯主要用来连接一些外接电子设备,或者近距离数据传输。

2、WIFI所使用的连接协议是IEEE80211b局域网协议,WIFI的传输范围是120米,传输速度最大可以达到11Mbps,使用的是直序列扩频和QPSK或BPSK,上下带宽是22MHz。主要能提供无线上网的业务,所以WIFI经常出现在需要进行联网的智能设备上面。

蓝牙”是一种新型的无线通讯技术,它可以实现个人域网与移动设备之间进行短距离数据交换,蓝牙通讯技术事实上是一个全球性的标准,它打破了用有线电缆来连接各种数字设备的局限,蓝牙主要工作于24Hz的全球通用的IS频段,这就是蓝牙为什么是全球通用的无线通讯技术的标准。

蓝牙自40版本开始就分为“经典蓝牙”、“低功耗BLE蓝牙”与“高速蓝牙”,经典蓝牙包括旧有的传输协议支持视频、音频的传输。则低功耗(BLE)蓝牙是40版本的一个子集,相对于经典蓝牙有着全新的协议栈可以快速简单的进行连接,它主要是面对功耗需求极地、用小型的纽扣电池供电应用。所以低功耗蓝牙非常适用于物联网应用的需求。

什么是WIFI?

WIFI的全称是Wireless Fidelity,又称80211b标准,它的最大优点就是可以允许电子设备连接到局域网和高传输速度,通常使用的是24G UHF ISM视频频段,连接到网络一般都是有密码保护的,也很容易通过技术手段被破解。所以WIFI在安全性能方面还是需要继续完善,WIFI通讯技术实际上就是把有线的网络信号转变为无线信号,使用无线路由器提供信号技术支持从而实现手机、平板、电脑进行连接上网。

蓝牙5和WiFi其实都是比较适合物联网应用的,具体的看产品的应用场景、是否需要联网以及内置协议啥的是WiFi 更适合,还是蓝牙更适合。

需要联网,对传输距离有要求,传输数据偏大的,毫无疑问,WiFi 会更加适合;

不需要联网,只是要高速率的数据采集、传输及智能控制,则蓝牙50会更为适合,低功耗,工业级,高性能的50蓝牙模块SKB501就蛮适合的。

BLE Mesh功耗的测量原理是基于发射功率和接收功率的控制来推断功耗的。发射功率和接收功率由芯片的额定功率和PHY的调节因素(包括空气模式、数据速率和调制类型等)共同决定。实际上,BLE芯片本身是根据当前网络状态调节它们的发射功率和接收功率进而控制功耗的。
因此,测量BLE Mesh功耗的原理就是通过监测每个节点的发射功率和接收功率,以及它们之间的相关性来估计网络的总体效率。这种测量可以同时实现两个目标:一是确定网络功耗,二是识别异常情况。一旦发现了异常情况,可以根据功率数据确定具体原因并采取相应行动。

如今,FR508x系列已实现量产,富芮坤称其为“双模蓝牙SoC”。双模即支持经典蓝牙(EDR),又支持低功耗蓝牙(BLE),还实现具备更高的算力。

可穿戴设备、智能门锁、TWS耳机等功能的需求提升了对算力的要求,比如TWS耳机有唤醒、降噪、语音识别的功能,智能门锁有指纹识别的功能,现在的智能手表也有更高的交互功能。因此,富芮坤在更早的产品规划中,提到了利用蓝牙芯片的处理器进行边缘计算。

FR508x体现了富芮坤在蓝牙SoC方面的思路,在本次对黎传礼的专访中,我们也大致聊了聊这颗芯片,或许它能够一定程度表明行业的发展方向。
当前,富芮坤FR508x系列主推产品有FR5082DM和FR5086D,从SoC框架图来看,它具备富芮坤的传统特色,集成了Audio CODEC和PMU——这是该公司差异化竞争的体现。黎传礼此前曾谈到过,更全面的定义、强调连接性和低功耗,对客户而言意味着节省开发时间成本、降低开发难度,并提高产品竞争力。

“高集成度给客户带来了高性价比、更小的PCBA面积。未来我们的产品会保持这种差异化、创新化的产品定义路线。”黎传礼表示。

除此之外,FR508x的特点还包括BT51 BLE+EDR协议认证——是“双模”这个词的体现。双模的价值在于,保证更大程度的兼容性,实现与所有蓝牙设备的互联互通。与此同时在处理器和算力加速部分,采用48MHz主频的Cortex-M3外加156MHz的高性能 DSP双核设计;其他配置相关的构成与核心参数包括:

黎传礼表示:“FR508x在定义之初,我们的应用方向有三个——一是蓝牙通话功能的手表,我们优化了蓝牙音频保持连接的功耗,目前能够做到业内最低的500ms sniff电流70μA;二是物联网智能家居方向,我们增加了一个156MHz的DSP以及512KB RAM,可以实现离线语音识别+BLE Mesh;三是TWS耳机,我们优化了音频的延迟,当前实测能够做到低于30ms的音频延迟,在 游戏 耳机等场景有广泛的应用场景。”
富芮坤微电子副总裁牛钊曾表示,富芮坤的产品规划会紧随三个趋势推进:第一步,会把蓝牙组网作为WiFi的补充放到家电产品中现;第二步是利用蓝牙芯片的处理器进行边缘计算,实现本地音频的实时识别与反馈,用户可以方便地使用手机自行更改特殊的 *** 作指令和提示声音,通过蓝牙更新到家电产品上,使得家居更个性化、赋有人情味,目前正在推广阶段;第三步WiFi+BLE的SoC,可以直接对接云端的大数据,结合本地的信息实现全新的用户体验。

FR508x(以及前代FR802x)理论上已经实现了第二步,为蓝牙芯片进一步增加算力。在富芮坤看来,随着技术的演进和时间的推移,IoT产品走向边缘计算就是一个重要的发展方向。比如可穿戴设备对驱屏能力提出了更高的要求,从主流240240的分辨率,到360360分辨率,富芮坤也接到了454454应用需求的订单;可穿戴设备在满足低功耗的同时,对数据吞吐也产生了更高的要求,同时还可能存在室内定位的场景需求,以及对语音指令的支持。

这些都是对算力提出更高需求的应用场景。黎传礼特别提到,FR508x系列的芯片算力能够实现离线语音识别,而且已经与离线语音的算法公司配合完成了Demo样品。

与此同时,“一个DSP大核+一个ARM小核的构架,能满足功耗敏感型且需要算力的应用的折中需求,当系统仅需蓝牙链接时,只有ARM小核在跑,需要算力时,开启大核进行运算。”

“对于资深的开发者可以对ARM和DSP两个核都进行开发,对于入门开发者而言,我们采用我们标准的SDK只对ARM编程即可,我们提供了丰富的DSP算法库可以直接调用。”这一点也部分体现了富芮坤产品上手门槛相对低、更简单的特点。

在黎传礼看来,富芮坤产品在技术方面的优势主要体现在:“第一,富瑞坤的产品使用上手门槛比较低,容易上手开发;第二,产品的定义更偏重SoC应用也就是蓝牙芯片作为主控芯片使用。”FR508x当属典型具备了这些特性的SoC产品。
牛钊在去年的松山湖中国IC创新高峰论坛上介绍了FR508x单芯片智能手表方案。除了蓝牙双模与Arm核+DSP方案之外,当时还提到这套方案的优势包括了,最小封装46mm;BR保持蓝牙连接sniff power

蓝牙网关是一个集成蓝牙BLE、WiFi和以太网的网关设备,蓝牙BLE与WiFi之间通过串口实现通信,可灵活应用于各种物联网场景。蓝牙网关可以扫描周边的蓝牙BLE设备、蓝牙信标(Beacon),并将获得的信息通过WiFi或者以太网通过UDP或者TCP/IP的形式发送到服务器。

蓝牙网关可以连接周边的蓝牙BLE设备,然后实现远程管理,例如:远程控制蓝牙BLE设备,接收蓝牙BLE设备发送的数据,并将其发送给服务器。一个蓝牙网关同时能够连接的BLE设备数量在7个左右,SKYLAB通过时分的方式可以进行轮流连接,达到与每个蓝牙BLE设备进行数据传输的目的。通过蓝牙BLE和WiFi之间的串口,将蓝牙BLE设备的数据通过WiFi或者以太网传送到服务器,并且将服务器端的数据传送到蓝牙BLE设备。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/13124857.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-05
下一篇 2023-06-05

发表评论

登录后才能评论

评论列表(0条)

保存