tcp_ssl_main.lua 5.2 KB

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