Я создаю проект python, который получает байты из последовательного порта. Байты - это ответы на отправленные команды (также через последовательный порт). Ответы не имеют идентификационных меток, т. Е. Из только байтов, я не знаю, какой именно ответ команды. Разумеется, декодер должен заранее знать, какая команда является ответом.Deserializing byte stream to objects
Я хотел бы иметь последовательность входящих байтов, представленную в виде вложенного объекта, указывающую кадр, заголовок, полезную нагрузку, декодированную полезную нагрузку и т. Д. Я бы предпочел нажимать 1 байт за раз на декодер и позвонить ему обратный вызов, когда он получил достаточное количество байтов для полного объекта (или errorCallback, если есть ошибки или таймаут).
Фактический кадр имеет начальный байт и конечный байт. Он имеет заголовок с несколькими байтами (некоторый id, статус команды (в основном, ok/fail)), один - байт длины данных. За этим следуют данные, за которыми следует контрольная сумма (один байт). Данные являются ответом на команду.
Ответ предсказуем в том, что предыдущие байты определяют, что означают будущие байты.
Пример ответа:
аа: 00: 0C: 00: 01: 00: 00: d3: 8d: d4: 5с: 50: 01: 04: е0: 6e: бб
Сломался :
aa: start frame
00: id
0c: data length (incl status): 12 bytes
00: command status (byte 1)
01: 1 data frame (byte 2)
00:00: flags of first data frame (byte 3-4)
d3:8d:d4:5c:50:01:04:e0: first data (aa and bb could be in it) (byte 5-12)
6e: checksum (includes all bytes except start, checksum, end bytes)
bb: end frame
Это является последовательным коммуникационным портом, байты может быть потерян (и дополнительными производства), и я ожидаю использовать тайм-аут для обработки сброса (никаких ответов не ожидается без первой команды отсылается).
Мне действительно хотелось бы, чтобы объектно-ориентированный подход, при котором декодер создавал объект, который при сериализации приводил бы к повторной последовательности байтов. Я использую python 2.7, но на самом деле любой объектно-ориентированный язык мог бы (пока я мог бы преобразовать его в python).
Я просто не уверен, как структурировать декодер, чтобы сделать его аккуратным. Я ищу полное решение, просто что-то, что заставит меня двигаться в правильном направлении (правильное направление здесь несколько субъективно).
У вас больше шансов получить положительный ответ на ваш вопрос, если вы разместите какой-либо код. Не беспокойтесь, если он не опрятен или не использует какие-либо продвинутые трюки. Не только публикация какого-либо кода показывает, что вы сделали честную попытку самостоятельно решить проблему, плита кода - очень полезный способ показать именно то, что вы пытаетесь сделать. –
Вы хотите сказать, что просто хотите проанализировать входящие ответы фиксированной длины на объекты (с атрибутами), которые можно преобразовать обратно в байты? – TisteAndii
У меня был какой-то код, но он был ужасен и на самом деле не работал должным образом. Кроме того, это не соответствовало моему желанию сделать его модульным. Ответ ниже TisteAndii на самом деле лучше, чем у меня. – galmok