Отправка смс через HiLink modem (с web интерфейсом)

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Ответить
werthard
Сообщения: 4
Зарегистрирован: Пн авг 29, 2016 12:44 pm
Благодарил (а): 0
Поблагодарили: 0

Отправка смс через HiLink modem (с web интерфейсом)

Сообщение werthard » Вт янв 31, 2017 12:49 pm

при переходе на 4G модем (e3372h) понял что текущая схема оповещения через смс перестала работать в связи с отсутствием COM PC UI.
пошерстил инет понял что есть возможность на современных модемах делать с помощью URL.
к сожалению не программист. Может кто то возьмется интерпретировать строчку BASH на PHP ?
How to send SMS via Hilink modem
#!/bin/bash

NUMBER=$1
MESSAGE=$2

LENGTH=${#MESSAGE}
TIME=$(date +"%Y-%m-%d %T")
TOKEN=$(curl -v 'http://192.168.8.1/api/webserver/token' | sed -n 's:.*<token>\(.*\)</token>.*:\1:p')

SMS="<?xml version="1.0" encoding="UTF-8"?><request><Index>-1</Index><Phones><Phone>$NUMBER</Phone></Phones><Sca></Sca><Content>$MESSAGE</Content><Length>$LENGTH</Length><Reserved>1</Reserved><Date>$TIME</Date></request>"

curl 'http://192.168.8.1/api/sms/send-sms' -H "__RequestVerificationToken: $TOKEN" --data "$SMS" --compressed

Usage: ./send-sms.sh +55555555 'hey there'

также возможно осуществлять и прием смс
https://chaddyhv.wordpress.com/2012/08/ ... der-linux/
Аватара пользователя
savenko_egor
Сообщения: 705
Зарегистрирован: Вс авг 03, 2014 8:17 pm
Откуда: Украина, Запорожье
Благодарил (а): 108 раз
Поблагодарили: 147 раз
Контактная информация:

Re: Отправка смс через HiLink modem (с web интерфейсом)

Сообщение savenko_egor » Вт янв 31, 2017 11:27 pm

Не очень уверен что заработает корректно, потому-что:
1. Я быдлокодер :D
2. Нет на чём протестировать.
СценарийПоказать

Код: Выделить всё

$number = '+123456789'; //Задаём номер
$message = 'test message'; //Задаём сообщение
$length = strlen($message); //Вычисляем длину сообщения
$time = date("Y-m-d H:i:s"); //Устанавливаем дату

$ch = curl_init(); //Начало получения токена
curl_setopt($ch, CURLOPT_URL, 'http://192.168.8.1/api/webserver/token'); //URL по которому запрашивать токен
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$get_token = curl_exec($ch);
curl_close($ch);
$tmp_token = new SimpleXMLElement($get_token);
$token = $tmp_token->token;

$sms = '<?xml version="1.0" encoding="UTF-8"?><request><Index>-1</Index><Phones><Phone>'.$number.'</Phone></Phones><Sca></Sca><Content>'.$message.'</Content><Length>'.$length.'</Length><Reserved>1</Reserved><Date>'.$time.'</Date></request>';

$ch = curl_init(); //Начало для отправки сообщения
curl_setopt($ch, CURLOPT_URL, 'http://192.168.8.1/api/sms/send-sms'); //URL отправки сообщения
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, '__RequestVerificationToken: $token');
curl_setopt($ch, CURLOPT_POSTFIELDS, $sms);
curl_exec($ch);
От этой части можно избавиться если получать токен через "Веб-переменные":
Кусок который можно убратьПоказать

Код: Выделить всё

$ch = curl_init(); //Начало получения токена
curl_setopt($ch, CURLOPT_URL, 'http://192.168.8.1/api/webserver/token'); //URL по которому запрашивать токен
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$get_token = curl_exec($ch);
curl_close($ch);
$tmp_token = new SimpleXMLElement($get_token);
$token = $tmp_token->token;
При таком варианте код будет таким:
Сценарий без одно curlПоказать

Код: Выделить всё

$number = '+123456789'; //Задаём номер
$message = 'test message'; //Задаём сообщение
$length = strlen($message); //Вычисляем длину сообщения
$time = date("Y-m-d H:i:s"); //Устанавливаем дату
$token = getGlobal("Modem.token");

