tcp_client_main.lua 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. --[[
  2. @module tcp_client_main
  3. @summary tcp client socket主应用功能模块
  4. @version 1.0
  5. @date 2025.07.01
  6. @author 朱天华
  7. @usage
  8. 本文件为tcp client socket主应用功能模块,核心业务逻辑为:
  9. 1、创建一个tcp client socket,连接server;
  10. 2、处理连接异常,出现异常后执行重连动作;
  11. 3、调用tcp_client_receiver和tcp_client_sender中的外部接口,进行数据收发处理;
  12. 本文件没有对外接口,直接在main.lua中require "tcp_client_main"就可以加载运行;
  13. ]]
  14. local libnet = require "libnet"
  15. -- 加载tcp client socket数据接收功能模块
  16. local tcp_client_receiver = require "tcp_client_receiver"
  17. -- 加载tcp client socket数据发送功能模块
  18. local tcp_client_sender = require "tcp_client_sender"
  19. -- 电脑访问:https://netlab.luatos.com/
  20. -- 点击 打开TCP 按钮,会创建一个TCP server
  21. -- 将server的地址和端口赋值给下面这两个变量
  22. local SERVER_ADDR = "112.125.89.8"
  23. local SERVER_PORT = 42089
  24. -- tcp_client_main的任务名
  25. local TASK_NAME = tcp_client_sender.TASK_NAME
  26. -- 处理未识别的消息
  27. local function tcp_client_main_cbfunc(msg)
  28. log.info("tcp_client_main_cbfunc", msg[1], msg[2], msg[3], msg[4])
  29. end
  30. -- tcp client socket的任务处理函数
  31. local function tcp_client_main_task_func()
  32. local socket_client
  33. local result, para1, para2
  34. while true do
  35. -- 如果WIFI还没有连接成功,一直在这里循环等待
  36. while not socket.adapter(socket.LWIP_STA) do
  37. log.warn("tcp_client_main_task_func", "wait IP_READY")
  38. -- 在此处阻塞等待WIFI连接成功的消息"IP_READY"
  39. -- 或者等待30秒超时退出阻塞等待状态
  40. sys.waitUntil("IP_READY", 30000)
  41. end
  42. -- 检测到了IP_READY消息
  43. log.info("tcp_client_main_task_func", "recv IP_READY")
  44. -- 创建socket client对象
  45. socket_client = socket.create(socket.LWIP_STA, TASK_NAME)
  46. -- 如果创建socket client对象失败
  47. if not socket_client then
  48. log.error("tcp_client_main_task_func", "socket.create error")
  49. goto EXCEPTION_PROC
  50. end
  51. -- 配置socket client对象为tcp client
  52. result = socket.config(socket_client)
  53. -- 如果配置失败
  54. if not result then
  55. log.error("tcp_client_main_task_func", "socket.config error")
  56. goto EXCEPTION_PROC
  57. end
  58. -- 连接server
  59. result = libnet.connect(TASK_NAME, 15000, socket_client, SERVER_ADDR, SERVER_PORT)
  60. -- 如果连接server失败
  61. if not result then
  62. log.error("tcp_client_main_task_func", "libnet.connect error")
  63. goto EXCEPTION_PROC
  64. end
  65. log.info("tcp_client_main_task_func", "libnet.connect success")
  66. -- 数据收发以及网络连接异常事件总处理逻辑
  67. while true do
  68. -- 数据接收处理(接收处理必须写在libnet.wait之前,因为老版本的内核固件要求必须这样,新版本的内核固件没这个要求,为了不出问题,写在libnet.wait之前就行了)
  69. -- 如果处理失败,则退出循环
  70. if not tcp_client_receiver.proc(socket_client) then
  71. log.error("tcp_client_main_task_func", "tcp_client_receiver.proc error")
  72. break
  73. end
  74. -- 数据发送处理
  75. -- 如果处理失败,则退出循环
  76. if not tcp_client_sender.proc(TASK_NAME, socket_client) then
  77. log.error("tcp_client_main_task_func", "tcp_client_sender.proc error")
  78. break
  79. end
  80. -- 阻塞等待socket.EVENT事件或者15秒钟超时
  81. -- 以下三种业务逻辑会发布事件:
  82. -- 1、socket client和server之间的连接出现异常(例如server主动断开,网络环境出现异常等),此时在内核固件中会发布事件socket.EVENT
  83. -- 2、socket client接收到server发送过来的数据,此时在内核固件中会发布事件socket.EVENT
  84. -- 3、socket client需要发送数据到server, 在tcp_client_sender.lua中会发布事件socket.EVENT
  85. result, para1, para2 = libnet.wait(TASK_NAME, 15000, socket_client)
  86. log.info("tcp_client_main_task_func", "libnet.wait", result, para1, para2)
  87. -- 如果连接异常,则退出循环
  88. if not result then
  89. log.warn("tcp_client_main_task_func", "connection exception")
  90. break
  91. end
  92. end
  93. -- 出现异常
  94. ::EXCEPTION_PROC::
  95. -- 数据发送应用模块对来不及发送的数据做清空和通知失败处理
  96. tcp_client_sender.exception_proc()
  97. -- 如果存在socket client对象
  98. if socket_client then
  99. -- 关闭socket client连接
  100. libnet.close(TASK_NAME, 5000, socket_client)
  101. -- 释放socket client对象
  102. socket.release(socket_client)
  103. socket_client = nil
  104. end
  105. -- 5秒后跳转到循环体开始位置,自动发起重连
  106. sys.wait(5000)
  107. end
  108. end
  109. --创建并且启动一个task
  110. --运行这个task的主函数tcp_client_main_task_func
  111. sysplus.taskInitEx(tcp_client_main_task_func, TASK_NAME, tcp_client_main_cbfunc)