Реализация SIP-телефонии для мобильных устройств с операционной системой Android

Санкт-Петербургский  Государственный Университет

Математико-механический факультет

 

Кафедра системного программирования

 

 

Малышев Виталий Владиславович

 

Дипломная работа

Реализация SIP-телефонии  для мобильных устройств с  операционной системой Android 

 

Допущено к защите

Зав. кафедрой

д.ф.-м.н, проф. А.Н. Терехов

 

 

Научный руководитель

 д.т.н., проф. кафедры информатики В.О. Сафонов

 

 

Рецензент

аспирант кафедры информатики  В.С. Соловьев

 

 

 

 

 

г. Санкт-Петербург

2010 год

St. Petersburg State University

Faculty of Mathematics and Mechanics

 

Chair of Software Engineering

 

 

Malyshev Vitaly Vladislavovich

 

Graduate paper

SIP-telephony implementation for mobile devices powered by Android operating system

 

Admitted to proof

Head of the chair

Dr. of Phys. and Math. Sci., Professor A.N. Terekhov

 

 

Scientific advisor

 Doctor of Sciences, Professor of Computer Science V. O. Safonov

 

 

Reviewer

Post-graduate student of Computer Science V.S. Soloviev

 

 

 

 

 

St. Petersburg

2010

Оглавление

1. Введение 5

1.1. Постановка задачи 5

1.2. Этапы работы 8

1.3. Введение в предметную область 10

1.3.1. Общие сведения о SIP телефонии 10

1.3.2. Принципы SIP протокола 11

1.3.3. Архитектура сети 12

1.3.4. Сообщения протокола SIP 13

1.3.5. Сравнение SIP с H.323 15

1.3.6. Сравнение SIP с Skype 17

2. Описание предлагаемого решения 19

2.1. Выбор платформы решения 19

2.2. Описание использования приложения 20

3. Реализация решения 24

3.1. Реализация низкоуровнего модуля, работающего со звуком напрямую 24

3.1.1. AudioRecordWrapper 26

3.1.2. AudioTrackWrapper 27

3.1.3. QueuedBuffer 28

3.2. Принцип работы “Handover” 29

3.3. Архитектура проекта “MC Client” 31

 

 

 

3.4. Ключевые классы элементов архитектуры. 33

3.4.1. Activity. 33

3.4.2. SipServiceWrapper 35

3.4.3. Service 36

3.4.4. SIPEngine 39

4. Реализация и применение решения 43

5. Сравнительный анализ 45

6. Заключение 47

7. Список литературы 48

 

  1. Введение
    1. Постановка задачи

Для пользователей персональных компьютеров уже давно стало  привычным голосовое общение через Интернет,  но для мобильных устройств качественных решений до недавнего времени просто не существовало. Однако развитие современных мобильных технологий, а именно появление мобильных устройств с быстрым доступом в Интернет и работающих под операционной системой Android[1], открывает новые возможности.

В июле 2005 Google приобрела небольшую  компанию Android, Inc., занимающуюся развитием собственных проектов. В то время было немного известно про компанию Android, Inc. – только то, что компания занималась разработкой программного обеспечения для мобильных телефонов. Как раз тогда и пошли слухи о том, что Google собирается выйти на рынок мобильных устройств.

Под руководством Google команда  разработала операционную систему, основанную на ядре Linux, гибкую и предлагающую широкие возможности по конфигурации. В ноябре 2007 Open Handset Alliance (OHA)[2]  - консорциум множества компаний, куда входит и Google, поставил перед собой задачу разработки открытых стандартов для мобильных устройств. Тогда же OHA и выпустил свой первый продукт – операционную систему Android, основанную на ядре Linux версии 2.6. Основными особенностями данной системы являлась открытость и многозадачность. Официальный выход первого смартфона HTC Dream (G1), под управлением ОС Android, на рынок США состоялся 22 октября 2008 года.

После появления первого  устройства под управлением Android, стало  возможным предоставить пользователю возможность использовать Интернет-телефонию так же, как и GSM телефонию. Широкополосный доступ в Интернет, многозадачность операционной системы дали возможность пользователю забыть о проблемах, связанных с Интернет связью. До Android самые удобные приложения Интернет-телефонии предлагала ОС iPhone, но с ее ограниченной многозадачностью невозможно использовать другие приложения вместе с Интернет-телефонией, что означает, например, невозможность читать документы и одновременно принимать звонки.

