main.lua 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "scdemo"
  3. VERSION = "1.0.0"
  4. log.info("main", PROJECT, VERSION)
  5. -- 一定要添加sys.lua !!!!
  6. sys = require("sys")
  7. _G.sysplus = require("sysplus")
  8. local taskName = "UDP_TASK" -- sysplus库用到的任务名称,也作为任务id
  9. if wdt then
  10. --添加硬狗防止程序卡死,在支持的设备上启用这个功能
  11. wdt.init(9000)--初始化watchdog设置为9s
  12. sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
  13. end
  14. local uart_rx_buff = zbuff.create(1024) -- 串口接收到的数据
  15. ----------------------------网络配置---------------------------
  16. local libnet = require "libnet" -- libnet库,支持tcp、udp协议所用的同步阻塞接口
  17. local ip = "112.125.89.8" -- 连接UDP服务器的ip地址
  18. local port = 46139 -- 连接UDP服务器的端口
  19. local connect_state = false -- 连接状态 true:已连接 false:未连接
  20. local protocol = true -- 通讯协议 true:UDP协议 false:TCP协议
  21. local ssl = false -- 加密传输 true:加密 false:不加密
  22. local tx_buff = zbuff.create(1024) -- 发送至UDP服务器的数据
  23. local rx_buff = zbuff.create(1024) -- 从UDP服务器接收到的数据
  24. --==============================================================
  25. --Uart初始化
  26. local uartid = 1 -- 根据实际设备选取不同的uartid
  27. uart.setup(
  28. uartid,--串口id
  29. 115200,--波特率
  30. 8,--数据位
  31. 1--停止位
  32. )
  33. local function tcp_client_main_cbfunc(msg)
  34. log.info("tcp_client_main_cbfunc", msg[1], msg[2], msg[3], msg[4])
  35. end
  36. function UDP_TASK()
  37. -- 打印一下连接的目标ip和端口号
  38. log.info("connect ip: ", ip, "port:", port)
  39. sys.waitUntil("IP_READY") -- 等待联网成功
  40. local socket_client
  41. -- 串口和UDP服务器的交互逻辑
  42. while true do
  43. socket_client = socket.create(nil, taskName) -- 创建socket对象
  44. socket.debug(socket_client, true) -- 打开调试日志
  45. socket.config(socket_client, nil, protocol, ssl) -- 此配置为UDP连接,无SSL加密
  46. -- 连接服务器,返回是否连接成功
  47. local result = libnet.connect(taskName, 15000, socket_client, ip, port)
  48. -----查询网络状态
  49. local status = mobile.status()
  50. log.info("status", status)
  51. -- 收取数据会触发回调, 这里的"receive" 是固定值不要修改。
  52. log.info("connect ip: 等待连接 ",result)
  53. uart.on(uartid, "receive", function(id, len)
  54. while true do
  55. local len = uart.rx(id, uart_rx_buff) -- 接收串口收到的数据,并赋值到uart_rx_buff
  56. if len <= 0 then -- 接收到的字节长度为0 则退出
  57. break
  58. end
  59. -- 如果已经在线了,则发送socket.EVENT消息来打断任务里的阻塞等待状态,让任务循环继续
  60. if connect_state then
  61. sys_send(taskName, socket.EVENT, 0)
  62. end
  63. end
  64. end)
  65. -- 如果连接成功,则改变连接状态参数,并且随便发一条数据到服务器,看服务器能不能收到
  66. if result then
  67. log.info("connect ip: 连接成功")
  68. connect_state = true
  69. libnet.tx(taskName, 0, socket_client, "UDP CONNECT")
  70. end
  71. -- 连接上服务器后,等待处理接收服务器下行至模块的数据 和 发送串口的数据到服务器
  72. while result do
  73. succ, param, _, _ = socket.rx(socket_client, rx_buff) -- 接收数据
  74. if not succ then
  75. log.info("服务器断开了", succ, param, ip, port)
  76. break
  77. end
  78. if rx_buff:used() > 0 then
  79. log.info("收到服务器数据,长度", rx_buff:used())
  80. uart.tx(uartid, rx_buff) -- 从服务器收到的数据转发 从串口输出
  81. rx_buff:del()
  82. end
  83. tx_buff:copy(nil, uart_rx_buff) -- 将串口数据赋值给UDP待发送数据的buff中
  84. uart_rx_buff:del() -- 清除串口buff的数据长度
  85. if tx_buff:used() > 0 then
  86. log.info("发送到服务器数据,长度", tx_buff:used())
  87. local result = libnet.tx(taskName, 0, socket_client, tx_buff) -- 发送数据
  88. if not result then
  89. log.info("发送失败了", result, param)
  90. break
  91. end
  92. end
  93. tx_buff:del()
  94. -- 如果zbuff对象长度超出,需要重新分配下空间
  95. if uart_rx_buff:len() > 1024 then
  96. uart_rx_buff:resize(1024)
  97. end
  98. if tx_buff:len() > 1024 then
  99. tx_buff:resize(1024)
  100. end
  101. if rx_buff:len() > 1024 then
  102. rx_buff:resize(1024)
  103. end
  104. log.info(rtos.meminfo("sys")) -- 打印系统内存
  105. -- 阻塞等待新的消息到来,比如服务器下发,串口接收到数据
  106. result, param = libnet.wait(taskName, 15000, socket_client)
  107. if not result then
  108. log.info("服务器断开了", result, param)
  109. break
  110. end
  111. end
  112. -- 服务器断开后的行动,由于while true的影响,所以会再次重新执行进行 重新连接。
  113. connect_state = false
  114. libnet.close(taskName, 5000, socket_client)
  115. socket.release(netc)
  116. tx_buff:clear(0)
  117. rx_buff:clear(0)
  118. socket_client=nil
  119. sys.wait(1000)
  120. end
  121. end
  122. -- libnet库依赖于sysplus,所以只能通过sysplus.taskInitEx创建的任务函数中运行
  123. sysplus.taskInitEx(UDP_TASK, taskName, tcp_client_main_cbfunc)
  124. -- 用户代码已结束---------------------------------------------
  125. -- 结尾总是这一句
  126. sys.run()
  127. -- sys.run()之后后面不要加任何语句!!!!!