Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> программы —> SMSTools 3

SMSTools 3 - шлюз для отправки SMS

Автор: lexy.


xxx: мой телефон крякнул :-(
xxx: все. я теперь не мобильная. сссукаааааааа . ну не прет так сразу во всем ]:->
yyy: че с ним? ))
xxx: он уже не жилец((((. у него белый свет ....в конце тунеля
xxx: экран белым светиться ..ни че не вижу...
yyy: знач будешь ходить со старым сименсом :-P
xxx: откуда у меня появится старый сименс?
yyy: у всех есть старые сименсы :-D
Цитата #400329 bash.org.ru


Нет, мы, как раз, немобильными не останемся, именно потому, что у нас есть «старый сименс»!
Постановка задачи: есть база партнеров по бизнесу, которых нужно уведомлять о состоянии их счета независимо от менеджеров, которые с ними работают. Переговоры с сотовыми операторами по поводу SMS-гейтов зашли в тупик в виду неадекватного ценника, неповоротливости (срок исполнения ведь обычно - «уже вчера должно работать») или сложности реализации, поэтому
имеем:

  • старый Siemens M75;
  • родной (семёновский) дата-кабель DCA-510 к нему;
  • машинку с правильной осью (FreeBSD 7.0)

    НАДО: создать автоматизированную систему рассылки SMS

    Детали полной реализации я выкладывать не буду, т.к. задача весьма специфическая, но рассмотрю все основные моменты отправки SMS.

    В портах нашел вот что:
    Port:   smstools-3.1.3
    Path:   /usr/ports/comms/smstools3
    Info:   SMS Gateway software for GSM modems and mobile phones
    Maint:  mm@FreeBSD.org
    WWW:    http://smstools3.kekekasvi.com
    

    sudo make -C /usr/ports/comms/smstools3 install clean
    

    Теперь цепляем телефон. Как я понял, проблем при подключении датакабеля через обычный comm-port не возникает, но в данной ситуации кабель USB. Чип используется  PL2303, в FreeBSD поддерживается. Проверяем:
     ~> kldstat -v | grep 'u[pl]*com'
    

    если не видим чего-то подобного:
    212 ucom
    223 uhub/uplcom

    берем бубен и собираем ядро, добавив в конфигурацию следующиме опции:
    device          ucom
    device          uplcom
    

    как это сделать очень хорошо расписано здесь: http://www.lissyara.su/?id=1072, поэтому, повторятся не буду (а можно и отдельно модули собрать, но это тема другой статьи).
    ВНИМАНИЕ! Без установленных модулей кабель тоже будет определятся как /dev/ugenX, но работать не будет.
    Если все модули на месте — подключаем кабель и смотрим:
    ~> ls -lah /dev/cuaU*
    crw-rw---- 1 uucp dialer 0, 69 28 окт 15:01 /dev/cuaU0
    crw-rw---- 1 uucp dialer 0, 70 24 окт 10:27 /dev/cuaU0.init
    crw-rw---- 1 uucp dialer 0, 71 24 окт 10:27 /dev/cuaU0.lock

    Кабель увидели, можно подключать телефон и приступать к настройке SMS-шлюза.
    Так как по умолчанию smsd стартует от рута, а это не тру, создаем пользователя:
    ~# pw groupadd smsd -g 151
    ~# pw  useradd -n smsd -u 151 -c 'SMS Gate worker' -g smsd \
    ? -G uucp,dialer -w no -s /sbin/nologin -d /nonexistent
    

    теперь настраиваем SMS Tools, файл /usr/local/etc/smsd.conf

    # структура файла такая:
    # глобальные настройки
    # ...
    # ...
    # [ модем 1 ]
    # ...
    # [ модем 2 ]
    # ...
    # [ модем 3 ]
    # ...
    
    # используемые устройства, если несколько — пишем через запятую
    devices = GSM0
    # лог, если не указан — пишется в syslog, если = 1, пишет в stdout
    logfile = /var/log/smsd.log
    # писать фсё
    loglevel = 7
    
    # No comments, я надеюсь ;-)
    USER = smsd
    GROUP = dialer
    
    # No comments too , главное — не забыть создать
    # /var/run/smsd/ и дать все права юзеру smsd
    PIDFILE= /var/run/smsd/smsd.pid
    INFOFILE= /var/run/smsd/smsd.working
    
    # Теперь настраиваем все телефоны, ГСМ-момеды и пр. шелезяки
    # Siemens M75
    [GSM0]
    # порт
    device = /dev/cuaU0
    # скорость в нем
    baudrate = 115200
    # аппаратное управление потоком
    rtscts = no
    # строка инициализации (взял с сайта программы), 
    # подробная справка по командам в приложениях
    init = AT+CPMS="ME","ME","ME"
    init2 = AT+CNMI=1,1,0,2
    # приоритет входящих сообщений
    incoming = high
    # хотим отчет о доставке
    report = yes
    # задержка перед отправкой
    send_delay = 20
    

    По минимуму достаточно, уже будет работать.
    Еще пару движений:
    в /usr/local/etc/rc.d/smsd
    pidfile=/var/run/smsd.pid
    

    меняем на
    pidfile=/var/run/smsd/smsd.pid
    

    ~# echo smsd_enable=»YES» >> /etc/rc.conf
    ~# /usr/local/etc/rc.d/smsd start
    

    смотрим

    ~> ps ax | grep smsd
    16711 ?? Ss 0:00,00 /usr/local/bin/smsd
    16712 ?? S 0:00,01 /usr/local/bin/smsd

    ~> tail -f /var/log/smsd.log
    Oct 28 16:39:40 smsgate smsd: Smsd v3.1.3 started.
    Oct 28 16:39:40 smsgate smsd: Running as smsd:dialer.
    Oct 28 16:39:40 smsgate smsd: File mode creation mask: 022 (0644, rw-r--r--).
    Oct 28 16:39:40 smsgate smsd: Outgoing file checker has started. PID: 16711.
    Oct 28 16:39:40 smsgate GSM0: GSM0: Modem handler 0 has started. PID: 16712.
    Oct 28 16:39:40 smsgate GSM0: GSM0: Checking device for incoming SMS
    Oct 28 16:39:40 smsgate GSM0: GSM0: Checking if modem is ready
    Oct 28 16:39:40 smsgate GSM0: GSM0: -> AT^M
    Oct 28 16:39:40 smsgate GSM0: GSM0: Command is sent, waiting for the answer
    Oct 28 16:39:40 smsgate GSM0: GSM0: <- OK
    Oct 28 16:39:40 smsgate GSM0: GSM0: Pre-initializing modem

    Все завелось, комментируем в конфиге 'logfile', ставим loglevel = 5, в /etc/syslog.conf добавляем:
    !+smsd,GSM0
    *.*                                             /var/log/smsd.log
    

    (если надо, после GSM0 через запятую перечисляем все названия модемов из smsd.conf)
    в /etc/newsyslog.conf добавляем:
    /var/log/smsd.log       smsd:dialer     644  7     100  *     JC
    

    Теперь самое вкусное — отправлять эсэмэски.
    Ничего сложного, процесс отправки похож на процесс печати, в /var/spool/sms/ есть три каталога:
    checked, incoming, outgoing. В каталог  outgoing кидаются файлы для отправки, по формату очень похожие на MIME: сначала заголовки, потом, через пустую строку, тело сообщения. Подробнее формат опишу ниже. В пакет входит утилита sendsms, надо добавить пользователя, от которого будут отправлятся sms в группу smsd. Затем пробуем:

    sendsms 79xxxxxxxxx 'Hello! How are You?'
    

    (обратите внимание, номера вводятся в международном формате но без знака «+»)
    И, о Чудо!, через несколько секунд придет желанная SMS. Но мы рано радуемся. Вавилон нас ждет! А точнее — отправка SMS кириллицей. Привычно берем бубен, напильник, и допиливаем "до придания нужной формы". SMSTools умеет обрабатывать события при помощи внешних программ, используем эту возможность и нарисуем скрипт проверки сообщения перед отправкой (за прототип был взят unicode2sms, все скрипты пакета можно найти в /usr/local/share/smstools):
    #!/bin/sh
    
    # checkhandler for SMS Tools 3
    # autoconverts cyrillic messages to UCS-2BE
    # add checkhandler=/path/to/ucsautoconvert into global part of smsd.conf
    # written by lexy (lexy@mrlexy.ru), 2008
    
    FILE=`mktemp /tmp/smsd_XXXXXX`
    
    if [ ! `grep '[А-Яа-я]' $1 > /dev/null` -o `grep 'Alphabet:\s*U' $1 > /dev/null` ]
        then exit 0
    fi
    
    cat $1 | awk '{if(NF==0) {s=1} if(s==0 && NF>0 && $0!~/Alphabet:[ \t]*U/){print}}' > $FILE
    echo Alphabet: Unicode >> $FILE
    cat $1 | awk '{if(NF==0) {s=1} if(s==1){print}}' | iconv -t UCS-2BE >> $FILE
    
    mv $FILE $1
    chmod 664 $1
    

    добавляем в smsd.conf, в основную часть (до описания модемов):
    checkhandler=/path/to/ucsautoconvert
    

    перезапускаем smsd:
    #~ /usr/local/etc/rc.d/smsd restart
    

    пробуем: sendsms 79xxxxxxxxx 'Привет! Мы победили Вавилон ?'
    ждем...ждем... телефончик — Плюмммм!!! Смотрим... Аллилуя!



    Кроме того можно добавить поддержку обработки и других событий (SENT, RECEIVED, FAILED, REPORT, CALL), белый и черный список.
    За это отвечают параметры конфигурации:
    eventhandler = /path/to/handler
    whitelist = /path/to/list
    blacklist = /path/to/list
    

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

    Теперь вкратце про формат файла сообщений, более полный вольный и сокращенный перевод документации можно найти в приложениях.

    Текстовые сообщения

    Файл SMS-сообщения похож на файл электронной почты: текстовый файл состоящий из заголовков и содержимого сообщения после пустой строки.
    Простой пример:

    To: 491721234567
    
    Hello, this is the sms.
    



    Номер указывается в международном формате но без знака «+». Если необходимо отправить сообщение на короткий номер, то перед номером нужно указать "s".
    Расширеный пример:

    To: 491721234567
    Flash: yes
    Alphabet: ISO
    
    Hello Stefan, how are you?
    



    ВАЖНО: Заголовки регистрозависимые.
    Можно добавлять свои собственные заголовки. Они игнорируются программой, но не удаляются. Можно, к примеру, привязать к сообщению ключ базы данных добавив заголовок

    X-Db-Id: 777888
    

    После отправки файл сообщения сохранится в папке отправленных с этим заголовком.

    Приложения

    Подробное описание многих заголовков можно найти в этом приложении:
    Формат файла SMS сообщения
    файл скачан размер размещён примечание
    SMSTools3_appx1.pdf
    3944 130.9kb 2008-11-10 Формат файла SMS сообщения

    Скрипт обработки событий и автоматической перекодировки сообщений в кирилице здесь:
    Обработчики событий для SMSTools
    файл скачан размер размещён примечание
    smstools-events.zip
    3873 2.1kb 2008-11-07 Обработчики событий для SMSTools

    Справочную информацию по AT-командам для работы с GSM-устройствами можно найти на FTP этого сайта



    размещено: 2008-11-10,
    последнее обновление: 2009-01-23,
    автор: lexy


    nikll, 2008-11-10 в 10:14:01

    Молодец автор! Так держать!
    Хорошая полезная толковая статься без лишней воды.

    h0kum, 2008-11-21 в 15:53:02

    Интересно

    а на прием можно настроить? :-)

    lexy, 2008-11-23 в 14:28:47

    смотри ответ в форуме

    Airatz, 2009-01-19 в 9:54:20

    Очень помогла статья. Вот такие изменения предлагаю в Bash скрипт -
    "cat $1 | awk '{if(NF==0) {s=1} if(s==0 && NF>0 && \
       $0!~/Alphabet:[ \t]*U/){print}}' > $FILE
    echo Alphabet: Unicode >> $FILE
    cat $1 | awk '{if(NF==0) {s=1} if(s==1){print}}' | iconv -t UCS-2BE >> $FILE"

    "cat $1 | awk '{if(NF==0) {s=1} if(s==0 && NF>0 && \
       $0!~/Alphabet:[ \t]*U/){print}}' > $FILE
    echo Alphabet: Unicode >> $FILE
    echo >> $FILE
    cat $1 | awk '{if(NF==0) {s=1;next} if(s==1){print}}' | iconv -t UCS-2BE >> $FILE"

    с предидущим вариантом smsd всё время писал "... has no text ..."

    m4rkell, 2009-01-22 в 15:38:41

    Скрипт для отправки в кириллице на пашет, ни тот что в статье ни тот что в каментах, кракозябры приходят и снизу подпись Alphabit: Unicode...кто сделал хоть? Хелп...!

    lexy, 2009-01-23 в 9:01:51

    точно, был косяк в скрипте, поправил на странице. все из за того, что не подавлялся вывод в grep'е. Этот скрипт у меня используется каждый месяц для отправки более 1000 сообщений, никаких косяков с ним не замечено

    Poison, 2009-03-21 в 23:45:15

    За статью респект уважуха! нужная вешч!
    Далее по теме:
    поставил сей софт я, и на те, не отправляется, пишет в лог
    smsd: Cannot handle /var/spool/sms/outgoing/send_ce7C75: Access denied.
    Решение:
    rj45#cat /usr/local/bin/sendsms
    #!/bin/sh
    # This script send a text sms at the command line by creating
    # a sms file in the outgoing queue.
    # I use it for testing.

    # $1 is the destination phone number
    # $2 is the message text
    # if you leave $2 or both empty, the script will ask you

    DEST=$1
    TEXT=$2

    if [ -z "$DEST" ]; then
     printf "Destination: "
     read DEST
    fi

    if [ -z "$TEXT" ]; then
     printf "Text: "
     read TEXT
    fi

    FILE=`mktemp /var/spool/sms/outgoing/send_XXXXXX`
    chown uucp ${FILE} #добавил эту строчку
    echo "To: $DEST" >> $FILE
    echo "" >> $FILE
    echo -n "$TEXT" >> $FILE

    а дальше все как с татье, на этом все.

    poison, 2009-05-04 в 16:59:41

    Написал простенькую web морду для сего хозяйства:
    rj45# cat /usr/local/www/apache22/http/sms/index.php
    <html>
    <head>
    <title>Send SMS Text Messages</title>
    <meta name="Keywords" content="send sms">
    <meta name="Description" content="Send free SMS worldwide to any GSM mobile phon                                                e and track message delivery.">
    <meta http-equiv="Content-Type" content="text/html; charset=koi8-r">
    <!--styles common for ie and nn-->
    <link href="./styles.css" rel="stylesheet" type="text/css">
    <style type="text/css">
    <!— .style1 { color: #FF3333; font-weight: bold; } -->
    </style>
    </head><body topmargin="0" leftmargin="0" marginheight="0" marginwidth="0">
    <table align="center" cellpadding="0" cellspacing="1" width="780">
    <tbody>
       <tr>
           <td style="border: 1px outset black; background-color: rgb(235, 255, 237                                                );" valign="top">
           <div width="100%" style="background-color: rgb(168, 221, 160);">
           <center spry:hover="style1" class="style1">
           </center>
           </div>
           <!--div style="border: 0px outset; padding:2x; background-color: white"-                                                ->
           <h1>Send SMS Text Messages</h1>
           <form method="post" action="sms.php"><div class="usual">
           <p>Use this page to send free SMS from your PC to any GSM mobile phone i                                                n the world. Happy txting!</p>
           <p>Recipient's mobile phone number in international format
           <br>(dashes and spaces are not allowed, only digits matter: 79151234567)                                                :<br>
           <input name="phone" value="" size="19" maxlength="40" type="text"> &nbsp                                                ;
               <select name="pb" onChange="if (selectedIndex>0) iphone.value=pb.opt                                                ions[selectedIndex].value">
                   <option value="" selected="selected"> — Phone book — </option>
               </select><br>
                   <input name="add" type="checkbox">Add this phone into your <a hr                                                ef="./phonebook.php">phone book</a> as
                   <input name="desc" value="" size="10" maxlength="20" type="text"                                                ></p>
               <p>
               Send message as flash(message will be displayed on screen of mobile                                                 phone, not all models support this option!):
               <br>
               <select name="flash" size=1>
                   <option value="no" selected="selected"> - NO - </option>
                   <option value="yes"> - YES - </option>
               </select></p>
           <p>Message text, max 140 Latin characters or 70 national characters (Heb                                                rew, Arabic, Cyrillic, etc):<br>
           <table>
                   <tbody>
                       <tr>
                           <td>
                                   <textarea name="text" rows="4" cols="50" wrap="v                                                irtual" onKeyPress="len.value=text.value.length" onChange="len.value=text.value.                                                length"></textarea><br>
                                   You entered <input name="len" value="" size="3"                                                 disabled="disabled" onFocus="text.focus()" type="text"> characters.
                                   <input name="rus" value="1" type="hidden">
                           </td>
                       </tr>
                   </tbody>
           </table>
           </p></div>
           <p><input value="Send SMS" type="submit"></p><p>

    </p><p>By sending SMS messages from this site you agree to the following terms:<                                                /p>

    <div sigid="7" style="border: 1px outset ; margin-left: 10px; margin-right: 10px                                                ; background-color: rgb(223, 242, 225);">
    <ol>
    <li>sms enables you to send free SMS from its site to any cellular phone wo                                                rldwide.</li>
    <li>sms
    service is provided "as is", there is no gurantee of timely delivery of
    all messages to all cellular networks, sms cannot be held
    liable for any losses resulted from sms-rj45's failure to deliver
    messages.</li>
    <li>Information you provide on this page will not be
    used for any purpose other than sending SMS message to the designated
    phone number, we do not collect or analyze the text of your messages
    and destination phone numbers.</li>
    <li>We reserve the right to add a small ad to the end of each message you send f                                                rom our site.</li>
    </ol>
    </div>
    </form>
    </td>
    </tr>
    </tbody>
    </table>
    </body>
    </html>

    Сам скрипт отправки
    rj45# cat /usr/local/www/apache22/http/sms/sms.php
    <?php
    #$ssms = `/usr/local/bin/sendsms`;
    $number = $_POST["phone"];
    switch ($_POST["flash"])
    {
    case "no": $flash = "no";
    break;
    case "yes": $flash = "yes";
    break;
    }
    $message = $_POST["text"];
    $sms = `sendsms $number $flash "$message"`;
    shell_exec('$sms');
    echo "
    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=koi8-r\">
    <!--styles common for ie and nn-->
    <link href=\"./styles.css\" rel=\"stylesheet\" type=\"text/css\">
    <style type=\"text/css\">
    <!— .style1 { color: #FF3333; font-weight: bold; } -->
    </style>
    </head><body topmargin=\"0\" leftmargin=\"0\" marginheight=\"0\" marginwidth=\"0\">
    <table align=\"center\" cellpadding=\"0\" cellspacing=\"1\" width=\"780\" height=\"175\">
    <tbody>
       <tr>
           <td height=\"80\" valign=\"top\" style=\"border: 1px outset black; background-color: rgb(235, 255, 237);\">
           <div width=\"100%\" style=\"background-color: rgb(168, 221, 160);\">
           <center spry:hover=\"style1\" class=\"style1\">
           </center>
           </div>
           <table>
                   <tbody>
                       <tr>
                           <td>
                           </td>
                       </tr>
                   </tbody>
           </table>
           </p></div>
           <div sigid=\"7\" style=\"border: 1px outset; margin-left: 10px; margin-right: 10px; background-color: rgb(223, 242, 225);\">
           <br>
           <center>
               <h1>Your message at number $number <br> with option flash \"$flash\" and text: \"$message\" is sent!</h1>
               <br><center>
                   <CODE style=\"font-size:12px\">
                       <form id=\"forml\" name=\"forml\" method=\"post\" action=\"./\">
                       <label>
                       <input type=\"Submit\" name=\"Last-Week\" id=\"Last-Week\" value=\"Send new message\" />
                       </label></form>
                   </CODE>
           <br>
           </center></div>
    </td>
    </tr>
    </tbody>
    </table>
    </body>";
    ?>
    Phonebook пока не реализован, будет время доделаю.

    Dystopian, 2010-03-29 в 10:53:22

    grep 'Alphabet:\s*U' А давно grep научился PCRE? Имхо надо так: grep 'Alphabet:[[:space:]]*U'

    AERO, 2010-06-12 в 23:00:14

    smsclub.com.ua
    с этого сайта можно атправлять смс по низким тарифам, поддерживает записную книгу. цена 1 смс - от 15 копеек.
    было бы не плохо отправлять смс из-под правильной ОС. есть БД с номерами клиентов и остатком  средств на чсету.
    задача: отправлять клиентам смс через smsclub.com.ua каждий месяц с инфой про состояние счета =))

    Archer, 2011-10-27 в 13:43:34

    При ошибке типа
    smsd: Cannot handle /var/spool/sms/outgoing/send_ce7C75: Access denied.

    нужно в /usr/local/bin/sendsms
    строчку

    smsd_user="smsd"

    заменить на

    smsd_user="uucp"



  •  

      Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
      Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

    © lissyara 2006-10-24 08:47 MSK

    Время генерации страницы 0.0435 секунд
    Из них PHP: 32%; SQL: 68%; Число SQL-запросов: 80 шт.
    Исходный размер: 62452; Сжатая: 14671