На данный момент существует ряд решений по обеспечению Интернет-телефонии для Android, однако все они обладают существенными ограничениями по использованию.

Данная работа ставит целью проведение анализа существующих решений Интернет-телефонии для ОС Android и создание приложения SIP телефонии под Android, удовлетворяющего следующим требованиям:

  • Приложение должно работать на всех существующих версиях ОС Android[3].  Следует учитывать старые версии Android (1.1 и 1.5), так как общий процент устройств под управлением данных версий ОС достаточно велик, что видно из рисунка 1.

Рисунок 1: Соотношение числа устройств, работающих под управлением конкретной версии ОС Android. Данные приведены по состоянию на 01.04.2010

  • Приложение должно уметь осуществлять переключение типа звонка с SIP на GSM и обратно – так называемый “Handover”. Т.е.  при наличии широкого Интернет канала звонок идет по SIP,  а если ширины канала начинает не хватать, то идет переключение звонка с SIP на GSM незаметно для пользователя. Как только ширина канала становится снова достаточной, идет переключение обратно на SIP.
  • Приложение должно работать на заднем плане, не ограничивая пользователя в работе с коммуникатором.
  • Приложение не должно уступать другим приложениям по качеству звука и скорости работы.
  • Приложение должно использовать по максимуму возможности Dialer - приложения для совершения GSM звонков, встроенного в ОС Android (пример возможностей - телефонная книга, учет совершенных звонков).
    1. Этапы работы

Разработку SIP телефонии возможно разбить на несколько этапов:

  1. Получение доступа к звуку на ранних версиях ОС

Так как одним из основных требований является работа на всех версиях ОС, то необходимо написать низкоуровневый модуль, работающий со звуком напрямую  - записывать голос с устройства и передавать звук в динамики – на ранних версиях ОС (Android 1.1 и Android 1.5) такой возможности не было.

 

  1. Сборка низкоуровнего модуля в виде библиотеки, которую возможно подключить и использовать в приложениях под Android

В Android есть механизм подключения  низкоуровневых библиотек в формате “.so” – формате понятном Linux, на ядре которого базируется Android. Сборка осуществляется с помощью компилятора arm gcc.

 

  1. Адаптация java библиотеки SIP телефонии для Android

В качестве базы для обмена SIP сообщений используется Open Source библиотека “MjSip”[4]. К данному этапу уже необходимо создать простейшее приложение, которое позволяет звонить и принимать звонки через Интернет.

 

  1. Обеспечение дополнительных возможностей SIP клиента 

Для удобства использования  необходимо обеспечить возможность  конфигурации клиента и возможность управления звонками. На данном этапе должна быть реализована возможность совершения автоматического и ручного “Handover” – переключение звонка с GSM на SIP и обратно.

Мною были спроектированы и реализованы этапы 1, 3, 4, в ходе чего были получены результаты, которые легли в основу данной работы. Этап 2 реализовали Смирнов Олег и Семаков Семен.

Стоит отметить, что проект по разработки SIP телефонии для Android является коммерческим, поэтому исходный код проекта является коммерческой тайной компании ООО “e-Legion Ltd.”.

В связи с этим в данной работе будут приведены описания только тех частей проекта, что отражают основные результаты.

Проект, являющийся результатом разработка SIP телефонии для Android, описан в разделе “Реализация и применение решения”.

    1. Введение в предметную область
      1. Общие сведения о SIP телефонии

SIP (Session Initiation Protocol — протокол установления сессии) - стандарт установления и завершения пользовательского Интернет-сеанса, включающего обмен мультимедийным содержимым (видео - и аудиоконференция, мгновенные сообщения).

В модели взаимодействия открытых систем SIP является сетевым протоколом прикладного уровня.

