嵌入式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
相关产品推荐
相关产品推荐

