Evgeniy
Таймаут recv удалось установить?
Dmitriy
Но дисконект нифига не быстро детектится, даже если нормальное закрытие порта с другой стороны происходит.
Dmitriy
Dmitriy
Примеры смотрели?
Evgeniy
через sock options?
Dmitriy
Evgeniy
тогда завтра еще раз проверю, наверняка достаточно будет блокирующего варианта + таймаут поставить
Dmitriy
Не более 5мс задержка на прохождение пакета туда и обратно. Так что если больше - не правильно настроили сокет.
Evgeniy
А какие настройки кроме TCP_NODELAY влияют еще?
Dmitriy
Dmitriy
Не вникал. Скопировал пример - работает.
Evgeniy
ага, оно есть, только с recv разобраться осталосьб
Dmitriy
А что с ним не так?
Dmitriy
Dmitriy
Ну ок, не буду больше скидывать...
Dmitriy
Dmitriy
Читай документацию
Evgeniy
Вроде бы как KEEPALIVE достаточно редко отправляется, какой в итоге выбрали период отправки ACK?
Evgeniy
По умолчанию что-то около двух часов
Dmitriy
321
https://habr.com/ru/company/sberdevices/news/t/659555/
321
Evgeniy
Любопытно, зачем BUF_SIZE - 1 - пережиток от текстового протокола?
Evgeniy
Вот vTaskDelay(2) в таком решении мне не нравится - зря только проц грузит
Dmitriy
Dmitriy
Evgeniy
А как надо?
Вот мне тоже любопытно - как совместить блокировку на recv с надежным детектом дисконнекта
ok-home
Вот vTaskDelay(2) в таком решении мне не нравится - зря только проц грузит
в смысле грузит - оно как раз говорит займитесь в это время своими делами, или ничего не делайте. А зачем дисконект ловить ? Да еще и быстро ? Ну никто не принимает со стороны tcp, ну и ладно - ничего и отправлять не будем. Чтобы не блокировать проц, вроде как много раз писали - uart в своей задаче, tcp в своей. И даже думать не нужно кто где отвалился, никто никого не блокирует
Dmitriy
Evgeniy
Dmitriy
Evgeniy
а, ну да, там 2 мс, тогда еще больше грузит 😁
Evgeniy
Dmitriy
Evgeniy
Dmitriy
Dmitriy
Ток ради чего не понятно. Вы знаете как под капотом эти функции реализованы? По сути, получается тот же самый код, только сложнее. Можно сравнить загрузку проца, если интересно
ok-home
Так я не настаиваю - вы совет спрашиваете - их есть у нас. Но мне 4 трансфера в одном while - да еще и трансферы которые могут в любой момент отвалиться .... не нравится.
Dmitriy
Evgeniy
У меня на самом деле проект уперся в то, что устройства клиента работают по протоколу, где важно выдерживать жестко тайминги, а если на уровне прозрачного обмена через TCP из сокета будет считано сразу 2 "команды" - устройство проигнорит вторую и это выглядит как сбой, потому что сделать нормальный парсер разработчик не смог. Такая же фигня у них была через прозрачный мост Bluetooth и иногда приглючивало в связке с USB <> UART, но редко, всё же не радиоканал.
Dmitriy
Evgeniy
В итоге использовал websockets и реализовал протокол обмена с устройством внутри WiFi модуля. Другой архитектуры здесь быть не может. Кстати - на клиентской стороне они не смогли осить правильно сделать обмен через сокеты, потому что не знают как это делать
Evgeniy
Теперь все тайминги выдерживаются правильно, но эти хм... господа, не хотят использовать готовую библиотечку для вебсокетов, а хотят сами дальше возиться с сокетами!
Evgeniy
Причем в своей документации на оборудование - этот момент с таймингами не указан, с готовым модулем Bluetooth этот вариант также не взлетел - там тоже тайминги по рандому не выдерживались. Модуль естественно, не самодельный)
Dmitriy
Evgeniy
Это верно, видимо придется новый костыль изобретать.
Dmitriy
Evgeniy
уже есть, для тех же приборов 😁
ok-home
ну так положить что нужно в очередь, и забирать тогда когда клиент готов забрать по их протоколу. Если вовремя не забрали.... ну значит не готовы или нет связи
Dmitriy
жесть какая то, гонять доли мегабайта с таймингами
Dmitriy
обычно или байты с таймингами или метры со смыслом
Dmitriy
вон в том же SIP пакеты и 200 байт нет
Evgeniy
жесть какая то, гонять доли мегабайта с таймингами
там: загаловок с длиной пакета, payload, CRC16. Можно вообще таймауты не делать. Ждать только загаловок и чистить буфер, если CRC не сошлась, как это везде сделано. Тогда грузи сколько хочешь этих команд - устройство их выполнит. По факту: часть команд не имеют ответов, другая часть будет принята через определенный тайминг, а приемный буфер чистится в любом случае после одной команды
Evgeniy
Еще крутая фишка: на RS485 ответ через 1.6 мкс после СТОП бита команды. И это на 921600. С таким таймингом не справится бОльшая часть серийных мостов.
Dmitriy
Dmitriy
есть же mqtt
Dmitriy
по последнему я видео гонял. Карл, видео!!!! и оно работало
Evgeniy
modbus - сложна!)
Evgeniy
на самом деле - для ускорения обмена кастомный протокол такой, то, что готовое оборудование это не переванивает - никого не волнует
Dmitriy
modbus - сложна!)
все хочу закончить, как с modbus и питоном гонять потоковые пакеты в несколько кб с кастомными потрохами на дефолтовой либе
Dmitriy
ну всмысле статью на хабр
Dmitriy
код лежит, наброски лежат, надо добить и выложить.
Evgeniy
мне нравится система регистров - это удобно и расширяемо, как в модбас
Dmitriy
Dmitriy
тебе надо соблюдать только первый 2 байта и последние 2 байта, что внутри - твое дело. И все, ты совместим с модбасом.
Dmitriy
Это mvp и свою задачу выполняет. Это tcp\ip, если вы послали 4 байта то придет 4, а не 3 и потом 1. За это у нас в универе на пересдачу отправляли...
Evgeniy
"minimum viable product" - оно?
Dmitriy
Это пакетная передача, а не поточная.
Dmitriy
Dmitriy
Это костыль, что бы можно было скорость при подключение выставлять, потом объект передается в класс, который ждем uart обычный. Да, оно хавает и работает.
Dmitriy
У каждого своя правда
Dmitriy
Ну если хреначить пакетами по 100кб, может оно и не так, а если укладывается во все буфера, то оно так. Покажите контрпример с размером массива до 255 элементов.
Evgeniy
Test как обычно жжет крепким словцом 😁