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

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库?

解答

连接失败的排查与解决

  1. 地址类型错误:你指定了"random"地址类型,但Nonin Onyx II大概率使用"public"地址类型,尝试修改连接代码:
    p = Peripheral("00:1C:05:01:A1:2E", "public")
    
  2. 权限问题:Linux环境下运行BLE代码可能需要root权限,或者给bluepy的辅助工具添加权限:
    sudo setcap 'cap_net_raw,cap_net_admin+eip' /usr/local/lib/python3.x/dist-packages/bluepy/bluepy-helper
    
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:24:20