RyanMqttPubTest.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #include "RyanMqttTest.h"
  2. static int32_t pubTestPublishedEventCount = 0;
  3. static int32_t pubTestDataEventCount = 0;
  4. static char *pubStr = NULL;
  5. static int32_t pubStrLen = 0;
  6. static void RyanMqttPublishEventHandle(void *pclient, RyanMqttEventId_e event, const void *eventData)
  7. {
  8. switch (event)
  9. {
  10. case RyanMqttEventPublished:
  11. {
  12. RyanMqttMsgHandler_t *msgHandler = ((RyanMqttAckHandler_t *)eventData)->msgHandler;
  13. rlog_w("qos1 / qos2发送成功事件回调 topic: %s, qos: %d", msgHandler->topic, msgHandler->qos);
  14. pubTestPublishedEventCount++;
  15. break;
  16. }
  17. case RyanMqttEventData:
  18. {
  19. RyanMqttMsgData_t *msgData = (RyanMqttMsgData_t *)eventData;
  20. // rlog_i("接收到mqtt消息事件回调 topic: %.*s, packetId: %d, payload len: %d, qos: %d",
  21. // msgData->topicLen, msgData->topic, msgData->packetId, msgData->payloadLen, msgData->qos);
  22. if (0 == strncmp(msgData->payload, pubStr, pubStrLen))
  23. pubTestDataEventCount++;
  24. else
  25. rlog_e("pub测试收到数据不一致 %.*s", msgData->payloadLen, msgData->payload);
  26. break;
  27. }
  28. default:
  29. mqttEventBaseHandle(pclient, event, eventData);
  30. break;
  31. }
  32. }
  33. static RyanMqttError_e RyanMqttPublishTest(RyanMqttQos_e qos, int32_t count, uint32_t delayms)
  34. {
  35. RyanMqttError_e result = RyanMqttSuccessError;
  36. RyanMqttClient_t *client;
  37. time_t timeStampNow = 0;
  38. RyanMqttInitSync(&client, RyanMqttTrue, RyanMqttPublishEventHandle);
  39. RyanMqttSubscribe(client, "testlinux/pub", qos);
  40. delay(100);
  41. time(&timeStampNow);
  42. pubStr = (char *)malloc(2048);
  43. memset(pubStr, 0, 2048);
  44. srand(timeStampNow);
  45. // NOLINTNEXTLINE(concurrency-mt-unsafe)
  46. for (int32_t i = 0; i < rand() % 250 + 1 + 100; i++)
  47. {
  48. // NOLINTNEXTLINE(concurrency-mt-unsafe)
  49. snprintf(pubStr + 4 * i, 2048 - 4 * i, "%04d", rand());
  50. }
  51. pubStrLen = (int32_t)strlen(pubStr);
  52. pubTestPublishedEventCount = 0;
  53. pubTestDataEventCount = 0;
  54. for (int32_t i = 0; i < count; i++)
  55. {
  56. RyanMqttError_e pubResult = RyanMqttPublish(client, "testlinux/pub", pubStr, pubStrLen, qos, RyanMqttFalse);
  57. if (RyanMqttSuccessError != pubResult)
  58. {
  59. rlog_e("QOS发布错误 Qos: %d, result: %d", qos, pubResult);
  60. result = RyanMqttFailedError;
  61. goto __exit;
  62. }
  63. if (delayms)
  64. delay(delayms);
  65. }
  66. for (int32_t i = 0;; i++)
  67. {
  68. if (RyanMqttQos0 == qos)
  69. {
  70. if (count == pubTestDataEventCount)
  71. break;
  72. }
  73. else if (pubTestPublishedEventCount == count && pubTestPublishedEventCount == pubTestDataEventCount)
  74. break;
  75. if (i > 300)
  76. {
  77. rlog_e("QOS测试失败 Qos: %d, PublishedEventCount: %d, dataEventCount: %d", qos, pubTestPublishedEventCount, pubTestDataEventCount);
  78. result = RyanMqttFailedError;
  79. goto __exit;
  80. }
  81. delay(100);
  82. }
  83. RyanMqttUnSubscribe(client, "testlinux/pub");
  84. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == checkAckList(client), RyanMqttFailedError, rlog_e, { goto __exit; });
  85. __exit:
  86. free(pubStr);
  87. pubStr = NULL;
  88. rlog_i("mqtt 发布测试,销毁mqtt客户端");
  89. RyanMqttDestorySync(client);
  90. return result;
  91. }
  92. RyanMqttError_e RyanMqttPubTest()
  93. {
  94. RyanMqttError_e result = RyanMqttSuccessError;
  95. // 发布 & 订阅 qos 测试
  96. result = RyanMqttPublishTest(RyanMqttQos0, 1000, 0);
  97. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, rlog_e, { goto __exit; });
  98. checkMemory;
  99. result = RyanMqttPublishTest(RyanMqttQos1, 1000, 2);
  100. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, rlog_e, { goto __exit; });
  101. checkMemory;
  102. result = RyanMqttPublishTest(RyanMqttQos2, 1000, 5);
  103. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, rlog_e, { goto __exit; });
  104. checkMemory;
  105. return RyanMqttSuccessError;
  106. __exit:
  107. return RyanMqttFailedError;
  108. }