如何用Python对接涂鸦蓝牙设备?现有脚本无法发现设备求解决
问题分析与解决方案
一、为何现有脚本无法发现涂鸦蓝牙设备?
1. 蓝牙适配器未开启扫描模式
从你提供的bluetoothctl show输出可以看到Discovering: no——你的蓝牙适配器根本没在扫描周边设备。现有脚本只是遍历已配对/已发现过的设备缓存,没有主动触发新设备扫描,自然找不到未配对的涂鸦传感器。
2. 第二个脚本存在语法错误
你调用函数时仅写了函数名(get_managed_objects、find_adapter),没有加括号执行;且find_device('hci0')参数错误——hci0是蓝牙适配器标识,不是设备MAC地址,这会直接抛出"设备未找到"的异常。
3. 未针对BLE设备优化扫描
涂鸦温湿度传感器属于低功耗蓝牙(BLE)设备,默认的蓝牙扫描可能未过滤BLE设备,导致无法精准识别。
二、Python对接涂鸦蓝牙设备的步骤
1. 先确认设备可被发现
先通过命令行手动扫描,验证设备是否能被识别:
bluetoothctl # 进入交互模式后执行: scan on
等待10秒左右,查看输出中是否出现你的温湿度传感器(名称通常包含"Tuya"或设备ID),记录设备的MAC地址(如AA:BB:CC:DD:EE:FF)。
2. 修复DBus脚本实现扫描
修改第一个脚本,添加BLE扫描逻辑并遍历设备:
#!/usr/bin/env python3 import dbus import time SERVICE_NAME = "org.bluez" OBJECT_IFACE = "org.freedesktop.DBus.ObjectManager" ADAPTER_IFACE = SERVICE_NAME + ".Adapter1" DEVICE_IFACE = SERVICE_NAME + ".Device1" bus = dbus.SystemBus() manager = dbus.Interface(bus.get_object(SERVICE_NAME, "/"), OBJECT_IFACE) # 获取蓝牙适配器 adapter = None objects = manager.GetManagedObjects() for path, ifaces in objects.items(): if ADAPTER_IFACE in ifaces: adapter = dbus.Interface(bus.get_object(SERVICE_NAME, path), ADAPTER_IFACE) break if adapter: # 开启BLE定向扫描 print("启动BLE扫描...") adapter.SetDiscoveryFilter({"Transport": dbus.String("le")}) adapter.StartDiscovery() time.sleep(10) # 扫描10秒 # 重新获取设备列表并输出 objects = manager.GetManagedObjects() print("发现的BLE设备:") for path, ifaces in objects.items(): if DEVICE_IFACE in ifaces: props = ifaces[DEVICE_IFACE] print(f"地址: {props['Address']}, 名称: {props.get('Name', '未知')}") adapter.StopDiscovery()
3. 使用更易用的BLE库(推荐)
直接使用bleak库(Python主流BLE操作库),比DBus更简洁:
安装依赖
pip install bleak
扫描设备
from bleak import BleakScanner import asyncio async def scan_ble_devices(): devices = await BleakScanner.discover(timeout=10) for dev in devices: print(f"地址: {dev.address}, 名称: {dev.name}, 信号强度: {dev.rssi}") asyncio.run(scan_ble_devices())
读取温湿度数据
涂鸦BLE传感器通常有固定的GATT特征UUID(可通过nRF Connect工具查看,或参考涂鸦公开文档),读取并解析数据:
from bleak import BleakClient import asyncio # 替换为你的设备MAC和特征UUID DEVICE_MAC = "AA:BB:CC:DD:EE:FF" TEMP_HUMI_UUID = "0000ffb2-0000-1000-8000-00805f9b34fb" # 示例UUID,需实际验证 async def read_sensor(): async with BleakClient(DEVICE_MAC) as client: # 读取特征值 data = await client.read_gatt_char(TEMP_HUMI_UUID) # 解析涂鸦温湿度格式:前2字节温度(小端),后2字节湿度(小端),除以10得实际值 temp = int.from_bytes(data[:2], byteorder="little") / 10 humi = int.from_bytes(data[2:4], byteorder="little") / 10 print(f"温度: {temp}℃, 湿度: {humi}%") asyncio.run(read_sensor())
4. 涂鸦BLE设备特殊注意事项
- 设备配对状态:如果传感器已绑定到SmartLife,需先解除绑定或长按设备进入配对模式,才能被其他设备连接。
- 数据加密:部分涂鸦BLE设备需要
local key解密数据,可通过SmartLife开发者模式导出设备密钥,再在Python中实现涂鸦BLE加密协议解析。
内容的提问来源于stack exchange,提问作者Dri372
相关产品推荐
相关产品推荐

