#javascript #python #bluetooth-lowenergy #sanic
#javascript #python #bluetooth-низкое энергопотребление #sanic
Вопрос:
Я получаю ошибки при настройке сервера python с помощью sanic. Сервер запускается нормально, но вызов через терминал curl localhost:8000 -i
приводит к ошибке. По сути, я хочу асинхронно вызывать функцию python. Функция анализирует датчик температуры и влажности BLE. Функция python также работает нормально. Я использую функцию python, поскольку у меня нет эквивалента в JavaScript.
Я попытался изменить возвращаемые значения json, но ни одно из изменений не сработало.
Код:
#!/usr/bin/env python3
from sanic import Sanic
from sanic.response import json
now = datetime.now()
dt_string = now.strftime("%d/%m %H:%M:%S")
app = Sanic()
@app.route('/')
async def poll(mac):
"""Poll data from the sensor every x (60) seconds."""
while True:
backend = BluepyBackend
poller = MiTempBtPoller(mac, backend)
print("Parsing data")
print("FW: {}".format(poller.firmware_version()))
print("Name: {}".format(poller.name()))
print("Battery: {}".format(poller.parameter_value(MI_BATTERY)))
print("Temperature: {}".format(poller.parameter_value(MI_TEMPERATURE)))
print("Humidity: {}".format(poller.parameter_value(MI_HUMIDITY)))
with open('/home/pi/file.txt', 'a') as myfile:
myfile.write("Time: {}, Battery: {}; Temp: {}; Humidity: {}".format(datetime.now(), poller.parameter_value(MI_BATTERY), poller.parameter_value(MI_TEMPERATURE),
poller.parameter_value(MI_HUMIDITY)))
return json.dumps({"a": poller.parameter_value(MI_TEMPERATURE)})
sleep(60)
if __name__ == '__main__':
app.run(host='0.0.0.0', port = 8000)
poll('sensormac')
Ошибка:
[2020-11-15 17:46:39 0100] [1557] [INFO] Goin' Fast @ http://0.0.0.0:8000
[2020-11-15 17:46:39 0100] [1557] [INFO] Starting worker [1557]
Parsing data
[2020-11-15 17:46:43 0100] [1557] [ERROR] Exception occurred while handling uri: 'http://localhost:8000/'
Traceback (most recent call last):
File "/home/pi/.local/lib/python3.7/site-packages/sanic/app.py", line 939, in handle_request
response = await response
File "/home/pi/mitemp/btparser_server.py", line 25, in poll
print("FW: {}".format(poller.firmware_version()))
File "/home/pi/mitemp/mitemp_bt/mitemp_bt_poller.py", line 90, in firmware_version
with self._bt_interface.connect(self._mac) as connection:
File "/home/pi/mitemp/btlewrap/base.py", line 47, in __enter__
self._backend.connect(self._mac)
File "/home/pi/mitemp/btlewrap/bluepy.py", line 27, in _func_wrapper
return func(*args, **kwargs)
File "/home/pi/mitemp/btlewrap/bluepy.py", line 56, in connect
self._peripheral = Peripheral(mac, iface=iface, addrType=self.address_type)
File "/usr/local/lib/python3.7/dist-packages/bluepy/btle.py", line 391, in __init__
self._connect(deviceAddr, addrType, iface)
File "/usr/local/lib/python3.7/dist-packages/bluepy/btle.py", line 422, in _connect
if len(addr.split(":")) != 6:
AttributeError: 'Request' object has no attribute 'split'
Любые советы о том, как это исправить?
Ответ №1:
Итак, я заставил код работать, поместив backend = BluepyBackend
и poller = MiTempBtPoller('sensormacID', backend)
перед async def poll(mac)
И удалив while True: ... sleep(10)
цикл