Size: a a a

2020 December 18

jp

jon pedro in Embedded Group
Ponytale 🇷🇺
я юзаю один уникальный символ как стартовый + синхронизирующий. до того обсуждения юзал 0xFF (все единицы, потом гарантированно один стоповый бит вставляется аппаратно - есть за что зацепиться). сейчас понял, что нужно его изменить на биточередующийся, например 0xAA - будет надежней. Но не суть.

Идея в том, что стартовый байт - уникальный, в теле пакета встретиться не имеет права. А как это обеспечить, если бинарные данные? А тогда вводим еще один, другой, служебный символ. Если в теле пакета встретился совпадач со стартовым, то он заменяется на пару служебный + любой другой. Если встретился совпадающий со служебным - то шлется два служебных. Примерно как сделано форматирование с обработке строк в си: '\0' = 0x00, '\\' = \
Понял, у тебя не бывает в посылках повторения первого символа. Если он появляется, ты помечаешь, что символ подменен и с стороны сервера это дешифруешь.
источник

P

Ponytale 🇷🇺 in Embedded Group
Alexander
0xAA55 (или что-то похожее) в качестве заголовка ставь, а в конце пакета фиксированного размера контрольную сумму. )
👍
источник

jp

jon pedro in Embedded Group
А мне понравился твой подход, надо будет проанализировать 2 варианта, твой и вариант просто с двумя байтами. Как мне кажется 2 байта же могут последовательно совпасть всего с 1/(256^2) вероятностью, но надо бы и то и то затестить, благо оба варианта не такие уж сложные вреализации, заложу оба) вдруг где палка выстрелит или нет
источник

P

Ponytale 🇷🇺 in Embedded Group
jon pedro
Понял, у тебя не бывает в посылках повторения первого символа. Если он появляется, ты помечаешь, что символ подменен и с стороны сервера это дешифруешь.
ага
источник

P

Ponytale 🇷🇺 in Embedded Group
jon pedro
А мне понравился твой подход, надо будет проанализировать 2 варианта, твой и вариант просто с двумя байтами. Как мне кажется 2 байта же могут последовательно совпасть всего с 1/(256^2) вероятностью, но надо бы и то и то затестить, благо оба варианта не такие уж сложные вреализации, заложу оба) вдруг где палка выстрелит или нет
не полагайся на случай. поверь, будут проблемы.
источник

s

shadowsoul in Embedded Group
Ponytale 🇷🇺
не полагайся на случай. поверь, будут проблемы.
если какая-то хуйня может случится - так она ведь обязательно)
источник

jp

jon pedro in Embedded Group
Ponytale 🇷🇺
не полагайся на случай. поверь, будут проблемы.
Поэтому и говорю, заложу оба) аш интересно стало почему могут у первого варианта возникнуть проблемы. Вероятность битых посылок ломает приём сразу всех данных?
источник

P

Ponytale 🇷🇺 in Embedded Group
@Bahoo08 ты можешь еще, если не важна скорость и ценой увеличения длины пакета и проц. времени применять как стартовый любой не десятичный символ, а тело (и CRC) кодировать десятичными - сишник в стандартных библиотеках предлагает весь нужный инструментарий преобразования таких строк друг в друга
источник

jp

jon pedro in Embedded Group
А в твоём варианте мы всегда знаем первый байт, значит меньше шанс, что мы потеряем сразу весь пакет?
источник

P

Ponytale 🇷🇺 in Embedded Group
ладно бы просто потерять пакет. часто гораздо важнее другое: принять неверный пакет за верный. CRC никогда не гарантирует 100% верификации пакета. да вообще ничто не гарантирует :) Можно лишь уменьшатиь вероятность такой ошибки. Ну вот лично мне неверно принятый пакет управления очень критичен - все идет вразнос. Поэтому и предприняты все меры (уникальный стартовый, фиксированная длина, CRC, непрерывные посылки, пост-фильтрация принятых констант фильтрами низких частот) - все лишь для решения одной единственной задачи: задачи двух генералов :). Точнее не решения, а приближения к решению, так никогда и не достижимому :)
источник

s

