mqtt_sub.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*
  2. * mqtt subscribe
  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-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_subscribe ->
  27. * on_publish -> handle_message
  28. *
  29. */
  30. static void handle_message(mqtt_client_t* cli, mqtt_message_t* msg) {
  31. printf("topic: %.*s\n", msg->topic_len, msg->topic);
  32. printf("payload: %.*s\n", msg->payload_len, msg->payload);
  33. }
  34. static void on_mqtt(mqtt_client_t* cli, int type) {
  35. printf("on_mqtt type=%d\n", type);
  36. switch(type) {
  37. case MQTT_TYPE_CONNECT:
  38. printf("mqtt connected!\n");
  39. break;
  40. case MQTT_TYPE_DISCONNECT:
  41. printf("mqtt disconnected!\n");
  42. mqtt_client_stop(cli);
  43. break;
  44. case MQTT_TYPE_CONNACK:
  45. printf("mqtt connack!\n");
  46. {
  47. const char* topic = (const char*)mqtt_client_get_userdata(cli);
  48. int mid = mqtt_client_subscribe(cli, topic, 2);
  49. printf("mqtt subscribe mid=%d\n", mid);
  50. }
  51. break;
  52. case MQTT_TYPE_SUBACK:
  53. printf("mqtt suback mid=%d\n", cli->mid);
  54. break;
  55. case MQTT_TYPE_PUBLISH:
  56. handle_message(cli, &cli->message);
  57. default:
  58. break;
  59. }
  60. }
  61. static int mqtt_subscribe(const char* host, int port, const char* topic) {
  62. mqtt_client_t* cli = mqtt_client_new(NULL);
  63. if (cli == NULL) return -1;
  64. // client_id
  65. char client_id[64];
  66. snprintf(client_id, sizeof(client_id), "mqtt_sub_%ld", hv_getpid());
  67. printf("client_id: %s\n", client_id);
  68. mqtt_client_set_id(cli, client_id);
  69. #if TEST_AUTH
  70. mqtt_client_set_auth(cli, "test", "123456");
  71. #endif
  72. mqtt_client_set_userdata(cli, (void*)topic);
  73. mqtt_client_set_callback(cli, on_mqtt);
  74. int ssl = 0;
  75. #if TEST_SSL
  76. ssl = 1;
  77. #endif
  78. mqtt_client_connect(cli, host, port, ssl);
  79. mqtt_client_run(cli);
  80. mqtt_client_free(cli);
  81. return 0;
  82. }
  83. int main(int argc, char** argv) {
  84. if (argc < 4) {
  85. printf("Usage: %s host port topic\n", argv[0]);
  86. return -10;
  87. }
  88. const char* host = argv[1];
  89. int port = atoi(argv[2]);
  90. const char* topic = argv[3];
  91. return mqtt_subscribe(host, port, topic);
  92. }