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

嵌入式Linux下脚本执行BLE命令报错求助:register-application失败

解决Expect脚本执行蓝牙GATT注册失败问题

问题分析

手动执行bluetoothctl命令可正常配置BLE设备并被扫描发现,但用Expect脚本执行时,register-application步骤始终返回org.bluez.Error.Failed错误。核心诱因包括:

  • 依赖固定sleep等待操作完成,适配性差(不同设备响应速度差异大)
  • 命令参数格式与手动操作不一致(如权限参数多了冗余空格)
  • Expect匹配字符串不精准,导致过早发送下一条命令
  • 蓝牙电源开启时机过晚,部分前置操作因设备未通电失败

修复方案

1. 对齐手动命令的参数格式

手动执行时register-characteristic的权限参数是read,write,脚本里错误写成read, write(逗号后多空格),直接修正为无空格格式,避免BlueZ解析权限失败。

2. 用精准Expect匹配替代固定Sleep

删除所有固定sleep,改为等待bluetoothctl输出的成功提示,确保上一步操作真正完成后再执行下一步,比如:

  • 注册服务后等待Service registered
  • 注册特征后等待Characteristic registered

3. 修正匹配字符串的错误

  • 原脚本中"Advertising object registered "末尾多余空格,改为匹配"Advertising object registered"
  • 原脚本中"Changeing power on succeed"拼写错误,修正为"Changing power on succeeded"

4. 提前开启蓝牙电源

将power on移至脚本开头,避免后续操作因设备未通电导致隐性失败。

修改后的完整脚本

#!/usr/bin/expect -f
set timeout 10

spawn bluetoothctl
expect "Agent registered"

# 提前开启蓝牙电源
send -- "power on\r"
expect "Changing power on succeeded"

send -- "menu advertise\r"
expect "Menu advertise:"

send -- "manufacturer 0xffff 0x12 0x34\r"
expect "Set manufacturer data successfully"
send -- "name myAX564\r"
expect "Set name successfully"
send -- "discoverable on\r"
expect "Set discoverable on succeeded"
send -- "back\r"
expect "Menu main:"

send -- "advertise on\r"
expect "Advertising object registered"

send -- "menu gatt\r"
expect "Menu gatt:"

send -- "register-service e2d36f99-8909-4136-9a49-d825508b297b\r"
expect "Primary (yes/no):"
send -- "yes\r"
expect "Service registered"

send -- "register-characteristic 0x1234 read\r"
expect "Enter value:"
send -- "0xFA\r"
expect "Characteristic registered"

send -- "register-characteristic 0x4567 read,write\r"
expect "Enter value:"
send -- "0xFE\r"
expect "Characteristic registered"

send -- "register-application\r"
expect "Application registered"

send -- "back\r"
expect "Menu main:"
send -- "exit\r"
expect eof

额外验证建议

  • 执行脚本前,先重置蓝牙状态:bluetoothctl power off && bluetoothctl power on,避免其他进程占用设备
  • 若仍失败,查看蓝牙服务日志journalctl -u bluetooth.service,日志会给出具体错误原因(如UUID重复、权限冲突等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:30:21