use Getopt::Long;
use Pod::Usage;
use POSIX qw(strftime);
+use File::Slurp;
+use autodie;
use lib '.';
use Protocol;
+my $queue = "queue";
+
$|=1; # flush STDOUT
my $help;
my $man;
my $verbose = 2;
-my $host = 'mqtt.zc-sensor.com';
+my $host = 'localhost';
my $port = 1883;
my $count;
my $client_id;
while (1) {
$msg = read_message($socket, $buf);
if ($msg) {
- print "\n",strftime("%Y-%m-%d %H:%M:%S ", localtime()) if $msg->message_type != MQTT_PINGRESP;
+ my $t = time();
+ print "\n",strftime("%Y-%m-%d %H:%M:%S ", localtime($t)) if $msg->message_type != MQTT_PINGRESP;
if ($msg->message_type == MQTT_PUBLISH) {
if ($verbose == 0) {
print $msg->topic, " ", $msg->message, "\n";
print $msg->string, "\n";
}
-# if ( $msg->topic =~ m{Inclinometer/ZCT330Ex_SWP_N_YK/869858031634109/up} ) {
- if ( substr($msg->message,2,1) eq "\x07" ) { # heartbeat
- #my $raw = "\x5a\x0b\x03\x09\x00\x00\x04\xe8\x03\x00\x00\x21\x44\xaa\x4B\xF3";
- my $raw = read_parameter_frame( "\x00" => "\x04\xe8\x03\x00\x00", "\x21", "\x44", "\x12", "\x14", "\x1a\x21\x22\x23\x24\x33\x34\x35\x3b" );
my $topic = $msg->topic;
- $topic =~ s/up$/down/;
- send_message($socket,
- message_type => MQTT_PUBLISH,
- retain => 0, #$retain,
- topic => $topic,
- message => $raw);
+ my $dir = $topic;
+ $dir =~ s{\w+/\w+/(\w+)/\w+}{$1};
+
+ mkdir "$queue" if ( ! -e "$queue" );
+ mkdir "$queue/$dir" if ( ! -e "$queue/$dir" );
+ mkdir "$queue/$dir/up" if ( ! -e "$queue/$dir/up" );
+ write_file "$queue/$dir/up/$t", $msg->string;
+
+ mkdir "$queue/$dir/down" if ( ! -e "$queue/$dir/down" );
+ mkdir "$queue/$dir/down/.done" if ( ! -e "$queue/$dir/down/.done" );
+
+# if ( $msg->topic =~ m{Inclinometer/ZCT330Ex_SWP_N_YK/869858031634109/up} ) {
+ if ( substr($msg->message,2,1) eq "\x07" ) { # heartbeat
+ $topic =~ s/up$/down/;
+
+ my @all_pending = sort glob "$queue/$dir/down/*";
+ if ( my $pending = shift @all_pending ) {
+ my $raw = read_file $pending;
+
+ send_message($socket,
+ message_type => MQTT_PUBLISH,
+ retain => 0, #$retain,
+ topic => $topic,
+ message => $raw);
+ rename "$queue/$dir/down/$pending", "$queue/$dir/down/.done/$pending";
+ }
}
if (defined $count && --$count == 0) {