timer_app.lua 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. --[[
  2. @module timer_app
  3. @summary 定时器应用功能模块
  4. @version 1.0
  5. @date 2025.11.15
  6. @author 王世豪
  7. @usage
  8. 本文件为定时器应用功能模块,核心业务逻辑为:
  9. 创建一个5秒的循环定时器,每次产生一段数据,通知TCP或UDP server进行处理;
  10. 本文件的对外接口有一个:
  11. 1、sys.publish("SEND_DATA_REQ", "timer", data, ip, port, {func=send_data_cbfunc, para="timer"..data}),通过publish通知TCP或UDP server数据发送功能模块发送data数据;
  12. 数据发送结果通过执行回调函数send_data_cbfunc通知本功能模块;
  13. ]]
  14. local config = {
  15. enable_udp = true, -- 是否启用UDP发送
  16. enable_tcp = false -- 是否启用TCP发送
  17. }
  18. local data = 1
  19. local udp_server_receiver = require "udp_server_receiver"
  20. -- 数据发送结果回调函数
  21. -- result:发送结果,true为发送成功,false为发送失败
  22. -- para:回调参数,sys.publish("SEND_DATA_REQ", "timer", data, ip, port, {func=send_data_cbfunc, para="timer"..data})中携带的para
  23. local function send_data_cbfunc(result, para)
  24. log.info("send_data_cbfunc", result, para)
  25. -- 无论上一次发送成功还是失败,启动一个5秒的定时器,5秒后发送下次数据
  26. sys.timerStart(send_data_req_timer_cbfunc, 5000)
  27. end
  28. -- 定时器回调函数
  29. function send_data_req_timer_cbfunc()
  30. -- 发布消息"SEND_DATA_REQ"
  31. -- 携带的第一个参数"timer"表示是定时器应用模块发布的消息
  32. -- 携带的第二个参数data为要发送的原始数据
  33. -- 携带的第三个参数client_ip为目标IP地址
  34. -- 携带的第四个参数port为目标端口号
  35. -- 携带的第五个参数cb为发送结果回调(可以为空,如果为空,表示不关心TCP或UDP server发送数据成功还是失败),其中:
  36. -- cb.func为回调函数(可以为空,如果为空,表示不关心TCP或UDP server发送数据成功还是失败)
  37. -- cb.para为回调函数的第二个参数(可以为空),回调函数的第一个参数为发送结果(true表示成功,false表示失败)
  38. -- UDP发送处理
  39. if config.enable_udp then
  40. -- 获取客户端信息
  41. local client_info = udp_server_receiver.get_client_info()
  42. -- 检查是否有客户端IP和端口
  43. if client_info.ip and client_info.port then
  44. -- 使用记录的客户端信息发送
  45. sys.publish("SEND_DATA_REQ", "timer", data, client_info.ip, client_info.port, {func=send_data_cbfunc, para="udp_timer"..data})
  46. else
  47. -- 未收到过客户端数据,提示错误
  48. log.error("timer_app", "尚未收到客户端数据, 无法确定目标IP和端口")
  49. sys.timerStart(send_data_req_timer_cbfunc, 5000)
  50. end
  51. -- TCP发送处理
  52. elseif config.enable_tcp then
  53. -- 当前TCP server与client是一对一连接,publish的消息可忽略ip和port参数
  54. sys.publish("SEND_DATA_REQ", "timer", data, {func=send_data_cbfunc, para="tcp_timer"..data})
  55. end
  56. data = data + 1
  57. log.info("send_data_req_timer_cbfunc", data)
  58. end
  59. -- 启动一个5秒的单次定时器
  60. -- 时间到达后,执行一次send_data_req_timer_cbfunc函数
  61. sys.timerStart(send_data_req_timer_cbfunc, 5000)