$sms = '<?xml version="1.0" encoding="UTF-8"?><request><Index>-1</Index><Phones><Phone>'.$number.'</Phone></Phones><Sca></Sca><Content>'.$message.'</Content><Length>'.$length.'</Length><Reserved>1</Reserved><Date>'.$time.'</Date></request>';

$ch = curl_init(); //Начало для отправки сообщения
curl_setopt($ch, CURLOPT_URL, 'http://192.168.8.1/api/sms/send-sms'); //URL отправки сообщения
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, '__RequestVerificationToken: $token');
curl_setopt($ch, CURLOPT_POSTFIELDS, $sms);
curl_exec($ch);
curl_close($ch);
Последний раз редактировалось savenko_egor Ср фев 01, 2017 4:13 pm, всего редактировалось 1 раз.
werthard
Сообщения: 4
Зарегистрирован: Пн авг 29, 2016 12:44 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Отправка смс через HiLink modem (с web интерфейсом)

Сообщение werthard » Ср фев 01, 2017 7:52 am

Спасибо за желание помочь !

при выполнении первого сценария дает ошибку.

Warning: curl_setopt(): You must pass either an object or an array with the CURLOPT_HTTPHEADER, CURLOPT_QUOTE, CURLOPT_HTTP200ALIASES and CURLOPT_POSTQUOTE arguments in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(139) : eval()'d code on line 19



а при выполнении второго скрипта
Warning: curl_setopt(): You must pass either an object or an array with the CURLOPT_HTTPHEADER, CURLOPT_QUOTE, CURLOPT_HTTP200ALIASES and CURLOPT_POSTQUOTE arguments in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(139) : eval()'d code on line 12

строка на которую ругается
curl_setopt($ch, CURLOPT_HTTPHEADER, '__RequestVerificationToken: $token');

как правильно интерпретировать этот ответ?
IvannikovAV
Сообщения: 2
Зарегистрирован: Вт фев 18, 2020 9:37 am
Благодарил (а): 0
Поблагодарили: 0

Re: Отправка смс через HiLink modem (с web интерфейсом)

Сообщение IvannikovAV » Ср янв 27, 2021 8:22 pm

Модем Хуавей B525. Озадачился считыванием параметров сигнала. Поставил модуль, увидев заветное слово, но получил пустоту в параметрах. Полез разбираться, обнаружил, что на мой взгляд процедура авторизации написана не совсем корректно, с моей точки зрения. В массиве $rec в этот момент пустота.
Если поправить строчки с именем массива в функции авторизации, то всё работает. И параметры и получение смс.

Файл modemsms.class.php, function checkModem,

было:
if ($modem['TYPE'] == 'huawei') {
include_once '3rdparty/Router.php';
$router = new Router;
$router->setAddress($modem['IP']);
if ($rec['AUTH']) {
$router->setNeedsAuth(true);
$router->login($rec['LOGIN'],$rec['PASSWORD']);
}

стало:
if ($modem['TYPE'] == 'huawei') {
include_once '3rdparty/Router.php';
$router = new Router;
$router->setAddress($modem['IP']);
if ($modem['AUTH']) {
$router->setNeedsAuth(true);
$router->login($modem['LOGIN'],$modem['PASSWORD']);
}

Огромное спасибо автору модуля за работу, с B525 работает на ура.
London
Сообщения: 76
Зарегистрирован: Чт фев 07, 2019 12:17 pm
Благодарил (а): 14 раз
Поблагодарили: 45 раз

Re: Отправка смс через HiLink modem (с web интерфейсом)

Сообщение London » Чт янв 28, 2021 9:50 am

Спасибо - это приятно :)
Так же, по модулю есть отдельная тема на форуме: https://mjdm.ru/forum/viewtopic.php?f=5&t=7109

а по поводу Вашей правки, да, всё верно, "копипаста" из одной функции в другую меня подвела:) Исправил, можно обновиться)
IvannikovAV
Сообщения: 2
Зарегистрирован: Вт фев 18, 2020 9:37 am
Благодарил (а): 0
Поблагодарили: 0

Re: Отправка смс через HiLink modem (с web интерфейсом)

Сообщение IvannikovAV » Чт янв 28, 2021 12:58 pm

Тут уже добьём :о) Обновил, сравнил правки, изменено пока не всё, осталось одно место.

Имя массива в function checkModem не заменено, осталось:
if ($rec['AUTH']) {
должно быть
if ($modem['AUTH']==1) {

И можно вешать наклейку - Протестировано с B525 :о)
Ответить