Pull to refresh

Взаимодействие с модемом в ОС Android

Reading time 2 min
Views 30K
В предыдущей статье я рассказал про то, как устроен слой радиоинтерфейса в ОС Android. Сегодня я расскажу о том, как можно взаимодействовать непосредственно с модемом.
Зачастую бывает, что планшет с 3G модемом не предоставляет возможности позвонить, отправить SMS-сообщение и даже узнать баланс счёта. В этой статье мы будем с этим бороться, а так же увидим как использовать весь функционал, предоставляемый модемом.
Как вы уже знаете, RIL производителя переводит запросы ОС Android в понятный модему виду. Как правило для взаимодействия с модемом используется множество стандартизованных Hayes AT-команд, тем не менее, некоторые производители модемов дополняют стандартный набор AT-команд своими собственными расширениями. Сегодня мы будем работать на уровне между RIL производителя и модемом.


Отмечу, что для экспериментов ваше устройство должно быть рутовано, а Вы должны иметь минимальный опыт программирования на NDK.

Приступим


Для начала нам необходимо установить как называется файл устройства модема в системе. Как правило это /dev/ttyACM0 или /dev/smd0 (так же встречается /dev/ttyUSB0). Чтобы это узнать, необходимо выполнить в терминале команду просмотра радио-лога: logcat -b radio. Самая первая строка радио-лога должна иметь вид: "Opening tty device /dev/ttyACM0". Если же такой строки нет, то нам повезло меньше, придётся перебрать все устройства, расположенные в каталоге /dev/. Для этого в каждый файл из этого каталога необходимо послать тестовую команду "AT" и в случае, если это файл устройства модема увидеть ответ в радио-логе "OK". Команды можно посылать например при помощи терминала: echo «AT» > /dev/file_name.

Теперь, установим, какие же команды посылаются в модем. Для этого осуществим «атаку» типа MITM.

Для этого:
  • Переименуем настоящий файл модема в /dev/ttyACM0_real.
  • Создадим файл /dev/ttyACM0 как символьную ссылку на псевдотерминал /dev/ptmx.
  • Будем записывать в лог всё, что идёт через /dev/ttyACM0 и перенаправлять это в /dev/ttyACM0_real
  • Перезапустим демон rild: "kill pid_rild", запустится он автоматически.

Код программы доступен тут.

Изучив наш лог, можно увидеть, какие АТ-команды и параметры соответствуют действиям. После старта демона rild сначала, происходит инициализация модема, получение необходимой информации от базовой станции и т.д.
Если вы отправляли SMS-сообщение, то этому соответствовала следующая последовательность AT-команд:
AT+CMGS=18
>
0001000b815686070855f4345005c8329bfd06^Z

Сообщение имеет такой вид, потому что закодировано в формате PDU. Воспроизведя программно данную последовательность AT-команд, можно убедиться, что сообщение успешно отправляется. При этом, естественно, не отображается в списке отправленных сообщений в приложении ОС Android.
С помощью AT-команды AT+CUSD=1,*100#,15 можно сделать USSD запрос
А используя команду ATD+79161234567; совершить исходящий телефонный звонок.

С использованием данного подхода возможно осуществлять, например, фильтрацию SMS-сообщений, звонков и т.д.

Используемые материалы:
1. fabiensanglard.net/cellphoneModem/index2.php
2. Исходные коды RIL производителя
Tags:
Hubs:
+19
Comments 0
Comments Leave a comment

Articles