ESP8266 передача по UDP

chip7777
Offline
Зарегистрирован: 29.01.2022

На стандартном пакете через UDP не идет передача двоичных данных. Текстовые данные передаются прекрасно. Может кто нибудь сказать, какой пакет для этого можно использовать?

nik182
Offline
Зарегистрирован: 04.05.2015

Текстовые данные это частный случай двоичных данных. Если текстовые передаются, значит и двоичные передаются. Надо просто правильно готовить. Например перевести в HEX и передать. Будут передаваться как текстовые.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

chip7777 пишет:

не идет передача двоичных данных. Текстовые данные передаются прекрасно. 

Так не бывает.

Либо Вы из неправильно пихаете на стороне передатчика, либо неправильно берёте на стороне приёмника.

chip7777
Offline
Зарегистрирован: 29.01.2022

Обратите внимание, что в функции     Udp.write(TestBuffer); нет длины посылки. В буфер забивается строка, оканчивающееся 0. Этот 0

определяет длину посылки. Т.е 0 я передать не смогу. Преобразовывать двоичные данные в текстовые данные - это увеличение длины посылки. А мне нужно передать несколько десятков мегабайт за минимальное время.

 
Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Что-то новенькое на Плюке? Обсуждаем "проблему " без кода? 

chip7777
Offline
Зарегистрирован: 29.01.2022

Бывает. Точнее принимается посылка нулевой длины. Буфер на 5 знаков.  Если он содержит 1,2,3,4,0 - приходит посылка 0 длины. Если я в нем тупо меняю значения на '1','2','3','4',0 - то приходит посылка с длиной 4

chip7777
Offline
Зарегистрирован: 29.01.2022

Дополнение передача идет между ESP8266 и ПК(java.net.DatagramSocket)

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Ясно, кода не будет. Без кода можно попробовать использовать пакет из метро. Он вместительный

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

chip7777 пишет:

Бывает. Точнее принимается посылка нулевой длины. Буфер на 5 знаков.  Если он содержит 1,2,3,4,0 - приходит посылка 0 длины. Если я в нем тупо меняю значения на '1','2','3','4',0 - то приходит посылка с длиной 4

Так у Вас же ошибка в 32-ой строке кода приёмника! Кто же так пишет?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Rumata пишет:

можно попробовать использовать пакет из метро. Он вместительный

Метровый пакет - вещь хорошая, но он для восьмеричных данных. А двоичные из него вываливаются.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Да нормально всё с пакетами. Просто двоичные нужно сперва в мелкие, фасовочные пакеты разложить. Они в рулонах, около картошки висят. А еще называют себя "опытными"!!!

sadman41
Offline
Зарегистрирован: 19.10.2016

С метрушечками осторожней надо быть. Давеча смотрел в ютубе про китайские рулетки - у них разброс в 1/8 на метре.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

chip7777 пишет:

Т.е 0 я передать не смогу. Преобразовывать двоичные данные в текстовые данные - это увеличение длины посылки. А мне нужно передать несколько десятков мегабайт за минимальное время.

 
Если 0 Вы передать не можете, то без увеличения длины посылки не обойтись. Никак.

chip7777 пишет:

Бывает. Точнее принимается посылка нулевой длины. Буфер на 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 приведет не к увеличению, а, наоборот, к уменьшению длины посылки.

Logik
Offline
Зарегистрирован: 05.08.2014

chip7777 пишет:

Обратите внимание, что в функции     Udp.write(TestBuffer); нет длины посылки. В буфер забивается строка, оканчивающееся 0. Этот 0

определяет длину посылки. Т.е 0 я передать не смогу. Преобразовывать двоичные данные в текстовые данные - это увеличение длины посылки. А мне нужно передать несколько десятков мегабайт за минимальное время.

 

а если так

  udp.beginPacket(address, 123); //NTP requests are to port 123
  udp.write(packetBuffer, NTP_PACKET_SIZE);
  udp.endPacket();

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Logik пишет:

а если так

Еретик! 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Проверенный кусок кода , вполне себе работает

