You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 20:23:12