Протокол описывает, каким образом  клиентское приложение (например, MC Client) запрашивает начало соединения у другого, возможно физически удалённого, клиента, находящегося в той же сети, используя его уникальное имя. Протокол определяет способ согласования между клиентами об открытии каналов обмена на основе других протоколов, которые могут использоваться для непосредственной передачи информации (например, RTP). Допускается добавление или удаление таких каналов в течение установленного сеанса, а также подключение и отключение дополнительных клиентов (то есть допускается участие в обмене более двух сторон — конференцсвязь). Протокол также определяет порядок завершения сеанса. Схему организации работы по протоколу SIP можно видеть на рисунке 2.

Рисунок 2: Пример сети на базе протокола SIP

Наряду с устаревшим H.323, SIP — один из протоколов, лежащих в основе Voice over IP (VoIP).

 

      1. Принципы SIP протокола

В основе протокола лежат следующие  принципы:

  • Простота: включает в себя только шесть методов (функций)
  • Независимость от транспортного уровня, допустимо использовать UDP, TCP, ATM и т. д.
  • Персональная мобильность пользователей. Пользователи разрешается перемещаться в пределах сети без ограничений. Данное свойство достигается путем присвоения пользователю уникального идентификатора. При этом набор предоставляемых услуг остается неизменным. О своих перемещениях пользователь сообщает с помощью сообщения REGISTER.
  • Масштабируемость сети. Структура сети на базе протокола SIP позволяет легко ее расширять и увеличивать число элементов.
  • Расширяемость протокола. Протокол характеризуется возможностью дополнять его новыми функциями при появлении новых услуг.
  • Интеграция в стек существующих протоколов Интернет. Протокол SIP является частью глобальной архитектуры мультимедиа, разработанной комитетом IETF. Кроме SIP, данная архитектура включает в себя протоколы RSVP, RTP, RTSP,SDP.
  • Взаимодействие с другими протоколами сигнализации. Протокол SIP может быть использован совместно с другими протоколами IP-телефонии, протоколами ТфОП (Телефонная сеть общего пользования), и для связи с интеллектуальными сетями.

 

      1. Архитектура сети

Протокол SIP имеет клиент-серверную  архитектуру. Клиент выдает запросы, с указанием того, что он хочет получить от сервера. Сервер принимает и обрабатывает запросы, выдает ответы, содержащие уведомление об успешности выполнения запроса, уведомление об ошибке или информацию, запрошенную клиентом.

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

 

 

 

 

 

      1. Сообщения протокола SIP

Сообщения протокола SIP (запросы и  ответы), представляют собой последовательности текстовых строк, закодированных в  соответствии с документом RFC 2279. Структура и синтаксис сообщений SIP идентичны используемым в протоколе HTTP. Структура сообщений протокола SIP:

Стартовая строка

Заголовки

Пустая строка

Тело сообщения


  • Стартовая строка — начальная строка любого SIP-сообщения. Если сообщение является запросом, в ней указывается тип запроса, адресат и номер версии протокола. Если сообщение является ответом на запрос, в ней указывается номер версии протокола, тип ответа и его короткая расшифровка.
  • Заголовки сообщений содержат информацию, необходимую для обработки сообщения (информация об отправителе, адресате, пути следования и пр.)
  • Тело сообщения содержит описание сеансов связи. Не все запросы содержат тело сообщения (например, запрос BYE). Все ответы могут содержать тело сообщения, но содержимое тела в них бывает разным.

 

 

 

 

Пример запроса INVITE:

INVITE sip:[email protected].ru SIP/2.0

Record-Route: <sip:[email protected];lr>

Via: SIP/2.0/UDP 10.0.0.10;branch=z9hG4bK3af7.0a6e92f4.0

Via: SIP/2.0/UDP 192.168.0.2:5060;branch=z9hG4bK12ee92cb;rport=5060

From: "78128210000" <sip:[email protected].ru>;tag=as149b2d97

To: <sip:[email protected].spb.ru>

Contact: <sip:[email protected].ru>

Call-ID: 3cbf958e6f43d91905c3fa964a373dcb_zenit.chempion.spb.ru

CSeq: 103 INVITE

Max-Forwards: 16

Date: Wed, 10 Jan 2001 13:16:23 GMT

Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY

Supported: replaces

Content-Type: application/sdp

Content-Length: 394

 

v=0

o=root 3303 3304 IN IP4 10.0.0.10

s=session

