Advertisement
Guest User

Untitled

a guest
Jan 28th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.20 KB | None | 0 0
  1. #include <stdbool.h>
  2. #include <stdint.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. #include <inttypes.h>
  7. #include <netinet/in.h>
  8. #include <string.h>
  9. #include <sys/types.h>
  10.  
  11. #include <MQTTClient.h>
  12.  
  13. #define ADDRESS "tcp://localhost:1883"
  14. #define QOS0 0
  15. #define QOS1 1
  16. #define QOS2 2
  17. #define TIMEOUT 10000L
  18.  
  19. volatile MQTTClient_deliveryToken deliveredtoken;
  20.  
  21. void rtfm(char **argv) {
  22.     printf("Usage: %s hamster_client_id {<Option>} <param1> \n", argv[0]);
  23.     printf("Function: Hamster instrumentation device software\n");
  24.     printf("Optionen:\n");
  25.     printf("     -p {<port>}         - port of the mqtt server (default (no tls): 1883\n");
  26.     printf("     -s {<IP address>}   - IP address to run the server on (default: 127.0.0.1\n");
  27.     printf("     -v                  - Connect with Certificate based SSL/TLS Support to the MQTT server \n");
  28.     printf("     -V                  - Connect with Certificate based client authentification to the MQTT server \n");
  29.     printf("     -h                  - This help \n");
  30. }
  31.  
  32. void delivered(void *context, MQTTClient_deliveryToken dt) {
  33.     printf("Message with token value %d delivery confirmed\n", dt);
  34.     deliveredtoken = dt;
  35. }
  36. int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message) {
  37.     int i;
  38.     char *payloadptr;
  39.     printf("Message arrived\n");
  40.     printf("   topic: %s\n", topicName);
  41.     printf("   message: ");
  42.     payloadptr = message->payload;
  43.     for (i = 0; i < message->payloadlen; i++) {
  44.         putchar(*payloadptr++);
  45.     }
  46.     putchar('\n');
  47.     MQTTClient_freeMessage(&message);
  48.     MQTTClient_free(topicName);
  49.     return 1;
  50. }
  51. void connlost(void *context, char *cause) {
  52.     printf("\nConnection lost\n");
  53.     printf("     cause: %s\n", cause);
  54. }
  55.  
  56. void pubnewmsg(MQTTClient* client, char* clientid, char* topic, char* payload) {
  57.     MQTTClient_message pubmsg = MQTTClient_message_initializer;
  58.     MQTTClient_deliveryToken token;
  59.     pubmsg.payload = payload;
  60.     pubmsg.payloadlen = strlen(payload);
  61.     pubmsg.qos = QOS0;
  62.     pubmsg.retained = 0;
  63.     MQTTClient_publishMessage(client, topic, &pubmsg, &token);
  64.     printf(
  65.         "Waiting for up to %d seconds for publication of %s\n"
  66.         "on topic %s for client with ClientID: %s\n",
  67.         (int)(TIMEOUT / 1000), "PAYLOAD", topic, clientid);
  68.     MQTTClient_waitForCompletion(client, token, TIMEOUT);
  69.     printf("Message with delivery token %d delivered\n", token);
  70. }
  71.  
  72. int main(int argc, char **argv) {
  73.     unsigned int port = 1883;
  74.     char *clientid;
  75.     char topic[256];
  76.  
  77.     if (argc < 2) {
  78.         rtfm(argv);
  79.         exit(0);
  80.     }
  81.  
  82.     // parse args
  83.     clientid = argv[1];
  84.     for (int i = 1; i < argc; i++) {
  85.         if (strcmp("-p", argv[i]) == 0) {
  86.             char *end;
  87.             port = strtoul(argv[i + 1], &end, 0);
  88.             if (argv[i + 1] == end) {
  89.                 printf("%s: Not a number: %s\n", argv[0], argv[i + 1]);
  90.                 exit(1);
  91.             }
  92.         } else if (strcmp("-s", argv[i]) == 0) {
  93.             // todo
  94.         } else if (strcmp("-h", argv[i]) == 0) {
  95.             rtfm(argv);
  96.             exit(0);
  97.         } else if (strcmp("-v", argv[i]) == 0) {
  98.             // todo
  99.         } else if (strcmp("-V", argv[i]) == 0) {
  100.         }
  101.     }
  102.  
  103.     if (port) {
  104.     }
  105.  
  106.     MQTTClient client;
  107.     MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
  108.     int rc;
  109.     int ch;
  110.  
  111.     MQTTClient_create(&client, ADDRESS, clientid, MQTTCLIENT_PERSISTENCE_NONE, NULL);
  112.     conn_opts.keepAliveInterval = 20;
  113.     conn_opts.cleansession = 1;
  114.     conn_opts.username = "hamster";
  115.     conn_opts.password = "";
  116.  
  117.     MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered);
  118.  
  119.     if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
  120.         printf("Failed to connect, return code %d\n", rc);
  121.         exit(EXIT_FAILURE);
  122.     }
  123.  
  124.  
  125.     MQTTClient_subscribe(client, "/pension/livestock", QOS0);
  126.     MQTTClient_subscribe(client, "/pension/room/A", QOS0);
  127.     sprintf(topic, "/pension/hamster/%s/wheels%c", clientid, '\0');
  128.     printf("%s\n", topic);
  129.     MQTTClient_subscribe(client, topic, QOS0);
  130.     sprintf(topic, "/pension/hamster/%s/state%c", clientid, '\0');
  131.     printf("%s\n", topic);
  132.     MQTTClient_subscribe(client, topic, QOS0);
  133.     sprintf(topic, "/pension/hamster/%s/position%c", clientid, '\0');
  134.     printf("%s\n", topic);
  135.     MQTTClient_subscribe(client, topic, QOS0);
  136.     sprintf(topic, "/pension/hamster/%s/fondle%c", clientid, '\0');
  137.     printf("%s\n", topic);
  138.     MQTTClient_subscribe(client, topic, QOS0);
  139.     sprintf(topic, "/pension/hamster/%s/punish%c", clientid, '\0');
  140.     printf("%s\n", topic);
  141.     MQTTClient_subscribe(client, topic, QOS0);
  142.  
  143.     do {
  144.         ch = getchar();
  145.         if (ch == 'l' || ch == 'L') {
  146.             pubnewmsg(client, clientid, "/pension/livestock", "payload");
  147.         }
  148.         if (ch == 's' || ch == 'S') {
  149.             sprintf(topic, "/pension/hamster/%s/state%c", clientid, '\0');
  150.             pubnewmsg(client, clientid, topic, "payload");
  151.         }
  152.     } while (ch != 'Q' && ch != 'q');
  153.     MQTTClient_disconnect(client, 10000);
  154.     MQTTClient_destroy(&client);
  155.  
  156.     return rc;
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement