Linux USB phone howto

Skip to end of metadata
Go to start of metadata

Linux USB phone howto

Документ описывает установку и настройку USB телефона для Linux, на базе Yealink P1K. В результате было достигнуто полное управление вызовами с телефона, без участия мышки и клавиатуры.

Введение

Всегда хотелось иметь мобильный [VoIP] телефон. Это такой телефон, который всегда с тобой, прямо как мобильник, но при этом это [VoIP] телефон, т.е. подключенный к твоему собственному серверу IP АТС (варианты типа Nokia E65 и аналогичные не предлагать, не хочется греть уши мобильной Wi-Fi микроволновкой, поэтому остаются только USB телефоны).
Пользователям Windows жить просто, всякие там X-Lite и прочие включают в себя драйвера для всевозможных USB телефонов, а всевозможные USB телефоны поставляются с диском с разными софтфонами. А вот тем, у кого на десктопе Linux, легкие пути заказаны Но тем не менее, в путь!

Выбор USB телефона

Гуглинг на тему "linux usb phone" показал, что практически единственным телефоном, который удалось успешно подключить, оказался Yealink P1K USB phone. При этом, половина пытавшихся так и не смогла его подключить. Ну что же, давайте попробуем
Заказываем P1K...

Установка

Не буду описывать длинный путь, проделанный в процессе хождения по граблям. Скажу только спасибо Томасу Рейтмайру, автору пакета Yeaphone http://www.devbase.at/voip/yeaphone.php, за его отзывчивость и помощь.
Итак, чтобы получить мобильный [VoIP] phone, нужны следующие компоненты:
- USB телефон P1K
- модуль ядра p1k yealink.ko
- программный телефон linphone.
- пакет yeaphone

USB phone Yealink P1K и модуль ядра yealink.ko

Начиная с какой-то версии, Linux содержит в разделе Device drivers -> Input device support -> Miscellaneous devices -> Yealink usb-p1k voip phone. Однако, данный модуль устарел! Надо брать модуль с сайта Томаса. Судя по всему, это его домашняя машина, поэтому копия файлов, актуальная на момент написания этой статьи приложена сюда же (Revision: 142). Как сказал Томас:

You might own a P1KH (USB ID 6993:b700) which uses a slightly different
communication protocol compared to the P1K. The P1K is the only model
supported by the kernel module shipped with the regular Linux kernel.
However if yours is a P1KH (or a B2K, B3G, P4K) then you should try my
version of this module:

svn co --username guest --password readonly svn://devbase.homelinux.org:5070/voip/yealink-module

Это как раз был мой случай, и вывод lsusb доказал это:

explorer t2-trunk # lsusb
...
Bus 003 Device 019: ID 6993:b700 Freshtel

Модуль без проблем собрался на моем относительно свежем 2.6.31-gentoo.Сборка проста:

max@explorer /tmp/yealink-module/trunk $ make
make -C /usr/src/linux SUBDIRS=`pwd` modules
make[1]: Entering directory `/usr/src/linux-2.6.31-gentoo-r6'
  CC [M]  /tmp/yealink-module/trunk/yealink.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /tmp/yealink-module/trunk/yealink.mod.o
  LD [M]  /tmp/yealink-module/trunk/yealink.ko
make[1]: Leaving directory `/usr/src/linux-2.6.31-gentoo-r6'
max@explorer /tmp/yealink-module/trunk $

Получившийся файл нужно отправить в нужное место:

cp yealink.ko /lib/modules/2.6.31-gentoo-r6/kernel/drivers/input/

Софтфон linphone и обертка yeaphone

Другая "ложная дорога" заключается в версии софтфона linphone. Дело в том, что все пакеты, опубликованные на сайтах, предназначены для версий ветки 2.x, а все свежие дистрибутивы устанавливают linphone версии 3.x. Например, у меня установлен net-voip/linphone-3.1.1. Именно с версией связана ошибка сборки yeaphone, что-то типа такого:

home/adyna/Desktop/yeaphone-0.1.6/src/ylcontrol.c:578: undefined reference to `gstate_get_state'
/home/adyna/Desktop/yeaphone-0.1.6/src/ylcontrol.c:579: undefined reference to `gstate_get_state'
/home/adyna/Desktop/yeaphone-0.1.6/src/ylcontrol.c:580: undefined reference to `gstate_get_state'

Дело в том, что в 3-й ветки изменили API. Томас сделан патч, но почему-то не обновил пакеты tar.gz, и нормально компилирующийся код лежит только в svn. Если возникает какая-то проблема сбоки, рекомендую прочесть раздел комментариев на сайте Томаса.
Для Вашего удобства также прилагаю к статье и пакет с yaphone.

Борьба с usbhid

Даже после того, как я все собрал, попытка запуска yaphone приводила к сообщению:

No appropriate handset found, exiting...

А выглядело это так:

usbcore: registered new interface driver yealink
yealink: Yealink phone driver: 20090418 (C) Thomas Reitmayr, Henk Vergonet
usb 3-1: USB disconnect, address 22
usb 3-1: new full speed USB device using uhci_hcd and address 23
usb 3-1: configuration #1 chosen from 1 choice
generic-usb 0003:6993:B700.0020: hiddev0,hidraw3: USB HID v1.10 Device [Yealink Network Technology Ltd. VOIP USB Phone ] on usb-0000:00:1a.1-1/input3

Все дело в том, что модуль usbhid "забирает" себе устройство, и модуль yealink его не видит. Если отгрузить модуль usbhid (внимание, тут остаемся без мышки , и временно переместить usbhid.ko, скажем, в /tmp/, перезагрузить модуль yealink, и воткнуть телефон, то сообщение dmesg будет таким:

yealink: Yealink phone driver: 20090418 (C) Thomas Reitmayr, Henk Vergonet
usb 3-1: new full speed USB device using uhci_hcd and address 19
usb 3-1: configuration #1 chosen from 1 choice
yealink: Detected Model USB-P1KH (Version 0x1005)
yealink: Serial Number ff0adb4abc96
input: Yealink USB-P1KH as /devices/pci0000:00/0000:00:1a.1/usb3/3-1/3-1:1.3/input/input20

Как видим, телефон определился, и показал свой серийный номер. Чтобы не приходилось каждый раз вручную играться с модулем, необходимо добавить правило в udev, которое будет вызывать скрипт, "отцепляющий" телефон от usbhid и "прикрепляющий" его к yealink. Скрирт приведен в приложении, а вот вывод его работы:

explorer /tmp # sh /tmp/rebind-yealink.sh
Found Yealink phone at /sys/devices/pci0000:00/0000:00:1a.1/usb3/3-1
  found HID interface at 3-1:1.3
  successfully detached driver 'usbhid'
  successfully reattached driver 'yealink'
explorer /tmp #

Вывод dmesg подтвердит, что все прошло успешно.

udev и разрешения

Последним штрихом является адаптация /etc/udev/rules.d/99-yealink.rules

explorer ~ # cat /etc/udev/rules.d/99-yealink.rules
KERNEL=="event*", ATTRS{name}=="Yealink*", GROUP="max", RUN+="/bin/sh -c '/bin/chgrp max /sys$env{DEVPATH}/device/device/*'"
ACTION=="add|change", SUBSYSTEMS=="usb", ATTRS{idVendor}=="6993", ATTRS{idProduct}=="b700", RUN+="/usr/local/sbin/rebind-yealink.sh"

Обратите внимание, что вместо max нужно вставить группу, под которым работает Ваша учетная запись. Чтобы увидеть свои группы, выполните команду groups. Скрипт rebind-yealink.sh есть в приложении.
Если при запуске телефон выдает нечто такое:

opmascha@explorer ~ $ yeaphone
path_sysfs = /sys/bus/usb/drivers/yealink/5-1:1.3/
path_event = /dev/input/event11
/sys/bus/usb/drivers/yealink/5-1:1.3/model: Permission denied
Detected handset Yealink USB-P1K
/sys/bus/usb/drivers/yealink/5-1:1.3/line2: Permission denied
/sys/bus/usb/drivers/yealink/5-1:1.3/line1: Permission denied
/sys/bus/usb/drivers/yealink/5-1:1.3/line3: Permission denied
/sys/bus/usb/drivers/yealink/5-1:1.3/hide_icon: Permission denied

это значит, что надо разбираться с 99-yealink.rules
- он либо не отрабатывает из-за синтаксической ошибки, либо допущена ошибка в учетной записи. cd /sys/bus/usb/ и смотреть разрешения.

Стартап

Прописать в стартап запуск телефона (rc.local, local.start или как в Вашем дистрибутиве правильно):

su - max -c '/usr/local/bin/yeaphone -w' > /dev/null 2>&1 &

Тут также надо изменить max на имя Вашей учетной записи.

Настройка

После установки всех компонентов можно приступать к настройке. Необходимо настроить:

  • SIP эккаунт (кстати, это одно из ограничений: если linphone поддерживает неограниченное число эккаунтов, то yeaphone - только один, так как не умеет их перебирать);
  • Аудио-устройство - USB [VoIP] Phone
  • доп. параметры yaphone (рингтон, параметры набора номера, и др.).

    Учетная запись SIP

    Это можно сделать двумя способами:

  • Запустить графический интерфейс linphone-3 (если собирали), и в нем настроить учетную запись .
  • выполнить конфигурацию из консоли. Приведем пример из консоли:
     linphonec> proxy add
    Adding new proxy setup. Hit ^D to abort.
    Enter proxy sip address: sip:sipnet.ru
    Your identity for this proxy: sip:1234567890@sipnet.ru
    Do you want to register on this proxy (yes/no): yes
    Specify register expiration time in seconds (default is 600): 180
    Expiration: 180 seconds
    Specify route if needed:
    No route specified.
    \-------------------------------------------\-
    sip address: sip:sipnet.ru
    route:
    identity: sip:1234567890@sipnet.ru
    register: yes
    expires: 180
    registered: no
    \-------------------------------------------\-
    Accept the above proxy configuration (yes/no) ?: yes
    Proxy added.
    linphonec> Registration on sip:sipnet.ru successful.
    linphonec> Registration on sip:sipnet.ru successful.
    linphonec> 

Конфигурация audio

Далее необходимо настроить используемое аудио-устройство. Если собрался GTK интерфейс, то можно сделать это в нем, иначе следующим образом:

linphonec> soundcard list
0: ALSA: default device
1: ALSA: HDA Intel
2: ALSA: VOIP USB Phone
linphonec> soundcard use 2
Using sound device ALSA: VOIP USB Phone
linphonec>

Эта команда настроит все звуковые каналы (playback, capture & ring) на использование USB телефона.

Настройка Yeaphone

Ну и в заключение, приведу пример настроек. Файл ~/.yeahonerc содержит конфигурацию, а папка ~/.yaphone/ringtone/ - рингтоны.

max@explorer /tmp $ cat ~/.yeaphonerc
intl-access-code	810
natl-access-code	8
country-code 7
display-id  "   --123--"
ringtone_default default_p1k.bin
#ringtone_default default_p1kh.bin
#ringtone_default falling2_p1k.bin
#ringtone_default falling_p1k.bin
#ringtone_default rising_p1k.bin
#ringtone_default special_p1k.bin

Рингтоны противные, было бы здорово, если бы кто-то добавил свои более мелодичные, типа "в траве сидел кузнечик"...

Также, надо убедиться, что настроен только один прокси сервер, и он же выбран как default в файле ~/.linphonerc. Если Вы получаете такое сообщение

Warning: Could not parse given sip address. A sip url usually looks like sip:user@domain

то это значит, что надо подредактировать ручками ~/.linphonerc.

Заключение

В результате, как только я подключаю USB телефон Skypemate P1K к своему ноутбуку, в течение максимум 10 секунд он подключается к серверу. Как только я вытаскиваю USB кабель из ноута, софтфон снимает регистрацию. За уже 3-й день эксплуатации проблем не обнаружено.

TODO: поднять остальные USB телефоны Skypemate.

Приложения

Файлы в приложении.

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.