c=IN IP4 10.0.0.10

t=0 0

m=audio 40358 RTP/AVP 0 8 101

a=rtpmap:0 PCMU/8000

a=rtpmap:8 PCMA/8000

a=rtpmap:101 telephone-event/8000

a=fmtp:101 0-16

a=silenceSupp:off - - - -

a=sendrecv


 

 

      1. Сравнение SIP с H.323[5]

Рекомендации ITU-T, входящие в стандарт H.323, определяют порядок  функционирования абонентских терминалов в сетях с разделяемым ресурсом, не гарантирующих качества обслуживания (QoS). Стандарт H.323 не связан с протоколом IP, однако, большинство реализаций основано на данном протоколе. Набор рекомендаций определяет сетевые компоненты, протоколы и процедуры, позволяющие организовать мультимедиасвязь в пакетных сетях. Стандарт H.323 определяет четыре основных компонента, которые вместе с сетевой структурой позволяют проводить двусторонние (точка - точка) и многосторонние (точка - много точек) мультимедиаконференции.

  1. Терминал может представлять собой ПК или автономное устройство, способное выполнять мультимедиаприложение. Требуется, чтобы он обеспечивал звуковую связь и дополнительно поддерживал передачу видео или данных. Вследствие того, что основной функцией терминала является передача звука, он играет ключевую роль в предоставлении сервиса IP- телефонии.

 

  1. Шлюз (gateway) не входит в число обязательных компонентов сети H.323. Он необходим только в случае, когда требуется установить соединение с терминалом другого стандарта. Связь обеспечивается трансляцией протоколов установки и разрыва соединений, а также форматов передачи данных. Шлюзы H.323 сетей широко применяются в IP телефонии для сопряжения IP сетей и цифровых или аналоговых коммутируемых телефонных сетей.

 

 

 

  1. Привратник (gatekeeper) выступает в качестве центра обработки вызовов внутри своей зоны и выполняет важнейшие функции управления вызовами. Зона определяется как совокупность всех терминалов, шлюзов и MCU под управлением данного привратника. Привратник необязательный компонент сети H.323, однако, если он присутствует в сети, то терминалы и шлюзы должны использовать его услуги.

 

  1. Сервер многосторонней конференции (Multipoint Control Unit) обеспечивает связь трёх или более H.323 терминалов. Все терминалы, участвующие в конференции, устанавливают соединение с MCU. Сервер управляет ресурсами конференции, согласовывает возможности терминалов по обработке звука и видео, определяет аудио и видеопотоки, которые необходимо направлять по многим адресам.

В результате появления стандарта H.323, описывающего механизмы взаимодействия устройств обеспечивающих передачу голоса и видео по IP сетям, появилась  возможность объединять в сети устройства различных производителей, что эффективно для сетей специальной связи.

Если сравнивать SIP с H.323, то SIP легче читается человеком и структурирован в отношении запросов и откликов.

Сторонники SIP также заявляют о нём как о более простом по сравнению с H.323. Однако некоторые считают, что, в то время как первоначально целью SIP была простота, в своём сегодняшнем виде он стал так же сложен, как и H.323. Другие считают, что SIP — протокол без состояний, который тем самым даёт легко реализовать восстановление при отказе и другие возможности, которые затруднены в протоколах с состояниями, таких как H.323. SIP и H.323 не ограничены голосовой связью, они могут обслуживать любой сеанс связи, от голосового до видеосеанса или приложений будущего.

Параметр сравнения

SIP

H.323

Дополнительные услуги

Набор услуг, поддерживаемых обоими протоколами примерно одинаков

Персональная мобильность пользователей

Имеется хороший набор  средств поддержки мобильности

Персональная мобильность  поддерживается, но менее гибко

Расширяемость протокола

Удобная расширяемость, простая  совместимость с предыдущими  версиями

Расширяемость поддерживается, но существует ряд сложностей

Масштабируемость сети

Оба протокола обеспечивают хорошую масштабируемость сети

Время установления соединения

Достаточно одной транзакции

Требуется несколько транзакций.

Сложность протокола

Простой, мало запросов, текстовый  формат сообщений

Сложный, много запросов и протоколов, двоичное представление сообщений


 

      1. Сравнение SIP с Skype[6]

