Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > OpenWRT/LEDE

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.11.2013, 21:08   #1
BeZoom
Junior Member
 
Регистрация: 25.08.2013
Сообщений: 15
Вес репутации: 0
BeZoom is an unknown quantity at this point
По умолчанию Помощь с проектом // 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 код:
#!/bin/ash

DEV=/dev/ttyUSB0

PORT
=5555
HOST
=192.168.0.100
BAUD
=115200

while true; do
  if [ -
e $DEV ]
  
then
    usbreset 
'USB-Serial Controller D'
    
socat -----lf /tmp/socat.log -T15 TCP4:$HOST:$PORT,reuseaddr file:$DEV,raw,echo=0,b$BAUD
    
echo '*** socat timeout ***'
  
else
    echo 
'*** no device /tmp/ttyUSB0 ***'
    
sleep 2
  fi
done 


Т.е. как только мы включаем клиентское устройство, сразу после загрузки роутер устанавливает связь с сервером 192.168.0.100 и принимает от него данные.
На LED панели мы видим время и номер пакета переданного с сервера начиная с момента коннекта (по сути это uptime в секундах)

Больше ~3500 секунд максимум не получатся чтобы устройство работало, время замирает.
Как я понимаю подводит переходник.




Вот фрагмент лога socat

PHP код:
1970/01/01 01:38:40 socat[1890I poll timed out (no data within 15.000000 seconds)
1970/01/01 01:38:40 socat[1890N inactivity timeout triggered
1970
/01/01 01:38:40 socat[1890N exiting with status 0
1970
/01/01 01:38:40 socat[1890exit(0)
1970/01/01 01:38:40 socat[1890I shutdown(42)
1970/01/01 01:38:40 socat[1890D shutdown()  -> 0
1970
/01/01 01:38:40 socat[1890D tcsetattr(50, {00000000,00000000,000018b2,00000080,03,1c,7f,15,01,00,00,00,11,13,1a,00,12,0f,17,16,04,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00})
1970/01/01 01:38:40 socat[1890D tcsetattr() -> -1
1970
/01/01 01:38:40 socat[1890W cannot restore terminal settings on fd 5Invalid argument 

socat устанавливает соединение с сервером и сервер передает данные на устройство, роутер переправляет их serial port, но отваливается по таймуту, видимо serial port отваливается, хотя если набрать команду ниже, то файл устройства есть
PHP код:
root@OpenWrt:~#ls /dev/ttyUSB0
/dev/ttyUSB0 
Если после того как время застопорилось вытащить usb из роутра и воткнуть, то время снова пойдет, только uptime сбросится, но это не так страшно.

После того как socat отваливается по таймауту срабатывает вот эта команда в socat.sh. Она софтварным путем перетыкает usb в роутере.
PHP код:
usbreset 'USB-Serial Controller D' 





Вопросы:


1. Может как-то можно решить вопрос без разрыва TCP соединения? Т.е. раз уж serial port залип, то перетыкнуть его, но оставаться на связи. У socat есть адское кол-во параметров и разных способов и комбинаций применения.
2. Как нужно экранировать переходник, если я все хочу собрать в одном корпусе? Какие места на плате самые опасныев плане помех для переходника? Провода питания 220?
Миниатюры
Нажмите на изображение для увеличения
Название: IMG_0001-fixed.jpg
Просмотров: 2945
Размер:	115.0 Кб
ID:	1263   Нажмите на изображение для увеличения
Название: IMG_0002-7-fixed.jpg
Просмотров: 3000
Размер:	144.2 Кб
ID:	1264   Нажмите на изображение для увеличения
Название: IMG_0003-16-fixed.jpg
Просмотров: 2956
Размер:	142.7 Кб
ID:	1265  
Изображения
 

Последний раз редактировалось BeZoom; 03.11.2013 в 00:05.
BeZoom вне форума   Ответить с цитированием
Старый 02.11.2013, 21:18   #2
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,323
Вес репутации: 9522
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

А ser2net не пробовали?
Admin на форуме   Ответить с цитированием
Старый 02.11.2013, 21:39   #3
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1599
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию

Вы уж определитесь кто клиент, а кто сервер ??
сервер - это тот кто слушает!!
клиент - это тот кто делает запрос к серверу
Цитата:
Клиент - это роутер на OpenWrt к которому подключена LED панель, которая дает собой управлять через rs-232
Прочитав пост я вообще не чего не понял
andr128 вне форума   Ответить с цитированием
Старый 03.11.2013, 00:23   #4
BeZoom
Junior Member
 
Регистрация: 25.08.2013
Сообщений: 15
Вес репутации: 0
BeZoom is an unknown quantity at this point
По умолчанию

@Admin

Да пробовал, сначала с него начал и пришел в socat.
ser2net может только расшарить serial port в локальный TCP сокет.

У меня задача сложнее. Устройство должно само уметь устанавливать коннект с сервером в любых условиях, из любых сетей, а не ждать, что к нему присоединятся.


@andr128

Я немного переформулировал начало поста. Но надо вникать, я все постарался расписать.

Если кратко, по вопросу. То поскольку OpenWrt клиент устанавливает TCP соединение с сервером, то в этот сокет может писать данные как сервер, так и клиентское устройство. Это просто канал связи.

Поэтому термины типа "слушает" и "делает запрос" тут не совсем верны. Это детали конечно, но процесс лучше представлять по другому.

После установки соединения начинается обмен данными. Каждая сторона просто пишет данные в сокет, видит что приходит, реагирует на это.
Пока для простоты LED панель ничего не передает на сервер.

А Сервер как только видит, что к нему подключился Клиент, начинает передавать туда данные о текущем времени.


Естественно на фотках показано только клиентское устройство.

Последний раз редактировалось BeZoom; 03.11.2013 в 00:25.
BeZoom вне форума   Ответить с цитированием
Старый 03.11.2013, 22:18   #5
michael_s
Member
 
Регистрация: 28.09.2012
Сообщений: 52
Вес репутации: 0
michael_s is an unknown quantity at this point
По умолчанию

Такое ощущение что ваш скрипт запускается туеву хучу раз. Потом когда кончаются открытые сокеты получаете ошибку =)
michael_s вне форума   Ответить с цитированием
Старый 04.11.2013, 04:53   #6
BeZoom
Junior Member
 
Регистрация: 25.08.2013
Сообщений: 15
Вес репутации: 0
BeZoom is an unknown quantity at this point
По умолчанию

@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

Остальное нужно чтобы решать любые проблемы.

Проблема с описанная выше возникает при первом выполнении этот строки.
BeZoom вне форума   Ответить с цитированием
Старый 04.11.2013, 04:57   #7
BeZoom
Junior Member
 
Регистрация: 25.08.2013
Сообщений: 15
Вес репутации: 0
BeZoom is an unknown quantity at this point
По умолчанию

Я хотел бы получить советы, если это возможно

1. Как нужно экранировать переходник?
2. Есть ли тут кто использует socat и поможет с настройкой. Чтобы TCP соединение не отваливалось в то время как переходник перетыкается на секунду.
BeZoom вне форума   Ответить с цитированием
Старый 04.11.2013, 12:35   #8
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,323
Вес репутации: 9522
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Цитата:
Как нужно экранировать переходник?
А для чего? Это же не аналоговое устройство
Admin на форуме   Ответить с цитированием
Старый 04.11.2013, 13:28   #9
BeZoom
Junior Member
 
Регистрация: 25.08.2013
Сообщений: 15
Вес репутации: 0
BeZoom is an unknown quantity at this point
По умолчанию

@mebitek

Поскольку лучше чем в socat я маловероятно напишу что-то на php. Поэтому пока так. Это уже второй переходник, да я понимаю, что можно всегда найти лучше... но не факт, что этот будет лучше =) Провод я просто обрежу в продакшен версии. Экранировать надо саму коробку насколько я понимаю по наблюдениям.

@Admin

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

Но чисто практически я делаю вывод, что надо экранировать саму коробку переходника, т.к. экпериментальным путем установил, что чем ближе она находится к плате, тем меньше время до очередного отвала порта. Т.е. какие-то наводки на нее влияют.
BeZoom вне форума   Ответить с цитированием
Старый 04.11.2013, 13:52   #10
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,323
Вес репутации: 9522
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Цитата:
Если есть какие-то ссылки на то где объясниется, почему нет смысла экранировать неаналоговые устойства
Так как в быту не бывает помех которые бы могли навестить на цепи устройства и ЭДС помехи был равен при этом логическому уровню

Экранировать есть смысл в том случаи если требуется заглушить излучаемые устройством помехи, для того что бы они не зашумляли эфир для высокочувствительных аналоговых устройств
Admin на форуме   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 15:50. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика