ISP`s IT Аутсорсинг
Быстрый переход: Главная блога Главная сайта Форум
Если Вы чего то недопоняли или не нашли - задайте
вопрос на нашем форуме и мы попробуем Вам помочь.
Subnets.ru Регистрация IP и Автономных систем mega-net.ru

Отправить 'Отправка и прием SMS через GSM шлюз' другу по e-mail

Отправить другу по Email копию 'Отправка и прием SMS через GSM шлюз'

* Required Field







E-Mail Image Verification

Loading ... Loading ...
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 10, среднее: 4,60 из 5)
Загрузка...
Отправить на почту Отправить на почту

комментариев 15

  1. plastilin сказал:

    А по поводу вот такого устройства что можно сказать

    http://gprs-modem.ru/TELEOFIS_RX101_USB_GPRS.htm

    Нужно сделать веб страничку через которую пользователи из корп. сети смогут отправлять смс и получать результат о доставке с возможностью выбора кириллицы, англ. яз. или транслита. Сталкивался?

  2. lehisnoe сказал:

    Сказать можно следующее: Если фря его нормально видит, скажем, как /dev/ttyU0, и на команду ATI девайс что-то отвечает, то это значит, что все хорошо 🙂
    Да, мы делали как отправку СМС, так и их прием (скрипт сам определяет, преобразовывать ли мессагу в/из UCS2). Единственное, чем не заморачивались — это «составными» СМС (у нас «составная» принятая СМС выглядит как две независимых СМС, но глазами «склеиваются» нормально :), на отправку просто не даем возможности юзеру ввести длину мессаги больше, чем на одну СМС).

  3. stramilov сказал:

    как можно сделать так чтоб используя телефон gsm можем, можно было через веб интерфейс удаленно делать рассылку?

    если не сложно давай поговорим в скайпе. мой ник stramilov или аське 145800415

  4. lehisnoe сказал:

    Не вижу проблем: на основе статьи это можно сделать (и у нас есть такая схема в работе: GSM-модем подключен com-портом к серверу с FreeBSD, с которого шлются SMS либо введенные через вэб интерфейс (аналогичный сотовым операторам) либо извещающие о произошедших событиях в сети).
    Если вопросы остались, то добро пожаловать на наш форум

    P.S. По аське вопрос, конечно, решить можно, но нужно позаботиться и о других людях, ищущих ответ на этот вопрос: если все будут только «читателями», то какие результаты будет выдавать гугл?

  5. phil_qwerty сказал:

    очень хорошая статья!!!
    у меня вопрос: у меня ОС Linux Ubuntu, GSM модем Siemens MC35i терминальный с com портом. когда я отправляю смс с помощью AT команд через утилиту minicom, то все проходит на УРА. Но вот наладить работу скрипта для отправки смс никак не получается. Сначала пробовал написать сам на php, в принципе удачно, но все время создается ощущуние, что AT команда зацикливается в порту тем самым мешая модему корректно отработать задачу. Брал другие готовые скрипты написанные на питоне и php, история та же самая. модем не может отработать команды, или отрабатывает и присылает в смс «лишнюю» информацию, которая повисла в порту.
    Вопрос: в чем может быть проблема? не требуется ли какая нибудь настройка ком порта или модема?
    буду благодарен отозвавшимся помочь

  6. phil_qwerty сказал:

    требуется ли какая нибудь дополнительная настройка ком порта или модема? не то у меня некоторые проблемы при отправке смс с помощью скрипта

  7. admin сказал:

    нет, дополнительных настроек не требуется
    ты пробовал отправлять СМСки через AT команды вводя их руками в консоли ?

  8. phil_qwerty сказал:

    да, пробовал!!! замечательно отправляются без всяких проблем.
    но вот когда дело доходит до скрипта, то тут начинаются танцы с бубнами. Не знаю в чем проблема. Модем даже простую команду ATZ успевает отработать 1,5 — 2,5 раза. это примерно выглядит так:
    ATZ
    A
    OK
    TZATZ
    OK

  9. freeneutron сказал:

    Познавательная статья, но вот что мне так и не удалось понять. Если я хочу наладить прием прием SMS сразу на 100 разных номеров, то мне придется использовать 100 GSM шлюзов или можно найти более экономичное решение?

  10. admin сказал:

    1 GSM-шлюз = 1 сим карта, 100 номеров = 100 сим-карт

    Не совсем понятно зачем тебе 100 номеров, но если нужно, то протокол SMPP для тебя.
    Заключаешь с GSM оператором договор, берешь 100 номеров, настраиваешь у себя kannel (он поддерживает протокол SMPP) и вперед.

  11. pwn сказал:

    Мне пришлось решать аналогичную задачу, только средствами perl-а а не php и кроме того нужно было отправлять фрагментированные СМС. Труды автора сильно сэкономили мне время жизни, так что считаю своим долгом поделится своими наработками. Так как у меня отправка в основном смешанного текста (кирилица+латынь) то с текстовым режимом решено было не морочиться, что в разы упростило модуль. Итак кодировка СМС оформлена в виде пелового модуля SMSCode.pm, так как у меня все отправляемые сообщения в koi8r кодировке, то присуствует перекодирование текста в cp1251 (кому не надо — достаточно убрать пару строк)

    SMSCode.pm

    #
    package SMSCode;
    require Exporter;
    #
    our @ISA = qw(Exporter);
    our @EXPORT = qw(smscode ucs2encode);
    our $VERSION = 1.00;
    #
    use strict; # отменить халяву c переменнымми
    use warnings; # включить вывод предупреждений
    use Text::Iconv; # Функции перекодировки текста
    #
    #######################################################################
    # Кодировка СМС сообщения в UDH формате #
    # #
    # $Phone — телефон, на который отправить СМС #
    # $Txt — текст в кодировке koi8r #
    # return -> массив кодированных строк, одна строка на фрагмент СМС #
    #######################################################################
    sub smscode($$) {
    #
    # —- Объявляем переменные
    my ($t,$NumPart,$IdGroup,$Head,$Part,$NumSMS,$Udh);
    my (@Parts,@UDH);
    #
    # —- Разбор параметров
    my ($Phone,$Txt) = @_ ;
    #
    # —- Кодируем заголовок СМС
    $Head =»00″; # Номер СМС центра
    $Head.= length($Txt)>70 ? «51» : «11»; # Первый октет SMS-SUBMIT message. Для рагментированных СМС надо устанавливать бит TP-UDHI (наличие заголовка)
    # и поэтому для фрагментированных — 51h дла простых — 11h
    $Head.=»00″; # количество успешно переданых (0..FFh) сообщений с телефона
    $Head.=»0B»; # Длина номера телефона (11 цифр)
    $Head.=»91″; # Тип номера телефона. 91h — международный формат
    #
    # —- Рихтуем переданный номер
    $Phone = «7».$Phone.»F»;
    #
    # —- Если в итоге получилось не 12 символов — лесом
    unless (length($Phone)==12) {return ();}
    #
    # —- Цикл кодирования номера телефона
    foreach $t ($Phone=~m/(.{2})/g) {
    #
    # —- Дописываем очередную пару символов номера меняя местами первую и вторую цифры
    $Head.=substr($t,1,1).substr($t,0,1);
    }
    #
    # —- Дописываем хвост заголовка
    $Head.=»00″; # Идентификатор протокола. 00h -> SMS
    $Head.=»08″; # Кодировка. 08h — юникод+сохранять СМС в истории телефона 18 — тоже но не сохранять историю
    $Head.=»C1″; # Период доставки СМС. C1 -> 1 неделя, полсе чего если юзер свой телефон не включит, то эту СМС он уже
    # не увидит никогда
    #
    # —- Создаем объект для перекодировки кои8 в ср1251
    my $KOI2UTF = Text::Iconv->new(«koi8-r», «cp1251»);
    #
    # —- Перекодируем текст в ср1251
    $Txt = $KOI2UTF->convert($Txt);
    #
    # —- Если длинна сообщения больше чем 70 символов
    if (length($Txt)>70) {
    #
    # —- Разрезаем сообщение на фрагменты не более 67 символов
    @Parts = $Txt=~m/(.{1,67})/g;
    #
    # —- Извлекаем число частей
    $NumPart = scalar(@Parts);
    #
    # —- Генерим уникальный номер группы для отправляемых СМС
    $IdGroup = int(rand(255));
    #
    # —- Цикл перебора фрагментов и формирования фрагментированной СМС
    $NumSMS = 1;
    foreach $Part (@Parts) {
    #
    # —- Формируем заголовок фрагментированной СМС
    $Udh = «050003»; # Признак фрагментированной СМС
    $Udh.= sprintf(«%02X»,$IdGroup); # Уникальный для данной группы СМС номер
    $Udh.= sprintf(«%02X»,$NumPart); # Количество СМС для склейки
    $Udh.= sprintf(«%02X»,$NumSMS); # порядковый номер СМС
    #
    # —— Дописываем закодированный текст фрагмента
    $Udh.= ucs2encode($Part);
    #
    # —- Рассчитываем длину строки и дописываем ее в начало
    $Udh = sprintf(«%02X»,length($Udh)/2).$Udh;
    #
    # —- Добавляем очередной элемент к возвращаемому массиву
    $UDH[$NumSMS-1] = $Head.$Udh;
    #
    # —- Наращиваем порядковый номер СМС в группе
    $NumSMS++;
    }
    }
    else {
    #
    # —- Кодируем текст ссобщения
    $Txt = ucs2encode($Txt);
    #
    # —- Рассчитываем длину строки и дописываем ее в начало
    $Txt = sprintf(«%02X»,length($Txt)/2).$Txt;
    #
    # —- Добавляем единственный элемент к возвращаемому массиву
    $UDH[0] = $Head.$Txt;
    }
    #
    # —- Возвращаем массив закодированных СМС
    return @UDH;
    }
    #
    # End of sub smscode
    #
    #
    #
    # —- Кодирование строки ср1251 в UCS2
    sub ucs2encode ($) {
    #
    # —- Объявляем переменные
    my ($UCS,$Chr);
    #
    # —- Разбор параметров
    my ($Str) = @_ ;
    #
    # —- Цикл кодирования символов
    $UCS = »;
    foreach $Chr (split(//,$Str)) {
    #
    # —- Если код символа меньше 127
    if (ord($Chr) < 127) {
    #
    # —- Английские символы кодируем как есть
    $UCS.= sprintf("%04X",ord($Chr));
    }
    #
    # —- С буковкой ё морока отдельная
    elsif (ord($Chr)==184) { #ё
    $UCS.="0451";
    }
    elsif (ord($Chr)==168) { #Ё
    $UCS.="0401";
    }
    #
    # —- Остальные русские буковки кодируются линейно
    else {
    $UCS.= sprintf("%04X",ord($Chr)-192+1040);
    }
    }
    #
    # —- Возвращаем закодированную строку
    return $UCS;
    }
    #
    # End of sub ucs2encode
    # End of module SMSCode.pm
    1;

  12. pwn сказал:

    Пример использования. (Кодирует заданное сообщение и выводит массив строк которые достаточно скормить модему через буфер обмена чтобы СМС было отправлено.)

    test.pl

    #
    # —- Подключаем модули
    use FindBin; # для того, чтобы модули используемые этим скриптом были доступны
    use lib $FindBin::Bin; # независимо от того, откуда запущен этот скрипт
    use SMSCode; # функции кодирования СМС
    #
    # —- Тест отправки СМС
    $Txt = «текст который отправляем»;
    $Tel = ‘1111111111’; # телефон (без +7 и 8 в начале)
    #
    # —- Кодируем СМС
    @SMS = smscode($Tel,$Txt);
    #
    # —- Отображаем фрагменты как есть, готовые чтоб их слить в GSM модуль
    foreach $SMS (@SMS) {
    $l = length($SMS)/2-1;
    print «AT+CMGS=$l\n»;
    print «$SMS\n»;
    }

  13. lehisnoe сказал:

    2pwn: благодарю за обмен опытом!

  14. pwn сказал:

    не за что 🙂
    файлики скриптов только надо как-то по другому залить, а то и кавычки заколбасились и отступы съехали. Тому кто их попробует передрать потом надо будет после еще html чудачества руками рихтовать.

  15. lehisnoe сказал:

    Ждем архив с файлами на мыло root[гав-гав]subnets.ru, после чего выложим их.

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

Вам следует авторизоваться для размещения комментария.