Я использую bluepy, и у меня есть базовый код для чтения значений, поступающих от arduino, теперь у меня проблема: когда я пытаюсь извлечь переменную num или tum из def handleNotification
, у меня нет никакого успеха в коде:
Поэтому я хочу напечатать переменную, чтобы через некоторое время использовать ее в формуле.
Второй вариант будет спрашивать, как я могу упростить свой код, чтобы просто подключаться и получать данные?
Это мой код:
from bluepy import btle
class MyDelegate(btle.DefaultDelegate):
def __init__(self):
btle.DefaultDelegate.__init__(self)
# ... initialise here
def handleNotification(self, cHandle, data):
print("\n- handleNotification -\n")
#print(data)
num = list(data)[0]
#print(num)
tum = int.from_bytes(data, byteorder='big')
#print(tum)
#print(data.decode("utf-8"))#newline
# ... perhaps check cHandle
# ... process 'data'
# Initialisation -------
p = btle.Peripheral("3a:dc:f3:6f:b1:dc")
p.setDelegate( MyDelegate() )
# Setup to turn notifications on, e.g.
svc = p.getServiceByUUID("81c30e5c-1101-4f7d-a886-de3e90749161")
ch = svc.getCharacteristics("81c30e5c-2101-4f7d-a886-de3e90749161")[0]
# ch.write( setup_data )
setup_data = b"\x01\00"
p.writeCharacteristic(ch.valHandle+1, setup_data)
# Main loop --------
while True:
if p.waitForNotifications(1.0):
# handleNotification() was called
continue
print("Waiting...")
# Perhaps do something else here
Из вашего вопроса не ясно, что вы хотите сделать с числом, которое вы прочитали из Arduino.
Типичная структура может заключаться в том, чтобы код BLE обрабатывал только чтение кода из Arduino, превращая его из байтов в какую-то другую структуру перед передачей. Значения характеристик всегда будут отправляться в виде байтов и могут иметь несколько значений, упакованных в одно уведомление.
Одним из способов структурирования может быть передача имени функции в MyDelegate
, которое будет использоваться при получении уведомлений. Например
from bluepy import btle
def my_main_code(new_value):
print(new_value)
class MyDelegate(btle.DefaultDelegate):
def __init__(self, callback):
self.callback = callback
btle.DefaultDelegate.__init__(self)
# ... initialise here
def handleNotification(self, cHandle, data):
# Convert data to be easily consumed by callback
tum = int.from_bytes(data, byteorder='big')
self.callback(tum)
# Initialisation -------
p = btle.Peripheral("3a:dc:f3:6f:b1:dc")
p.setDelegate( MyDelegate(my_main_code) )
# Setup to turn notifications on, e.g.
svc = p.getServiceByUUID("81c30e5c-1101-4f7d-a886-de3e90749161")
ch = svc.getCharacteristics("81c30e5c-2101-4f7d-a886-de3e90749161")[0]
setup_data = b"\x01\00"
p.writeCharacteristic(ch.valHandle+1, setup_data)
# Main loop --------
while True:
if p.waitForNotifications(1.0):
# handleNotification() was called
continue
print("Waiting...")
Чтобы ответить на ваше «обновление 2» о значении Bluetooth, определяющем, что отправляется через mqtt, я сделал следующее. Вокруг этого должно быть много отказов от ответственности, поскольку у меня нет возможности проверить это. Я попытался как можно точнее следовать структуре вашего вопроса вместе с несколькими предположениями (которые могут быть неверными). Структура кода может быть примерно такой:
from bluepy import btle
import paho.mqtt.publish as publish
hostname = "????????"
def publish_mqtt(new_value):
print(new_value)
if new_value == 1:
publish.single("dance/lights", "on", hostname=hostname)
else:
publish.single("dance/lights", "off", hostname=hostname)
class MyDelegate(btle.DefaultDelegate):
def __init__(self, callback):
self.callback = callback
btle.DefaultDelegate.__init__(self)
# ... initialise here
def handleNotification(self, cHandle, data):
# Convert data to be easily consumed by callback
tum = int.from_bytes(data, byteorder='big')
self.callback(tum)
# Initialisation -------
p = btle.Peripheral("3a:dc:f3:6f:b1:dc")
p.setDelegate(MyDelegate(publish_mqtt))
# Setup to turn notifications on, e.g.
svc = p.getServiceByUUID("81c30e5c-1101-4f7d-a886-de3e90749161")
ch = svc.getCharacteristics("81c30e5c-2101-4f7d-a886-de3e90749161")[0]
setup_data = b"\x01\00"
p.writeCharacteristic(ch.valHandle+1, setup_data)
# Main loop --------
while True:
if p.waitForNotifications(1.0):
# handleNotification() was called
continue
print("Waiting...")
Я проверял, а также делал это до вашего поста, и это сработало
На данный момент вы никуда не ставите
num
. Как толькоhandleNotification
выходит, значениеnum
исчезает. Я не уверен, что понимаю, что именно вы хотите сделать, но вы можете сохранить ссылку наMyDelegate
при его создании (назовите егоdelegate
), затем внутриhandleNotification
выполнитеself.num = list(data)[0]
, затем в своем основном коде вы можете получить значение черезdelegate.num
. Простите меня, если я неправильно понял вопрос.