main.lua 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. --[[
  2. demo说明:
  3. 1. 演示wifi联网操作
  4. 2. 演示长连接操作
  5. 3. 演示简易的网络状态灯
  6. ]]
  7. -- LuaTools需要PROJECT和VERSION这两个信息
  8. PROJECT = "modbus2relay"
  9. VERSION = "1.0.0"
  10. -- 引入必要的库文件(lua编写), 内部库不需要require
  11. sys = require("sys")
  12. log.info("main", "simple modbus relay demo")
  13. -- //////////////////////////////////////////////////////////////////////////////////////
  14. -- wifi 相关的代码
  15. if wlan ~= nil then
  16. log.info("mac", wlan.get_mac())
  17. local ssid = "uiot"
  18. local password = "12345678"
  19. -- 方式1 直接连接, 简单快捷
  20. --wlan.connect(ssid, password) -- 直接连
  21. -- 方式2 先扫描,再连接. 例如根据rssi(信号强度)的不同, 择优选择ssid
  22. sys.taskInit(function()
  23. wlan.scan()
  24. sys.waitUntil("WLAN_SCAN_DONE", 30000)
  25. local re = wlan.scan_get_info()
  26. log.info("wlan", "scan done", #re)
  27. for i in ipairs(re) do
  28. log.info("wlan", "info", re[i].ssid, re[i].rssi)
  29. end
  30. log.info("wlan", "try connect to wifi")
  31. wlan.connect(ssid, password)
  32. sys.waitUntil("WLAN_READY", 15000)
  33. log.info("wifi", "self ip", socket.ip())
  34. end)
  35. -- 方法3 airkiss配网, 可参考 app/playit/main.lua
  36. end
  37. -- airkiss.auto(27) -- 预留的功能,未完成
  38. -- //////////////////////////////////////////////////////////////////////////////////////
  39. --- 从这里开始, 代码与具体网络无关
  40. -- 联网后自动同步时间
  41. sys.subscribe("NET_READY", function ()
  42. log.info("net", "!!! network ready event !!! send ntp")
  43. sys.taskInit(function()
  44. sys.wait(2000)
  45. socket.ntpSync()
  46. end)
  47. end)
  48. _G.net_link = nil
  49. -- 串口1准备一下
  50. uart.setup(1, 115200)
  51. uart.on(1, "receive", function(id, len)
  52. local data = uart.read(id, len)
  53. log.info("uart", data:toHex())
  54. local s = _G.net_link
  55. if s ~= nil then
  56. s:send(data)
  57. end
  58. --sys.publish("net_send", data)
  59. end)
  60. -- 设置好GPIO的初始化状态
  61. gpio.setup(21, 0)
  62. gpio.setup(22, 0)
  63. gpio.setup(23, 0)
  64. _G.use_netled = 1 -- 启用1, 关闭0
  65. sys.taskInit(function()
  66. while 1 do
  67. --log.info("wlan", "ready?", wlan.ready())
  68. if socket.isReady() then
  69. --log.info("netled", "net ready, slow")
  70. gpio.set(21, 1 * use_netled)
  71. sys.wait(1900)
  72. gpio.set(21, 0)
  73. sys.wait(100)
  74. else
  75. --log.info("netled", "net not ready, fast")
  76. gpio.set(21, 1 * use_netled)
  77. sys.wait(100)
  78. gpio.set(21, 0)
  79. sys.wait(100)
  80. end
  81. end
  82. end)
  83. function net_recv(id, re, s)
  84. local hex = re:toHex()
  85. log.info("recv", id, hex, #re, re)
  86. uart.write(1, re)
  87. if #re > 7 then
  88. local addr,opt,index,val = string.unpack(">bbHH", re)
  89. log.info("modbus", addr,opt,index,val)
  90. if addr == 3 and opt == 6 then
  91. if index == 1 then
  92. gpio.set(22, 0)
  93. elseif index == 2 then
  94. gpio.set(22, 1)
  95. elseif index == 3 then
  96. _G.use_netled = val
  97. end
  98. s:send(re) -- 原样返回
  99. else
  100. s:send(string.char(0))
  101. end
  102. end
  103. end
  104. sys.taskInit(function()
  105. -- 等待联网成功
  106. while true do
  107. while not socket.isReady() do
  108. log.info("net", "wait for network ready")
  109. sys.waitUntil("NET_READY", 3000)
  110. end
  111. log.info("main", "socket loop")
  112. collectgarbage("collect")
  113. local s = socket.tcp()
  114. s:host("modbus.git4.cn") -- 改成服务器ip或者域名
  115. s:port(19001) -- 改成服务器端口
  116. s:on("connect", function(id, re)
  117. -- 连接成功后, 发注册包 {imei:"AABBCCDDEEFF",csq:-66}
  118. log.info("netc", "connect result", re)
  119. if re then
  120. local jdata = json.encode({imei=wlan.get_mac(),csq=wlan.rssi()})
  121. log.info("netc", "send reg", jdata)
  122. s:send(jdata)
  123. _G.net_link = s
  124. end
  125. end)
  126. s:on("recv", function(id, re)
  127. if #re > 0 then
  128. net_recv(id, re, s)
  129. end
  130. end)
  131. --log.info("netc", "info", s)
  132. -- 启动tcp独立线程(系统级的)
  133. if s:start() == 0 then
  134. -- 启动成功后, 连接中断时必然有NETC_END_XX事件
  135. -- 因为是长连接, 就这样等着就差不多了
  136. local tcount = 0
  137. while s:closed() == 0 do
  138. sys.waitUntil("NETC_END_" .. s:id(), 3000)
  139. -- 定时发个心跳什么的
  140. tcount = tcount + 1
  141. if tcount == 20 then
  142. log.info("netc", "heartbeat ping")
  143. s:send(string.char(0))
  144. tcount = 0
  145. end
  146. end
  147. else
  148. log.info("netc", "netc start fail!!")
  149. end
  150. -- 一定要清理好, 不然内存泄漏, 模块内存少啊!!!
  151. _G.net_link = nil
  152. s:clean()
  153. collectgarbage("collect")
  154. log.info("tcp", "link is broken, sleep 2s before retry")
  155. sys.wait(2000) -- 没连上, 或者断开了? 等2秒重试
  156. end
  157. end)
  158. -- 用户代码已结束---------------------------------------------
  159. -- 结尾总是这一句
  160. sys.run()
  161. -- sys.run()之后后面不要加任何语句!!!!!