Отправка уведомлений с помощью SMS

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Отправка уведомлений с помощью SMS

Сообщение sergejey » Пн окт 15, 2012 4:09 pm


Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Panchez
Сообщения: 99
Зарегистрирован: Вс апр 29, 2012 7:31 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Отправка уведомлений с помощью SMS

Сообщение Panchez » Сб янв 26, 2013 1:19 pm

Добрый день!
Не могу разобраться с превышением температуры из данной темы, при превышении ничего не происходит, свойства объекта изменяются а метод не выполняется.
Вложения
2.JPG
2.JPG (32.55 КБ) 14892 просмотра
1.JPG
1.JPG (49.43 КБ) 14892 просмотра
С уважением
Александр.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Отправка уведомлений с помощью SMS

Сообщение sergejey » Ср янв 30, 2013 11:37 am

А как именно проиходит установка температуры? Если свойство меняется, а метод не вызывается, значит не хватает вызова этого метода.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Panchez
Сообщения: 99
Зарегистрирован: Вс апр 29, 2012 7:31 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Отправка уведомлений с помощью SMS

Сообщение Panchez » Ср янв 30, 2013 11:50 am

Установка происходит из 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()));
С уважением
Александр.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Отправка уведомлений с помощью SMS

Сообщение sergejey » Ср янв 30, 2013 12:14 pm

Надо тогда добавить ещё вызов метода в код, который выполняется при обновлении значения 1-wire:
callMethod("объект.tempChanged");
Т.е. получается, что связанное свойство обновляется, но метод сам по себе не вызовется -- его нужно вызвать принудительно.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Panchez
Сообщения: 99
Зарегистрирован: Вс апр 29, 2012 7:31 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Отправка уведомлений с помощью SMS

Сообщение Panchez » Ср янв 30, 2013 11:57 pm

sergejey писал(а):Надо тогда добавить ещё вызов метода в код, который выполняется при обновлении значения 1-wire:
callMethod("объект.tempChanged");
Т.е. получается, что связанное свойство обновляется, но метод сам по себе не вызовется -- его нужно вызвать принудительно.
Так не получилось. В поле temp постоянно 0.
Посмотрел по форуму, нашел аналогичную тему про "Слежение за температурой контура отопления", уже обсуждалась подобная проблема.
Этот вызов заработал

if ($params['temperature']) {
callMethod('SensorZal.tempChanged',array('t'=>$params['temperature']['VALUE']));
}
С уважением
Александр.
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

Re: Отправка уведомлений с помощью SMS

Сообщение dmw » Ср июл 17, 2013 12:03 pm

На Linux Ubuntu Server как настроить модуль?
wvdial нужен?
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

Re: Отправка уведомлений с помощью SMS

Сообщение dmw » Вт июл 30, 2013 5:12 pm

Сдалал чтобы можно было отправлять SMS и USD с сервера Ubuntu аналогично как и в примере выше:
Для отправки 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;
  }

?>
И вот тут закралась засада, скрипт MDM указанный в статье ничего не возвращает.
Если создать отдельный скрипт для запроса баланса 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;
 }
?>
А если запустить из консоли: php balans.php то все работает отлично.
Такое подозрение что MDM не дает исполнять shell_exec(), либо в настройках где запрещено, либо прав не хватает?
Сергей, можете помочь разобраться?
Последний раз редактировалось dmw Ср июл 31, 2013 10:39 am, всего редактировалось 2 раза.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Отправка уведомлений с помощью SMS

Сообщение sergejey » Вт июл 30, 2013 5:21 pm

видимо, так настроены права, что веб-сервер (от имени которого выполняется скрипт) не может запускать команды через shell_exec.
как вариант, использовать safe_exec для этих целей -- он не выдаст результат назад, но команда будет передана основному циклу, который обычно запускается от имени пользователя с правами по-лучше чем веб-сервер.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

Re: Отправка уведомлений с помощью SMS

Сообщение dmw » Вт июл 30, 2013 8:00 pm

Да, с правами проблема была. Используемому ПО потребовалось:

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

chmod a+s /usr/bin/perl
chmod a+s /usr/bin/gnokii
и добавил в crontab при автозагрузке chmod 777 для модема (иначе права к устройству слетают после перемонтирования/перезагрузки):

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

chmod 777 /dev/ttyUSB0
и все заработало. Может кто знает как chmod выполнять после монтирования USB-устройтва?
Ответить