Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
MQTT - PHP
#1
witam... 
potrzebuje pomocy w ogarnięciu tematu spięcia wysyłania na mqtt danych poprzez phpa. 
na serwerze pracuje https://github.com/bluerhinos/phpMQTT 
pytania...

poniższy kod teoretycznie ma publikować client_id czy to prefix? z ustawień.
jak powinien wyglądać prefix i składnia dla zmiennej publish? 
chciałbym poprzez php pobrać dane z jsona zewnętrznego urządzenia i przesłać je do mqtt jako zmienne m1-m20, bo jak na razie nie ma szansy na doczekanie się na taką obsługę bezpośrednio w LK
później mqtt serwer wykona stosowne działania na podstawie tych zmiennych


Kod PHP:
<?php

require('../phpMQTT.php');

$server 'mqtt.ats.pl';     // change if necessary
$port 1883;                     // change if necessary
$username 'user';                   // set your username
$password 'pass';                   // set your password
$client_id '????????'// make sure this is unique for connecting to sever - you could use uniqid()

$mqtt = new Bluerhinos\phpMQTT($server$port$client_id);

if (
$mqtt->connect(trueNULL$username$password)) {
    
$mqtt->publish('prefix/tematu''m1 = 100 ' date('r'), 0false);
    
$mqtt->close();
} else {
    echo "Time out!\n";
}
/
?>
e-chata.hyzne.com | LK1 - sterowniki akwarystyki | LK2 - sterowniki ihome | LK3 - niezliczone ilości wersji/nakładek na farmach PV i nie tylko | LK4 - testy bezprzewodowe
Odpowiedz
#2
Co, skąd i gdzie chcesz wysyłąc?
pozdrawiam
tomek
Odpowiedz
#3
(01-09-2024, 10:45 AM)wilkxt napisał(a): Co, skąd i gdzie chcesz wysyłąc?

dane json z magazynu energii na serwer mqtt.ats.pl jako zmienne m1-->m30 
poniżej przykładowy kod odpowiedzi z luny2k który wypluwa mbtranslator bo tam w nowych huawei wszystko po zmodyfikowanym can'ie gada z sobą Smile ale już rozpracowane.
z modbusa można tylko pogadać trochę z falownikiem.. ale dane nie idą w czasie rzeczywistym, tylko to co dongl przetwarza i wysyła na serwer www a tutaj jest realtime
Kod:
{"tblDTSU":[{"em_Type":"DTSU666","em_RdTime":"11:58:15","em_Status":"OK","em_Queries":"479759","em_TotErr":"42","em_%ErrRate":"0.009","em_LastErr":"0","em_Uab":"411.300","em_Ubc":"408.500","em_Uca":"413.700","em_Ua":"240.500","em_Ub":"234.500","em_Uc":"237.200","em_Ia":"0.786","em_Ib":"0.384","em_Ic":"0.612","em_Pt":"13.300","em_Pa":"7.500","em_Pb":"-68.800","em_Pc":"74.600","em_Qt":"-315.000","em_Qa":"-173.300","em_Qb":"-42.000","em_Qc":"-99.600","em_PFt":"0.031","em_PFa":"0.039","em_PFb":"-0.768","em_PFc":"0.516","em_Freq":"50.010","em_ImpEp":"174.540","em_ExpEp":"19.810","em_Q1Eq":"0.220","em_Q2Eq":"0.230","em_Q3Eq":"23.790","em_Q4Eq":"123.500","em_CT":"1.000"}]}
mając to na serwerze mqtt odpowiednie zadania i reakcje Smile dla wybranych LK zza maskarady.

pełny json poniżej
Kod:
{"info":{"hst":"mbtranslator.local","myip":"192.168.xxx.xxx","pvsno":"01FF01AF","pvver":"1.05","pvmmi":"36880","pvme":"72508","pvrst":"1","pvstrt":"2024-01-09 00:01:14","pvrnt":"19731d 11:58:21"},"data":{"tblDTSU":[{"em_Type":"DTSU666","em_RdTime":"11:59:35","em_Status":"OK","em_Queries":"479904","em_TotErr":"42","em_%ErrRate":"0.009","em_LastErr":"0","em_Uab":"409.400","em_Ubc":"406.800","em_Uca":"413.700","em_Ua":"240.400","em_Ub":"232.400","em_Uc":"237.400","em_Ia":"0.758","em_Ib":"0.381","em_Ic":"0.616","em_Pt":"-5.700","em_Pa":"-9.300","em_Pb":"-69.200","em_Pc":"72.700","em_Qt":"-309.400","em_Qa":"-169.000","em_Qb":"-40.400","em_Qc":"-100.000","em_PFt":"-0.013","em_PFa":"-0.050","em_PFb":"-0.786","em_PFc":"0.499","em_Freq":"50.020","em_ImpEp":"174.540","em_ExpEp":"19.810","em_Q1Eq":"0.220","em_Q2Eq":"0.230","em_Q3Eq":"23.790","em_Q4Eq":"123.510","em_CT":"1.000"}]}}
e-chata.hyzne.com | LK1 - sterowniki akwarystyki | LK2 - sterowniki ihome | LK3 - niezliczone ilości wersji/nakładek na farmach PV i nie tylko | LK4 - testy bezprzewodowe
Odpowiedz
#4
ewentualnie zamiast kombinować po stronie php z klientem mqtt może dodać opcje update bazy danych na serwerze mqtt.ats.pl z url co będzie programowo prostszym zabiegiem dla użytkownika.

