udp_client_receiver.lua 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. --[[
  2. @module udp_client_receiver
  3. @summary udp client socket数据接收应用功能模块
  4. @version 1.0
  5. @date 2025.07.01
  6. @author 朱天华
  7. @usage
  8. 本文件为udp client socket数据接收应用功能模块,核心业务逻辑为:
  9. 从内核读取接收到的数据,然后将数据发送给其他应用功能模块做进一步处理;
  10. 本文件的对外接口有2个:
  11. 1、udp_client_receiver.proc(socket_client):数据接收应用逻辑处理入口,在udp_client_main.lua中调用;
  12. 2、sys.publish("RECV_DATA_FROM_SERVER", "recv from udp server: ", data):
  13. 将接收到的数据通过消息"RECV_DATA_FROM_SERVER"发布出去;
  14. 需要处理数据的应用功能模块订阅处理此消息即可,本demo项目中uart_app.lua中订阅处理了本消息;
  15. ]]
  16. local udp_client_receiver = {}
  17. -- socket数据接收缓冲区
  18. local recv_buff = nil
  19. -- 数据接收应用入口函数
  20. function udp_client_receiver.proc(socket_client)
  21. -- 如果socket数据接收缓冲区还没有申请过空间,则先申请内存空间
  22. if recv_buff==nil then
  23. recv_buff = zbuff.create(1024)
  24. -- 当recv_buff不再使用时,不需要主动调用recv_buff:free()去释放
  25. -- 因为Lua的垃圾处理器会自动释放recv_buff所申请的内存空间
  26. -- 如果等不及垃圾处理器自动处理,在确定以后不会再使用recv_buff时,则可以主动调用recv_buff:free()释放内存空间
  27. end
  28. -- 循环从内核的缓冲区读取接收到的数据
  29. -- 如果读取失败,返回false,退出
  30. -- 如果读取成功,处理数据,并且继续循环读取
  31. -- 如果读取成功,并且读出来的数据为空,表示已经没有数据可读,返回true,退出
  32. while true do
  33. -- 从内核的缓冲区中读取数据到recv_buff中
  34. -- 如果recv_buff的存储空间不足,会自动扩容
  35. local result = socket.rx(socket_client, recv_buff)
  36. -- 读取数据失败
  37. -- 有两种情况:
  38. -- 1、recv_buff扩容失败
  39. -- 2、socket client和server之间的连接断开
  40. if not result then
  41. log.error("udp_client_receiver.proc", "socket.rx error")
  42. return false
  43. end
  44. -- 如果读取到了数据, used()就必然大于0, 进行处理
  45. if recv_buff:used() > 0 then
  46. log.info("udp_client_receiver.proc", "recv data len", recv_buff:used())
  47. -- 读取socket数据接收缓冲区中的数据,赋值给data
  48. local data = recv_buff:query()
  49. -- 将数据data通过"RECV_DATA_FROM_SERVER"消息publish出去,给其他应用模块处理
  50. sys.publish("RECV_DATA_FROM_SERVER", "recv from udp server: ", data)
  51. -- 清空socket数据接收缓冲区中的数据
  52. recv_buff:del()
  53. -- 读取成功,但是读出来的数据为空,表示已经没有数据可读,可以退出循环了
  54. else
  55. break
  56. end
  57. end
  58. return true
  59. end
  60. return udp_client_receiver