Liczba postów: 338
Liczba wątków: 24
Dołączył: Nov 2013
Reputacja:
5
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(true, NULL, $username, $password)) { $mqtt->publish('prefix/tematu', 'm1 = 100 ' . date('r'), 0, false); $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
Liczba postów: 2,350
Liczba wątków: 40
Dołączył: Oct 2011
Reputacja:
14
Co, skąd i gdzie chcesz wysyłąc?
pozdrawiam
tomek
Liczba postów: 338
Liczba wątków: 24
Dołączył: Nov 2013
Reputacja:
5
01-09-2024, 02:51 PM
(Ten post był ostatnio modyfikowany: 01-09-2024, 03:04 PM przez stAch.)
(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ą 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 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
Liczba postów: 338
Liczba wątków: 24
Dołączył: Nov 2013
Reputacja:
5
01-11-2024, 10:37 PM
(Ten post był ostatnio modyfikowany: 01-11-2024, 11:15 PM przez stAch.)
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
Liczba postów: 25
Liczba wątków: 1
Dołączył: Sep 2019
Reputacja:
1
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(true, NULL, $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', 0, false); $mqtt->close(); } else { echo "Time out!\n"; }
Odnosnie aktualizacji bazy danych z url na mqtt.ats.pl, co masz na mysli?
Liczba postów: 338
Liczba wątków: 24
Dołączył: Nov 2013
Reputacja:
5
(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(true, NULL, $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', 0, false); $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
Liczba postów: 338
Liczba wątków: 24
Dołączył: Nov 2013
Reputacja:
5
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(true, NULL, $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', 0, false); $mqtt->close(); }
ale już wysyłając hurtowo - serwer mqtt.ats.pl nie odbiera nic poza pierwszym
Kod PHP: if ($mqtt->connect(true, NULL, $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', 0, false); $mqtt->publish(' abcdef/abc/m2/', '44', 0, false); $mqtt->publish(' abcdef/abc/m3/', '43', 0, false); $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
Liczba postów: 25
Liczba wątków: 1
Dołączył: Sep 2019
Reputacja:
1
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(true, NULL, $username, $password)) { // $mqtt->publish przyjmuje parametry: temat, tresc wiadomosci, QoS, flaga Retain (chyba :P) if ($message_count <= 1) { $mqtt->publish($prefix.'/'.$topic, strval(random_int(0,20)), 0, false); } else { for ($i = 1; $i <= $message_count; $i++) { $mqtt->publish($prefix.'/'.$topic.strval($i), strval(random_int(0,20)), 0, false); } } $mqtt->close(); } else { echo "Time out!\n"; }
|