This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LAUNCHXL-CC3235SF:MQTT 发布功能挂起

Guru**** 2353700 points
Other Parts Discussed in Thread: CC3235SF
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1452318/launchxl-cc3235sf-mqtt-publish-function-hangs

器件型号:LAUNCHXL-CC3235SF
Thread 中讨论的其他器件:CC3235SF

工具与软件:

你(们)好  

我们使用最新的 SDK 并运行 MQTT 客户端示例、这在通过按钮触发发布功能时看起来非常好。

为了检查稳定性、我们使用3秒周期 计时器来触发发布 功能、发布 功能有时(随机)挂起而 不返回、应用程序会接收"mqtt_event_Server_disconnect"事件。 我们想知道 MQTT 库是否存在任何限制。 我们还上传补丁供您参考。

--- C:\ti\simplelink_cc32xx_sdk_7_10_00_13\examples\rtos\CC3235SF_LAUNCHXL\demos\mqtt_client\mqtt_client_app.c
+++ C:\Users\97111701\workspace_v12_2_3\mqtt_client_CC3235SF_LAUNCHXL_tirtos7_ticlang\mqtt_client_app.c
@@ -112,7 +112,7 @@
 
 #ifndef MQTT_SECURE_CLIENT
 #define MQTT_CONNECTION_FLAGS           MQTTCLIENT_NETCONN_URL
-#define MQTT_CONNECTION_ADDRESS         "broker.hivemq.com" //"mqtt.eclipse.org"
+#define MQTT_CONNECTION_ADDRESS         "192.168.0.101"//"test.mosquitto.org"//"172.16.120.28"//"broker.hivemq.com" //"mqtt.eclipse.org"
 #define MQTT_CONNECTION_PORT_NUMBER     1883
 #else
 #define MQTT_CONNECTION_FLAGS           MQTTCLIENT_NETCONN_IP4 | MQTTCLIENT_NETCONN_SEC
@@ -134,6 +134,8 @@
 /* If ClientId isn't set, the MAC address of the device will be copied into  */
 /* the ClientID parameter.                                                   */
 char ClientId[13] = "clientId123";
+
+timer_t g_timer;
 
 enum{
     APP_MQTT_PUBLISH,
@@ -377,11 +379,11 @@
     if(ret < 0){
         LOG_ERROR("msg queue send error %d", ret);
     }
-    queueElement.event = APP_OTA_TRIGGER;
-    ret = mq_send(appQueue, (const char*)&queueElement, sizeof(struct msgQueue), 0);
-    if(ret < 0){
-        LOG_ERROR("msg queue send error %d", ret);
-    }
+//    queueElement.event = APP_OTA_TRIGGER;
+//    ret = mq_send(appQueue, (const char*)&queueElement, sizeof(struct msgQueue), 0);
+//    if(ret < 0){
+//        LOG_ERROR("msg queue send error %d", ret);
+//    }
 }
 
 void pushButtonConnectionHandler(uint_least8_t index)
@@ -715,6 +717,39 @@
     }
 }
 
