Browse code

Ascult toate topicurile insa le citesc doar pe cele care ne intereseaza. Fac update si in DB si in FILE (pentru grafice)

Liviu Pislaru authored on 04/03/2018 15:48:40
Showing 1 changed files
... ...
@@ -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
+}