przy dłubaniu w kodzie serwera mqtt wprowadziłbym ciekawe rozwiązanie polegające na usłudze sms poprzez moduł GSM na wybranym temacie analogicznie do wysyłania maila.
e-chata.hyzne.com | LK1 - sterowniki akwarystyki | LK2 - sterowniki ihome | LK3 - niezliczone ilości wersji/nakładek na farmach PV i nie tylko | LK4 - testy bezprzewodowe
Odpowiedz
#5
Co do kodu php to ponizej fragment z paroma komentarzami (samo wysylanie ):

Kod PHP:
<?php

require('../phpMQTT.php');

$server 'ADRES_IP_LUB_DOMENA_SERWERA';     // change if necessary
$port 1883;                     // change if necessary
$username 'NAZWA_KLIENTA_MQTT';                   // set your username
$password 'HASLO_KLIENTA_MQTT';                   // set your password
// bin2hex... generuje losowy string, tak by client_id byly unikalny. Nalezy przy tym pamietac ze taki klient powinien laczyc sie z ustawiona flaga clean_session (pierwszy parametr w $mqtt->connect).
$client_id 'phpMQTT-' bin2hex(random_bytes(8)); // make sure this is unique for connecting to sever - you could use uniqid()

$mqtt = new Bluerhinos\phpMQTT($server$port$client_id);

