Обработка протоколов
От: удусекшл  
Дата: 13.11.19 08:19
Оценка:
Здравствуйте!

Есть куча всякой периферии. Общение идет по CAN, RS232/UART, RS422/485, TCP, UDP и тп. Протоколы обычно совсем разные, но иногда — схожие, отличающиеся только нюансами способа передачи. Бывает peer-2-peer, бывает один-ко-многим. Один-ко-многим подразумевает мастера, слейвы только отвечают. Если peer-2-peer, или, как в CAN — коллизии разруливаются аппаратно — тогда слейвы могут асинхронно генерить сообщения.

Да, у протоколов может быть, а может не быть — адресация. Там, где транспорт обязывает иметь адрес для каждого пакета CAN/UDP, протокол пользуется средствами транспорта. Если это что-то типа RS232/UART, RS422/485, то адрес добавляется в посылку данных. peer-2-peer соединения могут быть установлены с использованием адреса один раз, и далее какая-либо адресация пропадает. Или не пропадает.

Хочется как-то более менее универсально описать всё это так, чтобы для добавления нового протокола (или способа использования существующего поверх другого транспорта) нужно было бы дописать самую малость — чтобы как из кубиков составлялось — просто заменил парочку и всё работает. Ну, и хочется, чтобы ранее написанный код от такой подмены не переставал работать, а без вопросов переехал бы на новый протокол/транспорт.

В принципе, кое-какие мысли есть, но буду рад всем идеям.

Пока затык вот такой сейчас. Как бы задание адреса сделать? Варианты примерно такие (терминологию/имена взял из API сокетов)
  1. sendTo, recvFrom и адрес куда/откуда
  2. send, recv — без адреса
  3. sendTo, recvFrom и опциональный адрес
  4. адрес отправки и адрес, откуда пришло — задавать/получать условно перед/после отправкой/приемом через опции сокета
  5. UPD — в перечисленных случаях подразумевалось, что полезная нагрузка — сообщение — передается туда-сюда как набор байтов. Есть еще вариант оперировать объектами Message, предоставляющими интерфейс IMessage, который в себе инкапсулирует и адрес и данные, и черта в ступе по желанию. Но это как-то не очень удобно начинает получаться, на мой взгляд
  6. UPD2 — адрес можно передавать вместе с данными — байтовый массив — префикс длинной N, где N зафисит от конкретного протокола
  7. еще варианты?

В целом, конечно, предлагаю обсудить не только описанный нюанс, но и вообще подобную архитектуру в комплексе

UPD По поводу адресов. Обычно это однобайтные значения. Но, если транспортом будет UDP, там уже как минимум 4х-байтный IPv4, а вообще адрес может быть произвольного размера. И тут не совсем понятно, то ли делать как в сокетах — гибко, но неудобно, то ли использовать только 32битное целое и считать, что его хватит всем, то ли совместить оба подхода перегрузками.
Отредактировано 13.11.2019 12:06 удусекшл . Предыдущая версия . Еще …
Отредактировано 13.11.2019 9:00 удусекшл . Предыдущая версия .
Re: Обработка протоколов
От: abrec Россия  
Дата: 13.11.19 08:51
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>Здравствуйте!


Адаптеры в виде микросервисов с реализацией нюансов обмена. далее из них более-менее стандартизованный протокол в процессинг.
Re[2]: Обработка протоколов
От: удусекшл  
Дата: 13.11.19 08:54
Оценка:
Здравствуйте, abrec, Вы писали:

У>>Здравствуйте!


A>Адаптеры в виде микросервисов с реализацией нюансов обмена. далее из них более-менее стандартизованный протокол в процессинг.


Ну да, как-то так, в общих чертах, я и планирую. Но интересно больше деталей )
И вот только как адреса вкорячить поудобнее — пока не придумал
Re[3]: Обработка протоколов
От: Qulac Россия  
Дата: 13.11.19 12:37
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>Здравствуйте, abrec, Вы писали:


У>>>Здравствуйте!


A>>Адаптеры в виде микросервисов с реализацией нюансов обмена. далее из них более-менее стандартизованный протокол в процессинг.


У>Ну да, как-то так, в общих чертах, я и планирую. Но интересно больше деталей )

У>И вот только как адреса вкорячить поудобнее — пока не придумал

Смотря какой уровень абстракции Вам нужен.В общем напрашивается два уровня: как уже сказали сервисы и то что под ними, хотя сервисов может и не быть. Вариантом может быть много, в общем виде у нас идет обмен сообщениями. Может подойти патерн "Шаблонный метод" у каждого класса протокола свой метод отправки сообщений.
Программа – это мысли спрессованные в код
Re: Обработка протоколов
От: Слава  
Дата: 14.11.19 14:56
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>В целом, конечно, предлагаю обсудить не только описанный нюанс, но и вообще подобную архитектуру в комплексе


Я считаю, что здесь может помочь только свой декларативный язык и кодогенерация по нему.
Re: Обработка протоколов
От: Pzz Россия https://github.com/alexpevzner
Дата: 14.11.19 18:37
Оценка: 7 (1)
Здравствуйте, удусекшл, Вы писали:

