Просмотр исходного кода

fix: mqtt库的重连回调应该通过msgbus机制转到luatos主线程执行,不应在timer回调内执行

Wendal Chen 3 лет назад
Родитель
Сommit
0c72a80cfc

+ 5 - 1
components/network/libemqtt/luat_lib_mqtt.c

@@ -34,7 +34,11 @@ static int32_t l_mqtt_callback(lua_State *L, void* ptr){
     luat_mqtt_ctrl_t *mqtt_ctrl =(luat_mqtt_ctrl_t *)msg->ptr;
     switch (msg->arg1) {
 		case MQTT_MSG_TIMER_PING : {
-			mqtt_ping(&(mqtt_ctrl->broker));
+			luat_mqtt_ping(mqtt_ctrl);
+			break;
+		}
+		case MQTT_MSG_RECONNECT : {
+			luat_mqtt_reconnect(mqtt_ctrl);
 			break;
 		}
 		case MQTT_MSG_PUBLISH : {

+ 4 - 0
components/network/libemqtt/luat_mqtt.h

@@ -3,6 +3,7 @@
 
 #define MQTT_MSG_RELEASE 0
 #define MQTT_MSG_TIMER_PING 2
+#define MQTT_MSG_RECONNECT  3
 
 #define MQTT_RECV_BUF_LEN_MAX 4096
 
@@ -60,4 +61,7 @@ void luat_mqtt_release_socket(luat_mqtt_ctrl_t *mqtt_ctrl);
 int luat_mqtt_init(luat_mqtt_ctrl_t *mqtt_ctrl, int adapter_index);
 int luat_mqtt_set_connopts(luat_mqtt_ctrl_t *mqtt_ctrl, luat_mqtt_connopts_t *opts);
 
+int luat_mqtt_reconnect(luat_mqtt_ctrl_t *mqtt_ctrl);
+int luat_mqtt_ping(luat_mqtt_ctrl_t *mqtt_ctrl);
+
 #endif

+ 16 - 4
components/network/libemqtt/luat_mqtt_client.c

@@ -23,8 +23,12 @@ LUAT_RT_RET_TYPE luat_mqtt_timer_callback(LUAT_RT_CB_PARAM){
     l_luat_mqtt_msg_cb(mqtt_ctrl, MQTT_MSG_TIMER_PING, 0);
 }
 
-static void reconnect_timer_cb(LUAT_RT_CB_PARAM){
+static LUAT_RT_RET_TYPE reconnect_timer_cb(LUAT_RT_CB_PARAM){
 	luat_mqtt_ctrl_t * mqtt_ctrl = (luat_mqtt_ctrl_t *)param;
+	l_luat_mqtt_msg_cb(mqtt_ctrl, MQTT_MSG_RECONNECT, 0);
+}
+
+int luat_mqtt_reconnect(luat_mqtt_ctrl_t *mqtt_ctrl) {
 	int ret = luat_mqtt_connect(mqtt_ctrl);
 	if(ret){
 		LLOGI("reconnect init socket ret=%d\n", ret);
@@ -32,6 +36,13 @@ static void reconnect_timer_cb(LUAT_RT_CB_PARAM){
 	}
 }
 
+
+
+int luat_mqtt_ping(luat_mqtt_ctrl_t *mqtt_ctrl) {
+	mqtt_ping(&mqtt_ctrl->broker);
+	return 0;
+}
+
 int luat_mqtt_init(luat_mqtt_ctrl_t *mqtt_ctrl, int adapter_index) {
 	memset(mqtt_ctrl, 0, sizeof(luat_mqtt_ctrl_t));
 	mqtt_ctrl->adapter_index = adapter_index;
@@ -60,9 +71,9 @@ int luat_mqtt_set_connopts(luat_mqtt_ctrl_t *mqtt_ctrl, luat_mqtt_connopts_t *op
 	if (opts->is_tls){
 		network_init_tls(mqtt_ctrl->netc, opts->client_cert?2:0);
 		if (opts->client_cert){
-			network_set_client_cert(mqtt_ctrl->netc, opts->client_cert, opts->client_cert_len,
-					opts->client_key, opts->client_key_len,
-					opts->client_password, opts->client_password_len);
+			network_set_client_cert(mqtt_ctrl->netc, (const unsigned char*)opts->client_cert, opts->client_cert_len,
+					(const unsigned char*)opts->client_key, opts->client_key_len,
+					(const unsigned char*)opts->client_password, opts->client_password_len);
 		}
 	} else {
 		network_deinit_tls(mqtt_ctrl->netc);
@@ -373,3 +384,4 @@ int luat_mqtt_connect(luat_mqtt_ctrl_t *mqtt_ctrl) {
     }
     return 0;
 }
+