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.

94 lines
2.8 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 <string>
  15. #include <vector>
  16. #include "MQTTClient.h"
  17. #include "config.hpp"
  18. using namespace std;
  19. using namespace nlohmann;
  20. using namespace iflytop;
  21. typedef struct {
  22. string address;
  23. string username;
  24. string password;
  25. string clientid;
  26. int qos;
  27. string topic;
  28. int timeout;
  29. } mqtt_config_t;
  30. shared_ptr<MQTTConfig> g_mqtt_config;
  31. static void publish(MQTTClient client, char *topic, char *payload) {
  32. MQTTClient_message message = MQTTClient_message_initializer;
  33. message.payload = payload;
  34. message.payloadlen = strlen(payload);
  35. message.qos = g_mqtt_config->getQos();
  36. message.retained = 0;
  37. MQTTClient_deliveryToken token;
  38. MQTTClient_publishMessage(client, topic, &message, &token);
  39. MQTTClient_waitForCompletion(client, token, g_mqtt_config->getTimeout());
  40. printf("Send `%s` to topic `%s` \n", payload, g_mqtt_config->getTopic().c_str());
  41. }
  42. static int on_message(void *context, char *topicName, int topicLen, MQTTClient_message *message) {
  43. char *payload = (char *)message->payload;
  44. printf("Received `%s` from `%s` topic \n", payload, topicName);
  45. MQTTClient_freeMessage(&message);
  46. MQTTClient_free(topicName);
  47. return 1;
  48. }
  49. int main(int argc, char *argv[]) {
  50. int rc;
  51. MQTTClient client;
  52. MQTTConfig mqttConfig;
  53. g_mqtt_config = make_shared<MQTTConfig>();
  54. // 从文件中读取配置
  55. g_mqtt_config->initialize("mqtt_config.json");
  56. // 打印配置
  57. printf("mqtt_config.json: \n%s\n", g_mqtt_config->dump().c_str());
  58. // 创建客户端
  59. MQTTClient_create(&client, g_mqtt_config->getAddress().c_str(), g_mqtt_config->getClientid().c_str(), 0, NULL);
  60. MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
  61. conn_opts.username = g_mqtt_config->getUsername().c_str();
  62. conn_opts.password = g_mqtt_config->getPassword().c_str();
  63. // 设置回调函数
  64. MQTTClient_setCallbacks(client, NULL, NULL, on_message, NULL);
  65. // 连接到MQTT Broker
  66. if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
  67. printf("Failed to connect, return code %d\n", rc);
  68. exit(-1);
  69. } else {
  70. printf("Connected to MQTT Broker!\n");
  71. }
  72. // 订阅主题
  73. MQTTClient_subscribe(client, g_mqtt_config->getTopic().c_str(), g_mqtt_config->getQos());
  74. char payload[23];
  75. for (int i = 0; i < 100; i += 1) {
  76. snprintf(payload, 23, "{\"RunningState\": \"%d\"}", i);
  77. // 发布消息
  78. publish(client, (char *)g_mqtt_config->getTopic().c_str(), payload);
  79. sleep(1);
  80. }
  81. // 取消订阅
  82. MQTTClient_disconnect(client, g_mqtt_config->getTimeout());
  83. // 销毁客户端
  84. MQTTClient_destroy(&client);
  85. return 0;
  86. }