+
+
+void TimerPeriodicIntHandler(sigval val)
+{
+    int ret;
+    struct msgQueue queueElement;
+
+    queueElement.event = APP_MQTT_PUBLISH;
+    ret = mq_send(appQueue, (const char*)&queueElement, sizeof(struct msgQueue), 0);
+    if(ret < 0){
+        LOG_ERROR("msg queue send error %d", ret);
+    }
+}
+
+void MqttTimerPubStart()
+{
+    struct itimerspec value;
+    sigevent sev;
+
+    /* Create Timer                                                          */
+    sev.sigev_notify = SIGEV_SIGNAL;
+    sev.sigev_notify_function = &TimerPeriodicIntHandler;
+    timer_create(CLOCK_MONOTONIC, &sev, &g_timer);
+
+    /* start timer                                                           */
+    value.it_interval.tv_sec = 3;
+    value.it_interval.tv_nsec = 0;//100 * 1000000;
+    value.it_value.tv_sec = 3;
+    value.it_value.tv_nsec = 0;//100 * 1000000;
+
+    timer_settime(g_timer, 0, &value, NULL);
+}
+
 void mainThread(void * args)
 {
     int32_t ret;
@@ -812,7 +847,7 @@
     /* Loop attempt to establish AP Connection */
     while(conn_Failure != 0)
     {
-        conn_Failure = SlNetConn_start(SLNETCONN_SERVICE_LVL_INTERNET, SlNetConnEventHandler, SLNETCONN_TIMEOUT, 0);
+        conn_Failure = SlNetConn_start(SLNETCONN_SERVICE_LVL_IP, SlNetConnEventHandler, SLNETCONN_TIMEOUT, 0);
         LOG_INFO("failed to Connect to AP: Error Code: %d. Retrying...",conn_Failure);
     }
 
@@ -847,7 +882,7 @@
     }
 
     do {
-        ret = SlNetConn_waitForConnection(SLNETCONN_SERVICE_LVL_INTERNET, SLNETCONN_TIMEOUT);
+        ret = SlNetConn_waitForConnection(SLNETCONN_SERVICE_LVL_IP, SLNETCONN_TIMEOUT);
     } while(ret != 0);
     LOG_INFO("Wi-Fi connection is UP");
 
@@ -863,6 +898,9 @@
         LOG_INFO("MQTT connection is UP");
 
         GPIO_enableInt(CONFIG_GPIO_BUTTON_0);
+
+        /* Start Timer to PUBLISH */
+        MqttTimerPubStart();
 
         while(1){
 

 

环境:本地网络(无互联网)。

            Mosquitto 代理 <->AP <-> CC3235SFLP

软件: simplelink_cc32xx_sdk_7_10_00_13 , ccs 12.2.

硬件:CC3235SF LP

谢谢。

BR

Trevor

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我知道没有限制。

    根据经验,这些经纪人有时是由于负载(特别是在非安全模式)。

    我会再次检查的方法是使用第二个 LP、并将其设置到 MQTT 服务器(代理)中、然后在本地进行测试。

    此致、

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     Shlomi、您好!  

    感谢您的建议、当我们获得 sencod LP 时、我们将尝试使用两个 LP 进行测试

    关于 mqtt_if_Publish()未返回、您有什么错误处理建议吗?

    谢谢。

    BR

    Trevor

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    很遗憾、我没有看到任何在内部打开的调试消息。

    我可能会首先在 wifi_settings.h 中打开 Wi-Fi 层调试

    它将 WIFI_IF_DEBUG_LEVEL 设置为 E_INFO、这意味着 会打印任何 E_INFO 及以上的消息。

    也许可以尝试将其设置为较低级别的 E_trace、重新编译、链接并查看是否收到更有意义的消息。

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     Shlomi、您好!  

    我们尝试将 mqtt_if_ClientParams 的 blockingSend 标志修改为 false 并监控该问题、通常 我们会   在 mqtt_if_Publish ()之后立即收到 mqtt_event_PUBACK 、但有时大约60秒后会收到 mqtt_event_PUBACK 事件、这可能是导致 mqtt_if_Publish ()不返回的原因。 (blockingSend flag = true)、  

    在这种情况下、MQTT 客户端库可能无法向 borker 发送 ping 请求、超时后、 客户端将收到 mqtt_event_server_disconnect 事件、我们想知道如何处理这种情况  、如果我们再次调用 mqtt_if_Publish ()、它将返回-5 (mqtt_packet_ERR_PKT_AVL)、是否有任何建议?

    谢谢

    BR

    Trevor

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    根据代码、 blockingSend 标志仅指实际连接和订阅操作、而不是发布。 将其更改为 false 将使用回调而不是信号、但如果订阅问题存在于阻塞模式、非阻塞模式也会发生。  同样,这与发布无关,只订阅,所以它是不相关的。

    正如我所说的,我确实看到了在线免费经纪人的问题,当服务下降. 这就是为什么我建议使用第二个 LP 来模拟服务器的原因。 您是否有机会对其进行测试?

    如果你坚持起诉在线经纪人,最好看到一个空气嗅探器,如果可能的话。

    Shlomi