Вчимо gsm модем zte «дзвонити і приймати дзвінки»

Завалявся у мене GSM -модем ZTE MF180 щось з ряду найдешевших. І ось нарешті настав його час, вирішив використовувати це чудо китайської модемного промисловості для зв'язку з віддаленим об'єктом, навколо якого ніякої іншої мережевої інфраструктури немає і не передбачається в найближчі 50 років.







Відразу скажу, забаганки у мене багато в чому дивні, а саме, мені заманулося використати голосові виклики для управління деякими функціями пристрою. Ну, скажімо так, не до кінця голосові, але все ж виклики, тобто коли ми дзвонимо на номер, за яким прописаний наш девайс, він повинен якось реагувати на вхідний дзвінок. І не тільки, і навіть не стільки на дзвінок, скільки на завершення виклику, і в залежності від умов активувати різні функції. З іншого боку, пристрій повинен вміти дзвонити саме, а вже двонога мавпа на іншій стороні або ж точно така ж автоматизована система в свою чергу теж якось реагувати на це.

Ofono - сервер управління GSM периферією

Товариші з Maemo Нокли і Штеуда написали таку цікаву штуку як ofono. Сервіс працює з різними родинами модемів і управляється через інтерфейс системної шини DBus. Мій модем давно підтримується, проте, я кілька зажурився, коли зрозумів, що інтерфейс голосових викликів недоступний. На сайті прочитав, що для таких GPRS-only модемів він принципово не доступний. Я, зрозуміло, обурювався, бо до цього вже встиг поспілкуватися з пристроєм через послідовну консоль в minicom. Там були повідомлення про вхідні дзвінки й завершення виклику, також працювала команда AT + CLCC. коректно повідомляючи про поточні виклики. Я навіть пробував зателефонувати собі (AT + 7 ××××××××××;) і відхиляти дзвінки (ATH), все було на місці. Не довго думаючи, вирішив таки докопатися до суті і попатчіть сервер під свої потреби.







Воркераунд перший: Активуємо сервіс голосових викликів

Сервіс голосових викликів з'явився відразу як тільки я додав рядок в plugins / zte.c в функцію zte_pre_sim:

Для тестування сервісів dbus я зазвичай використовую корисну ТУЛС mdbus2. яка є в будь-якому дистрибутиві. Все стало працювати, після включення пристрою я міг дзвонити на нього і отримувати повідомлення:

Воркераунд другий: Вирішуємо проблему повідомлень про скасування викликів

Однак, радість була не довгою, при скасуванні виклику сигнал про скасування через раз не приходив, і це насторожувало. Тоді я запустив сервер в отладочном режимі і став дивитися:

А побачив я цікаву річ, ну крім усього іншого, що він там виводить, а виводить він там дуже багато всього:

Повідомлення grep виявив в drivers / atmodem / voicecall.c в функції clcc_poll_cb. яка парсит відповідь модему на команду AT + CLCC. Тут треба пояснити, справа в тому, що сервіс отримує інформацію про стан вхідних викликів різними шляхами, в тому числі через прямий polling стану модему шляхом періодичного запуску цієї самою командою, це зроблено виходячи з міркувань сумісності. А тепер найцікавіше, те, що знаходиться перед виведенням цих повідомлень (для збереження ефекту привожу весь блок цілком):

Вот такой вот вам КвалКомм, ось такі ось вам Якісні Комунікації, помилки для яких в порядку речей, робимо висновки, товариші. Схоже нам пощастило не менш, хотфиксов від розробників ofono впору застосувати і для ZTE. який, до речі ставить чіпи цього самого КвалКомма.

Тут я вирішив підійти до вирішення проблеми через задній двір, дуже вже не хотілося правити код референсной (або не дуже) реалізації протоколу atmodem. Пам'ятайте вище ми активували сервіс голосових викликів, так ось там ми як другий параметр передали 0, а це є ні що інше як айди вендора, тому просто передамо туди OFONO_VENDOR_QUALCOMM_MSM. і буде нам щастя, сподіваюся.

Тести показали, що все працює саме так, як і було заплановано, так що ура, товариші, і щасливого хакинга.