Pull to refresh

Bluetooth-часы и Maemo

Reading time7 min
Views9.1K
Наверняка уважаемый %username%, увлеченный гаджетами, хотя бы раз, но обращал внимание на такой повседневный аксессуар, как наручные bluetooth-часы. Именно на bluetooth-аксессуар, а не часы-телефон и тому подобное. Удобный (на мой взгляд) вспомогательный гаджет.

Мои приключения с bluetooth-часами начались года три-четыре назад, тема подобных часов мелькала во всяких около-гаджетовых новостных лентах. Популярными моделями тогда были продукты SonyEricsson, разработанные совместно с Fossil. К тому моменту времени у меня уже имелись Fossil Abacus Wirst PDA, и я решил снова попробовать продукцию этой компании: на Amazon-е приобрел Fossil Abacus CallerID.

Fossil Abacus CallerID — полный аналог SonyEricsson MBW-100. Из возможностей — синхронизация времени с телефоном, отображение поступающего звонка (имя звонящего на небольшом экранчике, виброзвонок), да «конвертик», информирующий о поступлении новых сообщений. И CallerID, и MBW-100 совместимы только с рядом моделей SonyEricsson.

В тот момент времени в качестве рабочего телефона я использовал SE P1i и почти не напрягался на столь ограниченную совместимость. Часы не публиковали никаких bluetooth-профилей и копать глубже тогда не особо хотелось. Так все шло до появления Nokia N900. В какой-то момент у меня щелкнуло, что мне жутко не хватает интеграции часов с Maemo. В очередной раз я прошелся по поисковикам в поисках информации о протоколе, используемой часами… Закипела разработка!



На рынке представлены несколько моделей часов разных производителей с несколько различными функциями, их можно разделить по группам:
Fossil Abacus CallerID, SonyEricsson MBW-100, MBW-150 и MBW-200 (две последние модели с точки зрения User Expirience отличаются от первых только наличием управления мультимедиа).
— Линейка часов Citizen i:Virt и i:Virt-M, предназначенная для внутреннего рынка Японии. На мой взгляд, это самое интересное решение.
LG Prada Link, продаваемые исключительно с телефоном LG Prada и поэтому достаточно редкие и не представляющие (для меня) особого интереса.
— Различные китайские часы и браслеты. Тут можно отметить LM Technologies LM957, LM-958 и LM959, но ни одного живого экземпляра мне не попадалось. Что качается браслетов, то они отличаются крайне кривой софтверной реализацией.

Прежде чем перейти к рассказу о моем проекте, хочу отметить проекты других разработчиков, давшие мне в том или ином виде информацию, позволившую произвести разработку:
— Sic! BT-Watch для Symbian;
smartWatchM для Windows Mobile;
— кросс-платформенный OpenWatch, разработка которого двигается в параллели с моей.

Какие преимущества имеет мой проект перед проектами конкурентов?



Главным отличием является концепция. Первым моим требованием стала поддержка того User Expirience, который реализован каждой конкретной моделью часов, не более. То есть, например, если часы имеют функцию отображения номера звонящего, то это не означает, что вместо этого нужно подсовывать прогноз погоды. При взаимодействии с телефоном интерфейс часов представлен набором команд бизнес-уровня, а не уровня представления.

Вторым требованием является охват максимального количества функций часов. Например, Citizen i:Virt позволяет отобразить входящие звонки, отключать звонок и сбрасывать входящий звонок, отображать список входящих сообщений, читать входящие сообщения прямо на часах, отображают и переключают профили телефона, отображают названия оператора, уровень заряда батареи телефона. Наконец, они могут показывать различные нотификации (при этом вибрируют), новости (sic!) и даже спускать затвор камеры!

Третьим и не менее важным требованием является достаточно продуманная и компактная реализация кода. Мой проект разрабатывается на С/С++ только с использованием из фундаментальных библиотек stdlib и glib. STL, Boost, GlibMM и иже с ними были выкинуты из проекта в те или иные моменты времени из-за своей прожорливости.
Не надо забывать о том, что процесс должен работать месяцами на мобильном устройстве с ограниченными ресурсами памяти, процессора, да еще учитывать ресурс батареи. Я готов вылить ложку дегтя на проект OpenWatch за расточительность ресурсов, слабую структурированность и низкую концепцию.

