Forum Tiny Control Solution
Modem GSM i kilka LK - Wersja do druku

+- Forum Tiny Control Solution (https://forum.tinycontrol.pl)
+-- Dział: LanKontroler - sprzęt i wersje wsadów, problemy, zastosowanie (https://forum.tinycontrol.pl/forumdisplay.php?fid=3)
+--- Dział: LanKontroler V3.5 (https://forum.tinycontrol.pl/forumdisplay.php?fid=28)
+--- Wątek: Modem GSM i kilka LK (/showthread.php?tid=2875)



Modem GSM i kilka LK - marcinb - 09-03-2023

Witajcie,

Mam do Was pytanie.
Jak mogę wykorzystać czujniki, modem GSM, czujnik światła z jednego LK na innych.
Są w tej samej sieci lokalnej, chciałbym wykorzystać LK który ma czujnik światła i modem GSM do powiadomienia z innego LK który ma sterować tylko bramą.

Czy to jest w ogóle wykonalne ??


RE: Modem GSM i kilka LK - stAch - 09-08-2023

oczywiście że możesz. masz dwie możliwości kilka LK - dowolne wersje do jednego lk z modemem gsm

przy pomocy linku http - ogranicza to jednak do 1 i ten sam sms z każdego LK

http://192.168.1.100/stm.cgi?gsmsendsms --> ten url wyśle pierwszy sms pod wskazany tam numer (działa tak jak sms testowy)

przy pomocy strony pośredniczącej --> na serwerze zewnętrznym stawiasz bramkę sms która pobiera ustawienia twojego LK i podmienia nr tel oraz pierwszą wiadomość a następnie wysyła sms
strona taka może być w sieci wewnętrznej - zalecane ale i zewnętrznej - tu polecam vpny by zwiększyć bezpieczeństwo.
na każdym z klientów gsm wpisujesz url do tej strony i w zależności co tam sobie nadłubiesz - strona może sprawdzać stany - odczytywać parametry dowolnego LK oraz w zależności od nich budować treść sms który zostanie przesłany.

w mojej prywatnej sieci na bramie mam nakładkę GSM która współpracuje poprzez lokalny serwer z innymi sterownikami nie tylko LK
w sieciach klienckich mam kilka LK GSM (brak stałego interneta)  i poprzez nie wysyłam statusy farm fotowoltaicznych (overload sieci) z sieci wpiętych do Internetu - oczywiście przy pomocy bramki php

Kod:
<?php
error_reporting(E_ALL);
parse_str($_SERVER['QUERY_STRING']);

/**        API Client        //post msg format
function sms($x){                                                                                        //usage sms('wiadomosc');
    $ch = curl_init( 'http://api.url/lk/sms.php' );        //powiadomienie sms
        curl_setopt($ch, CURLOPT_USERPWD, "user:password");        //haslo do api
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, 'tel=600600600&msg='.$x);
        curl_exec($ch);
}

url post --> user:pass@api.url/lk/sms.php?tel=600600600&msg=xxx
**/

function ret_val($param){                                //odzyt z tablicy dns
        $reading = fopen('../conf.txt', 'r');
        while (!feof($reading)) {
          $line = fgets($reading);
          if (stristr($line,$param)) {
            return explode("=", $line)[1];
          }
        }
        fclose($reading);
}
function r($url){
        $e = rawurlencode($url);
        $e = str_replace("%3F", "?", $e);
        $e = str_replace("%26", "&", $e);
        $e = str_replace("%3D", "=", $e);
        $e = str_replace("%2F", "/", $e);
        $e = str_replace("%7C", "%0A", $e);        //nowa linia |
        $e = str_replace("%C2%BA", "º", $e);
        return $e;
}
function r_pl($q) {                                                    //usuwanie znakow specjalnych
    $p = array("ą","ć","ę","ł","ń","ó","ś","ż","ź","Ą","Ć","Ę","Ł","Ń","Ó","Ś","Ż","Ź");
    $z = array("a","c","e","l","n","o","s","z","z","A","C","E","L","N","O","S","Z","Z");
    $q = str_replace($p, $z, $q);
    $q = preg_replace("/[^a-z,?A-Z.0-9 º'|!=:\-\+@%]/", '', $q);
  return $q;
}
function get($x, $url){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $x.$url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_USERPWD, "user:pass");                            //user:pass LK
        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
        $d = curl_exec($ch);
        $i = curl_getinfo($ch);
        curl_close($ch);
        return $d;
}
$x = 'http://'.ret_val('api.dns').':99';         //odczyt dns

if(isset($_GET['msg']) AND isset($_GET['tel'])){
    $o = json_decode(get($x,'/json/gsm.json'));
    if (!is_object($o)) {exit('access fatal error!');}
    $s2=$o->gsmTexts[0]->off;
    $s3=$o->gsmTexts[1]->on;
    $s4=$o->gsmTexts[1]->off;
    $s5=$o->gsmTexts[2]->on;
    $s6=$o->gsmTexts[2]->off;
    $s7=$o->gsmTexts[3]->on;
    $s8=$o->gsmTexts[3]->off;
    if(isset($_GET['tel']) ){$d = 'gsmnumber1='.$_GET['tel'].'&';}else {$d = 'gsmnumber1=600600600&';}
    $_GET['msg'] = substr(r_pl($_GET['msg']),0,155).' ';
    $url = '/stm.cgi?'.$d.'gsmsms1='.$_GET['msg'].'*'.$s2.
    '&gsmsms2='.$s3.'*'.$s4.'&gsmsms3='.$s5.'*'.$s6.'&gsmsms4='.$s7.'*'.$s8.'&gsmsendsms';
if(array($o->gsmTexts)){get($x,r($url));
    exit($_GET['tel'].' --> '.$_GET['msg']);}
}
if(isset($_POST['sms'])){
    get($x,'/stm.cgi?gsmcmd=AT+CMGL="ALL",1');    //ALL  UNREAD
    sleep(1.5);
    $o = get($x,'/json/gsm_per.json');
    preg_match('/(?<=READ",)(.*)(?=OK)/', $o, $s);
    if(empty($s[1])){exit('Brak nowych SMS!');}
    $s = str_replace(array('\n \n','\n',','), array('"',',"',''), $s[1]);
    preg_match_all('"([^\\"]+)"', $s, $e);
    $s = join("\n",$e[1]);
    exit($s);
}

if(isset($_POST['msg'])){
    $o = json_decode(get($x,'/json/gsm.json'));
    if (!is_object($o)) {exit('access fatal error!');}
    $s2=$o->gsmTexts[0]->off;
    $s3=$o->gsmTexts[1]->on;
    $s4=$o->gsmTexts[1]->off;
    $s5=$o->gsmTexts[2]->on;
    $s6=$o->gsmTexts[2]->off;
    $s7=$o->gsmTexts[3]->on;
    $s8=$o->gsmTexts[3]->off;
    if(isset($_POST['tel']) ){$d = 'gsmnumber1='.$_POST['tel'].'&';}else {$d = 'gsmnumber1=600600600&';}
    $_POST['msg'] = substr(r_pl($_POST['msg']),0,155).' ';
    $url = '/stm.cgi?'.$d.'gsmsms1='.$_POST['msg'].'*'.$s2.
    '&gsmsms2='.$s3.'*'.$s4.'&gsmsms3='.$s5.'*'.$s6.'&gsmsms4='.$s7.'*'.$s8.'&gsmsendsms';
if(array($o->gsmTexts)){
    get($x,r($url));
    $a = array($_POST['tel'],"gsmsms1=");
    $b = array("600600600","gsmsms1=".$_POST['tel'].".");
    if($_POST['tel'] != "600600600"){ sleep(2); get($x,r(str_replace($a,$b,$url))); }
    exit();
}

//exit(get($x,r($url)));
}
?>
<html dir='ltr' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'  lang="pl-PL">
        <head>
        <title>Bramka LK3 SMS</title>
            <meta content='text/html; charset=utf-8' http-equiv='Content-Type'/>
        </head>
    <body>
        <form action="sms.php" method="post">
            <textarea type="text" id="sms" name="msg" rows="3" cols="40" maxlength="155" placeholder="Tresc wiadomosci SMS...">Treść wiadomości SMS
</textarea><br/>
            Odbiorca: <select id="tel" name="tel">
  <option value="600600600">bramka 1</option>
  <option value="600600601">bramka 2 K</option>
</select>
            <input type="submit" value="wyslij sms">
        </form>
    </body>
</html>



RE: Modem GSM i kilka LK - stAch - 09-11-2023

brakujący config wciągnięty na początek scryptu oraz opisy dodane w kodzie.
kod testowany php8, zmodyfikowany do sieci lokalnej bez obslugi zewnętrznych dnsów
 edytować nr predefiniowany na własny oraz user:pass ktore sa w kodzie w kilku miejscach oraz  zmienic ip lk3 z nakladka gsm

Kod PHP:
<?php
error_reporting
(E_ALL);
parse_str($_SERVER['QUERY_STRING']);
/**        API Client        //post msg format
function sms($x){                                          //usage sms('wiadomosc');
    $ch = curl_init( 'http://ip/bramka.php' );        //powiadomienie sms
        curl_setopt($ch, CURLOPT_USERPWD, "user:password");        //haslo do api
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, 'tel=600600600&msg='.$x);
        curl_exec($ch);
}
w LK3 bez nakladki gsm ustawiasz http  user:pass@adres_ip:port/adres/bramka.php?tel=600600600&msg=xxx
gdzie xxx to wiadomosc do wyslania a tel to numer odbiorcy aktywacja np zadaniem hhtp2
edycja kodu:
# zapisz kod na serwerze jako bramka.php z uprawnieniami chmod 744
# w kodzie nalezy edytowac USER:PASS jesli jest inne a powinno byc! w function get()
# oraz ponizej:
# ip oraz port LK3 na ktorym jest nakladka gsm 
# domyslny nr telefonu 600600600 na wlasny domyslny nr pod ktory maja przychodzic wyslane smsy lub numery kwestia wersji
# slac podziekowania bic poklony ;) informacje o bykach i pomyslach na https://forum.tinycontrol.pl/member.php?action=profile&uid=3492
**/
                                        // CONFIGURACJA ///
$x 'http://192.168.1.100:80';         //ip:port LK z nakladka gsm
function r($url){
        
$e rawurlencode($url);
        
$e str_replace("%3F""?"$e);
        
$e str_replace("%26""&"$e);
        
$e str_replace("%3D""="$e);
        
$e str_replace("%2F""/"$e);
        
$e str_replace("%7C""%0A"$e);        //nowa linia |
        
$e str_replace("%C2%BA""º"$e);
        return 
$e;
}
function 
r_pl($q) {                                                    //usuwanie znakow specjalnych
    
$p = array("ą","ć","ę","ł","ń","ó","ś","ż","ź","Ą","Ć","Ę","Ł","Ń","Ó","Ś","Ż","Ź");
    
$z = array("a","c","e","l","n","o","s","z","z","A","C","E","L","N","O","S","Z","Z");
    
$q str_replace($p$z$q);
    
$q preg_replace("/[^a-z,?A-Z.0-9 º'|!=:\-\+@%]/"''$q);
  return $q;
}
function 
get($x$url){
        
$ch curl_init();
        
curl_setopt($chCURLOPT_URL$x.$url);
        
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
        
curl_setopt($chCURLOPT_USERPWD"user:pass");                            //user:pass LK
        
curl_setopt($chCURLOPT_HTTPAUTHCURLAUTH_BASIC);
        
$d curl_exec($ch);
        
$i curl_getinfo($ch);
        
curl_close($ch);
        return 
$d;
}
if(isset(
$_GET['msg']) AND isset($_GET['tel'])){
    
$o json_decode(get($x,'/json/gsm.json'));
    if (!
is_object($o)) {exit('access fatal error!');}
    
$s2=$o->gsmTexts[0]->off;
    
$s3=$o->gsmTexts[1]->on;
    
$s4=$o->gsmTexts[1]->off;
    
$s5=$o->gsmTexts[2]->on;
    
$s6=$o->gsmTexts[2]->off;
    
$s7=$o->gsmTexts[3]->on;
    
$s8=$o->gsmTexts[3]->off;
    if(isset(
$_GET['tel']) ){$d 'gsmnumber1='.$_GET['tel'].'&';}else {$d 'gsmnumber1=600600600&';}
    
$_GET['msg'] = substr(r_pl($_GET['msg']),0,155).' ';
    
$url '/stm.cgi?'.$d.'gsmsms1='.$_GET['msg'].'*'.$s2.
    
'&gsmsms2='.$s3.'*'.$s4.'&gsmsms3='.$s5.'*'.$s6.'&gsmsms4='.$s7.'*'.$s8.'&gsmsendsms';
if(array(
$o->gsmTexts)){get($x,r($url));
    exit(
$_GET['tel'].' --> '.$_GET['msg']);}
}
if(isset(
$_POST['msg'])){
    
$o json_decode(get($x,'/json/gsm.json'));
    if (!
is_object($o)) {exit('access fatal error!');}
    
$s2=$o->gsmTexts[0]->off;
    
$s3=$o->gsmTexts[1]->on;
    
$s4=$o->gsmTexts[1]->off;
    
$s5=$o->gsmTexts[2]->on;
    
$s6=$o->gsmTexts[2]->off;
    
$s7=$o->gsmTexts[3]->on;
    
$s8=$o->gsmTexts[3]->off;
    if(isset(
$_POST['tel']) ){$d 'gsmnumber1='.$_POST['tel'].'&';}else {$d 'gsmnumber1=600600600&';}
    
$_POST['msg'] = substr(r_pl($_POST['msg']),0,155).' ';
    
$url '/stm.cgi?'.$d.'gsmsms1='.$_POST['msg'].'*'.$s2.
    
'&gsmsms2='.$s3.'*'.$s4.'&gsmsms3='.$s5.'*'.$s6.'&gsmsms4='.$s7.'*'.$s8.'&gsmsendsms';
if(array(
$o->gsmTexts)){
    
get($x,r($url));
    
$a = array($_POST['tel'],"gsmsms1=");
    
$b = array("600600600","gsmsms1=".$_POST['tel'].".");
    if(
$_POST['tel'] != "600600600"){ sleep(2); get($x,r(str_replace($a,$b,$url))); }
    exit();
}
}
?>
<html dir='ltr' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'  lang="pl-PL">
        <head>
        <title>Bramka LK3 SMS</title>
            <meta content='text/html; charset=utf-8' http-equiv='Content-Type'/>
        </head>
    <body>
        <form action="bramka.php" method="post">
            <textarea type="text" id="sms" name="msg" rows="3" cols="40" maxlength="155" placeholder="Tresc wiadomosci SMS...">Treść wiadomości SMS
</textarea><br/>
            Odbiorca: <select id="tel" name="tel">
  <option value="600600600">nr telefonu</option>
  <option value="600600600">nr telefonu</option>
  <option value="600600600">nr telefonu</option>
<!--... itd ..-->
</select>
            <input type="submit" value="wyslij sms">
        </form>
    </body>
</html> 
ustawienia http url dla bramki     


RE: Modem GSM i kilka LK - marcinb - 09-15-2023

stAch
mógłbyś przepatrzeć ten skrypt, nie bardzo chce działać Sad I mógłbyś dadć jeszcze raz komendę po http bo załącznik poleciał.


RE: Modem GSM i kilka LK - stAch - 09-17-2023

kod poprawiony powyżej testowano na php8 
komenda do sterownika użyta w kodzie 
Kod:
http://192.168.1.100:80/stm.cgi?gsmsms=sms1on*sms2on*sms3on*sms4on*sms1off*sms2off*sms3off*sms4off&gsmsendsms&gsmnumber1=1234567891
dokumentacja api  tutaj https://docs.tinycontrol.pl/pl/lk3/api/serial-port/

kod html do bramki  - wysyłanie sms przez http z dowolnym parametrem i nowa linią
Kod:
user:pass@adres_serwera_bramki:port/bramka.php?tel=600600600&msg=Test bramki |%069  - %070



RE: Modem GSM i kilka LK - stAch - 09-20-2023

kod php dla sms sendera z wlasnymi smsami dla stanow bez opcji deflaut sms number - wymaga każdorazowo jego deklaracje
Kod PHP:
<?php
error_reporting
(E_ALL);
if (!empty(
$_SERVER['QUERY_STRING'])){ parse_str($_SERVER['QUERY_STRING']); }
//parse_str($_SERVER['QUERY_STRING']);
/**        API Client        //post msg format
function sms($x){                                          //usage sms('wiadomosc');
    $ch = curl_init( 'http://ip/bramka.php' );        //powiadomienie sms
        curl_setopt($ch, CURLOPT_USERPWD, "user:password");        //haslo do api
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, 'tel=600600600&msg='.$x);
        curl_exec($ch);
}
w LK3 bez nakladki gsm ustawiasz http  user:pass@adres_ip:port/adres/bramka.php?tel=600600600&msg=xxx
gdzie xxx to wiadomosc do wyslania a tel to numer odbiorcy aktywacja np zadaniem hhtp2
edycja kodu:
# zapisz kod na serwerze jako bramka.php z uprawnieniami chmod 744
# w kodzie nalezy edytowac USER:PASS jesli jest inne a powinno byc! w function get()
# oraz ponizej:
# ip oraz port LK3 na ktorym jest nakladka gsm 
# domyslny nr telefonu 600600600 na wlasny domyslny nr pod ktory maja przychodzic wyslane smsy lub numery kwestia wersji
# slac podziekowania bic poklony ;) informacje o bykach i pomyslach na https://forum.tinycontrol.pl/member.php?action=profile&uid=3492
**/
                                        // CONFIGURACJA ///
$x 'http://192.168.1.100:80';         //ip:port LK z nakladka gsm
function r($url){
        $e rawurlencode($url);
        $e str_replace("%3F""?"$e);
        $e str_replace("%26""&"$e);
        $e str_replace("%3D""="$e);
        $e str_replace("%2F""/"$e);
        $e str_replace("%7C""%0A"$e);        //nowa linia |
        $e str_replace("%C2%BA""º"$e);
        return $e;
}
function 
r_pl($q) {                                                    //usuwanie znakow specjalnych
    $p = array("ą","ć","ę","ł","ń","ó","ś","ż","ź","Ą","Ć","Ę","Ł","Ń","Ó","Ś","Ż","Ź");
    $z = array("a","c","e","l","n","o","s","z","z","A","C","E","L","N","O","S","Z","Z");
    $q str_replace($p$z$q);
    $q preg_replace("/[^a-z,?A-Z.0-9 º'|!=:\-\+@%]/"''$q);
  return $q;
}
function 
get($x$url){
        $ch curl_init();
        curl_setopt($chCURLOPT_URL$x.$url);
        curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
        curl_setopt($chCURLOPT_USERPWD"user:pass");                            //user:pass LK
        curl_setopt($chCURLOPT_HTTPAUTHCURLAUTH_BASIC);
        $d curl_exec($ch);
        $i curl_getinfo($ch);
        curl_close($ch);
        return $d;
}
if( isset(
$_REQUEST['par']) AND isset($_REQUEST['val']) ){
if(
$_REQUEST['par']=='power' AND $_REQUEST['val'] > 500 ) {$_REQUEST['msg'] = $_REQUEST['msg'].'  Powrót zasilania ';}  //do kodu smsa dodac &par=power&val=%006
if($_REQUEST['par']=='power' AND $_REQUEST['val'] < 500 ) {$_REQUEST['msg'] = $_REQUEST['msg'].'  Brak zasilania ';}  //do kodu smsa dodac &par=power&val=%006

if($_REQUEST['par']=='pompa' AND $_REQUEST['val'] == 1) {$_REQUEST['msg'] = $_REQUEST['msg'].' Pompa ON';}  //do kodu smsa dodac &par=pompa&val=%044
if($_REQUEST['par']=='pompa' AND $_REQUEST['val'] == 0) {$_REQUEST['msg'] = $_REQUEST['msg'].' Pompa Off';}  //do kodu smsa dodac &par=poczta&val=%056


if($_REQUEST['par']=='poczta' AND $_REQUEST['val'] == 1) {$_REQUEST['msg'] = $_REQUEST['msg'].' Otwarcie skrytki pocztowej';}  //do kodu smsa dodac &par=pompa&val=%044
if($_REQUEST['par']=='poczta' AND $_REQUEST['val'] == 0) {exit();}  //pomija wysyłke sms jesli stan powraca i nas wnerwia :)


//itd dla każdego przesłanego par i val jesli wiadomosc poczatkowa ma byc timestampem to url ma postac  user:pass@adres_ip:port/adres/bramka.php?tel=600600600&msg=%069 - %070|&par=power&val=%006
}
if(isset(
$_REQUEST['msg']) AND isset($_REQUEST['tel'])){
    $o json_decode(get($x,'/json/gsm.json'));
    if (!is_object($o)) {exit('access fatal error json!');}
    $s2=$o->gsmTexts[0]->off;
    $s3=$o->gsmTexts[1]->on;
    $s4=$o->gsmTexts[1]->off;
    $s5=$o->gsmTexts[2]->on;
    $s6=$o->gsmTexts[2]->off;
    $s7=$o->gsmTexts[3]->on;
    $s8=$o->gsmTexts[3]->off;
    $d 'gsmnumber1='.$_REQUEST['tel'];
    $_REQUEST['msg'] = substr(r_pl($_REQUEST['msg']),0,155).' ';
    $url '/stm.cgi?'.$d.'&gsmsms1='.$_REQUEST['msg'].'*'.$s2.
    '&gsmsms2='.$s3.'*'.$s4.'&gsmsms3='.$s5.'*'.$s6.'&gsmsms4='.$s7.'*'.$s8.'&gsmsendsms';
    if(array(
$o->gsmTexts)){get($x,r($url));}
    exit($_REQUEST['tel'].' --> '.$_REQUEST['msg'].'<br/>'.$url);
}
?>
<html dir='ltr' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'  lang="pl-PL">
        <head>
        <title>Bramka LK3 SMS</title>
            <meta content='text/html; charset=utf-8' http-equiv='Content-Type'/>
        </head>
    <body>
        <form action="bramka.php" method="post">
            <textarea type="text" id="sms" name="msg" rows="3" cols="40" maxlength="155" placeholder="Tresc wiadomosci SMS...">Treść wiadomości SMS
</textarea><br/>
<input type="text" name="par" value="pompa"><br/>
<input type="text" name="val" value="1"><br/>
            Odbiorca: <select id="tel" name="tel">
  <option value="600600600">nr telefonu</option>
<!--... itd ..-->
</select>
            <input type="submit" value="wyslij sms">
        </form>
        <pre>
        <?php                                                  /////odczyt z LK przyklad
    $e = json_decode(get($x,'/json/all.json'));
    if (!is_object($e)) {exit('access fatal error!');}
    echo "mac adress: ".$e->mac."<hr/>mozliwe wartosci do pobrania";
         print_r($e); 
                 ?>
        </pre>
    </body>
</html> 


odczyt jsona dokumentacja lk3 https://docs.tinycontrol.pl/pl/lk3/responses/  tu zwrotka dla większości in/out https://docs.tinycontrol.pl/lk3demo/json/all.json