Browse code

Ascult pe un topic generic si doar anumite mesaje le scriu in DB si intr-un fisier. Teste 24 de ore.

Liviu Pislaru authored on 04/03/2018 00:15:02
Showing 1 changed files
... ...
@@ -1,18 +1,23 @@
1 1
 #!/usr/bin/perl
2 2
 # parser pentru mesajele MQTT
3
-# Version: 1.0.0 
3
+# Version: 1.0.1
4 4
 use strict;
5 5
 use warnings;
6 6
 use JSON qw( decode_json );
7 7
 use DBI;
8 8
 use Proc::Daemon;
9 9
 
10
-# partea de daemon
11
-###################################
12
-Proc::Daemon::Init;
13
-my $continue = 1;
14
-$SIG{TERM} = sub { $continue = 0 };
15
-###################################
10
+# pentru debug pun daemon=0 ca sa nu mai ruleze ca daemon
11
+my $daemon=1;
12
+my $continue;
13
+if ($daemon==1){
14
+  Proc::Daemon::Init;
15
+  $continue = 1;
16
+  $SIG{TERM} = sub { $continue = 0 };
17
+  open PID, ">>/var/run/mqttparser.pid" or die "Couldn't open file: $!";
18
+  print PID "$$\n";
19
+  close PID;
20
+}
16 21
 
17 22
 # citesc fisierul de config
18 23
 my $config = '/etc/mqttparser.conf';
... ...
@@ -37,26 +42,46 @@ while( my $line = <$CFG>){
37 37
 }
38 38
 close $CFG;
39 39
 
40
-# scriu pid-ul
41
-open PID, ">>/var/run/mqttparser.pid" or die "Couldn't open file: $!";
42
-print PID "$$\n";
43
-close PID;
44
-
45 40
 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/rqx958t-1459/#\" |");
41
+open(my $SUB, "/usr/bin/mosquitto_sub -u $mqttuser -P $mqttpass -v -t \"stat/#\" |");
47 42
 while (my $mqttMessage = <$SUB> ) {
48
-    # spargem mqttMessage in doua, dupa primul spatiu si obtinem topicul si json-ul:
49
-    (my $topic, my $json) = split /\ /, $mqttMessage, 2;
43
+  # spargem mqttMessage in doua, dupa prima { si obtinem canalul si json-ul:
44
+  my $channel = substr($mqttMessage, 0, index("$mqttMessage", '{'));
45
+  my $json = substr($mqttMessage, index("$mqttMessage", '{'), -1);
46
+  # spargem canalul: stat/esrqtsa-3434/ESP
47
+  (my $root, my $topic, my $queue) = split /\//, $channel;
48
+  # de obicei, exista un spatiu dupa afisarea canalului si-i fac remove
49
+  $queue=~ s/\ //g;
50
+  # cu mesajele care vin pe stat/+/ESP si contin in json Temp fac grafice
51
+  if ($queue eq "ESP"){
50 52
     my $decoded = decode_json($json);
53
+    my $temp=$decoded->{'Temp'};
54
+    colect ($topic, 'Temp', $temp);
51 55
     my $query = "insert into mqttparser values (?, ?, ?)";
52 56
     my $sqlQuery  = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstr\n";
53
-    $sqlQuery->execute('0', $decoded->{'Temp'}, '2');
57
+    $sqlQuery->execute('0', $decoded->{'Temp'}, '101');
54 58
     $sqlQuery->finish();
59
+  }
55 60
 }
56 61
 $dbh->disconnect;
57 62
 
58
-# partea de daemon
59
-###################################
60
-while ($continue) {
63
+if ($daemon==1){
64
+  while ($continue) {
65
+  }
66
+}
67
+sub colect {
68
+  (my $device, my $camp, my $val) = @_;
69
+  my $cale='/admin/scripts/mqtt-perl/test.txt';
70
+#  my $filename="test.txt";
71
+#  if ($camp eq "Temp"){
72
+#    $filename="temperatura.txt";
73
+#  }
74
+#  if ($camp eq "Humi"){
75
+#    $filename="umiditate.txt";
76
+#  }
77
+  my $cale_fisier=$cale;
78
+  open (my $fh, '>>', $cale_fisier) or die "Cannot open";
79
+  print $fh "valoare - topic: $val - $device\n";
80
+  close $fh;
81
+  return;
61 82
 }
62
-###################################