IR remote control в OpenWrt
Интересным развитием возможностей роутера может послужить использование инфракрасного канала связи. Вариантов использования возможностей удаленного управления достаточно много и, я думаю, вы сами решите, где применить эту опцию. Моя задача показать, насколько легко прикрутить эту функциональность к роутеру.
Немного теории ))...
Инфракрасный канал связи (IR) состоит как минимум из двух элементов: это приёмник и передатчик. Как приёмник, так и передатчик очень легко собрать самому, используя различные готовые решения из интернета. Но я же предлагаю взять готовый.
Передатчиком здесь является пульт, а приёмником ответная часть,которая подключается к usb-входу.
В Linux за работу инфракрасного канала связи отвечает программа LIRC. LIRC входит в конфигурацию OpenWrt. Поэтому на этапе конфигурации OpenWrt отмечаем следующие модули:
Base system:
<*> busybox:
Linux System Utilities:
<*> lsusb
Kernel modules:
USB Support:
<M> kmod-usb-hid
Utilities:
<M> lirc:
<M> lircdaemonadd
<M> lirctools
Перед сборкой необходимо самому прописать тип поддерживаемого драйвера для LIRC. По умолчанию LIRC собирается с поддержкой драйвера mceusb, но в нашем случае нужно использовать драйвер devinput. Делается это очень просто. Открываем файл OpenWtr/feeds/packages/utils/lirc/Makefile. Ищем в этом файле раздел CONFIGURE_ARGS и в строке --with-driver="mceusb" заменяем на --with-driver="devinput".
Устанавливаем пакеты:
root@OpenWrt:/# opkg install kmod-usb-hid Installing kmod-usb-hid (2.6.36.2-1) to root... Downloading ftp://ftp:ftp@192.168.0.9/kmod-usb-hid_2.6.36.2-1_brcm47xx.ipk. Installing kmod-hid (2.6.36.2-1) to root... Downloading ftp://ftp:ftp@192.168.0.9/kmod-hid_2.6.36.2-1_brcm47xx.ipk. Installing kmod-input-core (2.6.36.2-1) to root... Downloading ftp://ftp:ftp@192.168.0.9/kmod-input-core_2.6.36.2-1_brcm47xx.ipk. Installing kmod-input-evdev (2.6.36.2-1) to root... Downloading ftp://ftp:ftp@192.168.0.9/kmod-input-evdev_2.6.36.2-1_brcm47xx.ipk. Configuring kmod-input-core. Configuring kmod-hid. Configuring kmod-input-evdev. Configuring kmod-usb-hid. root@OpenWrt:/# opkg install udev Installing udev (142-1) to root... Downloading ftp://ftp:ftp@192.168.0.9/udev_142-1_brcm47xx.ipk. Configuring udev. root@OpenWrt:/# opkg install lirc Installing lirc (0.8.7-1) to root... Downloading ftp://ftp:ftp@192.168.0.9/lirc_0.8.7-1_brcm47xx.ipk. Configuring lirc. root@OpenWrt:/# opkg install lircdaemonadd lirctools Installing lircdaemonadd (0.8.7-1) to root... Downloading ftp://ftp:ftp@192.168.0.9/lircdaemonadd_0.8.7-1_brcm47xx.ipk. Installing lirctools (0.8.7-1) to root... Downloading ftp://ftp:ftp@192.168.0.9/lirctools_0.8.7-1_brcm47xx.ipk. Configuring lircdaemonadd. Configuring lirctools. |
Пару слов о том, как работает LIRC. При нажатии кнопки на нашем пульте посылается команда по инфракрасному каналу связи, соответствующая нажатой кнопке. Приёмник подключенный к usb-порту роутера принимает эту команду и посылает сигнал в LIRC с кодом этой команды. Демон LIRC сравнивает код команды с теми кодами, которые он знает, и выполняет действие, которое сопоставлено этому коду. Как-то вот так...
Давайте подключим приёмник к usb-порту и посмотрим, что скажет Linux нам.
root@OpenWrt:/# dmesg usb 1-1.4: new low speed USB device using ohci_hcd and address 4 usb 1-1.4: config 1 interface 0 altsetting 0 has 2 endpoint descriptors, different from the interface descriptor's value: 1 input: HID 073a:2230 as /devices/ssb0:1/usb1/1-1/1-1.4/1-1.4:1.0/input/input0 generic-usb 0003:073A:2230.0001: input: USB HID v1.10 Keyboard [HID 073a:2230] on usb-ssb0:1-1.4/input0 root@OpenWrt:/# lsusb Bus 001 Device 001: ID 1d6b:0001 Bus 002 Device 001: ID 1d6b:0002 Bus 001 Device 002: ID 0a05:7211 Bus 001 Device 003: ID 0951:1603 Bus 001 Device 004: ID 073a:2230 |
Как видим, устройство определилось и имеет идентификатор 073a:2230 Chaplet Systems, Inc.
Также можно проверить, что устройство корректно определилось в системе с помощью следующих команд.
Создалось устройство в директории /dev:
root@OpenWrt:/# ls -l /dev/input/ crw-r--r-- 1 root root 13, 64 Jan 1 00:01 event0 |
Создался файл устройства в директории /proc:
root@OpenWrt:/# cat /proc/bus/input/devices I: Bus=0003 Vendor=073a Product=2230 Version=0110 N: Name="HID 073a:2230" P: Phys=usb-ssb0:1-1.1/input0 S: Sysfs=/devices/ssb0:1/usb1/1-1/1-1.1/1-1.1:1.0/input/input1 U: Uniq= H: Handlers=event0 B: EV=10001f B: KEY=837fff 2c3027 bf004444 0 fffff ffffffff 10c04 b27c007 ffa67bfa d941dfff febeffdf ffefffff ffffffff fffffffe B: REL=343 B: ABS=1 30000 B: MSC=10 |
Информация об устройстве с помощью команды udevadm:
root@OpenWrt:/# udevadm info --query=all --name=/dev/input/event0 P: /devices/ssb0:1/usb1/1-1/1-1.1/1-1.1:1.0/input/input1/event0 E: UDEV_LOG=3 E: DEVPATH=/devices/ssb0:1/usb1/1-1/1-1.1/1-1.1:1.0/input/input1/event0 E: MAJOR=13 E: MINOR=64 E: DEVNAME=input/event0 |
Проверим, что команды посылаемые с пульта, передаются в систему. Запустим следующую команду и понажимаем кнопки на пульте:
root@OpenWrt:/# cat /dev/input/event0 | hexdump 0000000 04ee 0000 fd21 0003 0004 0004 00ea 000c 0000010 04ee 0000 fd46 0003 0001 0072 0001 0000 0000020 04ee 0000 fd50 0003 0000 0000 0000 0000 0000030 04ee 0000 1641 0005 0004 0004 00ea 000c 0000040 04ee 0000 1666 0005 0001 0072 0000 0000 0000050 04ee 0000 1683 0005 0000 0000 0000 0000 0000060 04f1 0000 b1e3 0000 0004 0004 0028 0007 0000070 04f1 0000 b209 0000 0001 001c 0001 0000 0000080 04f1 0000 b213 0000 0000 0000 0000 0000 0000090 04f1 0000 cb11 0001 0004 0004 0028 0007 00000a0 04f1 0000 cb33 0001 0001 001c 0000 0000 00000b0 04f1 0000 cb4f 0001 0000 0000 0000 0000 |
А с помощью программы irrecord можно для каждой кнопки пульта задать своё имя:
root@OpenWrt:/# irrecord -d /dev/input/event0 /etc/lircd.conf --disable-namespace
Также для диагностики есть программа mode2.
Переходим к запуску демона lircd. Файл /etc/lircd.conf является конфигурационным файлом демона lircd. В этом файле сопоставляется название кнопки и код, который принимается по инфракрасному каналу связи. Этот файл можно создать самому, считывая значения кнопок и задавая им имена, но наверно лучше взять готовый
Выглядит он следующим образом:
begin remote name ChapletSystem bits 32 begin codes POWER 0x40004 0x80010074 RADIO 0x40004 0x8001001e TV 0x40004 0x80010014 DVD 0x40004 0x80010031 MUSIC 0x40004 0x80010032 PHOTO 0x40004 0x80010017 VIDEO 0x40004 0x80010012 DVD_MENU 0x40004 0x8001002f MUTE 0x40004 0x80010042 BACK 0x40004 0x8001000e GUIDE 0x40004 0x8001003b VOLUME_UP 0x40004 0x80010073 VOLUME_DOWN 0x40004 0x80010072 CHANNEL_UP 0x40004 0x80010068 CHANNEL_DOWN 0x40004 0x8001006d ARROW_UP 0x40004 0x80010067 ARROW_DOWN 0x40004 0x8001006c ARROW_LEFT 0x40004 0x80010069 ARROW_RIGHT 0x40004 0x8001006a ENTER 0x40004 0x8001001c RECORD 0x40004 0x8001001d 0x40004 0x80010013 REPEAT 0x40004 0x8001002a 0x40004 0x80010013 PLAY 0x40004 0x8001002a 0x40004 0x80010019 PAUSE 0x40004 0x8001001d 0x40004 0x80010019 STOP 0x40004 0x8001001f REWIND 0x40004 0x8001002a 0x40004 0x80010020 FORWARD 0x40004 0x8001002a 0x40004 0x80010021 PREV_TRACK 0x40004 0x8001001d 0x40004 0x80010030 NEXT_TRACK 0x40004 0x8001001d 0x40004 0x80010021 NUMPAD_1 0x40004 0x80010002 NUMPAD_2 0x40004 0x80010003 NUMPAD_3 0x40004 0x80010004 NUMPAD_4 0x40004 0x80010005 NUMPAD_5 0x40004 0x80010006 NUMPAD_6 0x40004 0x80010007 NUMPAD_7 0x40004 0x80010008 NUMPAD_8 0x40004 0x80010009 NUMPAD_9 0x40004 0x8001000a NUMPAD_0 0x40004 0x8001000b end codes end remote |
Запускаем демона lircd:
root@OpenWrt:/# mkdir /var/run/lirc root@OpenWrt:/# lircd -n --driver=dev/input --device=/dev/input/event0 --pidfile /var/run/lirc/lircd.pid |
Проверяем его работоспособность. В другом окне запускаем клиент irw. Клиент irw считывает данные lircd и выводит результат на экран. После запуска понажимаем кнопки на пульте. На экране должны видеть название кнопок и код:
root@OpenWrt:/# irw 0000000000040004 00 ENTER ChapletSystem 0000000000040004 00 VOLUME_UP ChapletSystem 0000000000040004 00 VOLUME_DOWN ChapletSystem 0000000000040004 00 ARROW_RIGHT ChapletSystem 0000000000040004 00 ARROW_UP ChapletSystem 0000000000040004 00 ARROW_DOWN ChapletSystem 0000000000040004 00 ARROW_LEFT ChapletSystem |
Для того, чтобы к кнопке привязать какое-то определенное действие, имеется файл
Формат его очень простой. Рассмотрим пример:
begin prog = irexec button = ENTER config = echo "It is button 'ENTER'" end begin prog = irexec button = VOLUME_UP config = /home/my_script.sh end |
При нажатии кнопки ENTER на пульте, выполнить echo "It is button 'ENTER'" или при нажатии кнопки на пульте VOLUME_UP, выполнить скрипт /home/my_script.sh. Irexec - это демон, который осуществляет запуск программ по нажатию кнопки на пульте.
Давайте посмотрим, как это работает. Запустим демона lircd в фоновом режиме, а при запуске демона irexec укажем ему файл lircrc.
root@OpenWrt:/# lircd --driver=dev/input --device=/dev/input/event0 —pidfile root@OpenWrt:/# irexec /home/lircrc sh: /home/my_script.sh: not found It is button 'ENTER' It is button 'ENTER' sh: /home/my_script.sh: not found /var/run/lirc/lircd.pid |