Как стать автором
Обновить

Linux USB phone howto

Время на прочтение 7 мин
Количество просмотров 7.7K
Документ описывает установку и настройку 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. При этом, половина пытавшихся так и не смогла его подключить. Ну что же, давайте попробуем.

Установка

Не буду описывать длинный путь, проделанный в процессе хождения по граблям. Скажу только спасибо Томасу Рейтмайру, автору пакета Yeaphone 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 телефон Skype mate P1K к своему ноутбуку, в течение максимум 10 секунд он подключается к серверу. Как только я вытаскиваю USB кабель из ноута, софтфон снимает регистрацию. За уже 3-й день эксплуатации проблем не обнаружено.

Приложения

Правила udev
Скрипт для udev по отъему телефона у usbhid
Yaphone 0.1.8
Модуль к ядру
Теги:
Хабы:
+15
Комментарии 26
Комментарии Комментарии 26

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн