Недавно писал о настройке 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, их при желании несложно увидеть через режим инспектора в браузере.
Вызываются они по тому же принципу.
danik_proger
Не знаю насчёт символов переноса строк, но вот символ 0x11 DEVICE CONTROL 1 попадался, в отправителе Megafon<0x11>Eva. Регулярку мне такую подсказали (все непечатаемые символы, кажется): /[^ -~]/g
Было бы интересно изучить, как начать кодить под сам модем, чтобы он мог автономно что-нибудь делать. Правда, заголовочных файлов в открытом доступе нет, наверное. Есть только некие исходники для других модемов той же платформы (ZTE 79U).
JBFW Автор
Там Линукс, какое-то ядро и софт вокруг. Главная проблема - очень мало места, и диска и памяти.
А так-то, если соберете кросс-компилятором что-то статическое - работать оно должно.
Имхо, интереснее тогда уж скрипты внутри ковырять, что-то запускать, что-то отключать.
На 4pda народ пытался что-то такое делать