Несколько моих проектов отправляют СМС и в последнее время после обновлений сервера, а может и ряда других причин, отправка СМС стала почти невозможной.
Старенький USB модем HUAWEI (марку не буду разглашать) перестал стабильно висеть на одном COM порту и временами переподключался на другие порты, совсем отключался и терял антенну.
Да и ситуация с библиотекой GSMComm была непонятной и болезненной.
GSMComm — это пакет для телефонов GSM, в основном для выполнения задач, связанных с SMS.
www.nuget.org/packages/GSMComm последня версия 1.21.1 от 10.10.2015 года.
Поиск по интерент показал, что есть возможность использовать встроенный функционал WEB API новых модемов HUAWEI, более эффективно, чем старый подход с AT командами реализованный в GSMComm.
Выяснилось, что есть прекрасный usb модем HUAWEI E3372, который почти хакерским способом способен отправлять СМС как из скрипта (Curl + Bash), так и из кода (Python, Perl), и, как я предположил, из C#.
Как читать SMS приходящие на симку в модеме без телефона.
Самое печальное, что компания HUAWEI не предоставляет никакой документации как это сделать и все найденные методы имели экспериментальный харктер и зависели от семейства устройств.
В общем, опираясь на найденный материал, не гарантирующий работу кода с момедом, был приобретен HUAWEI E3372.
Не углублясь в эксперименты с Python или Perl я решил попробовать разобраться с вариантами Bash + Curl.
В общем, после нескольких экспериментов был найден работающий код под MS Windows 10 + Git Bash for MS Windows.
curl -b session.txt -c session.txt http://192.168.8.1/html/index.html > /dev/null 2>’ -f 10) echo $TOKEN > token.txt NUMBER=$1 MESSAGE=$2 LENGTH=$ TIME=$(date +»%Y-%m-%d %T») TOKEN=$(
Скрипт удивительным образом работал. И это было уже счастье, так как деньги были потрачены на модем не зря!
Осталось только понять КАК же он работает. Почитав документацию по Curl и Bash (ну по bash я не читал так догадался) прояснилась работа скрипта. Привожу этот же скрипт с моими комментариями.
Скрипт с комментариями
# https://stackoverflow.com/questions/28070500/grab-current-sessions-cookie-with-curl/28070870 # Содержимое файла session.txt определяется опцией -b # Сделать GET запрос и получить куки в первый раз и записать их в файл curl -b session.txt -c session.txt http://192.168.8.1/html/index.html > /dev/null 2>’ -f 10) # Отобразить на экране echo «$TOKEN» # сохранить подстроку в файле echo $TOKEN > token.txt # Получить два параметра командной строки: (1) номер телефона и (2) текст СМС NUMBER=$1 MESSAGE=$2 # Получить количество символов в тексте LENGTH=$ # Получить текущее время и отформатировать его TIME=$(date +»%Y-%m-%d %T») # Загрузить содержимое файла в переменную TOKEN=$(
Скажу честно, что СМС на русском я не смог добиться. Приходит абракадабра. Так что этот вопрос остался открытым и если у кого-то есть желание закрыть тему отправки СМС на русском — милости просим, дерзайте.
ПЛК Segnetics SMH4 отправка SMS сообщений с помощью 3G модема HUAWEI E1550
Понимание работы скрипта принесло свою пользу и приблизило к написанию кода на C#.
Было понятно, что в нем должно быть также 3 запроса и должны они делать то же самое что и благословенный Curl. Поэтому в коде приведен Curl, а ниже, аналогичный ему C# код.
Код С# для WinForms
private void button1_Click(object sender, EventArgs e) < var ip = «192.168.8.1»; // IP адрес который выдает модем в браузере после установки var phone = «+70000000000»; // Номер телефона var msg = «Привет. СМС работает. «; var result = SendSMS(ip, phone, msg); if (result) < //TODO Сохранить в БД, например >else < //TODO Сохранить в БД, например >> private bool SendSMS(string ip, string phone, string msg) < try < /* curl -b session.txt -c session.txt http://192.168.8.1/html/index.html >/dev/null 2> Cookie secondCookie = null; string token = string.Empty; //В первый раз получить куки var cookieContainer = new CookieContainer(); var uri = new Uri($»http:///html/index.html»); using (var httpClientHandler = new HttpClientHandler < CookieContainer = cookieContainer >) < using (var httpClient = new HttpClient(httpClientHandler)) < httpClient.GetAsync(uri).Wait(); var all = cookieContainer.GetCookies(uri); firstCookie = all[0]; >> /* TOKEN=$(curl -s -b session.txt -c session.txt http://192.168.8.1/html/smsinbox.html) TOKEN=$(echo $TOKEN | cut -d'»‘ -f 10) echo $TOKEN > token.txt */ // И спользуя куки из первого запроса получить страницу и извлечь из нее токен if (firstCookie != null) < var cookieContainer2 = new CookieContainer(); cookieContainer2.Add(firstCookie); // Поместить в конейнер куки из первого запроса к сайту var uri2 = new Uri($»http:///html/smsinbox.html»); using (var httpClientHandler = new HttpClientHandler < CookieContainer = cookieContainer2 >) < using (var httpClient = new HttpClient(httpClientHandler)) < var html = httpClient.GetStringAsync(uri2).Result; // Получить страницу HTML var all = cookieContainer2.GetCookies(uri2); secondCookie = all[0]; var doc = new HtmlAgilityPack.HtmlDocument(); // Используем HtmlAgilityPack чтобы преобразовать текст HTML в структурный вид doc.LoadHtml(html); var items = doc.DocumentNode.SelectNodes(«//meta»); if (items.Count >= 2) // Получить второй по счету meta тег. < token = items[1].GetAttributeValue(«content», «»); // Получить значение метатега. Не спрашивайтепочему второй метатаг с токеном рабочий — не знаю ))) >> > // Когда в наличии есть куки и токен делаем отправку СМС через запрос POST if (!string.IsNullOrEmpty(token)) < var msgLength = msg.Length; var time = DateTime.Now.ToString(«yyyy-MM-dd HH:mm:ss»); // TIME=$(date +»%Y-%m-%d %T») var sms = $»-1 1 «; /*# Сделать POST для отправки СМС curl -v -b session.txt -c session.txt -H «X-Requested-With: XMLHttpRequest» —data «$SMS» http://192.168.8.1/api/sms/send-sms —header «__RequestVerificationToken: $TOKEN» —header «Content-Type:text/xml» */ var uri3 = new Uri($»http:///api/sms/send-sms»); var client = new RestSharp.RestClient < BaseUrl = uri3 >; // Используем RestSharp для запроса (дело вкуса) var request = new RestSharp.RestRequest(RestSharp.Method.POST); // Формируем свой заголовой запроса — ничего лишненго все по примеру из Curl request.AddHeader(«__RequestVerificationToken», token); var ses = secondCookie.ToString(); request.AddCookie(«cookie», ses); request.AddHeader(«Content-Type», «text/xml»); request.AddHeader(«X-Requested-With», «XMLHttpRequest»); request.AddParameter(«text/html», sms, RestSharp.ParameterType.RequestBody); RestSharp.IRestResponse response = client.Execute(request); if (response.IsSuccessful) < var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(response.Content); // OK var responseElemenets = xmlDoc.GetElementsByTagName(«response»); var resultOK = responseElemenets[0].InnerXml.ToLower(); return resultOK == «ok»; // Ну вот и признак того, что СМС отправлено, но без отчета о доставке. > > > > catch (Exception) < //TODO в лог ошибку; >return false; >
Как только у вас в руках рабочий C# код вы всегда можете его улучшить.
В моем случае он работает как часы и для некоторого солидного количества СМС в минуту вполне годится.
Надеюсь эта статься принесла пользу и в профессиональном и экономическом смыслах.
Источник: habr.com
Отправка SMS утилитой gammu с модема Huawei E1550 на Ubuntu 16.04
Отправляем SMS (текстовые СМС сообщения) с модема Huawei E1550 на Ubuntu Linux 16.04.
Список девайсов поддерживаемых Gammu: http://wammu.eu/phones/
Проверим подключение USB модема к серверу/ноуту:
lsusb
Ищем запись похожую на эту:
Bus 003 Device 016: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem
Примечание
Попробуйте передернуть модем, если система определила модем как:
Bus 003 Device 016: ID 12d1:1446 Huawei Technologies Co., Ltd. Broadband stick (modem on)
Проверьте какие ttyUSB порты доступны:
ls /dev/ttyUSB* dmesg | grep tty
Установка gammu
Ставим утилиту gammu (в репозитории Ubuntu 16.04 доступна версия: Gammu version 1.37.0):
sudo apt install gammu # [Gammu version 1.37.0]
* На RaspberryPi устанавливается версия 1.33.0.
Конфигурация gammo
Запустите мастер конфигурации для регистрации пути к основному файлу настроек (потом подправим этот файл вручную).
gammu-config

