Я работаю над проектом, в котором мне нужно получить данные с датчика окружающей среды BLE на Raspberry Pi и регулярно отправлять их на сервер. Чем чаще я могу отправлять, тем лучше. Я нашел онлайн-скрипт, который работает с датчиком определенного типа, с которым я работаю , но он считывает данные только один раз и не обновляется, если какое-либо устройство не подключается и не отключается от датчика.
Так, например, если я запускаю сценарий дважды подряд, он будет содержать одни и те же данные, но если я запускаю сценарий один раз, затем подключаюсь и отключаюсь от датчика с помощью телефона, затем запускаю сценарий. опять же, будут новые, обновленные данные. Теперь я пытаюсь сделать это полностью автоматизированным и не хочу постоянно подключаться и отключаться от моего телефона каждый раз, чтобы получать новые данные, поэтому я обнаружил, что запуск gatttool и подключение имеет тот же эффект, как если бы я должны были подключиться и отключиться от моего телефона. Итак, я придумала несколько неуклюжее решение для автоматизации, которое работает через crontab:
- Запустите скрипт, который подключается и немедленно отключается от датчика с помощью gatttool
- Запустите данные -collection script и отправьте данные на сервер
- Повторите как можно скорее
Шаг 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!")