#!/usr/bin/perl
# parser pentru mesajele MQTT
# Version: 1.0.0
use strict;
use warnings;
use JSON qw( decode_json );
use DBI;
use Proc::Daemon;
# partea de daemon
###################################
Proc::Daemon::Init;
my $continue = 1;
$SIG{TERM} = sub { $continue = 0 };
###################################
# citesc fisierul de config
my $config = '/etc/mqttparser.conf';
open my $CFG, $config or die "Could not open my $config: my $!";
my $db;
my $dbuser;
my $dbpass;
my $dbhost;
my $mqttuser;
my $mqttpass;
my $row=1;
while( my $line = <$CFG>){
my @credentials = split /=/, $line;
if ($row==1) {$db = $credentials[1]; chomp($db);}
if ($row==2) {$dbuser = $credentials[1]; chomp($dbuser);}
if ($row==3) {$dbpass = $credentials[1]; chomp($dbpass);}
if ($row==4) {$dbhost = $credentials[1]; chomp($dbhost);}
if ($row==5) {$mqttuser = $credentials[1]; chomp($mqttuser);}
if ($row==6) {$mqttpass = $credentials[1]; chomp($mqttpass);}
$row++;
}
close $CFG;
# scriu pid-ul
open PID, ">>/var/run/mqttparser.pid" or die "Couldn't open file: $!";
print PID "$$\n";
close PID;
my $dbh = DBI->connect("DBI:mysql:$db:$dbhost", $dbuser, $dbpass);
open(my $SUB, "/usr/bin/mosquitto_sub -u $mqttuser -P $mqttpass -v -t \"stat/rqx958t-1459/#\" |");
while (my $mqttMessage = <$SUB> ) {
# spargem mqttMessage in doua, dupa primul spatiu si obtinem topicul si json-ul:
(my $topic, my $json) = split /\ /, $mqttMessage, 2;
my $decoded = decode_json($json);
my $query = "insert into mqttparser values (?, ?, ?)";
my $sqlQuery = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstr\n";
$sqlQuery->execute('0', $decoded->{'Temp'}, '2');
$sqlQuery->finish();
}
$dbh->disconnect;
# partea de daemon
###################################
while ($continue) {
}
###################################