Отправка уведомлений с помощью SMS
Модератор: immortal
- sergejey
- Site Admin
- Сообщения: 4284
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 75 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Отправка уведомлений с помощью SMS
Обсуждение страницы Отправка уведомлений с помощью SMS
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Re: Отправка уведомлений с помощью SMS
Добрый день!
Не могу разобраться с превышением температуры из данной темы, при превышении ничего не происходит, свойства объекта изменяются а метод не выполняется.
Не могу разобраться с превышением температуры из данной темы, при превышении ничего не происходит, свойства объекта изменяются а метод не выполняется.
- Вложения
-
- 2.JPG (32.55 КБ) 14909 просмотров
-
- 1.JPG (49.43 КБ) 14909 просмотров
С уважением
Александр.
Александр.
- sergejey
- Site Admin
- Сообщения: 4284
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 75 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Отправка уведомлений с помощью SMS
А как именно проиходит установка температуры? Если свойство меняется, а метод не вызывается, значит не хватает вызова этого метода.
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Re: Отправка уведомлений с помощью SMS
Установка происходит из 1wire датчика - объект.temp,
метод класса tempChanged
//$params['t']
$old_temp=$this->getProperty('temp');
$t=round($params['t']*2)/2;
$this->setProperty('temp',$t);
if ($t>$old_temp) {
$d=1;
} elseif ($t<$old_temp) {
$d=-1;
} else {
$d=0;
}
$this->setProperty('direction',$d);
$this->setProperty("updated",time());
$this->setProperty("updatedTime",date("H:i",time()));
метод класса tempChanged
//$params['t']
$old_temp=$this->getProperty('temp');
$t=round($params['t']*2)/2;
$this->setProperty('temp',$t);
if ($t>$old_temp) {
$d=1;
} elseif ($t<$old_temp) {
$d=-1;
} else {
$d=0;
}
$this->setProperty('direction',$d);
$this->setProperty("updated",time());
$this->setProperty("updatedTime",date("H:i",time()));
С уважением
Александр.
Александр.
- sergejey
- Site Admin
- Сообщения: 4284
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 75 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Отправка уведомлений с помощью SMS
Надо тогда добавить ещё вызов метода в код, который выполняется при обновлении значения 1-wire:
callMethod("объект.tempChanged");
Т.е. получается, что связанное свойство обновляется, но метод сам по себе не вызовется -- его нужно вызвать принудительно.
callMethod("объект.tempChanged");
Т.е. получается, что связанное свойство обновляется, но метод сам по себе не вызовется -- его нужно вызвать принудительно.
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Re: Отправка уведомлений с помощью SMS
Так не получилось. В поле temp постоянно 0.sergejey писал(а):Надо тогда добавить ещё вызов метода в код, который выполняется при обновлении значения 1-wire:
callMethod("объект.tempChanged");
Т.е. получается, что связанное свойство обновляется, но метод сам по себе не вызовется -- его нужно вызвать принудительно.
Посмотрел по форуму, нашел аналогичную тему про "Слежение за температурой контура отопления", уже обсуждалась подобная проблема.
Этот вызов заработал
if ($params['temperature']) {
callMethod('SensorZal.tempChanged',array('t'=>$params['temperature']['VALUE']));
}
С уважением
Александр.
Александр.
-
- Сообщения: 469
- Зарегистрирован: Вт мар 12, 2013 1:22 am
- Благодарил (а): 41 раз
- Поблагодарили: 81 раз
Re: Отправка уведомлений с помощью SMS
Сдалал чтобы можно было отправлять SMS и USD с сервера Ubuntu аналогично как и в примере выше:
Для отправки SMS нужно чтоб был установлен пакет Gnokii.
Для отправки USSD и получения результата идет обращение напрямую к модему AT-командами.
В принципе и SMS отправлять через AT-команды можно и тогда никакое сторонее ПО не нужно, но в Gnokii есть очень интересная утилитка - демон smsd, которая постоянно запущена и служит для приема входящих sms, сохранении их в базу, т.е. сервер можно заставить отвечать на SMS-ки, более подробно про smsd здесь. Своего демона писать пока сил и мозгов не хватает, поэтому оставил пока так. Может можно подобное на MDM собрать?
Вот так немного подкорректировал /lib/hardware/smsgw.php:
И вот тут закралась засада, скрипт MDM указанный в статье ничего не возвращает.
Если создать отдельный скрипт для запроса баланса balans.php в корне сайта и запустить из браузера www.адрес сайта/balans.php, то тоже белый лист:
А если запустить из консоли: php balans.php то все работает отлично.
Такое подозрение что MDM не дает исполнять shell_exec(), либо в настройках где запрещено, либо прав не хватает?
Сергей, можете помочь разобраться?
Для отправки SMS нужно чтоб был установлен пакет Gnokii.
Для отправки USSD и получения результата идет обращение напрямую к модему AT-командами.
В принципе и SMS отправлять через AT-команды можно и тогда никакое сторонее ПО не нужно, но в Gnokii есть очень интересная утилитка - демон smsd, которая постоянно запущена и служит для приема входящих sms, сохранении их в базу, т.е. сервер можно заставить отвечать на SMS-ки, более подробно про smsd здесь. Своего демона писать пока сил и мозгов не хватает, поэтому оставил пока так. Может можно подобное на MDM собрать?
Вот так немного подкорректировал /lib/hardware/smsgw.php:
Код: Выделить всё
<?php
/**
* Title
*
* Description
*
* @access public
*/
function sendSMS($phone, $text, $pass_server='000000') {
$phone=preg_replace('/^\+/', '', $phone);
if (substr(php_uname(), 0, 7) == "Windows")
{
$address = gethostbyname ('127.0.0.1'); //IP Ђ¤аҐб ў 襣® Є®¬ЇмовҐа
$service_port=8000; //Џ®ав
//$pass_server='000000'; //Џ а®«м
$socket = socket_create (AF_INET, SOCK_STREAM, 0);
if ($socket < 0) {
echo "socket create failed reason: " . socket_strerror ($socket) . "\n";
}
$result = socket_connect ($socket, $address, $service_port);
if ($result < 0) {
echo "socket connect failed.\nReason: ($result) " . socket_strerror($result) . "\n";
}
$text = iconv("UTF-8","Windows-1251",$text);
$in = base64_encode($pass_server."#SENDSMS#[TYPE]0[NUMBER]".$phone."[TEXT]".$text); //ЏаЁ¬Ґа ®вЇа ўЄЁ б¬б
//$in = base64_encode($pass_server."#CMD#[USSD]*102#"); //ЏаЁ¬Ґа § Їа®б USSD Є®¬ ¤л
$out = '';
socket_write ($socket, $in, strlen ($in));
//echo "Response:\n\n";
$res='';
while ($out = socket_read ($socket, 2048)) {
$res.=$out;
}
socket_close ($socket);
$res = iconv("Windows-1251","UTF-8",$res);
}
else
{
$comand = 'LANG=ru_RU.utf8; echo "'.$text.'" | gnokii --sendsms +'.$phone;
$res = shell_exec($comand);
}
return $res;
}
function sendUSD($text, $pass_server='000000') {
$phone=preg_replace('/^\+/', '', $text);
if (substr(php_uname(), 0, 7) == "Windows")
{
$address = gethostbyname ('127.0.0.1'); //IP Ђ¤аҐб ў 襣® Є®¬ЇмовҐа
$service_port=8000; //Џ®ав
//$pass_server='000000'; //Џ а®«м
$socket = socket_create (AF_INET, SOCK_STREAM, 0);
if ($socket < 0) {
echo "socket create failed reason: " . socket_strerror ($socket) . "\n";
}
$result = socket_connect ($socket, $address, $service_port);
if ($result < 0) {
echo "socket connect failed.\nReason: ($result) " . socket_strerror($result) . "\n";
}
$text = iconv("UTF-8","Windows-1251",$text);
$in = base64_encode($pass_server."#CMD#[USSD]".$text); //ЏаЁ¬Ґа ®вЇа ўЄЁ б¬б
//$in = base64_encode($pass_server."#CMD#[USSD]*102#"); //ЏаЁ¬Ґа § Їа®б USSD Є®¬ ¤л
$out = '';
socket_write ($socket, $in, strlen ($in));
//echo "Response:\n\n";
$res='';
while ($out = socket_read ($socket, 2048)) {
$res.=$out;
}
socket_close ($socket);
$res = iconv("Windows-1251","UTF-8",$res);
if (preg_match('/USSD-RESPONSE\[.+?\]:(.+)/is', $res, $m)) {
$res=$m[1];
}
}
else
{
$port = "/dev/ttyUSB0"; //указать куда смонтировался модем
$f = fopen ($port, "rw+");
//Чтобы послать USSD запрос на номер *100#, команда должна выглядеть так:
//AT+CUSD=1,"AA180C3602",15 (двойные кавычки обязательны)
$text = "AT+CUSD=1,\"".encodePDU($phone)."\",15\r\n";
fputs($f, $text);
while ($s = fgets($f)) {
if (substr($s, 0, 5) == "+CUSD") {
$codetext = substr(trim($s), 10, -4);
$res = decodePDU($codetext);
if (strpos($res, "1 - Dalee") !== false) {
fputs($f, "AT+CUSD=1,".encodePDU("1").",15\r\n");
}
else
break;
}
}
fclose($f);
}
return $res;
}
function decodePDU($in) {
$command = "echo ".$in." | perl -ne '@a = m/([0-9A-F]{4})/g; map { eval \"print \\\"\\\\x{\$_}\\\"\"; } @a;' 2>/dev/null";
$out = shell_exec ($command);
return $out;
}
function encodePDU($in) {
$out = "";
for ($i = 0; $i < (strlen($in)-1); $i++) {
$t = $i%8+1;
if ($t == 8) continue;
$c = ord($in[$i])>>($i%8);
$oc = $c;
$b = ord($in[$i+1]) & ((1 << $t)-1);
$c = ($b << (8-$t)) | $c;
$out .= strtoupper(str_pad(dechex($c), 2, '0', STR_PAD_LEFT));
}
return $out;
}
?>
Если создать отдельный скрипт для запроса баланса balans.php в корне сайта и запустить из браузера www.адрес сайта/balans.php, то тоже белый лист:
Код: Выделить всё
<?php
$ROOT = '/var/www/';
include_once($ROOT.'lib/hardware/smsgw.php');
$res=sendUSD("*100#", "Parol");
if (preg_match('/(\d+,\d+)/is',$res,$m)) {
$balance=floatval(str_replace(",",".",$m[1]));
echo $balance;
}
?>
Такое подозрение что MDM не дает исполнять shell_exec(), либо в настройках где запрещено, либо прав не хватает?
Сергей, можете помочь разобраться?
Последний раз редактировалось dmw Ср июл 31, 2013 10:39 am, всего редактировалось 2 раза.
- sergejey
- Site Admin
- Сообщения: 4284
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 75 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Отправка уведомлений с помощью SMS
видимо, так настроены права, что веб-сервер (от имени которого выполняется скрипт) не может запускать команды через shell_exec.
как вариант, использовать safe_exec для этих целей -- он не выдаст результат назад, но команда будет передана основному циклу, который обычно запускается от имени пользователя с правами по-лучше чем веб-сервер.
как вариант, использовать safe_exec для этих целей -- он не выдаст результат назад, но команда будет передана основному циклу, который обычно запускается от имени пользователя с правами по-лучше чем веб-сервер.
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
-
- Сообщения: 469
- Зарегистрирован: Вт мар 12, 2013 1:22 am
- Благодарил (а): 41 раз
- Поблагодарили: 81 раз
Re: Отправка уведомлений с помощью SMS
Да, с правами проблема была. Используемому ПО потребовалось: и добавил в crontab при автозагрузке chmod 777 для модема (иначе права к устройству слетают после перемонтирования/перезагрузки):
и все заработало. Может кто знает как chmod выполнять после монтирования USB-устройтва?
Код: Выделить всё
chmod a+s /usr/bin/perl
chmod a+s /usr/bin/gnokii
Код: Выделить всё
chmod 777 /dev/ttyUSB0