if (
$mqtt->connect(trueNULL$username$password)) {
    
// Pierwszy parametr to temat na ktory wyslac, a drugi to tekst do wyslania, reszte zostawic jak jest.
        // Np. ('abcdef/abc/m1', '27.1', 0, false)
    
$mqtt->publish('PREFIX/CZESC_TEMATU_PO_PREFIXIE''WARTOSC_DO_WYSLANIA'0false);
    
$mqtt->close();
} else {
    echo "Time out!\n";


Odnosnie aktualizacji bazy danych z url na mqtt.ats.pl, co masz na mysli?
Odpowiedz
#6
(01-12-2024, 12:37 PM)tonymony napisał(a): Co do kodu php to ponizej fragment z paroma komentarzami (samo wysylanie ):

Kod PHP:
<?php

require('../phpMQTT.php');

$server 'ADRES_IP_LUB_DOMENA_SERWERA';     // change if necessary
$port 1883;                     // change if necessary
$username 'NAZWA_KLIENTA_MQTT';                   // set your username
$password 'HASLO_KLIENTA_MQTT';                   // set your password
// bin2hex... generuje losowy string, tak by client_id byly unikalny. Nalezy przy tym pamietac ze taki klient powinien laczyc sie z ustawiona flaga clean_session (pierwszy parametr w $mqtt->connect).
$client_id 'phpMQTT-' bin2hex(random_bytes(8)); // make sure this is unique for connecting to sever - you could use uniqid()

$mqtt = new Bluerhinos\phpMQTT($server$port$client_id);

if (
$mqtt->connect(trueNULL$username$password)) {
    
// Pierwszy parametr to temat na ktory wyslac, a drugi to tekst do wyslania, reszte zostawic jak jest.
        // Np. ('abcdef/abc/m1', '27.1', 0, false)
    
$mqtt->publish('PREFIX/CZESC_TEMATU_PO_PREFIXIE''WARTOSC_DO_WYSLANIA'0false);
    
$mqtt->close();
} else {
    echo "Time out!\n";


Odnosnie aktualizacji bazy danych z url na mqtt.ats.pl, co masz na mysli?

thx będę testował kod... teoretycznie widzę już dlaczego nie szło nic 
odnośnie update by url...

przypuśćmy ze mamy urządzenie jakieś, które zbiera nam dane np stacja meteo, licznik energi etc 
Jeśli nie ma ona obsługi mqtt lub nawet jeśli ma ciut inaczej niż lk3 to trzeba się nakombinować jak to sprzęgnąć z LK - najprościej było by przesłać takie dane przez url 
 (np. mqtt.ats.pl/api/user/password/prefix/update?temat1=234&temat2=345&itd.. ) na serwer mqtt a na nim wykonać odpowiednie operacje na LK3 za maskaradą 
takim oto sposobem można by dodawać do bazy mqtt dane z dowolnych urządzeń

można by to rozwiązać jeszcze prościej z poziomu LK3 który odczytywał by jsona z takiego urządzenia np stacji meteo i podpinał je jako zmienne m1-->m30  a zebrane dane wysyłał na serwer Mqtt ale trzeba sobie radzić na tym co mamy obecnie.

mając na linii speca od mqtt .. czy można jakoś wysłać na lk przez mqtt polecenie AT+ do modemu gsm?

pozdr...
e-chata.hyzne.com | LK1 - sterowniki akwarystyki | LK2 - sterowniki ihome | LK3 - niezliczone ilości wersji/nakładek na farmach PV i nie tylko | LK4 - testy bezprzewodowe
Odpowiedz
#7
wreszcie trochę czasu wiec zasiadłem do dalszego dłubania w kodzie i napotkałem kolejny problem...

wysyłając jeden element wszystko śmiga ładnie

Kod PHP:
if ($mqtt->connect(trueNULL$username$password)) {
    // Pierwszy parametr to temat na ktory wyslac, a drugi to tekst do wyslania, reszte zostawic jak jest.
        // Np. ('abcdef/abc/m1', '27.1', 0, false)
    $mqtt->publish('abcdef/abc/m1''33'0false);
 
  $mqtt->close();


ale już wysyłając hurtowo - serwer mqtt.ats.pl nie odbiera nic poza pierwszym 

Kod PHP:
if ($mqtt->connect(trueNULL$username$password)) {
    // Pierwszy parametr to temat na ktory wyslac, a drugi to tekst do wyslania, reszte zostawic jak jest.
        // Np. ('abcdef/abc/m1', '27.1', 0, false)
    $mqtt->publish(' abcdef/abc/m1/''45'0false);
    $mqtt->publish(' abcdef/abc/m2/''44'0false);
    $mqtt->publish(' abcdef/abc/m3/''43'0false);
 
  $mqtt->close(); 
nawiązywanie do każdego przesyłanego parametru nowego polaczenia trochę mija się z celem - jakieś inne rozwiązanie poza pętlą?

na własnym brokerze wszystko przyjmuje..
e-chata.hyzne.com | LK1 - sterowniki akwarystyki | LK2 - sterowniki ihome | LK3 - niezliczone ilości wersji/nakładek na farmach PV i nie tylko | LK4 - testy bezprzewodowe
Odpowiedz
#8
Sprawdzilem z php8.3.1 (taka wersje mialem na dysku) na serwerze lokalnym i na mqtt.ats.pl. W obu przypadkach na standardowym porcie 1883 bez szyfrowania. Uruchamialem z konsoli "php plik.php" majac glowny plik i biblioteke phpMQTT.php w tym samym folderze.

Odrobinke zmodyfikowalem wczesniejszy skrypt. W kodzie zmienic wartosci $server, $username, $password, $prefix, $topic oraz $message_count. Opcjonalnie petle wysylajaca testowe wiadomosci mozna zamienic na wielokrotne wywolanie $mqtt->publish, w dzialaniu nie ma roznicy. Biblioteke pobralem:
Cytat:git clone https://github.com/bluerhinos/phpMQTT.git

Po wywolaniu skryptu pojawialy sie jedna lub wiecej wiadomosci na serwerze (zaleznie od wartosci $message_count).

Kod PHP:
<?php

require('phpMQTT.php');

$server 'ADRES_IP_LUB_DOMENA_SERWERA';     // change if necessary
$port 1883;                     // change if necessary
$username 'NAZWA_KLIENTA_MQTT';                   // set your username
$password 'HASLO_KLIENTA_MQTT';                   // set your password
$prefix 'PREFIX_TEMATOW_MQTT'// Prefix do tematow MQTT
$topic 'FRAGMENT_TEMATU_MQTT'// Bazowy temat ktory bedzie dodany do $prefix, tak ze finalny temat to $prefix/$topic(numer jesli $message_count > 1)
$message_count 1// Ilosc wiadomosci do wyslania "na raz" o losowej tresci z tematami zlozonymi z $prefix i $topic
// bin2hex... generuje losowy string, tak by client_id byly unikalny. Nalezy przy tym pamietac ze taki klient powinien laczyc sie z ustawiona flaga clean_session (pierwszy parametr w $mqtt->connect).
$client_id 'phpMQTT-' bin2hex(random_bytes(8)); // make sure this is unique for connecting to sever - you could use uniqid()

$mqtt = new Bluerhinos\phpMQTT($server$port$client_id);

if (
$mqtt->connect(trueNULL$username$password)) {
    // $mqtt->publish przyjmuje parametry: temat, tresc wiadomosci, QoS, flaga Retain (chyba :P)
    if ($message_count <= 1) {
      $mqtt->publish($prefix.'/'.$topicstrval(random_int(0,20)), 0false);
    } else {
      for ($i 1$i <= $message_count$i++) {
        $mqtt->publish($prefix.'/'.$topic.strval($i), strval(random_int(0,20)), 0false);
      }
    }
    $mqtt->close();
} else {
    echo "Time out!\n";

Odpowiedz


Skocz do:


Użytkownicy przeglądający ten wątek: 2 gości