Jelajahi Sumber

add: websocket库添加sent/disconnect事件 https://gitee.com/openLuat/LuatOS/issues/I6QCSX

Wendal Chen 3 tahun lalu
induk
melakukan
cdd7ec3bd7

+ 43 - 2
components/network/websocket/luat_lib_websocket.c

@@ -124,6 +124,34 @@ static int32_t l_websocket_callback(lua_State *L, void *ptr)
 		}
 		break;
 	}
+	case WEBSOCKET_MSG_SENT :
+	{
+		if (websocket_ctrl->websocket_cb)
+		{
+			lua_geti(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_cb);
+			if (lua_isfunction(L, -1))
+			{
+				lua_geti(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_ref);
+				lua_pushstring(L, "sent");
+				lua_call(L, 2, 0);
+			}
+		}
+		break;
+	}
+	case WEBSOCKET_MSG_DISCONNECT : 
+	{
+		if (websocket_ctrl->websocket_cb)
+		{
+			lua_geti(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_cb);
+			if (lua_isfunction(L, -1))
+			{
+				lua_geti(L, LUA_REGISTRYINDEX, websocket_ctrl->websocket_ref);
+				lua_pushstring(L, "disconnect");
+				lua_call(L, 2, 0);
+			}
+		}
+		break;
+	}
 	default:
 	{
 		LLOGD("l_websocket_callback error arg1:%d", msg->arg1);
@@ -226,9 +254,18 @@ static int l_websocket_create(lua_State *L)
 @return nil 无返回值
 @usage
 wsc:on(function(websocket_client, event, data, payload)
-	-- 用户自定义代码
-	log.info("websocket", "event", event, websocket_client, data, payload)
+	-- 打印各种事件
+	log.info("websocket", "event", event, data, payload)
 end)
+--[[
+event的值有:
+	conack 连接服务器成功,已经收到websocket协议头部信息,通信已建立
+	recv   收到服务器下发的信息, data, payload 不为nil
+	sent   send函数发送的消息,服务器在TCP协议层已确认收到
+	disconnect 服务器连接已断开
+
+其中 sent/disconnect 事件在 2023.04.01 新增
+]]
 */
 static int l_websocket_on(lua_State *L)
 {
@@ -334,7 +371,11 @@ static int l_websocket_send(lua_State *L)
 		lua_pushboolean(L, 0);
 		return 1;
 	}
+	websocket_ctrl->frame_wait ++;
 	ret = luat_websocket_send_frame(websocket_ctrl, &pkg);
+	if (ret < 1) {
+		websocket_ctrl->frame_wait --;// 发送失败
+	}
 	lua_pushboolean(L, ret == 0 ? 1 : 0);
 	return 1;
 }

+ 5 - 0
components/network/websocket/luat_websocket.c

@@ -267,6 +267,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_stop_rtos_timer(websocket_ctrl->ping_timer);
 	websocket_ctrl->websocket_state = 0;
 	if (websocket_ctrl->reconnect) {
@@ -583,6 +584,10 @@ int32_t luat_websocket_callback(void *data, void *param)
 	{
 		luat_stop_rtos_timer(websocket_ctrl->ping_timer);
 		luat_start_rtos_timer(websocket_ctrl->ping_timer, websocket_ctrl->keepalive * 1000 * 0.75, 1);
+		if (websocket_ctrl->frame_wait) {
+			websocket_ctrl->frame_wait --;
+			l_luat_websocket_msg_cb(websocket_ctrl, WEBSOCKET_MSG_SENT, 0);
+		}
 	}
 	else if (event->ID == EV_NW_RESULT_CLOSE)
 	{

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

@@ -8,6 +8,8 @@ enum
 	WEBSOCKET_MSG_TIMER_PING = 2,
 	WEBSOCKET_MSG_CONNACK = 3,
 	WEBSOCKET_MSG_RECONNECT = 4,
+	WEBSOCKET_MSG_SENT = 5,
+	WEBSOCKET_MSG_DISCONNECT = 6
 };
 
 #define WEBSOCKET_RECV_BUF_LEN_MAX 4096
@@ -33,6 +35,7 @@ typedef struct
 	void *ping_timer;		 // websocket_ping定时器
 	int websocket_ref;		 // 强制引用自身避免被GC
 	char* headers;
+	int frame_wait;
 } luat_websocket_ctrl_t;
 
 typedef struct luat_websocket_connopts