Немного оффтоп, но сохраню для истории.
У меня на даче dir-320, прошитый одной из последних от vampik, в него воткнут Huawei E352b. Дачный роутер подключатеся как l2tp-клиент к домашнему Mikrotik с l2tp-сервром.
Иногда возникает необходимость прочитать смс с кодом подтверждения (например чтобы зайти в личный кабинет и проверить баланс), а ехать на дачу и выдергивать модем из роутера ради этого, понятное дело, не хочется.
Читал в интернете разные инструкции, как читать смс, везде нужен какой-то дополнительный софт типа minicom, в общем сплошные заморочки. Но удалось решить проблему только средствами того, что есть в роутере. Уверен, что подойдет на любой роутер и почти на любой модем. Не у всех модемов есть возможность читать смс одновременно с интернет-соединением, но AT-команды стандартные для всех модемов и используется chat из busybox.
Заходим в роутер по ssh или в веб-админку, если она позволяет выполнять shell-команды
Ищем tty устройства модема
Получаем ответ вроде
Code:
ttyUSB0
ttyUSB1
ttyUSB2
Дальше придется пробовать для всех этих устройств, подобрав то, которое отвечает
Выводим список СМС
Code:
chat -V -t 5 '' 'AT+CMGF=1' 'OK' 'AT+CMGL="ALL"' 'OK' > /dev/ttyUSB1 < /dev/ttyUSB1
Что делает эта команда.
Ждёт, пока модем скажет '', то есть ничего не ждет.
Потом отправляет в него AT+CMGF=1 (это переключение модема в текстовый режим общения) и ждет ответа OK.
Потом отправляет AT+CMGL="ALL" (это вывести список всех смс) и снова ждет ответа OK.
Перенаправление ввода/вывода > /dev/ttyUSB1 и < /dev/ttyUSB1 говорят команде, где находится модем.
Параметр -V говорит, что всё общение с модемом нужно сделать на экран, а не выводить в логи. Параметр -t 5 - таймаут ожидания нужного ответа от модема, если он не будет получен, следующая команда не будет отправлена.
В результатах вывода ищем что-то вида
Code:
+CMGL: 0,"REC UNREAD","+7XXXXXXXXXX",,"XX/XX/XX,XX:XX:XX+XX"
041F0440043E043204350440043A0430002004410432044F04370438
Это значит, что в ячейке 0 хранится непрочитанное сообщение с номера +7XXXXXXXXXX. Если запустить команду ещй раз, сообщение будет REC READ, то есть его уже читали.
Берем тело сообщения из следующей строки, идем на https://smspdu.benjaminerhart.com/, вставляем в поле PDU, выбираем Contains only User Data, Unicode UCS2, Decode и читаем смс.
Если длинная и состоит из нескольких частей, она будет лежать в нескольких ячейчках. Можно расшифровать каждую по очереди и склеить итоговый текст.
Когда сообщений в памяти много, память заканчивается, и новые сообщения перестают приходить. Для удаления можно использовать AT+CMGD=n, где n - номер ячейчки с сообщением или AT+CMGD=,4, чтобы удалить все сообщения, включая непрочитанные.
Итоговая команда для чтения и сразу очистки (ведь зачем забивать память кодами подтверждения) будет выглядеть примерно так
Code:
chat -V -t 5 '' 'AT+CMGF=1' 'OK' 'AT+CMGL="ALL"' 'OK' 'AT+CMGD=,4' 'OK' > /dev/ttyUSB1 < /dev/ttyUSB1