shadowsoul in Embedded Group
Ponytale 🇷🇺
ладно бы просто потерять пакет. часто гораздо важнее другое: принять неверный пакет за верный. CRC никогда не гарантирует 100% верификации пакета. да вообще ничто не гарантирует :) Можно лишь уменьшатиь вероятность такой ошибки. Ну вот лично мне неверно принятый пакет управления очень критичен - все идет вразнос. Поэтому и предприняты все меры (уникальный стартовый, фиксированная длина, CRC, непрерывные посылки, пост-фильтрация принятых констант фильтрами низких частот) - все лишь для решения одной единственной задачи: задачи двух генералов :). Точнее не решения, а приближения к решению, так никогда и не достижимому :)
не, ну есть вариант гарантировать правильность пакета... HMAC со счётчиком лепить, но это оверкилл в большинстве случаев)
источник

P

Ponytale 🇷🇺 in Embedded Group
jon pedro
Поэтому и говорю, заложу оба) аш интересно стало почему могут у первого варианта возникнуть проблемы. Вероятность битых посылок ломает приём сразу всех данных?
ну как минимум: если у тебя допустим в теле пакета совпадач со стартовым, и предположим пакеты не меняются - шлешь все-время одинаковые и твой приемник зацепился за не тот стартовый байт - ну у тебя тогда все пакеты просто съедут и будут браковаться по CRC (в лучшем случае) или в самом худшем - проходить чушь. Все, приехали.
источник

P

Ponytale 🇷🇺 in Embedded Group
А эта ситуация кстати - оооочень реальная. У меня случалась.
источник

P

Ponytale 🇷🇺 in Embedded Group
shadowsoul
не, ну есть вариант гарантировать правильность пакета... HMAC со счётчиком лепить, но это оверкилл в большинстве случаев)
да, есть варианты. я чет заболтался. в двух генералах там стоит задача не только доставить пакет, но и гарантированно доставить инфу отправителю о том, что пакет доставлен. а это уже невозможно.
источник

jp

jon pedro in Embedded Group
Ponytale 🇷🇺
ладно бы просто потерять пакет. часто гораздо важнее другое: принять неверный пакет за верный. CRC никогда не гарантирует 100% верификации пакета. да вообще ничто не гарантирует :) Можно лишь уменьшатиь вероятность такой ошибки. Ну вот лично мне неверно принятый пакет управления очень критичен - все идет вразнос. Поэтому и предприняты все меры (уникальный стартовый, фиксированная длина, CRC, непрерывные посылки, пост-фильтрация принятых констант фильтрами низких частот) - все лишь для решения одной единственной задачи: задачи двух генералов :). Точнее не решения, а приближения к решению, так никогда и не достижимому :)
Ну я ломаную посылку на глаз определяю сразу, так что переживу)
источник

jp

jon pedro in Embedded Group
Ponytale 🇷🇺
да, есть варианты. я чет заболтался. в двух генералах там стоит задача не только доставить пакет, но и гарантированно доставить инфу отправителю о том, что пакет доставлен. а это уже невозможно.
Модбас же. Но медленно
источник

h

hardegor in Embedded Group
Ponytale 🇷🇺
ладно бы просто потерять пакет. часто гораздо важнее другое: принять неверный пакет за верный. CRC никогда не гарантирует 100% верификации пакета. да вообще ничто не гарантирует :) Можно лишь уменьшатиь вероятность такой ошибки. Ну вот лично мне неверно принятый пакет управления очень критичен - все идет вразнос. Поэтому и предприняты все меры (уникальный стартовый, фиксированная длина, CRC, непрерывные посылки, пост-фильтрация принятых констант фильтрами низких частот) - все лишь для решения одной единственной задачи: задачи двух генералов :). Точнее не решения, а приближения к решению, так никогда и не достижимому :)
тогда на одну команду посылай 3 пакета с разными данными - если все 3 пакета с crc правильные, тогда команда выполняй
источник

jp

jon pedro in Embedded Group
Ponytale 🇷🇺
ну как минимум: если у тебя допустим в теле пакета совпадач со стартовым, и предположим пакеты не меняются - шлешь все-время одинаковые и твой приемник зацепился за не тот стартовый байт - ну у тебя тогда все пакеты просто съедут и будут браковаться по CRC (в лучшем случае) или в самом худшем - проходить чушь. Все, приехали.
Страшные вещи рассказываешь, но учту, хоть ни разу с этим не сталкивался
источник

P

Ponytale 🇷🇺 in Embedded Group
jon pedro
Модбас же. Но медленно
не, не о том речь. загугли, если интересно - это известная логическая дилемма
источник

P

Ponytale 🇷🇺 in Embedded Group
hardegor
тогда на одну команду посылай 3 пакета с разными данными - если все 3 пакета с crc правильные, тогда команда выполняй
а почему не 103? :)
источник