我正在做一个项目,我需要从 BLE 环境传感器获取数据到树莓派上,并定期将其发送到服务器。我可以发送的越多越好。我在网上找到了一个脚本,它适用于我正在使用的特定类型的传感器,但它只读取一次数据并且不会更新,除非某些设备连接到传感器并断开连接。
因此,例如,如果我连续两次运行脚本,它将包含相同的数据,但如果我运行一次脚本,然后用我的手机连接和断开传感器,然后再次运行脚本,它将有新的, 更新数据。现在,我正在尝试使其完全自动化,并且不想每次都与手机保持连接和断开连接以获取新数据,因此我发现运行 gatttool 和连接具有与我相同的效果是连接和断开我的手机。所以我想出了一个有点笨拙的自动化解决方案,它都通过 crontab 运行:
- 运行脚本,使用 gatttool 连接并立即断开与传感器的连接
- 运行数据收集脚本并将数据发送到服务器
- 尽快重复
第 3 步是问题所在。我不能随心所欲地运行这个系列。理想的间隔是每 30 秒收集和发送一次数据,但由于某种原因,我间歇性地从 gatttool 收到错误消息:
connect error: Function not implemented (38)
我在 cron 计划的每次迭代中都会收到此错误,直到我设置了间隔以便脚本仅每2 分钟运行一次,即使如此,我也会间歇性地收到错误。我需要数据保持一致,并且绝对不像 2 分钟那样稀疏。1 分钟是我可以承受的发送数据的绝对最大间隔。
我怎样才能摆脱这个错误?
我连接和断开设备的脚本:
import pexpect
import time
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
scan = pexpect.spawn("sudo hcitool lescan")
time.sleep(5)
print(scan.terminate())
child = pexpect.spawn("sudo gatttool -i hci0 -b E2:D8:9D:FF:72:A2 -I -t random")
child.sendline("connect")
child.expect("Connection successful", timeout=7)
print("connected!")
child.sendline("disconnect")
child.sendline("quit")
child.sendline("sudo hciconfig hci0 down")
child.sendline("sudo hciconfig hci0 up")
print("done!")