/******************************************************************************* * 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 #include #include #include #include "home_easy.h" #if defined(WIN32) #define sleep Sleep #else #include #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 , where options are:\n"); printf(" --host (default is %s)\n", opts.host); printf(" --port (default is %s)\n", opts.port); printf(" --qos (default is %d)\n", opts.qos); printf(" --delimiter (default is \\n)\n"); printf(" --clientid (default is %s)\n", opts.clientid); printf(" --username none\n"); printf(" --password none\n"); printf(" --showtopics (default is on if the topic has a wildcard, else off)\n"); printf(" --keepalive (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++; } }