|
|
  |
Склеиваются UDP пакеты |
|
|
|
Nov 21 2016, 13:54
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Daniil @ Nov 21 2016, 17:40)  . . . . но никак не рассчитывал что пакеты будут где-то ходить ТАК долго. . . . . У оператора в приоритете номер один - обеспечение голосовой связи абонентов. Затем - обеспечение работы ЕГО интернет-провайдера и любимых корпоративных клиентов (банки, платежные системы итп). И только потом - все остальные смертные. Так что сравнивать пользовательскую передачу данных и работу интернета даже у одного провайдера связи некорректно.
|
|
|
|
|
Nov 22 2016, 06:50
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 3-09-04
Из: Russia, Novosibirsk
Пользователь №: 590

|
Цитата(dxp @ Nov 22 2016, 11:43)  А с чего взяли, что склеивается именно на уровне UDP? Какой следующий уровень на сервере, который получает данные от UDP уровня? Как он обрабатывает данные? Подозреваю, что именно он и "чудит". Т.е. если у него в очереди несколько запросов (данных - payload'ов UDP), то он их обрабатывает скопом и кидает в выходную очередь, а та весь блок данных обрамляет в UDP пакет и отправляет на IP уровень и т.д. Вот дивайс и ловит "склеенные" ответы. Нет, проблема не в сервере. Я смотрел трафик от него Wiresharkом - уходят именно отдельные пакеты. Остается два предположения - или они склеиваются на стороне оператора (что мне кажется маловероятным, но смущает очень большая задержка), или приходят с минимальным интервалом на сам модем, а он уже их выдает одним потоком. Как добиться от модема раздельной передачи принятых UDP - выяснить не удалось, в документации этот момент как-то обошли (или я не там смотрел).
|
|
|
|
|
Nov 22 2016, 07:21
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 3-09-04
Из: Russia, Novosibirsk
Пользователь №: 590

|
Цитата(Alechek @ Nov 22 2016, 14:16)  99% проблема в операторе. Кто, кстати? Не Мегафон ли случаем? МТС
|
|
|
|
|
Nov 22 2016, 09:59
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(Daniil @ Nov 22 2016, 08:50)  Нет, проблема не в сервере. Я смотрел трафик от него Wiresharkом - уходят именно отдельные пакеты. Остается два предположения - или они склеиваются на стороне оператора (что мне кажется маловероятным, но смущает очень большая задержка), или приходят с минимальным интервалом на сам модем, а он уже их выдает одним потоком. Я думаю последнее, ничего нигде не склеивается, приходят на модем пачкой и он выдирает сам данные и выдает одним блоком. Цитата Как добиться от модема раздельной передачи принятых UDP - выяснить не удалось, в документации этот момент как-то обошли (или я не там смотрел). Можете еще раз посмотреть "SIM800 Series_TCPIP_Application Note", но там нет возможности читать из модема данные "по-пакетно", только просто есть суммарная длина данных, которые на данный момент лежат в приемном буфере модема. Причем именно уже ЧИСТЫХ данных, без обрамления. Я эту проблему как-то решил изначально, на уровне структуры своих пакетов (данных) и включения заголовков для приема. Пока применяю только AT+CIPHEAD=1, т.к. у меня обычно единственное подключение. И разобрать свои данные на отдельные пакеты после +IPD (data length): у меня не сложно.
|
|
|
|
|
Nov 26 2016, 20:25
|
Местный
  
Группа: Свой
Сообщений: 403
Регистрация: 29-04-11
Из: Украина
Пользователь №: 64 682

|
Цитата(Alechek @ Nov 22 2016, 10:16)  99% проблема в операторе. Кто, кстати? Не Мегафон ли случаем? Категорически не согласен. В данном случае оператор, как и слой UDP, не при чем. Лично приходилось сталкиваться с описанным явлением на других модулях, тестировать и разбираться с механизмами эффекта. Сервер, как и положено, отсылает три раздельных UDP ответа. Интернет, как и положено, направляет их на гейт сотового оператора (тут добавлю, что теоретически очередность ответов может измениться, но это бывает чрезвычайно редко, и все же их будет три). Сотовый оператор буферизирует ответы (по отдельности) и доставляет их на модуль. Если доставка сразу не удалась (сеть перегружена, модуль временно в "мертвой" зоне), попытки повторяются до тех пор, пока пакеты не будут доставлены. Именно тут формируется задержка в ситуации топикастера. Пакеты все же доставляются на модуль, но один за другим без пауз (но раздельно!), попадают в протокол TCP-стека, где буферизируются опять же раздельно. Затем модуль формирует URC и выдает результат. Вот тут они и склеиваются - из-за кривой реализации самого верхнего уровня - АТ-команд. Вообще, работа со стеком через UART - зло. Используйте openAT, и получите несколько последовательных вызовов callback, что даст возможность зачитать пакеты раздельно. Используете внешний МК - перенесите часть логики в openAT, создав свои команды. Не поленитесь освоить openAT: все будет просто, логично и избавит от львиной доли геморроя, постоянно поднимаемого в этой ветке форума, оно того стоит.
|
|
|
|
|
Nov 28 2016, 05:42
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 3-09-04
Из: Russia, Novosibirsk
Пользователь №: 590

|
Цитата(GeGeL @ Nov 27 2016, 03:25)  Сервер, как и положено, отсылает три раздельных UDP ответа. Интернет, как и положено, направляет их на гейт сотового оператора (тут добавлю, что теоретически очередность ответов может измениться, но это бывает чрезвычайно редко, и все же их будет три). Сотовый оператор буферизирует ответы (по отдельности) и доставляет их на модуль. Если доставка сразу не удалась (сеть перегружена, модуль временно в "мертвой" зоне), попытки повторяются до тех пор, пока пакеты не будут доставлены. Именно тут формируется задержка в ситуации топикастера. Пакеты все же доставляются на модуль, но один за другим без пауз (но раздельно!), попадают в протокол TCP-стека, где буферизируются опять же раздельно. Затем модуль формирует URC и выдает результат. Вот тут они и склеиваются - из-за кривой реализации самого верхнего уровня - АТ-команд. Спасибо за подробный ответ. Да, я пришел к этому же выводу. Пакеты склеивает модем. При отправке UDP пакетов с небольшим интервалом друг за другом ситуация со склеиванием на стороне модема воспроизводится почти 100%. Пока решил проблему костылями. Уже была мысль перенести часть логики на модем, но такое решение мне не показалось удобным. Вариант со своим стеком нравится больше, правда в данном случае не подходит, т.к. ресурсы MCU его изначально не предусматривали.
|
|
|
|
|
Nov 29 2016, 12:52
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(butthead2 @ Nov 29 2016, 17:13)  Господа программисты! Где написано что модем должен выдавать данные в виде пакетов? Ткните пожалуйста в строку документации. Не ели UDP?Так зачем пытаетесь обсуждать его вкус? Смотрим: Цитата(SIM800 Series_AT Command Manual_V1.09 ) 8.2.15 AT+CIPHEAD Add an IP Head at the Beginning of a Package Received На русский перевести? Да, автор не указал, какое значение у этой переменной. Кстати, представители Симком может пояснят суть команды 8.2.25 AT+CIPUDPMODE UDP Extended Mode ? Может в этом дело?
|
|
|
|
|
Nov 29 2016, 13:10
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 22-07-09
Пользователь №: 51 470

|
Цитата(Alechek @ Nov 29 2016, 15:52)  Не ели UDP?Так зачем пытаетесь обсуждать его вкус? Даже комментировать не хочется. Внешние отличия TCP от UDP в стеке можно на пальцах одной руки перечислить. Цитата(Alechek @ Nov 29 2016, 15:52)  8.2.15 AT+CIPHEAD Add an IP Head at the Beginning of a Package Received На русский перевести? А прочитать что там пониже в описании написано слабо? Или только название команды читаем? Или может на русский перевести?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|