SIP и Skype предлагают два различных подхода к VoIP связи. SIP обладает гибкостью, Skype прост в установке, использовании и обладает прозрачным сетевым доступом; оба предлагают отличное качество звука.

 

Параметр сравнения

SIP

Skype

Лицензия

Публичная

Проприетарная

Аутентификация

Каждый VoIP SIP провайдер предлагает свой собственный сервер регистрации для своих подписчиков

Единый централизованный сервер регистрации, поддержка пользователей  по всему миру

Архитектура

Клиент-серверная – есть сервер регистрации и агенты пользователей

Распределенная – есть вершины (клиент) и супервершины (вершины с большими аппаратными ресурсами).

Масштабируемость  сети

Хорошая

Отличная – число супервершин возрастает, как только возрастает число вершин

Кодеки

Чаще всего G.711, для корпоративных сетей G.729

Для узких каналов связи  iLBC, для широких iSAC

Проход через  сетевые защиты(Firewalls)

STUN server анализирует доверенность агента – не всегда хорошо работает

Проблемы отсутствуют

Защищенность

Все сообщения передаются по Интернету в виде обычного текста

Каждый пакет шифруется


 

 

  1. Описание предлагаемого решения
    1. Выбор платформы решения

В качестве платформы для  разработки приложения SIP телефонии был выбран Android.

Поскольку разработка приложения проводилась в ходе рабочего проекта, то при выборе платформы рассматривались как технические, так и экономические факторы, например многозадачность операционной системы, отсутствие приложений SIP телефонии на момент начала проекта и удобство разработки мобильных приложений.

Для удобства большая часть разработки велась на платформе Windows для настольных компьютеров, сборка низкоуровнего модуля в виде библиотеки велась на платформе Linux, так как компилятор arm gcc существовал только для Linux. При этом стоит отметить, что при переносе приложения на платформу Android возник ряд технических проблем:

  • Невозможность работать со звуком через стандартный API в ранних версиях Android SDK. Отсутствие такой возможности позволило написать первое приложение VoIP телефонии для Android, в дальнейшем данный факт превратился в конкурентное преимущество (работа на всех версиях ОС). Для решения данной проблемы пришлось написать низкоуровневый модуль, работающий со звуком напрямую.
  • Отсутствие некоторых функций. Так из соображений безопасности Android запрещает писать обработку нажатия красной кнопки сброса вызова. Однако для пользователя в плане удобства использование кнопки критично. Для решения данной проблемы был написан модуль, который слушает все события системы и перехватывает требуемое.

 

    1. Описание использования приложения

Приложение SIP телефонии, написанное в ходе дипломной работы, будет  далее обозначено как  “MC Client”. MC Client ориентирован на использование точек доступа Wi-Fi. Когда пользователь заходит в приложение впервые (рисунок 3), он вводит свои данные для SIP регистрации (такие, как адрес сервера, порт, имя пользователя – рисунок 5) в разделе настроек (рисунок 4).         

        

                                

Рисунок 3: Главное окно приложения        Рисунок 4: Настройки (settings)

                                

Рисунок 5: Настройки соединения с сервером (SIP Settings)

Далее, когда пользователь находится вблизи точки доступа Wi-Fi, идет автоматическая попытка соединения через найденную точку доступа. В случае успеха (рисунок 6), пользователь регистрируется на сервере, который он указал в настройках.

Рисунок 6: Сообщение об успешной регистрации

MC Client очень тесно интегрируется  со стандартным dialer (приложение  для GSM звонков), находящемся в  операционной системе Android. Происходит это следующим образом:

  1. Пользователь запускает приложение, и идет успешная регистрация на сервере
  2. Пользователь запускает стандартный dialer системы и набирает некий номер
  3. Он нажимает кнопку звонить
  4. Данное событие перехватывается и предлагается пользователю выбор (рисунок 7)
    1. Позвонить по GSM(GSM call)

В данном случае идет стандартный звонок через Dialer по GSM, средствами операционной системы Android. Т.е. все происходит так, как если бы приложение ни на что не влияло

    1. Позвонить по SIP(Enterprise Call)