Как работают часы?



Забавно, но не смотря на то, что изначально мне не было понятно, как это вообще работает, все оказалось достаточно просто. Без изобретения велосипеда.
Все разработчики подобных устройств придерживаются рекомендаций Bluetooth Group и ETSI — используют для коммуникации IFCOMM и AT-команды. Японский Mobile Computing Promotion Consortium (MCPC) опубликовал даже несколько спецификаций, связаных с реализацией BT-часов.

Fossil и SonyEricsson требуют от телефона публикации SPP профиля со специфичным UUID. Остальные производители придерживаются расширения HFP-профиля.
К сожалению, только trunk-версия bluetooth-стека BlueZ позволяет реализовывать внешние агенты для AT-команд, по этому поддержка HFP-профиля связана с некоторыми неудобствами: невозможно одновременно реализовать поддержку различного bluetooth-аудио и часов. (В своей реализации я свел это неудобство к минимуму: поддержка HFP включается «флажком», плагин Audio BlueZ отключается только на время работы программы).

Набор команд, используемый Fossil и SonyEricsson, хорошо описан в документации на разные телефоны от последнего. Достаточно лишь посмотреть дамп обмена часов и телефона, чтобы определиться с тем, какие команды надо поддержать. Но тут все равно не без подковырки. Младшие модели без поддержки управления медиа-плеером имеют полноценный знакогенератор Unicode, а старшие — только ASCII, так что выводить имя звонящего следует только в графическом виде, прорисовывая текст на телефоне и передавая растр на часы. С метаинформацией из медиа-плеера вообще песня: кидаешь в часы событие с метаинформации, а они тебе в ответ команду с этим же текстом — прорисуй его в растр.

Отдельные приключения с Citizen i:Virt. Японцы — очень закрытые. Эти часы предназначены для внутреннего рынка Японии и работают исключительно телефонами Softbank и DisneyMobile от Sharp. Тут часть команд покрывается стандартными спецификациями, еще по некоторой части можно найти спецификации MCPC. Основное же покрывается только обратным инжинирингом дампов. На текущий момент времени для меня остаются неизвестными команды для трансляции новостей и управления камерой, нужно получить на руки поддерживающий эти функции телефон и заснифить весь трафик между устройствами для последующего анализа.

Интеграция с Gnome Mobile и Maemo



Я специально указал Gnome Mobile в названии этого раздела, чтобы подчеркнуть тот факт, что развитие множества мобильных платформ, основанных на Linux, базируется на этом проекте. Данный факт позволить достаточно легко портировать приложение на другие Linux-платформы, базирующиеся на проекте Gnome Mobile.

Мой проект активно использует объектную модель для реализации функциональных компонентов: Отдельно выделено достаточно тонкое ядро, реализующее коммуникационный слой, с которым взаимодействуют агенты — компоненты, реализующие те или иные функциональные домены, такие как интеграция с модемом или Telepathy.

Прямая интеграция с модемом. Реализовывать ее пришлось из следующих соображений: по хорошему, нужно отображать статус регистрации в сети и имя оператора, входящий звонок на модеме появляется значительно раньше, нежели чем в Telepathy. К тому же этот компонент я разработал намного раньше, чем осилил реализацию Telepathy. API модема на N900 закрытый, но все необходимое можно узнать из открытых источников на основе обратного инжиниринга BlueZ.

Интеграция со службой сообщений. В Maemo вся работа с короткими сообщениями и сообщениями IM-служб тесно связаны с системой RTCOMM. RTCOMM обеспечивает персистентное хранение журналов, поэтому было вполне логичным использовать API RTCOMM для чтения входящих сообщений. Кроме того, rtcomm-event-logger нотифицирует другие процессы о добавлении или изменении данных с помощью сигналов DBUS.

