0

我正在做一个项目,我需要从 BLE 环境传感器获取数据到树莓派上,并定期将其发送到服务器。我可以发送的越多越好。我在网上找到了一个脚本,它适用于我正在使用的特定类型的传感器,但它只读取一次数据并且不会更新,除非某些设备连接到传感器并断开连接。

因此,例如,如果我连续两次运行脚本,它将包含相同的数据,但如果我运行一次脚本,然后用我的手机连接和断开传感器,然后再次运行脚本,它将有新的, 更新数据。现在,我正在尝试使其完全自动化,并且不想每次都与手机保持连接和断开连接以获取新数据,因此我发现运行 gatttool 和连接具有与我相同的效果是连接和断开我的手机。所以我想出了一个有点笨拙的自动化解决方案,它都通过 crontab 运行:

  1. 运行脚本,使用 gatttool 连接并立即断开与传感器的连接
  2. 运行数据收集脚本并将数据发送到服务器
  3. 尽快重复

第 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!")
4

1 回答 1

2

您在问题开始时链接到的脚本似乎没有连接到传感器。我对他们的脚本的理解是它正在从包含测量信息的传感器中扫描广告数据。这是很常见的事情,您可以获得许多不同类型的信标。

我推测您在连接和断开连接时会看到更频繁的测量,因为这会重置广告,因为连接时传感器不会进行广告。

在您链接到的 repo 的首页上,有一些关于如何更改测量间隔的信息。您说您希望每 30 秒一次,因此这将是1E您需要写入该特征的值。

他们建议使用一个应用程序来做到这一点。我已经使用过该应用程序,并且他们指向您的该应用程序没有任何具体内容。如果您需要其他选择,我发现nRF Connect应用程序非常适合此类活动。如果您的 PC 或 Raspberry Pi 上安装了 Chrome 或 Chromium 浏览器,那么您可以从那里输入以下 URL:

chrome://bluetooth-internals/#devices

Start Scan->Inspect传感器设备 -> 点击0C4C3010-7700-46F4-AA96D5E974E32A54服务 -> 点击0C4C3011-7700-46F4-AA96D5E974E32A54特征 -> 输入值 (1E) -> 按下Write按钮。

这应该允许您以您想要的测量频率使用他们的原始脚本。

于 2020-07-12T21:53:22.697 回答