main.lua 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. -- main.lua文件
  2. -- LuaTools需要PROJECT和VERSION这两个信息
  3. PROJECT = "lan_tcp"
  4. VERSION = "1.0.0"
  5. log.info("main", PROJECT, VERSION)
  6. local taskName = "TCP_TASK" -- sysplus库用到的任务名称,也作为任务id
  7. dhcps = require "dhcpsrv"
  8. dnsproxy = require "dnsproxy"
  9. if wdt then
  10. --添加硬狗防止程序卡死,在支持的设备上启用这个功能
  11. wdt.init(9000)--初始化watchdog设置为9s
  12. sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
  13. end
  14. local uartid = 1 -- 根据实际设备选取不同的uartid
  15. local uart_rx_buff = zbuff.create(1024) -- 串口接收到的数据
  16. local libnet = require "libnet" -- libnet库,支持tcp、udp协议所用的同步阻塞接口
  17. local ip = "192.168.4.100" -- 连接tcp服务器的ip地址
  18. local port = 777 -- 连接tcp服务器的端口
  19. local netCB = nil -- socket服务的回调函数
  20. local connect_state = false -- 连接状态 true:已连接 false:未连接
  21. local protocol = false -- 通讯协议 true:UDP协议 false:TCP协议
  22. local ssl = false -- 加密传输 true:加密 false:不加密
  23. local tx_buff = zbuff.create(1024) -- 发送至tcp服务器的数据
  24. local rx_buff = zbuff.create(1024) -- 从tcp服务器接收到的数据
  25. --初始化
  26. uart.setup(
  27. uartid,--串口id
  28. 115200,--波特率
  29. 8,--数据位
  30. 1--停止位
  31. )
  32. sys.taskInit(function ()
  33. sys.wait(500)
  34. log.info("ch390", "打开LDO供电")
  35. gpio.setup(140, 1, gpio.PULLUP) --打开ch390供电
  36. sys.wait(3000)
  37. local result = spi.setup(
  38. 1,--spi_id
  39. nil,
  40. 0,--CPHA
  41. 0,--CPOL
  42. 8,--数据宽度
  43. 25600000--,--频率
  44. -- spi.MSB,--高低位顺序 可选,默认高位在前
  45. -- spi.master,--主模式 可选,默认主
  46. -- spi.full--全双工 可选,默认全双工
  47. )
  48. log.info("main", "open",result)
  49. if result ~= 0 then--返回值为0,表示打开成功
  50. log.info("main", "spi open error",result)
  51. return
  52. end
  53. -- 初始化指定netdrv设备,
  54. -- socket.LWIP_ETH 网络适配器编号
  55. -- netdrv.CH390外挂CH390
  56. -- SPI ID 1, 片选 GPIO12
  57. netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=1,cs=12})
  58. sys.wait(3000)
  59. local ipv4,mark, gw = netdrv.ipv4(socket.LWIP_ETH, "192.168.4.1", "255.255.255.0", "192.168.4.1")
  60. log.info("ipv4", ipv4,mark, gw)
  61. while netdrv.link(socket.LWIP_ETH) ~= true do
  62. sys.wait(100)
  63. end
  64. while netdrv.link(socket.LWIP_GP) ~= true do
  65. sys.wait(100)
  66. end
  67. sys.wait(2000)
  68. dhcps.create({adapter=socket.LWIP_ETH})
  69. dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_GP)
  70. netdrv.napt(socket.LWIP_GP)
  71. if iperf then
  72. log.info("启动iperf服务器端")
  73. iperf.server(socket.LWIP_ETH)
  74. end
  75. end)
  76. function TCP_TASK()
  77. sys.waitUntil("IP_READY") -- 等待联网成功
  78. -- 打印一下连接的目标ip和端口号
  79. log.info("connect ip: ", ip, "port:", port)
  80. netCB = socket.create(socket.LWIP_ETH, taskName) -- 创建socket对象
  81. socket.debug(netCB, true) -- 打开调试日志
  82. socket.config(netCB, nil, protocol, ssl) -- 此配置为TCP连接,无SSL加密
  83. -- 收取数据会触发回调, 这里的"receive" 是固定值不要修改。
  84. uart.on(uartid, "receive", function(id, len)
  85. while true do
  86. local len = uart.rx(id, uart_rx_buff) -- 接收串口收到的数据,并赋值到uart_rx_buff
  87. if len <= 0 then -- 接收到的字节长度为0 则退出
  88. break
  89. end
  90. -- 如果已经在线了,则发送socket.EVENT消息来打断任务里的阻塞等待状态,让任务循环继续
  91. if connect_state then
  92. sys_send(taskName, socket.EVENT, 0)
  93. end
  94. end
  95. end)
  96. -- 串口和TCP服务器的交互逻辑
  97. while true do
  98. -- 连接服务器,返回是否连接成功
  99. result = libnet.connect(taskName, 15000, netCB, ip, port)
  100. -- 如果连接成功,则改变连接状态参数,并且随便发一条数据到服务器,看服务器能不能收到
  101. if result then
  102. connect_state = true
  103. libnet.tx(taskName, 0, netCB, "TCP CONNECT")
  104. end
  105. -- 连接上服务器后,等待处理接收服务器下行至模块的数据 和 发送串口的数据到服务器
  106. while result do
  107. succ, param, _, _ = socket.rx(netCB, rx_buff) -- 接收数据
  108. if not succ then
  109. log.info("服务器断开了", succ, param, ip, port)
  110. break
  111. end
  112. if rx_buff:used() > 0 then
  113. log.info("收到服务器数据,长度", rx_buff:used())
  114. uart.tx(uartid, rx_buff) -- 从服务器收到的数据转发 从串口输出
  115. rx_buff:del()
  116. end
  117. tx_buff:copy(nil, uart_rx_buff) -- 将串口数据赋值给tcp待发送数据的buff中
  118. uart_rx_buff:del() -- 清除串口buff的数据长度
  119. if tx_buff:used() > 0 then
  120. log.info("发送到服务器数据,长度", tx_buff:used())
  121. local result = libnet.tx(taskName, 0, netCB, tx_buff) -- 发送数据
  122. if not result then
  123. log.info("发送失败了", result, param)
  124. break
  125. end
  126. end
  127. tx_buff:del()
  128. -- 如果zbuff对象长度超出,需要重新分配下空间
  129. if uart_rx_buff:len() > 1024 then
  130. uart_rx_buff:resize(1024)
  131. end
  132. if tx_buff:len() > 1024 then
  133. tx_buff:resize(1024)
  134. end
  135. if rx_buff:len() > 1024 then
  136. rx_buff:resize(1024)
  137. end
  138. log.info(rtos.meminfo("sys")) -- 打印系统内存
  139. -- 阻塞等待新的消息到来,比如服务器下发,串口接收到数据
  140. result, param = libnet.wait(taskName, 15000, netCB)
  141. if not result then
  142. log.info("服务器断开了", result, param)
  143. break
  144. end
  145. end
  146. -- 服务器断开后的行动,由于while true的影响,所以会再次重新执行进行 重新连接。
  147. connect_state = false
  148. libnet.close(d1Name, 5000, netCB)
  149. tx_buff:clear(0)
  150. rx_buff:clear(0)
  151. sys.wait(1000)
  152. end
  153. end
  154. -- libnet库依赖于sysplus,所以只能通过sysplus.taskInitEx创建的任务函数中运行
  155. sysplus.taskInitEx(TCP_TASK, taskName, netCB)
  156. -- 用户代码已结束---------------------------------------------
  157. -- 结尾总是这一句
  158. sys.run()
  159. -- sys.run()之后后面不要加任何语句!!!!!