UART over SSH (или дешево и сердито дружим МК с инетом)

Несколько раз я встречал статьи про то, как какую-нибудь ардуинку прикручивали к роутеру по USB и радовались от светодиодиков с вебмордой. Жабаскрипт и красивые кнопочки в браузере это конечно модно, но нельзя-ли проще? Оказывается, что можно. С командной строкой и железным UART.



Но перед тем, как начать — Отмазки:
1) Во-первых, в linux я практически не разбираюсь. Поэтому возможно где-то туплю и использую костыли, сам не подозревая.
2) Я искал самый простой способ реализации общения МК c компом через инет. Поэтому намерено не использовал дополнительный софт (на стороне роутера)
3) У меня роутер zyxel keenetic 4g, c альтернативной прошивкой. Вполне возможно, что на другом это может не сработать (проверить не могу, обратно заводскую прошивку ставить не хочу) или будет выглядеть чуть по-другому.

Поставим себе боевую задачу: Передать через инет команду на МК и принять с него ответ. Реализовать это нужно как можно проще.

Идея в том, чтобы использовать аппаратный UART, вместо подключения по USB. Он есть в каждом роутере и предназначен для низкоуровнего ковыряния, смены загрузчика и прочих кошерных вещей.

При старте система (linux-based прошивка роутера) открывает этот порт, выкидывает в него всякую отладочную инфу и оставляет открытым. Практика показывает, что при нормальной работе роутер больше в порт ничего не говорит, а значит можно юзать его в свое удовольствие.

Задачка первая — определить как зовут наш порт и с какими настройками он открыт.

В моем случае вся нужная инфа нашлась в начале системного журнала:
Kernel command line: console=ttyS1,57600n8 root=/dev/mtdblock4 rootfstype=squashfs noinitrd quiet

Что, в переводе на русский, значит:
К порту обращаться через /dev/ttyS1 (Регистр, соблюдайте регистр!)
Порт открыт с параметрами: Скорость 57600 бод, 8 бит, проверка четности отключена.
Про количество старт-стоп битов тут не сказано, но обычно оно = 1.

Если роутер не спешит выкладывать вам информацию об UART, то можно и нужно сходить в гугл. Наверняка на каком-нибудь форуме, в очередной теме о восстановлении/прокачке маршрутизатора есть искомые данные.

Тех, кого забанили в гугле (у вас правда такой редкий роутер?!), может спасти консоль. Перебираем первые два-три ttySx вот такой командой:
stty -F ttyS1 -a

В первой строчке её вывода будет скорость UART. На некоторых процессорах может быть пара UARTов, поэтому надо послать что-нибудь (см. ниже) в порт для проверки.

Есть еще забавный момент: мой keenetic 4g после разгона с 320 до 384МГц, уводит
скорость UART с 57600 на 48000 бод (да-да, вниз). Поэтому те, кто разогнал процессор на своем роутере, могут внезапно найти UART на другом бодрейте.
Найдя нужные данные, заряжаем наш МК и цепляем к роутеру. В 99% случаев на UART там будет напряжение 3.3 Вольта, но проверить не мешает. Кроме RX, TX и земли, на разъем выведено питание, которое можно утащить (естесвенно, если мы не будем эту линию нагружать движками и другими страшными вещами).

Для проверки связи подключаемся к роутеру по ssh (или telnet) набираем в консоли

printf TEST >/dev/ttyS1

(вместо ttyS1 может быть другое обозначение, к которому у вас привязан UART).

Роутер должен выплюнуть в порт четыре байта — TEST. Если не выплюнул значит либо порт не открыт, либо мы перепутали его с другим.

Таким образом можно передавать данные из роутера в компьютер.

Для того, чтобы немного упростить себе жизнь, я написал вот такой скрипт:

#!/bin/sh
DEVICE_ADDR=/dev/ttyS1
printf "---" >$DEVICE_ADDR
for i in "$@"; do
	printf $i >$DEVICE_ADDR
	printf " " >$DEVICE_ADDR
done
printf "-" >$DEVICE_ADDR

SIZE=${#@} # Получаем длину строки с параметрами
echo "$SIZE + 4 bytes sent" #Выводим отчет

и положил его в папку /bin, чтобы при вызове не нужно было прописывать полный адрес.

Теперь достаточно просто ввести

uart hello world


и на МК полетит строчка "---hello world -" (без кавычек). Дефисы нужны для того чтобы МК мог определить начало и конец полезных данных. Мне просто было лень писать новый код и я заюзал прошивку от экспериментов с радиомодулями.
А пробел после последнего слова, потому что я туплю в sh скриптах :)

Чтение по-идее должно осуществляться так

cat /dev/ttyS1


(для прекращения вывода нажать ctrl+z)

Но у меня это работать не хочет. Данные посланые МК возвращаются эхом обратно, а роутер их не принимает. Хотя UART интерфейс роутера расчитан на небольшой диалог с загрузчиком. Странно все это.

На этом все. Способ конечно не удобный, но зато быстро и сердито.
  • +1
  • 26 апреля 2012, 11:07
  • dcoder

Комментарии (6)

RSS свернуть / развернуть
Скорость можно и осциллографом поймать. А можно подключить к компу и последовательно перебирать скорости, пока вместо мусора не посыпется текст.
0
  • avatar
  • Vga
  • 26 апреля 2012, 11:35
Ура, dcoder линуксом заразился! Попахивает чем-то интересным :)
+1
Я думал ты уже добился работы, а тут на тебе
Но у меня это работать не хочет.
Порт остаётся занятым роутером. На нем висит системная консоль. Она и лопает всё то, что вы отправляете роутеру.

Если поможет: уже как-то подключались к компортам
0
я тоже так делал — Превращаем ADSL-модем в Ethernet-шилд :)
0
А скомпилять под него uart <-> telnet bridge разве сложно?
0
Или какой-нибудь picocom.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.