02.11.2013, 21:08 | #1 |
Junior Member
Регистрация: 25.08.2013
Сообщений: 15
Вес репутации: 0 |
Помощь с проектом // socat, serial port to TCP socket
Я делаю проект суть которого в двухсторонней коммуникации сервера и множества клиентских устройств по TCP.
Сервер - это просто машина на линуксе где-то в интернете. Клиенты - это LED панели, они находятся в разных городах, подключенные к своему локальному интернету по wifi То что ниже - это скажем так, прув оф концепт технологии. Один сервер и один подключенный клиент. Я столкнулся со сложностями. Помогите пожалуйста их решить. Клиентское устройство состоит из: — роутера на OpenWrt — переходника usb to rs-232 — LED панели, которая дает собой управлять через rs-232 Задача клиента: при включении выходить в интернет по wifi и самостоятельно устанавливать соединение с сервером. Задача сервера: посылать на клиент текущее время раз в секунду Роутер принимает данные по TCP от сервера и отправляет их на serial порт /dev/ttyUSB0. Это делает программа socat запущенная в фоне. Т.е. роутер просто переадресовывает приходящие по TCP данные (и обратно, если бы LED панель отправляла что-то), это своеобразный тонкий клиент. На сервере время кодируется в наборы команд которые понимает LED панель и передается по TCP. Те же самые команды, при желании, можно было бы отправить в LED по rs-232 с локального компа. socat.sh - выполняется на клиенте при загрузке PHP код:
Т.е. как только мы включаем клиентское устройство, сразу после загрузки роутер устанавливает связь с сервером 192.168.0.100 и принимает от него данные. На LED панели мы видим время и номер пакета переданного с сервера начиная с момента коннекта (по сути это uptime в секундах) Больше ~3500 секунд максимум не получатся чтобы устройство работало, время замирает. Как я понимаю подводит переходник. Вот фрагмент лога socat PHP код:
socat устанавливает соединение с сервером и сервер передает данные на устройство, роутер переправляет их serial port, но отваливается по таймуту, видимо serial port отваливается, хотя если набрать команду ниже, то файл устройства есть PHP код:
После того как socat отваливается по таймауту срабатывает вот эта команда в socat.sh. Она софтварным путем перетыкает usb в роутере. PHP код:
Вопросы: 1. Может как-то можно решить вопрос без разрыва TCP соединения? Т.е. раз уж serial port залип, то перетыкнуть его, но оставаться на связи. У socat есть адское кол-во параметров и разных способов и комбинаций применения. 2. Как нужно экранировать переходник, если я все хочу собрать в одном корпусе? Какие места на плате самые опасныев плане помех для переходника? Провода питания 220? Последний раз редактировалось BeZoom; 03.11.2013 в 00:05. |
02.11.2013, 21:18 | #2 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
А ser2net не пробовали?
|
02.11.2013, 21:39 | #3 | |
Senior Member
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605 |
Вы уж определитесь кто клиент, а кто сервер ??
сервер - это тот кто слушает!! клиент - это тот кто делает запрос к серверу Цитата:
|
|
03.11.2013, 00:23 | #4 |
Junior Member
Регистрация: 25.08.2013
Сообщений: 15
Вес репутации: 0 |
@Admin
Да пробовал, сначала с него начал и пришел в socat. ser2net может только расшарить serial port в локальный TCP сокет. У меня задача сложнее. Устройство должно само уметь устанавливать коннект с сервером в любых условиях, из любых сетей, а не ждать, что к нему присоединятся. @andr128 Я немного переформулировал начало поста. Но надо вникать, я все постарался расписать. Если кратко, по вопросу. То поскольку OpenWrt клиент устанавливает TCP соединение с сервером, то в этот сокет может писать данные как сервер, так и клиентское устройство. Это просто канал связи. Поэтому термины типа "слушает" и "делает запрос" тут не совсем верны. Это детали конечно, но процесс лучше представлять по другому. После установки соединения начинается обмен данными. Каждая сторона просто пишет данные в сокет, видит что приходит, реагирует на это. Пока для простоты LED панель ничего не передает на сервер. А Сервер как только видит, что к нему подключился Клиент, начинает передавать туда данные о текущем времени. Естественно на фотках показано только клиентское устройство. Последний раз редактировалось BeZoom; 03.11.2013 в 00:25. |
03.11.2013, 22:18 | #5 |
Member
Регистрация: 28.09.2012
Сообщений: 52
Вес репутации: 0 |
Такое ощущение что ваш скрипт запускается туеву хучу раз. Потом когда кончаются открытые сокеты получаете ошибку =)
|
04.11.2013, 04:53 | #6 |
Junior Member
Регистрация: 25.08.2013
Сообщений: 15
Вес репутации: 0 |
@mebitek
Да, пробовал, он не подходит. Не умеет коннектиться к серверу. socat умеет, он гибче. И ser2net точно так же отваливается. Никаких преимуществ т.е. нет и функционально не подходит. @michael_s Скрип, конечно не продакшен. Но такого там не происходит. Это точно. От старта коннекшена до его отвала по таймауту работает только эта команда socat -d -d -d -d -lf /tmp/socat.log -T15 TCP4:$HOST:$PORT,reuseaddr file:$DEV,raw,echo=0,b$BAUD Остальное нужно чтобы решать любые проблемы. Проблема с описанная выше возникает при первом выполнении этот строки. |
04.11.2013, 04:57 | #7 |
Junior Member
Регистрация: 25.08.2013
Сообщений: 15
Вес репутации: 0 |
Я хотел бы получить советы, если это возможно
1. Как нужно экранировать переходник? 2. Есть ли тут кто использует socat и поможет с настройкой. Чтобы TCP соединение не отваливалось в то время как переходник перетыкается на секунду. |
04.11.2013, 12:35 | #8 | |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Цитата:
|
|
04.11.2013, 13:28 | #9 |
Junior Member
Регистрация: 25.08.2013
Сообщений: 15
Вес репутации: 0 |
@mebitek
Поскольку лучше чем в socat я маловероятно напишу что-то на php. Поэтому пока так. Это уже второй переходник, да я понимаю, что можно всегда найти лучше... но не факт, что этот будет лучше =) Провод я просто обрежу в продакшен версии. Экранировать надо саму коробку насколько я понимаю по наблюдениям. @Admin Если есть какие-то ссылки на то где объясниется, почему нет смысла экранировать неаналоговые устойства, то я бы почитал. Не разбираюсь в этом. Но чисто практически я делаю вывод, что надо экранировать саму коробку переходника, т.к. экпериментальным путем установил, что чем ближе она находится к плате, тем меньше время до очередного отвала порта. Т.е. какие-то наводки на нее влияют. |
04.11.2013, 13:52 | #10 | |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Цитата:
Экранировать есть смысл в том случаи если требуется заглушить излучаемые устройством помехи, для того что бы они не зашумляли эфир для высокочувствительных аналоговых устройств |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|