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

    Установка

    Не буду описывать длинный путь, проделанный в процессе хождения по граблям. Скажу только спасибо Томасу Рейтмайру, автору пакета 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
    Модуль к ядру
    Метки:
    Поделиться публикацией
    Похожие публикации
    Комментарии 26
    • –2
      А зачем обязательно через USB подключать? К трубке от любого обычного телефона припаять два миниджека — и всё!
      • 0
        там еще набиратель номера, ну и то что звуковуха в самом телефоне это тоже неплохо… не придется перенастраивать звуковые устройства для «послушать музыку» и «поговорить»
      • 0
        запускаем модем freshtel в линукс непосредственно драйвером!

        без virtualbox & windows!!!

        ualinux.com/index.php/forum/10/67-freshtel---sagem-fst-9520-seowon-swu-3220a
    • 0
      И что и все? :-)
      Откуда связь брать?
      • 0
        откуда угодно. skype/sip/iax etc
        речь только о оконечном пользовательском устройстве.
        • 0
          Программной начинкой что будет? В случае с USB телефонов — linphone. А с трубкой с джеками?
          Ладно, можно поставить Asterisk с chan_alsa (о том, что отнимается звуковой порт, и мешать музыке будет, умолчим). Но клавиатуру как от трубки прикрутить? К чему!?

          Я статью написал потому-то это единственный известный мне способ получить *полноценный* телефон на Linux.
          • 0
            ааа, отоночо, Михалыч!(С) нарушение порядка комментов. Я то как раз про усб телефон.
    • 0
      Статья конечно познавательная, но, мне кажется, раз уж вы всё равно таскаете с собой ноутбук, проблему обеспечения связи можно было бы решить гораздо проще.
      • 0
        Микрофон и наушники не подходят — я в К-55 музыку слушаю.
        • 0
          Ну вам же их всё равно приходится снимать, чтобы принять вызов? Тогда почему бы вместо телефонной трубки не поднести к уху bluetooth-гарнитуру?
          • 0
            Да, но я просто снимаю на шею наушники, и преподношу трубку, на начинаю резко дергаться в поисках окна с плеером или искать миксер, чтобы вырубить музыку.
            Гарнитура — а как на ней номер набрать? :-)
            • 0
              Так перед вами компьютер, и вам всё равно придётся искать плеер, чтобы его выключить :)
              Уж наверное можно изыскать способ и номер набрать :)
              • 0
                А я вот как раз и не хочу плеер искать. Пусть себе играет дальше, уши снял, вызов принял, трубу положил, уши надел. Все движения натуральные :-)

                А хочу позвонить, трубу взял, номер набрал. Не надо искать в окнах SIP клиента. По юзабилити не отличается от полноценного аппаратного внешнего SIP телефона, но дешевле минимум в 3 раза. Кстати, и видео поддерживает, если есть камера. Вот так.
                • 0
                  > на начинаю резко дергаться в поисках окна с плеером или искать миксер, чтобы вырубить музыку.
                  А, здесь должно было быть «не».

                  > А я вот как раз и не хочу плеер искать. Пусть себе играет дальше, уши снял, вызов принял, трубу положил, уши надел. Все движения натуральные :-)
                  Так всё равно сигнал пойдёт через отдельные аудио-устройства. Заменить трубку на гарнитуру — и движения не изменяться.

                  > А хочу позвонить, трубу взял, номер набрал. Не надо искать в окнах SIP клиента. По юзабилити не отличается от полноценного аппаратного внешнего SIP телефона, но дешевле минимум в 3 раза. Кстати, и видео поддерживает, если есть камера. Вот так.
                  У SIP-клиента есть некоторые преимущества: адресная книга, Skype (через шлюз) и SIP-аккаунты. Сейчас это становится всё актуальнее, чем звонки на городские и мобильные с помощью набора номера «из головы» или с экрана.
                  • 0
                    > Так всё равно сигнал пойдёт через отдельные аудио-устройства. Заменить трубку на гарнитуру — и движения не изменяться.

                    А кнопки где взять? :-)

                    > У SIP-клиента есть некоторые преимущества: адресная книга, Skype (через шлюз) и SIP-аккаунты. Сейчас это становится всё актуальнее, чем звонки на городские и мобильные с помощью набора номера «из головы» или с экрана.

                    Не спорю. Но у меня все на Asterisk'e. Звонки в Skype через короткие номера (skype ID = XXXX), разные SIP эккаунты имеют свои префиксы.

                    Но! Я полностью согласен, что полноценный IP телефон рулит, а USB телефон — суррогат дешевый :-) И я категорически против установки юзерам USB телефонов, даже внешне выглядящих как натуральные — венда в перегруз, а юзер без связи, как раз в том момент, когда вышла пауза и можно позвонить :-)
                    • 0
                      > А кнопки где взять? :-)
                      Так, вон, ниже написали — на клавиатуре ноутбука. А ещё удобнее — по дабл-клику в адресной книге какого-нибудь Google Voice.

                      > Не спорю. Но у меня все на Asterisk'e. Звонки в Skype через короткие номера (skype ID = XXXX), разные SIP эккаунты имеют свои префиксы.
                      Все их не упомнить. Всё равно приходится где-то смотреть обозначение префикса или сам номер.

                      > Я полностью согласен, что полноценный IP телефон рулит
                      Как очень хороший вариант — если уже есть коммуникатор с WiFi, удобно цеплять его к беспроводному адаптеру ноутбука, тем самым используя дешёвый Интернет-канал.
                      • 0
                        > Все их не упомнить. Всё равно приходится где-то смотреть обозначение префикса или сам номер.
                        WEB морда. Входящие со Skype автоматически добавляются, и им ставитится callerid number. Можно redial сделать. А если забыл, иди в книжку, найди по SkypeID.
                        • 0
                          Так всё же приходится компьютер для набора?
                          • 0
                            Неа, с него не набрать, на нем посмотреть :-)
                            • 0
                              А не проще ли в таком случае кликнуть возле контакта по кнопке «Позвонить» а адресной книге софтфона, чем перенабирать номер с экрана?
                              • 0
                                Проще. Но не реализовано в текущей версии. Будет в следующей.
    • 0
      имхо usb телефон не самый кошерный вариант, но на вкус и цвет… Я использовал ekiga + bluetooth гартитуру(на ноуте есть bluetooth), работало под Ubuntu\Windows:
      + не привязан проводами
      + можно задать много SIP провайдеров
      — номер набирать клавиатурой ноута
      — bluetooth'a до лестничной площадки не хватает, по квартире нормально
      • 0
        При желании, и в драйвер этой yealink можно было бы воткнуть выбор эккаунта. Linphone все поддерживает, а именно он в основе.
    • 0
      Статья интересная.
      Тоже игрался с такой трубкой, но использовал, как аудио-устройство — благо это без танцев с бубном работало.
      Вообще удручает «обилие» софтфонов и поддержка под Linux. Единственное приличное по функционалу Twinkle. Но и то криво работает с pulse audio.
    • НЛО прилетело и опубликовало эту надпись здесь

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.