123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- /*******************************************************************************
- * 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++;
- }
- }
|