ESP8266 передача по UDP
- Войдите на сайт для отправки комментариев
Сб, 29/01/2022 - 11:43
На стандартном пакете через UDP не идет передача двоичных данных. Текстовые данные передаются прекрасно. Может кто нибудь сказать, какой пакет для этого можно использовать?
Текстовые данные это частный случай двоичных данных. Если текстовые передаются, значит и двоичные передаются. Надо просто правильно готовить. Например перевести в HEX и передать. Будут передаваться как текстовые.
не идет передача двоичных данных. Текстовые данные передаются прекрасно.
Так не бывает.
Либо Вы из неправильно пихаете на стороне передатчика, либо неправильно берёте на стороне приёмника.
Обратите внимание, что в функции Udp.write(TestBuffer); нет длины посылки. В буфер забивается строка, оканчивающееся 0. Этот 0
определяет длину посылки. Т.е 0 я передать не смогу. Преобразовывать двоичные данные в текстовые данные - это увеличение длины посылки. А мне нужно передать несколько десятков мегабайт за минимальное время.
Что-то новенькое на Плюке? Обсуждаем "проблему " без кода?
Бывает. Точнее принимается посылка нулевой длины. Буфер на 5 знаков. Если он содержит 1,2,3,4,0 - приходит посылка 0 длины. Если я в нем тупо меняю значения на '1','2','3','4',0 - то приходит посылка с длиной 4
Дополнение передача идет между ESP8266 и ПК(java.net.DatagramSocket)
Ясно, кода не будет. Без кода можно попробовать использовать пакет из метро. Он вместительный
Бывает. Точнее принимается посылка нулевой длины. Буфер на 5 знаков. Если он содержит 1,2,3,4,0 - приходит посылка 0 длины. Если я в нем тупо меняю значения на '1','2','3','4',0 - то приходит посылка с длиной 4
Так у Вас же ошибка в 32-ой строке кода приёмника! Кто же так пишет?
можно попробовать использовать пакет из метро. Он вместительный
Метровый пакет - вещь хорошая, но он для восьмеричных данных. А двоичные из него вываливаются.
Да нормально всё с пакетами. Просто двоичные нужно сперва в мелкие, фасовочные пакеты разложить. Они в рулонах, около картошки висят. А еще называют себя "опытными"!!!
С метрушечками осторожней надо быть. Давеча смотрел в ютубе про китайские рулетки - у них разброс в 1/8 на метре.
Т.е 0 я передать не смогу. Преобразовывать двоичные данные в текстовые данные - это увеличение длины посылки. А мне нужно передать несколько десятков мегабайт за минимальное время.
Бывает. Точнее принимается посылка нулевой длины. Буфер на 5 знаков. Если он содержит 1,2,3,4,0 - приходит посылка 0 длины. Если я в нем тупо меняю значения на '1','2','3','4',0 - то приходит посылка с длиной 4
Ну, вообще-то под [неслужебными] символами обычно понимаются байты с кодами от 32 до 126 включительно. Т.е. если допускаются к передаче только эти коды, то байты из диапазона 0-31 и 127-255 Вы передать не сможете. Соответственно, увеличивать длину посылки требуется не для единственного значения байта, а более чем для половины всех значений.
Думаю, самый стандартный из более или менее компактных способов - UUE-кодирование: преобразует каждые 3 байта в 4 символа. Т.е. длина посылки возрастает лишь на треть.
Опять же, перед UUE-кодированием данные можно попытаться сжать. Тогда есть вероятность, что zip+UUE приведет не к увеличению, а, наоборот, к уменьшению длины посылки.
Обратите внимание, что в функции Udp.write(TestBuffer); нет длины посылки. В буфер забивается строка, оканчивающееся 0. Этот 0
определяет длину посылки. Т.е 0 я передать не смогу. Преобразовывать двоичные данные в текстовые данные - это увеличение длины посылки. А мне нужно передать несколько десятков мегабайт за минимальное время.
а если так
а если так
Еретик!
Проверенный кусок кода , вполне себе работает
Што-то я сомневаюсь, что оно "вполне себе работает" с таким:
UDP.beginPacket(
"192,169,43,1"
, 5555);
Што-то я сомневаюсь, что оно "вполне себе работает" с таким:
UDP.beginPacket(
"192,169,43,1"
, 5555);
А чем плох адрес и порт?
Адрес плох своей публичностью и разделителями.
На мой субъективный взгляд.
Што-то я сомневаюсь, что оно "вполне себе работает" с таким:
UDP.beginPacket(
"192,169,43,1"
, 5555);
А ты не сомневайся, оно работает
Прям с запятыми в адресе? Фантастика.
Насчет IP вне gray subnets - это дело, конечно, пользовательское. А вот за запятые разделителями авторов библиотеки стоило пришибить. Ну, или Кактус нам тут дичь толкает...
Прям с запятыми в адресе? Фантастика.
Насчет IP вне gray subnets - это дело, конечно, пользовательское. А вот за запятые разделителями авторов библиотеки стоило пришибить. Ну, или Кактус нам тут дичь толкает...
Ну это же строка, как ее парсить и что считать разделителями вопрос пожеланий заказчика
Строка - это одно, к ней претензий нет. Но когда строка - FDQN, то это совершенно другое и запятых там между ее частями, а в IPV4 - между октетами быть не могёт. Только точки.
https://datatracker.ietf.org/doc/html/rfc3986
Я не знаю как реализована функция beginPacket», поэтому и задал свой вопрос. Наверное, если так сильно у Вас бомбит, можно и ссылки на документацию (от чего бомбит) прикладывать, ну иди хотя бы намекать куда смотреть. А иначе это просто пустое сотресание (сказал бы воздуха, но по факту кнопок). Хотя..
Пока аргументы кактуса мне более логичны, если нет обратного.
BOOM, я понимаю, что вы там накатили.
Просто попробуйте где-нить ip-адрес с запятыми вместо точек ввести, если нет желания читать RFC. Потом расскажете, чем дело закончилось.
Попробую
Обратите внимание, что в функции Udp.write(TestBuffer); нет длины посылки. В буфер забивается строка, оканчивающееся 0. Этот 0
определяет длину посылки. Т.е 0 я передать не смогу. Преобразовывать двоичные данные в текстовые данные - это увеличение длины посылки. А мне нужно передать несколько десятков мегабайт за минимальное время.
а если так
Большое спасибо! В такой версии udp.write двоичные данные передаются. Вопрос снят.