|
@@ -0,0 +1,323 @@
|
|
|
+/*******************************************************************************
|
|
|
+ * Copyright (c) 2012, 2013 IBM Corp.
|
|
|
+ *
|
|
|
+ * All rights reserved. This program and the accompanying materials
|
|
|
+ * are made available under the terms of the Eclipse Public License v1.0
|
|
|
+ * and Eclipse Distribution License v1.0 which accompany this distribution.
|
|
|
+ *
|
|
|
+ * The Eclipse Public License is available at
|
|
|
+ * http://www.eclipse.org/legal/epl-v10.html
|
|
|
+ * and the Eclipse Distribution License is available at
|
|
|
+ * http://www.eclipse.org/org/documents/edl-v10.php.
|
|
|
+ *
|
|
|
+ * Contributors:
|
|
|
+ * Ian Craggs - initial contribution
|
|
|
+ * Ian Craggs - change delimiter option from char to string
|
|
|
+ * Guilherme Maciel Ferreira - add keep alive option
|
|
|
+ *******************************************************************************/
|
|
|
+
|
|
|
+/*
|
|
|
+
|
|
|
+ stdout subscriber
|
|
|
+
|
|
|
+ compulsory parameters:
|
|
|
+
|
|
|
+ --topic topic to subscribe to
|
|
|
+
|
|
|
+ defaulted parameters:
|
|
|
+
|
|
|
+ --host localhost
|
|
|
+ --port 1883
|
|
|
+ --qos 2
|
|
|
+ --delimiter \n
|
|
|
+ --clientid stdout-subscriber
|
|
|
+ --showtopics off
|
|
|
+ --keepalive 10
|
|
|
+
|
|
|
+ --userid none
|
|
|
+ --password none
|
|
|
+
|
|
|
+*/
|
|
|
+#include "MQTTClient.h"
|
|
|
+#include "MQTTClientPersistence.h"
|
|
|
+
|
|
|
+#include <stdio.h>
|
|
|
+#include <signal.h>
|
|
|
+#include <string.h>
|
|
|
+#include <stdlib.h>
|
|
|
+#include "home_easy.h"
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+#if defined(WIN32)
|
|
|
+#define sleep Sleep
|
|
|
+#else
|
|
|
+#include <sys/time.h>
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+unsigned int id = 0x01379F0E;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+volatile int toStop = 0;
|
|
|
+
|
|
|
+typedef struct Item {
|
|
|
+ char * topic;
|
|
|
+ unsigned long int id;
|
|
|
+ char section;
|
|
|
+ char channel;
|
|
|
+ char type;
|
|
|
+} Item;
|
|
|
+
|
|
|
+
|
|
|
+struct opts_struct
|
|
|
+{
|
|
|
+ char* clientid;
|
|
|
+ int nodelimiter;
|
|
|
+ char* delimiter;
|
|
|
+ int qos;
|
|
|
+ char* username;
|
|
|
+ char* password;
|
|
|
+ char* host;
|
|
|
+ char* port;
|
|
|
+ int showtopics;
|
|
|
+ int keepalive;
|
|
|
+} opts =
|
|
|
+{
|
|
|
+ "stdout-subscriber", 0, "\n", 2, NULL, NULL, "localhost", "1883", 0, 10
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+void usage(void)
|
|
|
+{
|
|
|
+ printf("MQTT stdout subscriber\n");
|
|
|
+ printf("Usage: stdoutsub topicname <options>, where options are:\n");
|
|
|
+ printf(" --host <hostname> (default is %s)\n", opts.host);
|
|
|
+ printf(" --port <port> (default is %s)\n", opts.port);
|
|
|
+ printf(" --qos <qos> (default is %d)\n", opts.qos);
|
|
|
+ printf(" --delimiter <delim> (default is \\n)\n");
|
|
|
+ printf(" --clientid <clientid> (default is %s)\n", opts.clientid);
|
|
|
+ printf(" --username none\n");
|
|
|
+ printf(" --password none\n");
|
|
|
+ printf(" --showtopics <on or off> (default is on if the topic has a wildcard, else off)\n");
|
|
|
+ printf(" --keepalive <seconds> (default is %d seconds)\n", opts.keepalive);
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void myconnect(MQTTClient* client, MQTTClient_connectOptions* opts)
|
|
|
+{
|
|
|
+ int rc = 0;
|
|
|
+ if ((rc = MQTTClient_connect(*client, opts)) != 0)
|
|
|
+ {
|
|
|
+ printf("Failed to connect, return code %d\n", rc);
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void cfinish(int sig)
|
|
|
+{
|
|
|
+ signal(SIGINT, NULL);
|
|
|
+ toStop = 1;
|
|
|
+}
|
|
|
+
|
|
|
+void getopts(int argc, char** argv);
|
|
|
+
|
|
|
+int main(int argc, char** argv)
|
|
|
+{
|
|
|
+ MQTTClient client;
|
|
|
+ MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
|
|
|
+
|
|
|
+
|
|
|
+ Item lampH = { "chacon/maison/salon/lampehaute", 0x01379F0E, 'A', 1, 0};
|
|
|
+ Item videoP = { "chacon/maison/salon/videoproj", 0x00DE29E6, 'A', 2, 0};
|
|
|
+ Item tardis = { "chacon/maison/salon/tardis", 0x01379F0E, 'A', 3, 0};
|
|
|
+ Item lampC = { "chacon/maison/chambre/lampe", 0x00DE29E6, 'A', 1, 0};
|
|
|
+ Item lampP = { "chacon/maison/salon/lampe", 0x1379F0E, 'A', 2, 0};
|
|
|
+ Item portail = { "chacon/maison/portail", 0, 'B', 0, 1};
|
|
|
+ Item garage = { "chacon/maison/garage", 0, 'A', 0, 1};
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ //Item lampH = { "chacon/maison/salon/lampehaute", 0x01379F0E, 'A', 1};
|
|
|
+
|
|
|
+
|
|
|
+ Item * listItem[10];
|
|
|
+ listItem[0] = &lampH;
|
|
|
+ listItem[1] = &videoP;
|
|
|
+ listItem[2] = &tardis;
|
|
|
+ listItem[3] = &lampC;
|
|
|
+ listItem[4] = &lampP;
|
|
|
+ listItem[5] = &portail;
|
|
|
+ listItem[6] = &garage;
|
|
|
+
|
|
|
+
|
|
|
+ char* topic = "chacon/#";
|
|
|
+ int rc = 0;
|
|
|
+ char url[100];
|
|
|
+
|
|
|
+
|
|
|
+ opts.showtopics = 1;
|
|
|
+ if (opts.showtopics)
|
|
|
+ printf("topic is %s\n", topic);
|
|
|
+
|
|
|
+ getopts(argc, argv);
|
|
|
+ sprintf(url, "%s:%s", opts.host, opts.port);
|
|
|
+
|
|
|
+ rc = MQTTClient_create(&client, url, opts.clientid, MQTTCLIENT_PERSISTENCE_NONE, NULL);
|
|
|
+
|
|
|
+ signal(SIGINT, cfinish);
|
|
|
+ signal(SIGTERM, cfinish);
|
|
|
+
|
|
|
+ conn_opts.keepAliveInterval = opts.keepalive;
|
|
|
+ conn_opts.reliable = 0;
|
|
|
+ conn_opts.cleansession = 1;
|
|
|
+// conn_opts.username = opts.username;
|
|
|
+// conn_opts.password = opts.password;
|
|
|
+
|
|
|
+ myconnect(&client, &conn_opts);
|
|
|
+
|
|
|
+ rc = MQTTClient_subscribe(client, topic, opts.qos);
|
|
|
+
|
|
|
+ while (!toStop)
|
|
|
+ {
|
|
|
+ char* topicName = NULL;
|
|
|
+ int topicLen;
|
|
|
+ MQTTClient_message* message = NULL;
|
|
|
+ rc = MQTTClient_receive(client, &topicName, &topicLen, &message, 1000);
|
|
|
+ if (message)
|
|
|
+ {
|
|
|
+ if (opts.showtopics)
|
|
|
+ printf("%s\t", topicName);
|
|
|
+
|
|
|
+ for(int i=0;i < 7; i++){
|
|
|
+ if(strcmp(listItem[i]->topic, topicName) == 0){
|
|
|
+
|
|
|
+ initIO();
|
|
|
+ if(listItem[i]->type == 0){
|
|
|
+ ((char*)message->payload)[message->payloadlen] = 0;
|
|
|
+ char onoff = strcmp(message->payload,"1") ? 0 : 1;
|
|
|
+ printf("payload %s %d\n", message->payload, message->payloadlen);
|
|
|
+ printf("%s %x %c %d %d \n",listItem[i]->topic,listItem[i]->id,listItem[i]->section,listItem[i]->channel, onoff);
|
|
|
+ sendHomeEasyCommand(listItem[i]->id,listItem[i]->section,listItem[i]->channel, onoff,10);
|
|
|
+ }else{
|
|
|
+ printf("sendPortail\n");
|
|
|
+ sendPortailCommand(0,((char*)message->payload)[0],100);
|
|
|
+ printf("Command Sent\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (opts.nodelimiter)
|
|
|
+ printf("%.*s", message->payloadlen, (char*)message->payload);
|
|
|
+ else
|
|
|
+ printf("%.*s%s", message->payloadlen, (char*)message->payload, opts.delimiter);
|
|
|
+ fflush(stdout);
|
|
|
+ MQTTClient_freeMessage(&message);
|
|
|
+ MQTTClient_free(topicName);
|
|
|
+ }
|
|
|
+ if (rc != 0)
|
|
|
+ myconnect(&client, &conn_opts);
|
|
|
+ }
|
|
|
+
|
|
|
+ printf("Stopping\n");
|
|
|
+
|
|
|
+ MQTTClient_disconnect(client, 0);
|
|
|
+
|
|
|
+ MQTTClient_destroy(&client);
|
|
|
+
|
|
|
+ return EXIT_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+void getopts(int argc, char** argv)
|
|
|
+{
|
|
|
+ int count = 2;
|
|
|
+
|
|
|
+ while (count < argc)
|
|
|
+ {
|
|
|
+ if (strcmp(argv[count], "--qos") == 0)
|
|
|
+ {
|
|
|
+ if (++count < argc)
|
|
|
+ {
|
|
|
+ if (strcmp(argv[count], "0") == 0)
|
|
|
+ opts.qos = 0;
|
|
|
+ else if (strcmp(argv[count], "1") == 0)
|
|
|
+ opts.qos = 1;
|
|
|
+ else if (strcmp(argv[count], "2") == 0)
|
|
|
+ opts.qos = 2;
|
|
|
+ else
|
|
|
+ usage();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ usage();
|
|
|
+ }
|
|
|
+ else if (strcmp(argv[count], "--host") == 0)
|
|
|
+ {
|
|
|
+ if (++count < argc)
|
|
|
+ opts.host = argv[count];
|
|
|
+ else
|
|
|
+ usage();
|
|
|
+ }
|
|
|
+ else if (strcmp(argv[count], "--port") == 0)
|
|
|
+ {
|
|
|
+ if (++count < argc)
|
|
|
+ opts.port = argv[count];
|
|
|
+ else
|
|
|
+ usage();
|
|
|
+ }
|
|
|
+ else if (strcmp(argv[count], "--clientid") == 0)
|
|
|
+ {
|
|
|
+ if (++count < argc)
|
|
|
+ opts.clientid = argv[count];
|
|
|
+ else
|
|
|
+ usage();
|
|
|
+ }
|
|
|
+ else if (strcmp(argv[count], "--username") == 0)
|
|
|
+ {
|
|
|
+ if (++count < argc)
|
|
|
+ opts.username = argv[count];
|
|
|
+ else
|
|
|
+ usage();
|
|
|
+ }
|
|
|
+ else if (strcmp(argv[count], "--password") == 0)
|
|
|
+ {
|
|
|
+ if (++count < argc)
|
|
|
+ opts.password = argv[count];
|
|
|
+ else
|
|
|
+ usage();
|
|
|
+ }
|
|
|
+ else if (strcmp(argv[count], "--delimiter") == 0)
|
|
|
+ {
|
|
|
+ if (++count < argc)
|
|
|
+ opts.delimiter = argv[count];
|
|
|
+ else
|
|
|
+ opts.nodelimiter = 1;
|
|
|
+ }
|
|
|
+ else if (strcmp(argv[count], "--showtopics") == 0)
|
|
|
+ {
|
|
|
+ if (++count < argc)
|
|
|
+ {
|
|
|
+ if (strcmp(argv[count], "on") == 0)
|
|
|
+ opts.showtopics = 1;
|
|
|
+ else if (strcmp(argv[count], "off") == 0)
|
|
|
+ opts.showtopics = 0;
|
|
|
+ else
|
|
|
+ usage();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ usage();
|
|
|
+ }
|
|
|
+ else if (strcmp(argv[count], "--keepalive") == 0)
|
|
|
+ {
|
|
|
+ if (++count < argc)
|
|
|
+ opts.keepalive = atoi(argv[count]);
|
|
|
+ else
|
|
|
+ usage();
|
|
|
+ }
|
|
|
+ count++;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|