当前位置:首页 > 通信技术 > 通信技术
[导读]在蓝牙5.0 BLE(低功耗蓝牙)开发中,GATT(通用属性规范) 是应用层数据交互的绝对核心。很多开发者能连上设备,却在“找不到服务”或“收不到数据”上栽跟头。本文将深入服务发现流程与通知(Notify)机制这两大实战难点,助你打通BLE通信的“任督二脉”。



蓝牙5.0 BLE(低功耗蓝牙)开发中,GATT(通用属性规范) 是应用层数据交互的绝对核心。很多开发者能连上设备,却在“找不到服务”或“收不到数据”上栽跟头。本文将深入服务发现流程与通知(Notify)机制这两大实战难点,助你打通BLE通信的“任督二脉”。


一、GATT服务发现:连接后的“地图加载”


BLE连接建立后,手机(Client)并不知道设备(Server)内部有什么能力。服务发现(Service Discovery) 就是Client主动去Server端“读取地图”的过程。这个过程必须严格按照ATT(属性协议)的顺序执行。


1. 发现流程状态机


在Android等平台,GATT操作是异步回调驱动的。一个标准的发现流程必须遵循以下状态迁移:


1.  连接成功:onConnectionStateChange回调状态变为STATE_CONNECTED。

2.  触发发现:立即调用gatt.discoverServices(),进入发现状态。

3.  发现完成:等待onServicesDiscovered回调,状态为GATT_SUCCESS。

4.  获取对象:只有在此之后,调用gatt.getService(UUID)才能拿到非空对象。


避坑指南:绝对不要在连接成功回调后立即进行读写操作,此时服务表尚未加载,必然失败。


2. 底层交互解析(ATT层)


服务发现在底层是通过一系列ATT指令完成的:

-   MTU交换:协商双方能处理的最大数据包长度。

•   发现主服务:Client发送ATT_READ_BY_GROUP_TYPE_REQ,遍历Server的属性表,找出所有UUID=0x2800(主服务声明)的条目。


-   发现特征:针对每个服务,发送ATT_READ_BY_TYPE_REQ,查找UUID=0x2803(特征声明),获取特征的属性(Properties)和句柄(Handle)。


二、通知机制(Notify/Indicate):服务端主动“推数据”


BLE通信默认是Client主动请求(Read/Write)。若要让Server(如传感器)主动上报数据,必须使用通知(Notify) 或指示(Indicate) 机制。


1. Notify vs Indicate:一字之差,天壤之别


两者都用于Server主动发送数据,但可靠性机制完全不同:


特性 Notify(通知) Indicate(指示)


确认机制 ❌ 无ACK(发完即忘) ✅ 有ACK(必须确认)


可靠性 可能丢包(适合传感器流) 可靠送达(适合关键指令)


速度 快,无等待开销 慢,需等待Client回复


适用场景 心率、温度等高频数据 固件升级确认、开关指令


2. 使能通知的“三步走”代码(Android示例)


通知机制是双向握手的:Client必须先告诉Server“我要订阅”,Server才能推送。这通过写入CCCD(客户端特征配置描述符) 实现。

// 1. 获取目标特征(Characteristic)

val service = gatt.getService(UUID_SERVICE)

val char = service.getCharacteristic(UUID_CHAR_NOTIFY)


// 2. 本地开启监听(告诉Android系统准备接收)

gatt.setCharacteristicNotification(char, true)


// 3. 关键步骤:写入CCCD描述符,告诉设备端“开启通知”

val cccd = char.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"))

cccd.value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE

gatt.writeDescriptor(cccd) // 这一步才是真正的“订阅”



关键点:

•   CCCD UUID:固定为00002902-0000-1000-8000-00805f9b34fb。


•   写入值:ENABLE_NOTIFICATION_VALUE(0x0001)开启通知;ENABLE_INDICATION_VALUE(0x0002)开启指示。


3. 服务端(嵌入式侧)发送逻辑


当Server端(如ESP32、nRF52)检测到CCCD被写入0x0001后,即可在数据更新时主动发送。

// 基于ESP-IDF的伪代码示例

// 检查客户端是否开启了通知

uint16_t cccd_value;

esp_ble_gatts_get_attr_value(cccd_handle, &cccd_value);