У>UPD По поводу адресов. Обычно это однобайтные значения. Но, если транспортом будет UDP, там уже как минимум 4х-байтный IPv4, а вообще адрес может быть произвольного размера. И тут не совсем понятно, то ли делать как в сокетах — гибко, но неудобно, то ли использовать только 32битное целое и считать, что его хватит всем, то ли совместить оба подхода перегрузками.


Под IPv6 32-битного числа не хватит. И под IPv4, если адрес включает номер порта, его тоже не хватит.

Сокеты сделаны очень хорошо, любой существующий протокол в них более-менее укладывается. Я бы от них отталкивался.

Другой вариант — это сделать, как в Plan9/Go: адрес в програмном интерфейсе — это просто строка, а преобразование его в "проводной" формат — это личное дело системы.
Re: Обработка протоколов
От: Вячеслав Бенедичук Интернет  
Дата: 22.11.19 05:06
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>UPD По поводу адресов. Обычно это однобайтные значения. Но, если транспортом будет UDP, там уже как минимум 4х-байтный IPv4, а вообще адрес может быть произвольного размера. И тут не совсем понятно, то ли делать как в сокетах — гибко, но неудобно, то ли использовать только 32битное целое и считать, что его хватит всем, то ли совместить оба подхода перегрузками.


посмотри на сетевую модель OSI.
https://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D1%82%D0%B5%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_OSI
У тебя сейчас смешаны разные уровни абстракции.
Тебе нужно определить API на верхнем, прикладном уровне, задать форматы, а потом постепенно опускаться вниз до физического.
Это позволит изолировать код приложения от физической реализации.
Специфика возникнет на более низких уровнях.
--
http://www.slideshare.net/vyacheslavbenedichuk
https://www.linkedin.com/in/vbenedichuk
Re: Обработка протоколов
От: Буравчик Россия  
Дата: 22.11.19 08:09
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>Здравствуйте!


У>Есть куча всякой периферии. Общение идет по CAN, RS232/UART, RS422/485, TCP, UDP и тп.


Думаю, плясать надо от вопроса "Для чего общаемся с периферией?". Например:
— получить информацию о возможностях устройства
— дать команду устройству
— получить состояние устройства
и т.п.

interface IDevice:
  getInfo()
  sendCommand()
  getStatus()



На основе этого сделать интерфейс работы с устройством.

Потом сделать много реализаций этого интерефейса — для CAN, TCP, RS232 и т.п.

У>Протоколы обычно совсем разные, но иногда — схожие, отличающиеся только нюансами способа передачи. Бывает peer-2-peer, бывает один-ко-многим. Один-ко-многим подразумевает мастера, слейвы только отвечают. Если peer-2-peer, или, как в CAN — коллизии разруливаются аппаратно — тогда слейвы могут асинхронно генерить сообщения.


Можно выделить общий функционал в отдельные классы — "устройство MasterSlave" и "устройство Peer2Peer"

У>Да, у протоколов может быть, а может не быть — адресация. Там, где транспорт обязывает иметь адрес для каждого пакета CAN/UDP, протокол пользуется средствами транспорта. Если это что-то типа RS232/UART, RS422/485, то адрес добавляется в посылку данных. peer-2-peer соединения могут быть установлены с использованием адреса один раз, и далее какая-либо адресация пропадает. Или не пропадает.


Адрес неразрывно связан с протоколом. Обобщать его смысла, наверное нет. Это детали реализации протокола работы с устройством.

class TCPDevice(ip_address) implements IDevice
class TCP6Device(ip6_address) implements IDevice
class RS232() implements IDevice  # no address
class TCPNetworkDevice(ip_address, gateway_address, mask) implements IDevice  # multi-address


У>Хочется как-то более менее универсально описать всё это так, чтобы для добавления нового протокола (или способа использования существующего поверх другого транспорта) нужно было бы дописать самую малость — чтобы как из кубиков составлялось — просто заменил парочку и всё работает. Ну, и хочется, чтобы ранее написанный код от такой подмены не переставал работать, а без вопросов переехал бы на новый протокол/транспорт.


Имхо, как сказал выше, надо поднять уровень абстракции, чтобы охватить все возможные варианты.
Работать не на уровне протокола, а выше — зачем этот протокол нужен.
Best regards, Буравчик
Re: Обработка протоколов
От: Mr.Delphist  
Дата: 29.01.20 16:00
Оценка: +1
Здравствуйте, удусекшл, Вы писали:


У>Хочется как-то более менее универсально описать всё это так, чтобы для добавления нового протокола (или способа использования существующего поверх другого транспорта) нужно было бы дописать самую малость — чтобы как из кубиков составлялось — просто заменил парочку и всё работает. Ну, и хочется, чтобы ранее написанный код от такой подмены не переставал работать, а без вопросов переехал бы на новый протокол/транспорт.


Звучит вот прямо как WCF (communication foundation) — всё в конфиге, а в случае изменений просто исправь конфиг. Вот только вышло у них как-то дико многословно и любви особой не снискало.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.