Browse Source

update:websocket 剥离更多c函数

Dozingfiretruck 1 năm trước cách đây
mục cha
commit
2f01ae712f

+ 19 - 25
components/network/websocket/luat_lib_websocket.c

@@ -55,7 +55,7 @@ static luat_websocket_ctrl_t *get_websocket_ctrl(lua_State *L)
 	}
 }
 
-static int l_websocket_callback(lua_State *L, void *ptr)
+int l_websocket_callback(lua_State *L, void *ptr)
 {
 	(void)ptr;
 	rtos_msg_t *msg = (rtos_msg_t *)lua_topointer(L, -1);
@@ -76,9 +76,9 @@ static int l_websocket_callback(lua_State *L, void *ptr)
 	}
 	case WEBSOCKET_MSG_PUBLISH:
 	{
-		if (websocket_ctrl->websocket_cb)
+		if (websocket_ctrl->websocket_cb_id)
 		{
-			lua_geti(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_cb);
+			lua_geti(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_cb_id);
 			if (lua_isfunction(L, -1))
 			{
 				lua_geti(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_ref);
@@ -95,9 +95,9 @@ static int l_websocket_callback(lua_State *L, void *ptr)
 	}
 	case WEBSOCKET_MSG_CONNACK:
 	{
-		if (websocket_ctrl->websocket_cb)
+		if (websocket_ctrl->websocket_cb_id)
 		{
-			lua_geti(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_cb);
+			lua_geti(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_cb_id);
 			if (lua_isfunction(L, -1))
 			{
 				lua_geti(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_ref);
@@ -125,9 +125,9 @@ static int l_websocket_callback(lua_State *L, void *ptr)
 	}
 	case WEBSOCKET_MSG_SENT :
 	{
-		if (websocket_ctrl->websocket_cb)
+		if (websocket_ctrl->websocket_cb_id)
 		{
-			lua_geti(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_cb);
+			lua_geti(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_cb_id);
 			if (lua_isfunction(L, -1))
 			{
 				lua_geti(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_ref);
@@ -139,9 +139,9 @@ static int l_websocket_callback(lua_State *L, void *ptr)
 	}
 	case WEBSOCKET_MSG_DISCONNECT : 
 	{
-		if (websocket_ctrl->websocket_cb)
+		if (websocket_ctrl->websocket_cb_id)
 		{
-			lua_geti(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_cb);
+			lua_geti(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_cb_id);
 			if (lua_isfunction(L, -1))
 			{
 				lua_geti(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_ref);
@@ -161,11 +161,11 @@ static int l_websocket_callback(lua_State *L, void *ptr)
 	return 0;
 }
 
-int l_luat_websocket_msg_cb(luat_websocket_ctrl_t *ctrl, int arg1, int arg2)
+int l_luat_websocket_msg_cb(luat_websocket_ctrl_t *websocket_ctrl, int arg1, int arg2)
 {
 	rtos_msg_t msg = {
 		.handler = l_websocket_callback,
-		.ptr = ctrl,
+		.ptr = websocket_ctrl,
 		.arg1 = arg1,
 		.arg2 = arg2,
 	};
@@ -275,15 +275,15 @@ event的值有:
 static int l_websocket_on(lua_State *L)
 {
 	luat_websocket_ctrl_t *websocket_ctrl = get_websocket_ctrl(L);
-	if (websocket_ctrl->websocket_cb != 0)
+	if (websocket_ctrl->websocket_cb_id != 0)
 	{
-		luaL_unref(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_cb);
-		websocket_ctrl->websocket_cb = 0;
+		luaL_unref(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_cb_id);
+		websocket_ctrl->websocket_cb_id = 0;
 	}
 	if (lua_isfunction(L, 2))
 	{
 		lua_pushvalue(L, 2);
-		websocket_ctrl->websocket_cb = luaL_ref(L, LUA_REGISTRYINDEX);
+		websocket_ctrl->websocket_cb_id = luaL_ref(L, LUA_REGISTRYINDEX);
 	}
 	return 0;
 }
@@ -323,13 +323,7 @@ wsc:autoreconn(true)
 static int l_websocket_autoreconn(lua_State *L)
 {
 	luat_websocket_ctrl_t *websocket_ctrl = get_websocket_ctrl(L);
-	if (lua_isboolean(L, 2))
-	{
-		websocket_ctrl->reconnect = lua_toboolean(L, 2);
-	}
-	websocket_ctrl->reconnect_time = luaL_optinteger(L, 3, 3000);
-	if (websocket_ctrl->reconnect && websocket_ctrl->reconnect_time < 1000)
-		websocket_ctrl->reconnect_time = 1000;
+    luat_websocket_autoreconn(websocket_ctrl, lua_toboolean(L, 2),luaL_optinteger(L, 3, 3000));
 	return 0;
 }
 
@@ -404,10 +398,10 @@ static int l_websocket_close(lua_State *L)
 	luat_websocket_ctrl_t *websocket_ctrl = get_websocket_ctrl(L);
 	// websocket_disconnect(&(websocket_ctrl->broker));
 	luat_websocket_close_socket(websocket_ctrl);
-	if (websocket_ctrl->websocket_cb != 0)
+	if (websocket_ctrl->websocket_cb_id != 0)
 	{
-		luaL_unref(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_cb);
-		websocket_ctrl->websocket_cb = 0;
+		luaL_unref(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_cb_id);
+		websocket_ctrl->websocket_cb_id = 0;
 	}
 	luat_websocket_release_socket(websocket_ctrl);
 	return 0;

+ 43 - 8
components/network/websocket/luat_websocket.c

@@ -29,6 +29,8 @@ static void print_pkg(const char *tag, char *buff, luat_websocket_pkg_t *pkg)
 #define print_pkg(...)
 #endif
 
+static int32_t luat_websocket_callback(void *data, void *param);
+
 int luat_websocket_payload(char *buf, luat_websocket_pkg_t *pkg, size_t limit)
 {
 	uint32_t pkg_len = 0;
@@ -125,16 +127,41 @@ void luat_websocket_reconnect(luat_websocket_ctrl_t *websocket_ctrl) {
 	}
 }
 
+int luat_websocket_set_cb(luat_websocket_ctrl_t *websocket_ctrl, luat_websocket_cb_t websocket_cb){
+	if (websocket_ctrl == NULL || websocket_ctrl->netc == NULL)
+		return -1;
+	websocket_ctrl->websocket_cb = websocket_cb;
+	return 0;
+}
+
+#ifdef __LUATOS__
+int l_luat_websocket_msg_cb(luat_websocket_ctrl_t *websocket_ctrl, int arg1, int arg2);
+#endif
+static int luat_websocket_msg_cb(luat_websocket_ctrl_t *websocket_ctrl, int arg1, int arg2){
+#ifdef __LUATOS__
+    l_luat_websocket_msg_cb(websocket_ctrl,arg1,arg2);
+#else
+	if (websocket_ctrl->websocket_cb){
+		luat_websocket_cb_t websocket_cb = websocket_ctrl->websocket_cb;
+		websocket_cb(websocket_ctrl, arg1,arg2);
+	}else{
+        LLOGE("websocket need set cb\n");
+    }
+#endif
+	return 0;
+}
+
+
 LUAT_RT_RET_TYPE luat_websocket_timer_callback(LUAT_RT_CB_PARAM)
 {
 	luat_websocket_ctrl_t *websocket_ctrl = (luat_websocket_ctrl_t *)param;
-	l_luat_websocket_msg_cb(websocket_ctrl, WEBSOCKET_MSG_TIMER_PING, 0);
+	luat_websocket_msg_cb(websocket_ctrl, WEBSOCKET_MSG_TIMER_PING, 0);
 }
 
 static void reconnect_timer_cb(LUAT_RT_CB_PARAM)
 {
 	luat_websocket_ctrl_t *websocket_ctrl = (luat_websocket_ctrl_t *)param;
-	l_luat_websocket_msg_cb(websocket_ctrl, WEBSOCKET_MSG_RECONNECT, 0);
+	luat_websocket_msg_cb(websocket_ctrl, WEBSOCKET_MSG_RECONNECT, 0);
 }
 
 int luat_websocket_init(luat_websocket_ctrl_t *websocket_ctrl, int adapter_index)
@@ -159,6 +186,14 @@ int luat_websocket_init(luat_websocket_ctrl_t *websocket_ctrl, int adapter_index
 	return 0;
 }
 
+int luat_websocket_autoreconn(luat_websocket_ctrl_t *websocket_ctrl, uint8_t reconnect,uint32_t reconnect_time){
+    websocket_ctrl->reconnect = reconnect;
+    if (reconnect){
+        websocket_ctrl->reconnect_time = reconnect_time<1000?1000:reconnect_time;
+    }
+    return 0;
+}
+
 int luat_websocket_set_connopts(luat_websocket_ctrl_t *websocket_ctrl, luat_websocket_connopts_t* opts)
 {
 	int is_tls = 0;
@@ -272,7 +307,7 @@ void luat_websocket_close_socket(luat_websocket_ctrl_t *websocket_ctrl)
 	{
 		network_force_close_socket(websocket_ctrl->netc);
 	}
-	l_luat_websocket_msg_cb(websocket_ctrl, WEBSOCKET_MSG_DISCONNECT, 0);
+	luat_websocket_msg_cb(websocket_ctrl, WEBSOCKET_MSG_DISCONNECT, 0);
 	luat_stop_rtos_timer(websocket_ctrl->ping_timer);
 	websocket_ctrl->websocket_state = 0;
 	if (websocket_ctrl->reconnect) {
@@ -282,7 +317,7 @@ void luat_websocket_close_socket(luat_websocket_ctrl_t *websocket_ctrl)
 
 void luat_websocket_release_socket(luat_websocket_ctrl_t *websocket_ctrl)
 {
-	l_luat_websocket_msg_cb(websocket_ctrl, WEBSOCKET_MSG_RELEASE, 0);
+	luat_websocket_msg_cb(websocket_ctrl, WEBSOCKET_MSG_RELEASE, 0);
 	if (websocket_ctrl->ping_timer) {
 		luat_release_rtos_timer(websocket_ctrl->ping_timer);
     	websocket_ctrl->ping_timer = NULL;
@@ -421,7 +456,7 @@ static int websocket_parse(luat_websocket_ctrl_t *websocket_ctrl)
 				websocket_ctrl->websocket_state = 1;
 				luat_stop_rtos_timer(websocket_ctrl->ping_timer);
 				luat_start_rtos_timer(websocket_ctrl->ping_timer, 30000, 1);
-				l_luat_websocket_msg_cb(websocket_ctrl, WEBSOCKET_MSG_CONNACK, 0);
+				luat_websocket_msg_cb(websocket_ctrl, WEBSOCKET_MSG_CONNACK, 0);
 				return 1;
 			}
 		}
@@ -480,7 +515,7 @@ static int websocket_parse(luat_websocket_ctrl_t *websocket_ctrl)
 			return -1;
 		}
 		memcpy(buff, buf, pkg_len);
-		l_luat_websocket_msg_cb(websocket_ctrl, WEBSOCKET_MSG_PUBLISH, (int)buff);
+		luat_websocket_msg_cb(websocket_ctrl, WEBSOCKET_MSG_PUBLISH, (int)buff);
 	}
 
 	// 处理完成后, 如果还有数据, 移动数据, 继续处理
@@ -567,7 +602,7 @@ int luat_websocket_read_packet(luat_websocket_ctrl_t *websocket_ctrl)
 	return 0;
 }
 
-int32_t luat_websocket_callback(void *data, void *param)
+static int32_t luat_websocket_callback(void *data, void *param)
 {
 	OS_EVENT *event = (OS_EVENT *)data;
 	luat_websocket_ctrl_t *websocket_ctrl = (luat_websocket_ctrl_t *)param;
@@ -610,7 +645,7 @@ int32_t luat_websocket_callback(void *data, void *param)
 		luat_start_rtos_timer(websocket_ctrl->ping_timer, websocket_ctrl->keepalive * 1000, 1);
 		if (websocket_ctrl->frame_wait) {
 			websocket_ctrl->frame_wait --;
-			l_luat_websocket_msg_cb(websocket_ctrl, WEBSOCKET_MSG_SENT, 0);
+			luat_websocket_msg_cb(websocket_ctrl, WEBSOCKET_MSG_SENT, 0);
 		}
 	}
 	else if (event->ID == EV_NW_RESULT_CLOSE)

+ 8 - 3
components/network/websocket/luat_websocket.h

@@ -25,7 +25,8 @@ typedef struct
 	uint16_t remote_port; // 远程端口号
 	uint16_t buffer_offset; // 用于标识pkg_buff当前有多少数据
 	uint8_t pkg_buff[WEBSOCKET_RECV_BUF_LEN_MAX + 4];
-	int websocket_cb;		 // websocket lua回调函数
+	int websocket_cb_id;		 // websocket lua回调函数
+    void* websocket_cb;			/**< websocket 回调函数*/
 	uint32_t keepalive;		 // 心跳时长 单位s
 	uint8_t adapter_index;	 // 适配器索引号, 似乎并没有什么用
 	uint8_t websocket_state; // websocket状态
@@ -62,15 +63,19 @@ typedef struct luat_websocket_pkg
 #define WebSocket_OP_PING 0x9	  /* 1001 - ping frame */
 #define WebSocket_OP_PONG 0xA	  /* 1010 - pong frame */
 
+typedef void (*luat_websocket_cb_t)(luat_websocket_ctrl_t *websocket_ctrl, int arg1, int arg2);
+
 int luat_websocket_connect(luat_websocket_ctrl_t *websocket_ctrl);
-int l_luat_websocket_msg_cb(luat_websocket_ctrl_t *ctrl, int arg1, int arg2);
-int32_t luat_websocket_callback(void *data, void *param);
+int luat_websocket_set_cb(luat_websocket_ctrl_t *websocket_ctrl, luat_websocket_cb_t websocket_cb);
 int luat_websocket_send_packet(void *socket_info, const void *buf, unsigned int count);
 void luat_websocket_close_socket(luat_websocket_ctrl_t *websocket_ctrl);
 void luat_websocket_release_socket(luat_websocket_ctrl_t *websocket_ctrl);
 void luat_websocket_ping(luat_websocket_ctrl_t *websocket_ctrl);
 void luat_websocket_reconnect(luat_websocket_ctrl_t *websocket_ctrl);
 int luat_websocket_init(luat_websocket_ctrl_t *websocket_ctrl, int adapter_index);
+
+int luat_websocket_autoreconn(luat_websocket_ctrl_t *websocket_ctrl, uint8_t reconnect,uint32_t reconnect_time);
+
 int luat_websocket_set_connopts(luat_websocket_ctrl_t *websocket_ctrl, luat_websocket_connopts_t* opts);
 int luat_websocket_payload(char *buff, luat_websocket_pkg_t *pkg, size_t limit);
 int luat_websocket_send_frame(luat_websocket_ctrl_t *websocket_ctrl, luat_websocket_pkg_t *pkg);