You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
2.5 KiB

2 years ago
  1. //
  2. // Created by zwsd
  3. //
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <unistd.h>
  7. #include <fstream>
  8. #include <iostream>
  9. #include <list>
  10. #include <map>
  11. #include <memory>
  12. #include <set>
  13. #include <sstream>
  14. #include <stdint>
  15. #include <string>
  16. #include <vector>
  17. #include "MQTTClient.h"
  18. #include "mqtt_config.hpp"
  19. typedef struct {
  20. string address;
  21. string username;
  22. string password;
  23. string clientid;
  24. int qos;
  25. string topic;
  26. int timeout;
  27. } mqtt_config_t;
  28. share_ptr<MQTTConfig> g_config;
  29. static void publish(MQTTClient client, char *topic, char *payload) {
  30. MQTTClient_message message = MQTTClient_message_initializer;
  31. message.payload = payload;
  32. message.payloadlen = strlen(payload);
  33. message.qos = g_mqtt_config.qos;
  34. message.retained = 0;
  35. MQTTClient_deliveryToken token;
  36. MQTTClient_publishMessage(client, topic, &message, &token);
  37. MQTTClient_waitForCompletion(client, token, g_mqtt_config.timeout);
  38. printf("Send `%s` to topic `%s` \n", payload, g_mqtt_config.topic.c_str());
  39. }
  40. static int on_message(void *context, char *topicName, int topicLen, MQTTClient_message *message) {
  41. char *payload = (char *)message->payload;
  42. printf("Received `%s` from `%s` topic \n", payload, topicName);
  43. MQTTClient_freeMessage(&message);
  44. MQTTClient_free(topicName);
  45. return 1;
  46. }
  47. int main(int argc, char *argv[]) {
  48. int rc;
  49. MQTTClient client;
  50. MQTTConfig mqttConfig;
  51. g_config = make_shared<MQTTConfig>();
  52. g_config->initialize("mqtt_config.json");
  53. printf("mqtt_config.json: \n%s\n", g_config->dump().c_str());
  54. MQTTClient_create(&client, g_mqtt_config.address.c_str(), g_mqtt_config.clientid.c_str(), 0, NULL);
  55. MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
  56. conn_opts.username = g_mqtt_config.username.c_str();
  57. conn_opts.password = g_mqtt_config.password.c_str();
  58. MQTTClient_setCallbacks(client, NULL, NULL, on_message, NULL);
  59. if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
  60. printf("Failed to connect, return code %d\n", rc);
  61. exit(-1);
  62. } else {
  63. printf("Connected to MQTT Broker!\n");
  64. }
  65. MQTTClient_subscribe(client, g_mqtt_config.topic.c_str(), g_mqtt_config.qos);
  66. char payload[23];
  67. for (int i = 0; i < 100; i += 1) {
  68. snprintf(payload, 23, "{\"RunningState\": \"%d\"}", i);
  69. publish(client, (char *)g_mqtt_config.topic.c_str(), payload);
  70. sleep(1);
  71. }
  72. MQTTClient_disconnect(client, g_mqtt_config.timeout);
  73. MQTTClient_destroy(&client);
  74. return 0;
  75. }