如何基于bluepy启用Sensirion Smartgadget温度更新通知
解决Sensirion Smartgadget BLE温度通知问题
我之前折腾过Sensirion Smartgadget的BLE通知功能,结合官方文档和bluepy的使用经验,给你梳理下关键步骤,应该能解决你的问题:
核心原理:启用BLE通知的关键是配置CCCD
BLE设备的通知功能需要通过**客户端特征配置描述符(CCCD)**来开启,这个描述符的UUID是固定的00002902-0000-1000-8000-00805f9b34fb。针对温度特征,我们需要向它写入特定指令来启用通知。
具体操作步骤(附代码示例)
1. 定义通知回调类
首先要创建一个回调类来处理设备发来的通知数据,bluepy需要通过继承DefaultDelegate实现:
from bluepy.btle import DefaultDelegate, Peripheral class TempNotificationHandler(DefaultDelegate): def __init__(self): super().__init__() def handleNotification(self, char_handle, data): # 解析Sensirion的温度数据:16位小端格式,单位0.01℃ temperature = int.from_bytes(data, byteorder='little') / 100.0 print(f"实时温度更新: {temperature} °C")
2. 连接设备并定位目标特征
Smartgadget使用标准的环境监测服务(UUID: 0000181a-0000-1000-8000-00805f9b34fb),温度特征的UUID是00002a6e-0000-1000-8000-00805f9b34fb,我们需要先定位到这个特征:
# 替换成你的设备MAC地址 DEVICE_MAC = "AA:BB:CC:DD:EE:FF" # 连接设备 peripheral = Peripheral(DEVICE_MAC) # 设置回调处理器 peripheral.setDelegate(TempNotificationHandler()) # 获取环境监测服务 env_service = peripheral.getServiceByUUID("0000181a-0000-1000-8000-00805f9b34fb") # 获取温度特征 temp_characteristic = env_service.getCharacteristics("00002a6e-0000-1000-8000-00805f9b34fb")[0]
3. 写入指令启用通知
找到温度特征对应的CCCD描述符,写入\x01\x00(小端字节序,代表启用通知):
# 获取CCCD描述符 cccd_descriptor = temp_characteristic.getDescriptors(forUUID="00002902-0000-1000-8000-00805f9b34fb")[0] # 写入启用通知的指令,withResponse=True确保设备确认收到 cccd_descriptor.write(b"\x01\x00", withResponse=True)
4. 循环等待通知
最后进入循环等待设备推送的温度数据:
print("已启用温度通知,等待数据更新...") while True: # waitForNotifications(1.0)表示每隔1秒检查一次是否有通知 if peripheral.waitForNotifications(1.0): continue print("等待中...")
常见问题排查
- 指令字节序错误:很多人会把指令写成
b"\x00\x01",这是启用**指示(Indication)**而非通知,设备可能不会推送数据,一定要用b"\x01\x00"。 - 权限问题:运行bluepy脚本需要蓝牙操作权限,建议用
sudo执行,或者给bluepy设置cap_net_raw权限。 - 特征UUID找错:如果你的设备用了自定义UUID(而非标准环境服务),需要对照你手上的第10页文档确认特征UUID,替换代码中的对应值。
- 设备未进入通知模式:部分Smartgadget可能需要先通过特定特征写入指令开启推送模式,如果上述步骤无效,可以尝试向设备的配置特征写入对应指令(参考文档第10页的配置命令)。
内容的提问来源于stack exchange,提问作者Burner
相关产品推荐
相关产品推荐