Мастер настройки утилиты gammu (шаг 1)

Установка дефолтного файла конфигурации (шаг 2)
Запускаем утилиту идентификации модема:
sudo gammu identify
Если все хорошо — видим модель нашего «хуавэя»:
Устройство : /dev/ttyUSB0 Производитель : Huawei Модель : E1550 (E1550) Прошивка : 11.608.14.11.222 IMEI : 359124036500000 Номер SIM IMSI : 255061025200000
Можно подредактировать файл настроек ~/.gammurc:
touch ~/.gammurc
[gammu] port = /dev/ttyUSB0 connection = at name = Huawei E1550 logfile = /tmp/gammu.log logformat = textall
Читаем сообщения с модема?
gammu getallsms
# 0 SMS parts in 0 SMS sequences
Пробуем отправить SMS:
gammu sendsms TEXT ‘+380670000000’ -unicode -report -text ‘СМС отправленно с модема :)’
Возможно вам нужно будет запустить gammu под root’ом, указать путь к файлу конфигурации и секцию настроек:
sudo gammu -c ~/.gammurc -s 0 getallsms
Примечание
- Warning: Не найден конфигурационный файл, используются настройки по умолчанию! — эта ошибка время от времени появляется, но это не всегда означает, что что-то не работает. Чтобы избавиться от этой ошибки — пройдите по мастеру-настроек до конца (gammu-config), чтобы зарегистрировать основной файл настроек. Можете не заморачиваться с самим настройками, после мастера мы отредактируем конфиг ~/.gammurc вручную.
- Ошибка открытия устройства: его не существует. — проверьте параметры настроек в файле ~/.gammurc (port, connection).
- Ошибка подключения к устройству: у вас нет прав доступа. — используйте sudo или см. статью Выполнение USSD запросов на модеме Huawei E1550.
Внимание!
Чтобы использовать gammo без sudo — установите права на устройство, к которому подключен модем:
sudo chmod -R 777 /dev/ttyUSB*
При каждом подключении модема нужно задавать права!
Или установите пакет modemmanager и добавьте себя в группу dialout:
sudo apt-get remove modemmanager sudo usermod -a -G dialout $USER
Расширенная настройка
Настройка БД для демона SMSD
device = com3: connection = at115200 service = SQL PIN = 1234 logfile = smsdlog debuglevel = 255 user = root password = host = localhost database = gammu driver = native_mysql
Удаленное SSH подключение
Команды gammu
Опции конфигурации и отладки при запуске утилиты gammu:
-c, —config ~/.gammurc # путь к файлу настроек -s # задать номер секции конфигурации (профиль) из файла ~/.gammurc
Справка по командам
Получить справку по разделу:
gammu —help call gammu —help sms
Важные справочные разделы:
call — Вызовы sms — SMS и EMS mms — Настройки MMS memory — Память (записные книжки и вызовы) network — Сеть info — Информация о телефоне settings — Настройки телефона gammu — Gammu information
SMS
Справка по SMS командам: https://wammu.eu/docs/manual/gammu/index.html#sms-commands
Отправить SMS с отчетом о доставке:
gammu sendsms TEXT «+380670000000» -unicode -report -text ‘sms text message’
Отправляется SMS 1/1. ожидается ответ сети..OK, ссылка на сообщение=3 Sending SMS 1/1. waiting for network answer..OK, message reference=3
Получить все СМС:
gammu getallsms
Размещение 1, каталог «Входящие», SIM memory, Inbox folder SMS status report Состояние : Прочитанные Remote number : «+380670000000» Reference number : 3 Отправленные : Пн 01 май 2017 16:41:14 +0300 SMSC number : «+380630000007» SMSC response : Пн 01 май 2017 16:41:21 +0300 Delivery status : Delivered Details : SM получено через SME Размещение 2, каталог «Входящие», SIM memory, Inbox folder SMS status report Состояние : Не прочитано Remote number : «+380670000000» Reference number : 4 Отправленные : Вт 02 май 2017 00:06:05 +0300 SMSC number : «+380630000007» SMSC response : Вт 02 май 2017 00:06:12 +0300 Delivery status : Delivered Details : SM получено через SME 3 SMS parts in 3 SMS sequences
Получить папки с сообщениями:
gammu getsmsfolders
1. » Входящие», память SIM, папка Входящие 2. » Исходящие», память SIM, папка Исходящие 3. » Входящие», память телефона, папка Входящие 4. » Исходящие», память телефона, папка Исходящие
Другие значимые команды:
gammu getsmsfolder gammu getallsms gammu deleteallsms folder-number
USSD запросы
gammu getussd *121#
Полные список команд (прием звонков, отправка смс, проверка баланса и прочее USSD запросы): https://wammu.eu/docs/manual/gammu/index.html#call-commands
Внимание!
Утилита gammu не умеет работать с USSD запросами на модеме Huawei E1550! См. статью Выполнение USSD запросов на модеме Huawei E1550 .
Служебные команды
Получить информацию о состоянии модема/телефона (режим наблюдения):
gammu monitor 1
Включается режим наблюдения. Включить информацию о входящих SMS : Нет ошибки. Включить информацию о входящих CB : Нет ошибки. Включить информацию о вызовах : Нет ошибки. Включить информацию о USSD : Нет ошибки.
SIM phonebook : 4 used, 96 free Own numbers : 0 used, 1 free Уровень заряда аккумулятора : 0 процента(ов) Состояние зарядки : аккумулятор подключён и заряжается Уровень сигнала : -107 dBm Уровень сигнала сети : 9 процента(ов) Состояние SIM SMS : 1 использовано, 0 unread, 10 расположений SMS статус : 0 использовано, 0 unread, 23 расположений Сеть : 255 06 (life:), Ukraine), LAC 3140, CID 575 Состояние пакета сети : домашняя сеть Пакетная сеть : 255 06 (life:), Ukraine), LAC 3140, CID 575 Имя в телефоне : «lifecell» GPRS : attached Выход из режима наблюдения.
Отправить AT команду и получить скриншот (пример команды):
printf ‘AT*EKEY=7,»:J»,2,»*»,2,»1″,2,»0″,2,»0″,2,»#»,2,»:J»,2r’ > /dev/ttyUSB2 gammu screenshot test
Логи и отладка
Формат и уровень детализации логов и ошибок: https://wammu.eu/docs/manual/config/index.html#option-LogFormat
Опции отладки при запуске gammu:
-d, —debug debug level -f, —debug-file file for logging debug messages
#3g, #huawei E1550, #sms
Источник: onedev.net
Блог Агапова Максима
Используя пакет трафика на МТС, у меня остается много неиспользованных СМС, которые ежемесячно сгорают. Жалко. Подумал, что информирование по СМС гораздо надежнее и эффективнее. Что-то, а смс-ка всегда долетит, даже если на телефоне закончился интернет-трафик.
Чтобы отправлять СМС через модем (в моём случае это Huawei e3372h), требуется установить прошивку Stick. Stick нужна, чтобы роутер (или комп) видел интерфейс /dev/ttyUSB0 модема, через который собственно и будут передаваться AT-команды.
Из софта, нужен smstools3. Готовый пакет можно поставить на Ubuntu или OpenWRT.
Для установки пакета smstools3 на роутер Keenetic Giga (KN-1010), сперва понадобится установить менеджер пакетов opkg. Как это сделать, хорошо описано в официальном мануале. В роли флэш-носителя, я установил micro-sd карту в слот модема, чтобы не занимать лишний USB-порт роутера.
Установка не вызвала никаких проблем
opkg update opkg install smstools3 nano
После установки, сразу лезем в файл конфигурации демона
nano /opt/etc/smsd.conf # Description: Main configuration file for the smsd devices = GSM1 incoming = /opt/var/spool/sms/incoming outgoing = /opt/var/spool/sms/outgoing checked = /opt/var/spool/sms/checked failed = /opt/var/spool/sms/failed sent = /opt/var/spool/sms/sent receive_before_send = no autosplit = 3 checkhandler = /opt/sms-to.sh eventhandler = /opt/sms-from.sh logfile = /var/log/smsd.log loglevel = 7 # Uncomment (and edit) this section to allow smsd to start: [GSM1] init = AT+CPMS=»ME»,»ME»,»ME» device = /dev/ttyUSB1 incoming = yes #pin = 0000 baudrate = 115200
Создадим все пути, указанные в конфиге
cd /opt/var/ mkdir spool cd spool mkdrit sms cd sms mkdir incoming mkdir outgoing mkdir checked mkdir failed mkdir sent cd /var/run/ mkdir smsd
Ну, и пропишем свой путь для лог-файла
logfile = /var/log/smsd.log
Далее снимаем комменты с секции [GSM1] и запустим демона
smsd -c /opt/etc/smsd.conf
Готово! Отправить СМС можно командой
sendsms +79211231234 «test»
Вы наверное обратили внимание на две строки
checkhandler = /opt/sms-to.sh eventhandler = /opt/sms-from.sh
Эти параметры указывают путь к исполняемому скрипту, который будет выполняться при получении, или при отправке смс.
Создадим исполняемый файл /opt/send-to.sh, который поможет отправлять СМС на кириллице.
nano /opt/sms-to.sh
#!/bin/sh export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/bin FROM_FILE=»$1″ [ ! -r «$FROM_FILE» ] exit 1 if grep -q ‘[а-яА-Я]’ $FROM_FILE; then TMPFILE=$(mktemp /tmp/smsd_XXXXXX) sed -e ‘/^$/ q’ < «$FROM_FILE» >$TMPFILE echo ‘Alphabet: Unicode’ >> $TMPFILE sed -e ‘1,/^$/ d’ < «$FROM_FILE» | iconv -f UTF-8 -t UNICODEBIG >>$TMPFILE mv $TMPFILE «$FROM_FILE» fi
На всякий случай, установим программу iconv, которая используется в скрипте
opkg update opkg install iconv
Отправляем тестовую СМС на русском языке
sendsms +79211231234 «Я есть Грутъ!»
Смотрим логи
cat /var/log/smsd.log
2019-01-14 16:20:41,5, GSM1: SMS sent, Message_id: 19, To: 79211231234, sending time 1 sec. 2019-01-14 16:20:42,6, GSM1: SMS To: 79211231234. Moved file /opt/var/spool/sms/checked/send_8Py8QQ to /opt/var/spool/sms/sent/send_8Py8QQ 2019-01-14 16:20:42,7, GSM1: Running eventhandler: /opt/sms-from.sh SENT /opt/var/spool/sms/sent/send_8Py8QQ 19 2019-01-14 16:20:42,3, GSM1: Done: eventhandler, execution time 0 sec., status: 32512 (127)
Источник: magapov.blogspot.com
