main.lua 5.0 KB

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