Делаем Soft Phone на c# (GSM-модем)

Приступая к работе

       Итак, ранее мы рассмотрели как же заставить нашу систему говорить и сохранять аудио-файлы. Теперь вполне можно перейти к самому интересному. Рассмотрим, как можно сделать свой soft phone при помощи простого gsm-модема. Нам понадобится gsm-модем, он же «свисток» в народе, SIM-карта и ранее использованная среда разработки. Нами был использован модем Huawei e173, недорогой и достаточно надежный. Приобрести подобный можно как у оператора сотовой связи, так и заказать из Китая. Симку можно брать на любой вкус. Однако я бы рекомендовал тариф с посекундной оплатой, если балуетесь для себя или какой-нибудь безлимит, потому как при тестировании и отладке неминуемо будет упущено огромное количество минут, а следовательно и денег.

От слов к делу

Говорить мы научились. Уже хорошо. Осталось научиться звонить и отслеживать хотя бы какие-то реакции абонента, если тот вообще доступен. Для начала разберемся, как же нам общаться с нашим свистком. Модемы слушаются специальных команд, называемых AT-команды. Полный список, если будет интересно, можно найти на официальных сайтах разработчиков. Так же нам понадобятся драйвера для нашего модема. Их мы тоже можем абсолютно спокойно стянуть из сети. После установки драйвера нам нужно будет найти файл конфигурации модема PluginsConfig.xml в папке config, и немного его подкорректировать. А именно, нужно найти такую запись:   и три строчки <add…> перенести в раздел <common><plugin>, при этом заменить слово «add» на слово «item». И сохранить наш файл конфигурации. Казалось бы ничего трудного, однако так мы разрешаем нашему модему говорить. Далее, определяем какие же AT-команды нам могут пригодиться.

  1. ATD:+7951******* — для нас это самая важная команда. Именно она инициализирует вызов абонента, номер которого мы укажем.
  2. AT+CHUP — сброс вызова / положить трубку.
  3. AT^DDSETEX=2 — перевод модема в голосовой режим.

Этих трех команд вполне достаточно для диалога с нашим модемом. Однако для более-менее полного диалога рекомендую так же обращать внимание на ключевые слова CONN — абонент снял трубку и CEND — вызов завершен.

Давайте звонить!

Сам модем наш компьютер воспринимает как COM-порт. И общаться с ним мы будем соответствующим образом. В нашей программе укажем using System.IO.Ports, чтобы спокойно работать с портами. Далее, нужно найти сам модем. На самом деле существует огромное количество способов определить устройство. Однако, если брать за основу утверждение, что работать мы будем именно с Huawei e173, поиск можно выполнить следующим образом:

Так мы получаем имена двух портов: командного и голосового. Один принимает управляющие команды, второй будет задействован для передачи аудио-файла. До модема достучались. Теперь нам нужно открыть к нему путь. Вынесем это действие в отдельный метод: Думаю, тут комментарии излишни. На этом наши приготовления к звонкам и передаче данных завершена. Осталось лишь дозвониться до абонента и сказать ему что-нибудь в трубочку. 

Данный фрагмент кода отвечает за звонок на номер, который записан в переменной phoneNum. В цикле мы ждем, пока абонент снимет трубку или сбросит вызов. Далее, в зависимости от действия абонента отправляем сообщение или же выходим из метода. Для отправки аудио-файла нам нужно не только создать его, но и разбить на пакеты по 320 байт, иначе нормального звучания не будет. Для отправки аудио-сообщения используем метод. 

Что ж, вот мы и сделали простенький телефон на базе gsm модема. Он может звонить, может не звонить. При желании, можно расширить функционал для определения насколько полно прослушано сообщение, завершил вызов абонент или же мы сами положили трубку, доступен ли абонент, занят или вне сети. Однако это уже совсем другая история.