mqtt_pub.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*
  2. * mqtt publish
  3. *
  4. * @build make examples
  5. * @sub bin/mqtt_sub 127.0.0.1 1883 topic
  6. * @pub bin/mqtt_pub 127.0.0.1 1883 topic payload
  7. *
  8. */
  9. #include "hv.h"
  10. #include "mqtt_client.h"
  11. /*
  12. * @test MQTTS
  13. * #define TEST_SSL 1
  14. *
  15. * @build ./configure --with-mqtt --with-openssl && make clean && make
  16. *
  17. */
  18. #define TEST_SSL 0
  19. #define TEST_AUTH 0
  20. /*
  21. * workflow:
  22. * mqtt_client_new -> mqtt_client_xxx -> mqtt_client_run
  23. *
  24. * mqtt_client_set_xxx ->
  25. * mqtt_client_connect ->
  26. * on_connack -> mqtt_client_publish ->
  27. * on_puback -> mqtt_client_disconnect ->
  28. * on_disconnect -> mqtt_client_stop
  29. *
  30. */
  31. static void on_mqtt(mqtt_client_t* cli, int type) {
  32. printf("on_mqtt type=%d\n", type);
  33. switch(type) {
  34. case MQTT_TYPE_CONNECT:
  35. printf("mqtt connected!\n");
  36. break;
  37. case MQTT_TYPE_DISCONNECT:
  38. printf("mqtt disconnected!\n");
  39. {
  40. mqtt_message_t* msg = (mqtt_message_t*)mqtt_client_get_userdata(cli);
  41. HV_FREE(msg);
  42. mqtt_client_set_userdata(cli, NULL);
  43. mqtt_client_stop(cli);
  44. }
  45. break;
  46. case MQTT_TYPE_CONNACK:
  47. printf("mqtt connack!\n");
  48. {
  49. mqtt_message_t* msg = (mqtt_message_t*)mqtt_client_get_userdata(cli);
  50. if (msg == NULL) return;
  51. int mid = mqtt_client_publish(cli, msg);
  52. printf("mqtt publish mid=%d\n", mid);
  53. if (msg->qos == 0) {
  54. mqtt_client_disconnect(cli);
  55. } else if (msg->qos == 1) {
  56. // wait MQTT_TYPE_PUBACK
  57. } else if (msg->qos == 2) {
  58. // wait MQTT_TYPE_PUBREC
  59. }
  60. }
  61. break;
  62. case MQTT_TYPE_PUBACK: /* qos = 1 */
  63. printf("mqtt puback mid=%d\n", cli->mid);
  64. mqtt_client_disconnect(cli);
  65. break;
  66. case MQTT_TYPE_PUBREC: /* qos = 2 */
  67. printf("mqtt pubrec mid=%d\n", cli->mid);
  68. // wait MQTT_TYPE_PUBCOMP
  69. break;
  70. case MQTT_TYPE_PUBCOMP: /* qos = 2 */
  71. printf("mqtt pubcomp mid=%d\n", cli->mid);
  72. mqtt_client_disconnect(cli);
  73. break;
  74. default:
  75. break;
  76. }
  77. }
  78. static int mqtt_publish(const char* host, int port, const char* topic, const char* payload) {
  79. mqtt_client_t* cli = mqtt_client_new(NULL);
  80. if (cli == NULL) return -1;
  81. cli->keepalive = 10;
  82. // client_id
  83. char client_id[64];
  84. snprintf(client_id, sizeof(client_id), "mqtt_pub_%ld", hv_getpid());
  85. printf("client_id: %s\n", client_id);
  86. mqtt_client_set_id(cli, client_id);
  87. // will
  88. mqtt_message_t will;
  89. memset(&will, 0, sizeof(will));
  90. will.topic = "will";
  91. will.payload = "This is a will.";
  92. mqtt_client_set_will(cli, &will);
  93. #if TEST_AUTH
  94. mqtt_client_set_auth(cli, "test", "123456");
  95. #endif
  96. mqtt_message_t* msg = NULL;
  97. HV_ALLOC_SIZEOF(msg);
  98. msg->topic = topic;
  99. msg->topic_len = strlen(topic);
  100. msg->payload = payload;
  101. msg->payload_len = strlen(payload);
  102. msg->qos = 1;
  103. mqtt_client_set_userdata(cli, msg);
  104. mqtt_client_set_callback(cli, on_mqtt);
  105. int ssl = 0;
  106. #if TEST_SSL
  107. ssl = 1;
  108. #endif
  109. mqtt_client_connect(cli, host, port, ssl);
  110. mqtt_client_run(cli);
  111. mqtt_client_free(cli);
  112. return 0;
  113. }
  114. int main(int argc, char** argv) {
  115. if (argc < 5) {
  116. printf("Usage: %s host port topic payload\n", argv[0]);
  117. return -10;
  118. }
  119. const char* host = argv[1];
  120. int port = atoi(argv[2]);
  121. const char* topic = argv[3];
  122. const char* payload = argv[4];
  123. return mqtt_publish(host, port, topic, payload);
  124. }