Периодически возникающая ошибка соединения: функция не реализована (38) при соединении с gatttool - PullRequest
0 голосов
/ 03 мая 2020

Я работаю над проектом, в котором мне нужно получить данные с датчика окружающей среды BLE на Raspberry Pi и регулярно отправлять их на сервер. Чем чаще я могу отправлять, тем лучше. Я нашел онлайн-скрипт, который работает с датчиком определенного типа, с которым я работаю , но он считывает данные только один раз и не обновляется, если какое-либо устройство не подключается и не отключается от датчика.

Так, например, если я запускаю сценарий дважды подряд, он будет содержать одни и те же данные, но если я запускаю сценарий один раз, затем подключаюсь и отключаюсь от датчика с помощью телефона, затем запускаю сценарий. опять же, будут новые, обновленные данные. Теперь я пытаюсь сделать это полностью автоматизированным и не хочу постоянно подключаться и отключаться от моего телефона каждый раз, чтобы получать новые данные, поэтому я обнаружил, что запуск gatttool и подключение имеет тот же эффект, как если бы я должны были подключиться и отключиться от моего телефона. Итак, я придумала несколько неуклюжее решение для автоматизации, которое работает через crontab:

  1. Запустите скрипт, который подключается и немедленно отключается от датчика с помощью gatttool
  2. Запустите данные -collection script и отправьте данные на сервер
  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!")
...