if(flag==1){
//UDP.beginPacket("172.20.10.2", 5555);
								UDP.beginPacket("192,169,43,1", 5555);
								UDP.write(aX);
								UDP.write(_aY);
								UDP.write(_aZ);
								UDP.write(_temp);
								UDP.write(_gX);
								UDP.write(_gY);
								UDP.write(_gZ);
    UDP.endPacket();
 flag=0;
 }

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Што-то я сомневаюсь, что оно "вполне себе работает" с таким: UDP.beginPacket("192,169,43,1", 5555);

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

sadman41 пишет:

Што-то я сомневаюсь, что оно "вполне себе работает" с таким: UDP.beginPacket("192,169,43,1", 5555);

А чем плох адрес и порт?

sadman41
Offline
Зарегистрирован: 19.10.2016

Адрес плох своей публичностью и разделителями.
На мой субъективный взгляд.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

sadman41 пишет:

Што-то я сомневаюсь, что оно "вполне себе работает" с таким: UDP.beginPacket("192,169,43,1", 5555);

А ты не сомневайся, оно работает

sadman41
Offline
Зарегистрирован: 19.10.2016

Прям с запятыми в адресе? Фантастика. 

Насчет IP вне gray subnets - это дело, конечно, пользовательское. А вот за запятые разделителями авторов библиотеки стоило пришибить. Ну, или Кактус нам тут дичь толкает...

Kakmyc
Offline
Зарегистрирован: 15.01.2018

sadman41 пишет:

Прям с запятыми в адресе? Фантастика. 

Насчет IP вне gray subnets - это дело, конечно, пользовательское. А вот за запятые разделителями авторов библиотеки стоило пришибить. Ну, или Кактус нам тут дичь толкает...

Ну это же строка, как ее парсить и что считать разделителями вопрос пожеланий заказчика

sadman41
Offline
Зарегистрирован: 19.10.2016

Строка - это одно, к ней претензий нет. Но когда строка - FDQN, то это совершенно другое и запятых там между ее частями, а в IPV4 - между октетами быть не могёт. Только точки. 

https://datatracker.ietf.org/doc/html/rfc3986

 A host identified by an IPv4 literal address is represented in
   dotted-decimal notation (a sequence of four decimal numbers in the
   range 0 to 255, separated by "."), as described in [RFC1123] by
   reference to [RFC0952].  Note that other forms of dotted notation may
   be interpreted on some platforms, as described in Section 7.4, but
   only the dotted-decimal form of four octets is allowed by this
   grammar.

      IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Я не знаю как реализована функция beginPacket», поэтому и задал свой вопрос. Наверное, если так сильно у Вас  бомбит, можно и ссылки на документацию (от чего бомбит) прикладывать, ну иди хотя бы намекать куда смотреть. А иначе это просто пустое сотресание (сказал бы воздуха, но по факту кнопок). Хотя..

Пока аргументы кактуса мне более логичны, если нет обратного.

sadman41
Offline
Зарегистрирован: 19.10.2016

BOOM, я понимаю, что вы там накатили.

Просто попробуйте где-нить ip-адрес с запятыми вместо точек ввести, если нет желания читать RFC. Потом расскажете, чем дело закончилось. 

chip7777
Offline
Зарегистрирован: 29.01.2022

Попробую

chip7777
Offline
Зарегистрирован: 29.01.2022

Logik пишет:

chip7777 пишет:

Обратите внимание, что в функции     Udp.write(TestBuffer); нет длины посылки. В буфер забивается строка, оканчивающееся 0. Этот 0

определяет длину посылки. Т.е 0 я передать не смогу. Преобразовывать двоичные данные в текстовые данные - это увеличение длины посылки. А мне нужно передать несколько десятков мегабайт за минимальное время.

 

а если так

  udp.beginPacket(address, 123); //NTP requests are to port 123
  udp.write(packetBuffer, NTP_PACKET_SIZE);
  udp.endPacket();

 

Большое спасибо! В такой версии udp.write двоичные данные передаются. Вопрос снят.