Баланс сим-карты на почту

В прошлой статье мы подключили наш E1550 к asterisk.

Продолжая тюнинг и «обвес» системы. Сегодня мы будем отправлять входящие на симку сообщения и USSD-запросы на почту.

Показать »

Нам потребуются:

  • asterisk + chan_dongle
  • почтовый клиент
  • php

Установим php:

opkg install php5 php5-cli

Установим почтовый клиент:

opkg install ssmtp

Можно любой другой, но настроить mini-sendmail у меня например не хватило терпения =)

Настроим SMTP-клиент:

nano /etc/ssmtp/ssmtp.conf

root=<имя ящика>@gmail.com
mailhub=smtp.gmail.com:587
#rewriteDomain=
hostname=psmtp.gmail.com:587
FromLineOverride=YES
UseSTARTTLS=YES 

AuthUser=<имя почтового ящика>
AuthPass=<пароль от почтового ящика>

nano /etc/ssmtp/revaliases

root:sigillite@gmail.com:smtp.gmail.com:587

В первом файле прописываем настройки соединения. Второй нужен чтобы не приходилось формировать заголовок письма вручную.

Проверим результат:

 echo test | ssmtp -s "test" mail@gmail.com

Если все правильно, вы получите письмо с текстом test.

Добавим в контекст донгла экстеншены для обработки sms и ussd-сообщений:

exten => ussd,1,NoOP(Incoming USSD: ${USSD})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%d.%m.%Y %H:%M:%S)} -%- USSD -%- ${DONGLENAME}: -%- ${USSD} -%-' >> /www/msg)
exten => ussd,n,system(/work/smssend.php)
exten => ussd,n,Hangup()

exten => sms,1,NoOP(Incoming SMS: ${SMS})
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%d.%m.%Y %H:%M:%S)} -%- SMS -%- ${DONGLENAME}: -%- ${SMS} -%-' >> /www/msg)
exten => sms,n,system(/work/smssend.php)
exten => sms,n,Hangup()

Создадим скрипт для обработки входящих сообщений:

#!/usr/bin/php-cli
<?php

// путь до файла с смс
$file_name = '/var/log/asterisk/sms.txt';

// если размер файла больше 0 переходим к его обрботке
if (filesize($file_name)>0) {.

    // открываем файл для чтения и записи
    $fobj = fopen($file_name,"r+");
    $text = fread($fobj, filesize($file_name));
    // в файл смс записываются в следуюшем формате
    // дата и время -%- datacard -%- номер отправителя -%- текст смс
    // формат и разделитель можно сменить в конфиг файле
    // преобразовываем содержимое в массив используя -%- как разделитель
    $text1 = explode("-%-", $text);
    // делим массив а части по 4 элемента
    $array = array_chunk($text1, 4);
    // рисуем таблицу в которой будут выводится наши смс
    $mes1 = "<table border='1' bordercolor='#000000' cellspacing='0' cellpadding='2'>";
    $mes2 = "<tr align='center' valign='middle'><td width='160'>Дата и время сообщения</td><td width='140'>Номер отправителя</td><td width='230'>Сообщение</td></tr>";

    for ($i = 0; $i < = count($array)-2; $i++)
{
$sms = $array[$i];
$sms1[] = "<tr valign='middle'><td align='center'>".$sms[0]."</td><td align='center'>".$sms[2]."</td><td align='left'>".$sms[3]."</td>";
    }

    for ($mes3 = '', $j = 0; $j < = count($sms1); $j++)
{
$mes3 = $mes3.$sms1[$j];
    }

    $mes4 = "</table>";

    // Теперь перейдем к отправке
    // отправлять будем используя встроенную функцию mail()

    // получаем текущую дату
    $date = date("d.m.Y");
    // получаем текущее время
    $time = date("H:i:s");
    // адрес куда будем отправлять письмо
    $to  = "sigillite@gmail.com";
    // тема письма
    $subject = "New SMS Message(s) - ".$date." - ".$time;
    // текст письма
    $message = $mes1.$mes2.$mes3.$mes4;
    // дополнительные заголовки письма
    // кодировка письма
    $headers  = "Content-type: text/html; charset=utf-8 rn";
    // отправитель письма
    $headers .= "From: Asterisk SMS Gate <asterisk @router.com>rn";

    // отправляем письмо, если отправка прошла успешно
    // выводим сообщение иочищаем файл с смс
    if (mail($to, $subject, $message, $headers)) {
echo "Soobshenie ojidaet otpravki";
ftruncate ($fobj, 0);
    } else {
// если ошибка выводим это сообщение
echo "Oshibka pri otpravke";
    }

    // закрываем файл
    fclose($file_name);

}

// если файл пустой выводим это сообщение
else { echo "Sms soobshenii net...n"; }

?>

Корректировки:

По умолчанию наш астериск стартует от имени пользователя nobody, поэтому скрипт не запускается — прав не хватает. Я исправил в файле /etc/asterisk/asterisk.conf имя пользователя, от имени которого запускается астер, на root.

Делаем релоад, пробуем:

>dongle ussd SIMCARD *111#
[SIMCARD] USSD queued for send with id 0x5e6658
    -- [SIMCARD] Successfully sent USSD 0x5e6658
[Mar 30 23:39:14] NOTICE[22100]: at_response.c:267 at_response_ok: [SIMCARD] Successfully sent USSD 0x5e6658
 [SIMCARD] Got USSD type 0 'USSD Notify': 'Balans 0.00grn, bonus 0.48grn. Detali: *121#
    -- Executing [ussd@dongle-incoming:1] NoOp("Local/ussd@dongle-incoming-885d;1", "Incoming USSD: Balans 0.00grn, bonus 0.48grn. Detali: *121#") in new stack
    -- Executing [ussd@dongle-incoming:2] System("Local/ussd@dongle-incoming-885d;1", "echo '30.03.2013 23:39:17 -%- USSD -%- SIMCARD: -%- Balans 0.00grn, bonus 0.48grn. Detali: *121# -%-' >> /www/msg") in new stack
    -- Executing [ussd@dongle-incoming:3] System("Local/ussd@dongle-incoming-885d;1", "/work/smssend.php") in new stack
    -- Executing [ussd@dongle-incoming:4] Hangup("Local/ussd@dongle-incoming-885d;1", "") in new stack

получаем на почту письмо:

30.03.2013 23:39:17   SIMCARD:   Balans 0.00grn, bonus 0.48grn. Detali: *121#

Comments

  1. На выхлопе скрипта:
    PHP Notice: Undefined offset: 1 in /work/smssend.php on line 35
    Soobshenie ojidaet otpravkiPHP Warning: fclose() expects parameter 1 to be resource, string given in /work/smssend.php on line 70
    письмо приходит только когда вручную запускаю скрипт. Как быть?

    1. По умолчанию наш астериск стартует от имени пользователя nobody, поэтому скрипт не запускается – прав не хватает. Я исправил в файле /etc/asterisk/asterisk.conf имя пользователя, от имени которого запускается астер, на root.

Добавить комментарий

Войти с помощью: