Я пытаюсь прочитать двоичное сообщение от ESP32 с помощью брокера; Я написал фитоновый скрипт, где подписываюсь на тему. сообщение, которое я фактически получаю:
b'\x00\x00\x00?'
это двоичное сообщение с прямым порядком байтов с плавающей запятой, но у меня нет ключа для его декодирования. Есть ли способ найти ключ декодирования на основе этих данных? Это мой код Python:
import paho.mqtt.client as mqtt
def on_connect1(client1, userdata1, flags1, rc1):
client1.subscribe("ESP32DevKit123/mytopic")
def on_message1(client1, userdata1, msg1):
print(msg1.topic+" "+ "TESTENZA: "+str(msg1.payload))
client1 = mqtt.Client()
client1.username_pw_set(username = "myuser",password = "mypassword")
client1.on_connect = on_connect1
client1.on_message = on_message1
client1.connect("linkclient", portnumber, 60)
def twosComplement_hex(hexval):
bits = 16 # Number of bits in a hexadecimal number format
on_message1 = int(hexval, bits)
if on_message1 & (1 << (bits-1)):
on_message1 -= 1 << bits
return on_message1
client1.loop_forever()
У меня тоже выдает ошибку в строке on_message1 --= 1 << бит; ошибка говорит: Ожидаемый предполагаемый блок pylance. Любые решения?
Предоставленные вами данные: b'\x00\x00\x00?'
— я предполагаю, что это 0000003f
(пожалуйста, выведите шестнадцатеричный код с msg1.payload.hex()
).
Я также предполагаю, что под «двоичным прямым порядком байтов с плавающей запятой» вы подразумеваете двоичный код с плавающей запятой с прямым порядком байтов (IEE754) — обратите внимание, что это не соответствует используемому вами алгоритму (двойной комплимент). Включение этого ввода в онлайн-инструмент указывает на то, что ожидаемый результат ("Плавающая - Big Endian (ABCD)") равен 8.82818e-44
(это стоит проверить с помощью этого инструмента; иногда кодировка может быть не такой, как вы думаете!).
Давайте распакуем это с помощью python (дополнительную информацию см. в документации структура):
>>> from struct import unpack
>>> unpack('>f', b'\x00\x00\x00\x3f')[0]
8.828180325246348e-44
Примечания:
[0]
существует, потому что unpack
возвращает массив (вы можете распаковать более одного элемента из ввода)>f
- >
означает обратный порядок байтов, а f
число с плавающей запятой (стандартный размер = 4 байта)Причина, по которой ваш исходный код выдает ошибку «Ожидаемый предполагаемый блок», связана с отсутствием отступа в строке on_message1 -= 1 << bits
(поскольку она следует за if
, она должна иметь отступ). Алгоритм не имеет отношения к вашей задаче (но могут быть детали, которые я упускаю).