| ... | ... |
@@ -1,6 +1,7 @@ |
| 1 | 1 |
#!/usr/bin/perl |
| 2 | 2 |
# parser pentru mesajele MQTT |
| 3 |
-# Version: 1.0.1 |
|
| 3 |
+# Version: 1.0.2 |
|
| 4 |
+ |
|
| 4 | 5 |
use strict; |
| 5 | 6 |
use warnings; |
| 6 | 7 |
use JSON qw( decode_json ); |
| ... | ... |
@@ -43,24 +44,48 @@ while( my $line = <$CFG>){
|
| 43 | 43 |
close $CFG; |
| 44 | 44 |
|
| 45 | 45 |
my $dbh = DBI->connect("DBI:mysql:$db:$dbhost", $dbuser, $dbpass);
|
| 46 |
-open(my $SUB, "/usr/bin/mosquitto_sub -u $mqttuser -P $mqttpass -v -t \"stat/#\" |"); |
|
| 46 |
+open(my $SUB, "/usr/bin/mosquitto_sub -u $mqttuser -P $mqttpass -v -t \"#\" |"); |
|
| 47 | 47 |
while (my $mqttMessage = <$SUB> ) {
|
| 48 |
- # spargem mqttMessage in doua, dupa prima { si obtinem canalul si json-ul:
|
|
| 49 |
- my $channel = substr($mqttMessage, 0, index("$mqttMessage", '{'));
|
|
| 50 |
- my $json = substr($mqttMessage, index("$mqttMessage", '{'), -1);
|
|
| 51 |
- # spargem canalul: stat/esrqtsa-3434/ESP |
|
| 52 |
- (my $root, my $topic, my $queue) = split /\//, $channel; |
|
| 53 |
- # de obicei, exista un spatiu dupa afisarea canalului si-i fac remove |
|
| 54 |
- $queue=~ s/\ //g; |
|
| 55 |
- # cu mesajele care vin pe stat/+/ESP si contin in json Temp fac grafice |
|
| 56 |
- if ($queue eq "ESP"){
|
|
| 57 |
- my $decoded = decode_json($json); |
|
| 58 |
- my $temp=$decoded->{'Temp'};
|
|
| 59 |
- colect ($topic, 'Temp', $temp); |
|
| 60 |
- my $query = "insert into mqttparser values (?, ?, ?)"; |
|
| 61 |
- my $sqlQuery = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstr\n"; |
|
| 62 |
- $sqlQuery->execute('0', $decoded->{'Temp'}, '101');
|
|
| 63 |
- $sqlQuery->finish(); |
|
| 48 |
+ my $start = substr($mqttMessage, 0, 4); |
|
| 49 |
+ # prelucrez doar mesajele de pe canalele stat/# sau tele/# |
|
| 50 |
+ if (($start eq "stat")||($start eq "tele")){
|
|
| 51 |
+ if (index($mqttMessage, "{") == -1) {
|
|
| 52 |
+ #print "Mesajul nu contine json, il sparg dupa spatiu\n" |
|
| 53 |
+ (my $channel, my $nonjson) = split /\ /, $mqttMessage, 2; |
|
| 54 |
+ (my $root, my $topic, my $queue) = split /\//, $channel; |
|
| 55 |
+ # aleg canalele de unde salvez date in DB: |
|
| 56 |
+ if ($queue eq "LWT"){
|
|
| 57 |
+ getdevinfoFILE ($topic, "LWT", $nonjson); |
|
| 58 |
+ getdevinfoDB ($topic, "LWT", $nonjson); |
|
| 59 |
+ } |
|
| 60 |
+ else {
|
|
| 61 |
+ #print "nu ma intereseaza alte canale fara json"; |
|
| 62 |
+ } |
|
| 63 |
+ } |
|
| 64 |
+ else {
|
|
| 65 |
+ #print "Mesajul contine json, il sparg dupa {\n";
|
|
| 66 |
+ my $channel = substr($mqttMessage, 0, index("$mqttMessage", '{'));
|
|
| 67 |
+ $channel=~ s/\ //g; # sterg ultimul spatiu |
|
| 68 |
+ (my $root, my $topic, my $queue) = split /\//, $channel; |
|
| 69 |
+ my $json = substr($mqttMessage, index("$mqttMessage", '{'), rindex("$mqttMessage", '}'));
|
|
| 70 |
+ |
|
| 71 |
+ # aleg canalele de unde salvez date in DB: |
|
| 72 |
+ if ($queue eq "ENERGY"){
|
|
| 73 |
+ # tele/mng9184-1657/ENERGY {"Time":"2018-03-04T13:18:39","Total":1376.995,"Yesterday":23.704,"Today":16.450,"Period":102,"Power":1255,"Factor":0.99,"Voltage":237,"Current":5.298}
|
|
| 74 |
+ my $decoded = decode_json($json); |
|
| 75 |
+ my $yesterday = $decoded->{'Yesterday'};
|
|
| 76 |
+ my $today = $decoded->{'Today'};
|
|
| 77 |
+ getdevinfoFILE ($topic, "Yesterday", $yesterday); |
|
| 78 |
+ getdevinfoDB ($topic, "Yesterday", $yesterday); |
|
| 79 |
+ getdevinfoFILE ($topic, "Today", $today); |
|
| 80 |
+ getdevinfoDB ($topic, "Today", $today); |
|
| 81 |
+ } |
|
| 82 |
+ if ($queue eq "ESP"){
|
|
| 83 |
+ } |
|
| 84 |
+ } |
|
| 85 |
+ } |
|
| 86 |
+ else {
|
|
| 87 |
+ #print 'Nu ma intereseaza mesajele astea!\n$mqttMessage'; |
|
| 64 | 88 |
} |
| 65 | 89 |
} |
| 66 | 90 |
$dbh->disconnect; |
| ... | ... |
@@ -69,19 +94,24 @@ if ($daemon==1){
|
| 69 | 69 |
while ($continue) {
|
| 70 | 70 |
} |
| 71 | 71 |
} |
| 72 |
-sub colect {
|
|
| 73 |
- (my $device, my $camp, my $val) = @_; |
|
| 74 |
- my $cale='/admin/scripts/mqtt-perl/test.txt'; |
|
| 75 |
-# my $filename="test.txt"; |
|
| 76 |
-# if ($camp eq "Temp"){
|
|
| 77 |
-# $filename="temperatura.txt"; |
|
| 78 |
-# } |
|
| 79 |
-# if ($camp eq "Humi"){
|
|
| 80 |
-# $filename="umiditate.txt"; |
|
| 81 |
-# } |
|
| 82 |
- my $cale_fisier=$cale; |
|
| 83 |
- open (my $fh, '>>', $cale_fisier) or die "Cannot open"; |
|
| 84 |
- print $fh "valoare - topic: $val - $device\n"; |
|
| 72 |
+ |
|
| 73 |
+sub getdevinfoFILE {
|
|
| 74 |
+ (my $topic, my $camp, my $valoare) = @_; |
|
| 75 |
+ my $cale='/admin/scripts/mqtt-perl/mqttparser.devel.txt'; |
|
| 76 |
+ my $tm=localtime; |
|
| 77 |
+ open (my $fh, '>>', $cale) or die "Cannot open"; |
|
| 78 |
+ (my $user, my $devid) = split /\-/, $topic; |
|
| 79 |
+ print $fh "$tm: Update FILE getdevinfo: $user - $devid - $camp - $valoare\n"; |
|
| 85 | 80 |
close $fh; |
| 86 | 81 |
return; |
| 87 | 82 |
} |
| 83 |
+ |
|
| 84 |
+sub getdevinfoDB {
|
|
| 85 |
+ (my $topic, my $camp, my $valoare) = @_; |
|
| 86 |
+ my $query = "insert into mqttparser values (?, ?, ?)"; |
|
| 87 |
+ my $sqlQuery = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstr\n"; |
|
| 88 |
+ my $tm=localtime; |
|
| 89 |
+ (my $user, my $devid) = split /\-/, $topic; |
|
| 90 |
+ $sqlQuery->execute('0', "$tm", "$user - $devid - $camp - $valoare");
|
|
| 91 |
+ return; |
|
| 92 |
+} |