Недавно писал о настройке USB-модема Olax для подключения интернета - но у этого модема есть и другая полезная функция: получение и отправка СМС.
Несмотря ни на что, до сих пор эта функция бывает востребована - от получения всяких кодов до информации о "выгодных предложениях" операторов.

Особенность данного модема в том, что он для доступа к WebAPI требует авторизацию, хотя и довольно примитивную: ввод только пароля, после чего с адреса отправителя в течении нескольких минут можно отправлять команды.
Но ничего не мешает отправлять пароль перед каждой операцией - это сбросит предыдущее разрешение, но зато гарантирует успешность новой команды.

Например, получение списка СМС:

#!/bin/sh

password='admin'
hash=$( echo -n "$password" | base64 )

host='http://192.168.100.1'

dtm=$( date "+%s" )

curl -s -X POST $host/reqproc/proc_post -d goformId=LOGIN -d password="$hash" > /dev/null

curl -s "$host/reqproc/proc_get?cmd=sms_data_total&page=0&data_per_page=500&mem_store=1&tags=10&order_by=order+by+id+desc&_=${dtm}001"

Скрипт выдает список в виде JSON-данных.
Кстати, похоже с API есть баг: при некоторых условиях в JSON-код попадают символы переноса строк. Если при этом браузер пытается честно распарсить JSON - скрипт валится на ошибке, а браузер показывает бесконечно крутящееся окошко "загружается" - видимо, с этим и связана известная пользователям этих модемов ошибка "не могу прочитать СМС" в веб-интерфейсе.

Но это несложно исправить, если мы не в браузере:

#!/usr/bin/perl

use JSON;
use Encode qw(decode);

use utf8;

my $str='';
while(<>){
  $str .= $_;
}

$str =~ s/[\r\n]//gm;

my $data = from_json($str);

if(defined $data->{messages}){
  for my $msg (@{ $data->{messages} }){
    my $bin = pack("H*",$msg->{content});
    my $unicode = decode("UCS-2BE", $bin);
    print "$msg->{id}: from $msg->{number}\n$unicode\n";
  }
}

Почему perl? Потому что он есть в ОС, не требует никаких "установок окружения", и потому что он прекрасно подходит для решения этой задачи:
get_sms | parse_sms сразу выдаст список в читаемом виде.

Также, при желании несложно добавить сохранение этих СМС в базу данных:

....
use DBI:
....

my $dbh = DBI->connect("dbi:mysql:database=$db_name", $db_user, $db_pass , { 'mysql_enable_utf8' => 1 }) || die "Cant connect database\n";

....
$dbh->do("insert into sms (id, text) values (?,?)", undef, $msg->{id}, $unicode);
...

Удаление СМС - по их номеру, id:

#!/bin/sh

password='admin'
hash=$( echo -n "$password" | base64 )

host='http://192.168.100.1'

if [ "x$1" != "x" ]; then

  curl -s -X POST $host/reqproc/proc_post -d goformId=LOGIN -d password="$hash" > /dev/null

  curl -s "$host/reqproc/proc_post?goformId=DELETE_SMS&msg_id=$1"

else
  echo "Usage: $0 <id>";
  echo
fi

Ну и конечно отправка:
(номер телефона - включая все цифры, без +, например send_sms 71234567890 - читает со STDIN)

#!/bin/sh

password='admin'
hash=$( echo -n "$password" | base64 )

host='http://192.168.100.1'

if [ "x$1" != "x" ]; then

  read str

  if [ -n "$str" ] ; then

    packed=$( echo -n $str | iconv -f UTF-8 -t UCS-2BE | xxd -p | tr -d '\n' )

    dtm=$( date "+%y;%m;%d;%H;%M;%S;%:::z" )

    curl -s -X POST $host/reqproc/proc_post -d goformId=LOGIN -d password="$hash" > /dev/null

    curl  -X POST $host/reqproc/proc_post -d goformId=SEND_SMS \
      -d notCallback="true" \
      -d Number="$1" \
      -d sms_time="$dtm" \
      -d MessageBody=$packed \
      -d ID="-1" \
      -d encode_type=UNICODE


  fi
else
  echo "Usage: echo "message" | $0 <number>"
  echo
fi

Также у модема есть и другие интересные методы в API, их при желании несложно увидеть через режим инспектора в браузере.

Вызываются они по тому же принципу.

Комментарии (2)


  1. danik_proger
    08.12.2025 20:57

    Не знаю насчёт символов переноса строк, но вот символ 0x11 DEVICE CONTROL 1 попадался, в отправителе Megafon<0x11>Eva. Регулярку мне такую подсказали (все непечатаемые символы, кажется): /[^ -~]/g

    Было бы интересно изучить, как начать кодить под сам модем, чтобы он мог автономно что-нибудь делать. Правда, заголовочных файлов в открытом доступе нет, наверное. Есть только некие исходники для других модемов той же платформы (ZTE 79U).


    1. JBFW Автор
      08.12.2025 20:57

      Там Линукс, какое-то ядро и софт вокруг. Главная проблема - очень мало места, и диска и памяти.

      А так-то, если соберете кросс-компилятором что-то статическое - работать оно должно.

      Имхо, интереснее тогда уж скрипты внутри ковырять, что-то запускать, что-то отключать.

      На 4pda народ пытался что-то такое делать