if (cccd_value & ESP_GATT_PERM_NOTIFY) {

   // 发送通知(无确认,高效)

   esp_ble_gatts_send_indicate(gatts_if, conn_id, char_handle, data_len, data, false);

   // 若为Indicate,最后一个参数传 true

}



三、量产级调试与排错


1. 服务发现失败(onServicesDiscovered返回错误)


•   原因:MTU协商失败或ATT超时。


•   对策:在连接后、发现服务前,先调用gatt.requestMtu(247)申请更大的MTU(需设备端支持),减少分包次数。


2. 收不到通知(Notify不触发)


•   检查CCCD:90%的问题出在这里。确认Client端writeDescriptor是否成功,且Server端正确解析了CCCD的值。


•   连接参数:通知频率受Connection Interval限制。若间隔太长(如1秒),数据会堆积。建议在Android端调用gatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH)请求更短的间隔。


3. 数据截断


•   默认限制:BLE默认ATT_MTU为23字节,有效载荷仅20字节。长数据需进行MTU协商(如扩展到247字节)或应用层分包。


四、结语


GATT服务发现是BLE通信的“地基”,而通知机制是实时数据流的“桥梁”。掌握这两者,意味着你已突破了BLE开发中最容易卡壳的关卡。记住核心口诀:先发现,后操作;开通知,先写CCCD。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

蓝牙5.0在物理层上引入了2倍速率增加、4倍范围增加和8倍广播数据容量增加的技术改进。它还引入了低能耗广播和连接模式,以及新的2Mbps的高速数据传输模式。

关键字: 蓝牙5.0 耳机 智能手表

(全球TMT2022年8月15日讯)绘王(Huion)推出新款数位板Inspiroy Dial 2 (Inspiroy Dial Q620M的升级版)。Inspiroy Dial 2采用双滚轮控制器,支持快速访问Win...

关键字: SPI 控制器 蓝牙 蓝牙5.0

(全球TMT2022年5月25日讯)近日,绘王推出了新一代蓝牙5.0数位板G930L。作为绘王Inspiroy Giano系列第二代产品,G930L延续了WH1409 V2大尺寸面板,并真正意义上诠释了一台专业的数位板...

关键字: 蓝牙5.0 LCD屏 电量 Android

12月10日,2021第八届中国IoT大会在深圳圆满落幕。在同期举行的第六届中国IoT创新奖评选中,中微半导低功耗蓝牙5.0 SoC BAT32WB35凭借超低功耗、高速率、远距离及易用性等性能优势,获评“2021中国...

关键字: 中微半导体 蓝牙5.0 IoT

(全球TMT2021年8月16日讯)环旭电子利用独有的异质整合封装能力与微小化技术,推出WM-BZ-ST-55双核蓝牙5.0天线封装模块。该模块为一款节能降耗的绿色产品,是远程传感器、可穿戴跟 踪器

关键字: 蓝牙5.0 物联网设备 电子

在这篇文章中,小编将为大家带来网易云音乐 AIR 蓝牙5.0 真无线入耳式蓝牙耳机的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: 网易云 蓝牙5.0 蓝牙耳机

  最新版蓝牙5.0(Bluetooth5.0;BT5)将大幅扩展个人局域网络(PAN)以及网状网络的连接范围,并进一步在家庭与建筑物自动化领域挑战Zigbee技术。从长期来看,供货商与分析师都

关键字: IoT Zigbee 蓝牙5.0

低功耗蓝牙(Bluetooth Low Energy,简称BLE)技术已经成为物联网领域领先的通信标准之一。前不久,蓝牙技术联盟(Bluetooth SIG)分享了一些蓝牙5.0标准的进展,蓝牙

关键字: 物联网 蓝牙5.0

  虽然,智能硬件行业相比前几年的热度有所下降,但是WiFi、ZigBee、蓝牙等通信协议之间的标准之争还在继续,到底哪个会成为最适合智能硬件或者物联网领域的协议,谁也没能说出个一二三来。

关键字: Zigbee 物联网 蓝牙5.0

  2016年8月31日,由电子发烧友主办的第五届智能家居技术研讨会在深圳会展中心5楼菊花厅盛大召开,会场来自广东、上海各地工程师200多名共聚一堂。   电子发烧友主编陈路在开场介绍了

关键字: 2016iot大会 NB-IoT 智能家居 蓝牙5.0
关闭