websocket_receiver.lua 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. --[[
  2. @module websocket_receiver
  3. @summary WebSocket client数据接收处理应用功能模块
  4. @version 1.0
  5. @date 2025.08.24
  6. @author 陈媛媛
  7. @usage
  8. 本文件为WebSocket client 数据接收应用功能模块,核心业务逻辑为:
  9. 处理接收到的数据,同时将数据发送给其他应用功能模块做进一步处理;
  10. 本文件的对外接口有2个:
  11. 1、websocket_receiver.proc(data, fin, opcode):数据处理入口,在websocket_main.lua中调用;
  12. 2、sys.publish("RECV_DATA_FROM_SERVER", "recv from websocket server: ", data):
  13. 将接收到的数据通过消息"RECV_DATA_FROM_SERVER"发布出去;
  14. 需要处理数据的应用功能模块订阅处理此消息即可,本demo项目中uart_app.lua中订阅处理了本消息;
  15. ]]
  16. local websocket_receiver = {}
  17. -- 接收数据缓冲区
  18. local recv_data_buff = ""
  19. --[[
  20. 处理接收到的数据
  21. @api websocket_receiver.proc(data, fin, opcode)
  22. @param1 data string
  23. 表示接收到的数据
  24. @param2 fin number
  25. 表示是否为最后一个数据包,1表示是最后一个,0表示还有后续
  26. @param3 opcode number
  27. 表示数据包类型,1-文本,2-二进制
  28. @return1 result nil
  29. @usage
  30. websocket_receiver.proc(data, fin, opcode)
  31. ]]
  32. function websocket_receiver.proc(data, fin, opcode)
  33. log.info("WebSocket接收处理", "收到数据", data, "是否结束", fin, "操作码", opcode)
  34. -- 接收到数据,通知网络环境检测看门狗功能模块进行喂狗
  35. sys.publish("FEED_NETWORK_WATCHDOG")
  36. -- 将数据拼接到缓冲区
  37. recv_data_buff = recv_data_buff .. data
  38. -- 如果收到完整消息(fin=1)并且缓冲区有数据,则处理
  39. if fin == 1 and #recv_data_buff > 0 then
  40. local processed_data = recv_data_buff
  41. recv_data_buff = "" -- 清空缓冲区
  42. -- 尝试解析JSON格式数据
  43. local json_data, result, errinfo = json.decode(processed_data)
  44. if result and type(json_data) == "table" then
  45. log.info("WebSocket接收处理", "收到JSON格式数据")
  46. -- 如果是JSON格式,提取有用信息
  47. if json_data.action == "echo" and json_data.msg then
  48. processed_data = json_data.msg
  49. log.info("WebSocket接收处理", "提取echo消息", processed_data)
  50. end
  51. -- 其他JSON格式数据处理逻辑可以在这里添加
  52. else
  53. log.info("WebSocket接收处理", "收到非JSON格式数据")
  54. end
  55. -- 将处理后的数据通过"RECV_DATA_FROM_SERVER"消息publish出去,给其他应用模块处理
  56. sys.publish("RECV_DATA_FROM_SERVER", "收到WebSocket服务器数据: ", processed_data)
  57. else
  58. log.info("WebSocket接收处理", "收到部分数据,等待后续数据包")
  59. end
  60. end
  61. return websocket_receiver