В указанном случае, звонок, инициируемый dialer, - обрывается. Берется номер, набранный пользователем, и считается, что он набирал SIP адрес.

Рисунок 7: Окно выбора типа звонка

К номеру подставляются данные из настроек приложения, чтобы получился  правильный SIP адрес (адрес сервера  и порт). По составленному SIP адресу идет дозвон на сервер средствами реализации протокола SIP. 

  1. Визуально звонок выглядит одинаково для звонков GSM и SIP (рисунок 8 и 9)

                      

  Рисунок 8: Дозвон до абонента       Рисунок 9: Разговор с абонентом              

     Результаты SIP звонков отображаются в логе dialer, как если бы пользователь говорил по GSM(кто звонил, сколько времени говорил и другая информация о разговоре).

 

 

 

 

 

 

  1. Реализация решения
    1. Реализация низкоуровнего модуля, работающего со звуком напрямую

Основное преимущество проекта SIP телефонии “MC Client” перед конкурентами состоит в работе на всех версиях Android. В частности, для версий 1.1 и 1.5 было необходимо реализовывать низкоуровневый модуль, работающий со звуком напрямую.  Реализации для версий 1.1 и 1.5 очень схожи и отличаются лишь в нескольких константах и параметрах, передаваемых методам, поэтому далее будет описана лишь реализация для Android 1.5.

Всего в модуле есть 3 ключевых сущности: AudioRecordWrapper (рисунок 10) – native обертка для записи звука с микрофона, AudioTrackWrapper (рисунок 10) – native обертка для проигрывания звука на динамиках и QueuedBuffer (рисунок 11) – буфер, через который проходит звук, прежде чем попасть на целевую компоненту.

Рисунок 10: Поля и методы классов AudioRecordWrapper и AudioTrackWrapper

 

Рисунок 11: Буфер хранения информации

Далее будет описаны основные методы ключевых сущностей. В данном разделе не будет описана инициализация и использование ключевых сущностей низкоуровнего модуля в дипломном проекте “MC Client”, так как это стандартная процедура работы с native классами через JNI[7].

 

      1. AudioRecordWrapper

~AudioRecordWrapper() – деструктор, при уничтожении объекта остановить запись звука и уничтожить все связанные переменные.

audioRecordCallback(int event, void* user, void *info) – callback метод о событии, присылаемом ОС Android.  В частности, получение новой порции информации с микрофона, которую требуется положить в буфер.

handleEvent(int event, void* voidInfo) – метод обработки события, которое пришло от ОС Android.

onMoreData(const android::AudioRecord::Buffer* info) – при получении новой порции информации положить ее в буфер.

read(char* data, int maxSize) – прочитать данные из буфера.

start() – запустить запись звука.

stop() – остановить запись звука.

 

      1. AudioTrackWrapper

~AudioTrackWrapper() – деструктор, при уничтожении объекта остановить проигрывание звука и уничтожить все связанные переменные.

audioTrackCallback (int event, void* user, void *info) – callback метод о событии, присылаемом ОС Android.  В частности, получение новой порции информации от динамиков о том, что проигралось некое количество информации и требуется высылать еще.

handleEvent(int event, void* voidInfo) – метод обработки события, которое пришло от ОС Android.

onMoreData(android::AudioTrack::Buffer* info) – если вызван данный метод, значит проиграна часть информации на динамиках и ее можно выбросить из буфера.

write(const char* data, int size) – отправить данные из буфера на динамик.

start() – запустить проигрывание звука на динамиках.

stop() – остановить проигрывание звука на динамиках.

 

 

 

      1. QueuedBuffer

~QueuedBuffer() – деструктор, при уничтожении объекта уничтожить все связанные переменные.

clear() – в режиме блокировки сбросить все индексы – такие как индекс чтения, индекс записи и размер активных данных в буфере.

get(char* data, int size) – записать в data данные из буфера размером в size.

put(const char* data, int size) – записать в буфер данные из data размером size.

lock(), unlock() – обеспечение режима блокировки. Чтобы обращаться с переменными одновременно мог только один поток (очевидно, что запись звука и проигрывание звука совершаются в разных потоках).

Реализация SIP-телефонии для мобильных устройств с операционной системой Android