Интеграция с Telepathy. Gnome Mobile и Maemo имеют одну замечательную способность. Эта особенность так же соответствует концепции развития телефонных услуг 3GPP. Особенность эта заключается в том, что все телефонные звонки CS-домена приравниваются к VoIP-услугам и IM-у и их обслуживание реализуется через Telepathy. Поскольку интеграция со службой сообщений и модемом была произведена ранее, интеграция с Telepathy в данном случае необходима для обслуживания VoIP-звонков. К сожалению байндинги для C достаточно слабо документированы в самом Telepathy, по этому за помощью пришлось обращаться к исходникам проекта Impathy. Основную «портянку» данного компонента составляет GObject, реализующий интерфейс Telepathy Observer.

Мультимедийный плеер в Maemo реализован с помощью фреймворка MAFW, приложение Media Player представляется лишь только фронт-эндом для него. Управление воспроизведением плейлистов и громкостью реализовано через MAFW.

Базовые ипецификации на AT-команды включает репортинг аксесуару состояния и заряда батареи. Все это можно получить через libhal. Управление профилями реализуется через libprofile. Для синхронизации времени между устройствами пришлось воспользоваться libtime. ну а для прорисовки текстов под часы Fossil и SE — Cairo.

Теперь о самом интересном. Получение нотификаций из системы, управление звонком. Все нотификации в системе (желтые тизеры, календарь, будильник и прочее) реализуются D-BUS-интерфейсом org.freedesktop.Notifications в процессе notification-daemon. Когда еще нужно чем-нибудь побренчать или помигать, в дело вступает hildon-sv-notification-daemon (com.nokia.HildonSVNotificationDaemon), которому notification-daemon делает соответствующий вызов. При входящих звонках приложение Phone вызывает hildon-sv-notification-daemon напрямую.

Соответственно о фактах вызова методов этих интерфейсов можно узнать, установив соответствующие фильтры сообщений с помощью D-BUS low-level API. В обоих случая важно знать хэндл, выдаваемый обоими демонами за запрос. То есть необходимо отслеживать не только DBUS-сообщения method_call, но и method_return, строя между ними корреляцию. Дело осложняется еще тем, что в DBUS low-level API для сообщений method_return возможно установить только глобальный фильтр, по этому реализуемый код монитора должен быть очень быстрым и сверхкомпактным, дабы не нагружать устройство обслуживанием этого хука. Дополнительно хочу обратить внимание заинтересовавшихся на дефект 1719 на D-BUS. Его наличие устанавливает ограничение на возможность реализации лишь одного монитора вызовов на процесс.

Реализованые возможности



Abacus CallerID, SonyEricsson MBW-100:
— входящие сотовые и VoIP звонки — номер и имя,
— отключение мелодии звонка, сброс входящего звонка,
— входящие сообщения IM и SMS — «конвертик».
Sony Ericsson MBW-150, MBW-200:
— входящие сотовые и VoIP звонки — номер и имя,
— отключение мелодии звонка, сброс входящего звонка,
— входящие сообщения IM и SMS — «конвертик»,
— управление громкостью и воспроизведением медиа-плеера.
Citizen i:Virt:
— входящие сотовые и VoIP звонки — номер и имя,
— отключение мелодии звонка, сброс входящего звонка,
— журнал пропущенных звонков,
— входящие сообщения IM и SMS — «конвертик»,
— чтение непрочитанных сообщений IM и SMS прямо на часах,
— управление профилями телефона — основной и тихий,
— отображение текущего профиля,
— отображение названия оператора и уровня заряда батареи,
— нотификации о входящих e-mail-ах, нотификации будильника и календаря, нотификации прочих приложений.
браслеты и прочее:
… все что смогут из перечисленного.

В заключении хочу привести несколько видео, которые я снимал в ходе процесса разработки. Прошу прощения за качество видео.





Большое спасибо всем, кто помог мне с публикацией на Хабре!
Tags:
Hubs:
Total votes 31: ↑27 and ↓4+23
Comments23

Articles