LINUX.ORG.RU

Протокол для общения с железкой

 , ,


0

1

Имеется самодельная железка и самодельный же софт для работы с ней. Связь происходит по UART.

В настоящий момент времени железка умеет выполнять только одну команду - запрос своего состояния. И по этой команде она возвращает данные со всех своих датчиков и отладочные переменные (например, время цикла опроса датчиков).

Возвращаю данные в простом формате - набор чисел разделённых запятыми. Соответственно, в программе-клиенте захардкожено «1-ое число это температура, 2-ое число это время опроса, 3-е число это ...». В итоге получается, что при изменении данных, которые может выдавать девайс, софт, который работает с ними придётся переписывать.

Хочу, чтобы протокол связи умел в интроспекцию. То есть можно было бы особой командой запросить у железки схему данных (она вернёт какой тип (целое, вещественное, трёхмерный вектор, кватернион, строка) и какое имя имеет каждое поле), а потом уже обычным образом запрашивать циферки, разделёнными запятыми, однако программа уже будет знать как именно отобразить каждую из них (она сможет сделать к каждому числу в интерфейсе подпись, которую юзер поймёт, например).

В итоге при обновлении прошивки устройства, управляющий софт уже будет знать как работать с новыми данными.

Ну, разумеется, подобное и для управляющих команд (чтобы можно было запросить коды команд их user-friendly идентификаторы и список типов аргументов, а потом уже вызывать их).

Оверхеда быть не должно, потому что изменится лишь инициализация общения - надо будет вытянуть из железки описания всех команд и данных. А потом будет всё тот же легковесный протокол из значений, разделённых запятыми (принципиально, чтобы данные были текстовыми, во избежание ошибок синхронизации, а ещё чтобы в крайнем случае можно было работать с девайсом из minicom).

Конечно, я могу сделать свой велосипед, но нет ли уже готовых стандартов, которые мне подходят? Важно, чтобы после описания схемы данных обмен данными шёл с минимумом накладных расходов, так что всякие JSON'ы и XML идут лесом.

★★★★★

Последнее исправление: KivApple (всего исправлений: 1)

ASN.1 — компактно, выразительно, относительно просто, этерпрайзно (используется в LDAP, SNMP, x509, PBX, GSM, LTE ... просто везде и особенно в железе)

http://www.strozhevsky.com/free_docs/asn1_in_simple_words.pdf

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 3)
Ответ на: комментарий от beastie

Не плохо, однако нарушает два условия:

1) Протокол должен быть текстовый

2) Протокол должен позволить узнать текстовые имена всех полей структуры, да и самой структуры.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от KivApple
  1. Протокол бинарный — лучше подходит для embedded (его и парзить и генерить проще)
  2. Протокол self-describing, но не текстовый, да

Т.ч. советую переобдумать ТЗ. ;)

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 2)
Ответ на: комментарий от beastie

Если с первым ещё можно согласиться, то второе меня точно не устраивает. Я хочу чтобы программа создавала свой интерфейс на основе того, какие данные хочет возвращать железка. От типа будет зависеть представление данных (скажем, GPS-координаты можно отобразить в виде карты, а не просто чисел), а от имени - подпись (да, пусть краткая аббревиатура типа «CYCLE_TIME», но это лучше, чем «Поле данных #6»).

KivApple ★★★★★
() автор топика
Ответ на: комментарий от KivApple

Почитай уже, как оно там устроено. TL;DR: тип и размер передаётся вместе с данными. Есть набор базовых типов (primitive): struct, sequence, int, bool, time, string ... Можно делать и свои типы. (application / context-specific / private)

https://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One

PS: но голову там конечно поломать надо ;)

PPS: http://www.asn1c.com (компилятор, один из)

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 5)
Ответ на: комментарий от tailgunner

Над тобой пошутили, а ты повелся.

tailgunner ★★★★★ Старый быдлокодер и тролль. Характер скверный. Не женат.

beastie ★★★★★
()

Посмотри Modbus RTU. Стандартный протокол.

Zubok ★★★★★
()
Ответ на: комментарий от beastie

И что? ASN1 - это жуть и песец. Если уж действительно нужен двоичный протокол, то protobuf.

tailgunner ★★★★★
()

Сначала прочитал название темы как «протокол для общения с женщиной».

CARS ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.