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

    В предыдущей статье я рассказал про то, как устроен слой радиоинтерфейса в ОС 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 производителя
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 0

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.