You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

LoPy与Windows设备通过BLE连接后自动断开的问题排查及代码求助

解决LoPy BLE连接Windows后自动断开的问题

我来帮你排查LoPy通过BLE和Windows电脑连接后几秒就断开的问题——看了你的代码,这里有几个关键的问题点和对应的修复方案:

1. 未完成的特征回调函数

你定义了char1_cb_handler但完全没写实现逻辑,而且也没把这个回调绑定到特征上。BLE连接很容易因为设备端没正确响应客户端的读写请求(比如缺少操作确认)而触发断开。你得补全回调逻辑,并且绑定到特征:

def char1_cb_handler(chr, data):
    # 处理客户端的读写请求,至少要返回确认信号
    if data is not None:
        # 如果是写操作,这里可以处理客户端发来的数据
        print(f"Received data from client: {data}")
    # 回复客户端,避免因无响应导致连接超时
    chr.value(chr.value())  # 返回当前特征值作为确认

# 在创建chr1之后,绑定回调到特征上
chr1.callback(trigger=Bluetooth.CHAR_WRITE_EVENT | Bluetooth.CHAR_READ_EVENT, handler=char1_cb_handler)

2. 调整BLE连接参数,避免超时断开

LoPy的BLE默认连接超时可能设置得比较短,如果Windows端没有频繁的交互,设备会认为连接失效而主动断开。你可以在初始化蓝牙后,手动设置更长的连接超时和合适的连接间隔:

# 初始化蓝牙后添加这段代码,调整连接参数
bluetooth.set_connection_params(
    min_conn_interval=7.5,  # 最小连接间隔(单位1.25ms,7.5对应9.375ms)
    max_conn_interval=10,   # 最大连接间隔
    slave_latency=0,        # 从设备可以跳过的连接事件数
    conn_sup_timeout=4000   # 连接超时时间(单位10ms,4000对应40秒)
)

3. 规范特征值的更新方式,开启通知功能

你当前只是直接设置特征值,但如果Windows端没有订阅这个特征的通知,不仅数据发不出去,还可能导致连接异常。建议开启BLE的通知机制,让客户端订阅后接收数据,这才是BLE传输数据的标准方式:

# 创建特征时,添加支持读和通知的属性
chr1 = srv1.characteristic(
    uuid=b'ab3451230123456',
    value=5,
    properties=Bluetooth.PROP_READ | Bluetooth.PROP_NOTIFY
)
# 添加客户端订阅通知所需的描述符
desc1 = chr1.descriptor(uuid=b'2902', value=bytes([0x00, 0x00]))

# 修改主循环,更新值后主动发送通知
while True:
    print("Send Data")
    new_data = "here is the data need to be send it should be a very very long string"
    chr1.value(new_data)
    # 主动发送通知给已连接的客户端
    chr1.notify(new_data)
    time.sleep(3.050)

4. 排查Windows端的客户端问题

有时候问题可能出在Windows侧的BLE客户端,比如客户端没有正确处理连接事件,或者没有保持活跃状态。你可以先用Windows官方的Bluetooth LE Explorer这类调试工具测试连接,确认是LoPy端的问题还是客户端的问题。

把这些修改整合到你的代码里,应该就能解决连接自动断开的问题了。

内容的提问来源于stack exchange,提问作者Ani

火山引擎 最新活动