Python脚本无法连接Nonin Onyx II血氧仪问题求助
问题描述
我可以通过以下Python代码获取Nonin Onyx II血氧仪的MAC地址(设备本身也会显示该地址):
import bluetooth from bluetooth.ble import DiscoveryService def scan(): print("Scanning for bluetooth devices:") devices = bluetooth.discover_devices(duration=40, lookup_names = True, lookup_class = True) number_of_devices = len(devices) print(number_of_devices,"devices found") for addr, name, device_class in devices: print("\n") print("Device:") print("Device Name: %s" % (name)) print("Device MAC Address: %s" % (addr)) print("Device Class: %s" % (device_class)) print("\n") services = bluetooth.find_service(address=addr) if len(services) <=0: print("zero services found on", addr) else: for serv in services: print(serv['name']) print("\n") return scan();
将食指放入设备后运行上述代码,能正常打印MAC地址。但尝试用以下代码连接设备以接收数据时:
import binascii import struct import time from bluepy.bluepy.btle import UUID, Peripheral service_uuid = UUID(0x1822) p = Peripheral("00:1C:05:01:A1:2E", "random") try: ch = p.getCharacteristics(uuid=service_uuid)[0] if (ch.supportsRead()): while 1: val = binascii.b2a_hex(ch.read()) val = binascii.unhexlify(val) val = struct.unpack('f', val)[0] print (val) time.sleep(1) finally: p.disconnect()
出现如下报错:
Traceback (most recent call last): File "/home/sabhya/extractdata.py", line 8, in <module> p = Peripheral("00:1C:05:01:A1:2E", "random") File "/home/sabhya/bluepy/bluepy/btle.py", line 190, in __init__ self.connect(deviceAddr, addrType) File "/home/sabhya/bluepy/bluepy/btle.py", line 310, in connect raise BTLEException(BTLEException.DISCONNECTED, bluepy.bluepy.btle.BTLEException: Failed to connect to peripheral 00:1C:05:01:A1:2E, addr type: random
请问是否需要使用设备专属API?有哪些适合与BLE医疗设备通信的Python库?
解答
连接失败的排查与解决
- 地址类型错误:你指定了
"random"地址类型,但Nonin Onyx II大概率使用"public"地址类型,尝试修改连接代码:p = Peripheral("00:1C:05:01:A1:2E", "public") - 权限问题:Linux环境下运行BLE代码可能需要root权限,或者给bluepy的辅助工具添加权限:
sudo setcap 'cap_net_raw,cap_net_admin+eip' /usr/local/lib/python3.x/dist-packages/bluepy/bluepy-helper - UUID不匹配:你用的
0x1822是通用属性协议的UUID,并非Nonin设备的专属服务UUID。需要查阅设备官方文档,或用扫描工具确认设备实际提供的服务UUID。
是否需要设备专属API?
不一定必须用专属API,但要遵循Nonin的BLE通信协议。Nonin会公开设备的服务UUID、特征UUID及数据编码规则(比如血氧、心率的解析格式),基于这些文档用通用BLE库就能实现通信。如果官方有Python SDK,使用它会更省心,省去协议解析的工作量。
适合BLE医疗设备的Python库
- bluepy:轻量高效,适配Linux平台,支持扫描、连接、读写特征值,调整参数后大概率能适配你的设备。
- bleak:跨平台(Windows、macOS、Linux),API简洁,支持异步操作,对医疗设备兼容性较好。
- pybluez:老牌蓝牙库,覆盖经典蓝牙和BLE,功能全面文档丰富,不同平台BLE功能兼容性略有差异。
- Adafruit_Blinka:针对Adafruit硬件的库,支持BLE通信,适合搭配树莓派这类嵌入式设备连接医疗传感器。
内容的提问来源于stack exchange,提问作者santobedi
相关产品推荐
相关产品推荐

