multi_network.lua 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. local multi_network = {}
  2. dnsproxy = require("dnsproxy")
  3. dhcpsrv = require("dhcpsrv")
  4. httpplus = require("httpplus")
  5. local run_state = false
  6. local sta_state = false
  7. local wifi_net_state = "未打开"
  8. local ssid = "Air8000_"
  9. local password = "12345678"
  10. local number = 0
  11. local event = ""
  12. local LEDA = gpio.setup(146, 0, gpio.PULLUP)
  13. function handle_http_request(fd, method, uri, headers, body)
  14. log.info("httpsrv", method, uri, json.encode(headers), body)
  15. if uri == "/led/1" then
  16. LEDA(1)
  17. event = "绿灯已打开"
  18. return 200, {}, "ok"
  19. elseif uri == "/led/0" then
  20. LEDA(0)
  21. event = "绿灯已关闭"
  22. return 200, {}, "ok"
  23. elseif uri == "/scan/go" then
  24. event = "开始搜索WiFi"
  25. wlan.scan()
  26. return 200, {}, "ok"
  27. elseif uri == "/scan/list" then
  28. return 200, {["Content-Type"]="application/json"}, (json.encode({data=_G.scan_result, ok=true}))
  29. elseif uri == "/connect" then
  30. if method == "POST" and body and #body > 2 then
  31. local jdata = json.decode(body)
  32. if jdata and jdata.ssid then
  33. event = "开始链接目标WiFi 路由器"
  34. sys.timerStart(wlan.connect, 500, jdata.ssid, jdata.passwd)
  35. return 200, {}, "ok"
  36. end
  37. end
  38. return 400, {}, "ok"
  39. elseif uri == "/connok" then
  40. log.info("connok", json.encode({ip=socket.localIP(2)}))
  41. return 200, {["Content-Type"]="application/json"}, json.encode({ip=socket.localIP(2)})
  42. end
  43. return 404, {}, "Not Found" .. uri
  44. end
  45. function wifi_networking()
  46. sys.wait(3000)
  47. httpsrv.start(80, handle_http_request, socket.LWIP_AP)
  48. log.info("web", "pls open url http://192.168.4.1/")
  49. end
  50. function scan_done_handle()
  51. local result = wlan.scanResult()
  52. _G.scan_result = {}
  53. for k, v in pairs(result) do
  54. log.info("scan", (v["ssid"] and #v["ssid"] > 0) and v["ssid"] or "[隐藏SSID]", v["rssi"], (v["bssid"]:toHex()))
  55. if v["ssid"] and #v["ssid"] > 0 then
  56. table.insert(_G.scan_result, v["ssid"])
  57. end
  58. end
  59. log.info("scan", "aplist", json.encode(_G.scan_result))
  60. event = "搜索热点完成,共搜到" .. #_G.scan_result .. "个,请选择热点,并输入密码后连接"
  61. end
  62. -------------------------------------------------------------------------------
  63. -- 配置网络共享(STA到ETH)
  64. function setup_network_sharing()
  65. log.info("配置网络共享")
  66. -- 配置以太网的IP
  67. netdrv.ipv4(socket.LWIP_ETH, "192.168.2.1", "255.255.255.0", "0.0.0.0")
  68. sys.wait(1000)
  69. -- 获取以太网网络状态,连接后返回 true,否则返回 false,如果不存在就返回 nil。
  70. while netdrv.ready(socket.LWIP_ETH) ~= true do
  71. log.info("netdrv", "等待以太网就绪") -- 若以太网设备没有连上,可打开此处注释排查。
  72. sys.wait(10000)
  73. end
  74. -- 启用以太网的DHCP服务
  75. dhcpsrv.create({adapter=socket.LWIP_ETH, gw={192,168,2,1}})
  76. -- 设置DNS代理,将以太网流量通过STA转发
  77. dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_STA)
  78. log.info("netdrv", "以太网就绪")
  79. -- 等待网络就绪
  80. while 1 do
  81. if netdrv.ready(socket.LWIP_STA) then
  82. log.info("设置NAPT")
  83. netdrv.napt(socket.LWIP_STA)
  84. break
  85. end
  86. sys.wait(1000)
  87. end
  88. event = "网络共享配置完成"
  89. log.info("网络共享配置完成")
  90. return true
  91. end
  92. -- 以太网初始化
  93. function init_eth()
  94. log.info("初始化以太网")
  95. -- 打开CH390供电
  96. gpio.setup(140, 1, gpio.PULLUP)
  97. sys.wait(100)
  98. -- 配置SPI和初始化网络驱动
  99. local result = spi.setup(
  100. 1,--spi id
  101. nil,
  102. 0,--CPHA
  103. 0,--CPOL
  104. 8,--数据宽度
  105. 51200000--波特率
  106. )
  107. log.info("main", "open spi", result)
  108. if result ~= 0 then
  109. log.info("main", "spi open error", result)
  110. return false
  111. end
  112. local success = netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=1, cs=12, irq=255})
  113. if not success then
  114. log.error("以太网初始化失败")
  115. return false
  116. end
  117. log.info("以太网初始化完成")
  118. return true
  119. end
  120. local function start_muti_network()
  121. local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_STA,timeout=5000,debug=false}).wait()
  122. -- 注意使用不同的网络出口,可以设置不同的适配器,比如你想通过sta 方式上网就填入adapter=socket.LWIP_STA,如果使用4G 则填入adapter=socket.LWIP_GP
  123. log.info("http执行结果", code, headers, body and #body)
  124. if code == 200 then
  125. wifi_net_state = "STA 连接成功,http 通过STA 上网测试成功"
  126. end
  127. if not init_eth() then
  128. log.error("以太网初始化失败,退出")
  129. return
  130. end
  131. setup_network_sharing()
  132. end
  133. -------------------------------------------------------------------------------
  134. local function start_ap()
  135. wifi_net_state = "创建AP 热点中,通过AP 热点配置 STA 网络"
  136. wifi_networking() -- 创建网页服务,可以根据此服务进行配网
  137. log.info("start_sta")
  138. ssid = ssid .. wlan.getMac()
  139. wlan.createAP(ssid, password)
  140. netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
  141. while netdrv.ready(socket.LWIP_AP) ~= true do
  142. sys.wait(100)
  143. end
  144. -- sys.wait(5000)
  145. dhcpsrv.create({adapter=socket.LWIP_AP})
  146. wifi_net_state = "创建AP 热点完成"
  147. event = "请连接热点后,打开192.168.4.1网页"
  148. end
  149. local function start_sta()
  150. wlan.init()
  151. start_ap()
  152. sys.wait(100)
  153. sys.subscribe("WLAN_SCAN_DONE", scan_done_handle)
  154. sys.subscribe("IP_READY", ip_ready_handle)
  155. end
  156. local function stop_sta()
  157. wlan.stopAP()
  158. end
  159. sys.subscribe("WLAN_AP_INC", function(evt, data)
  160. if evt == "CONNECTED" then
  161. event = "配置工具连接成功,请打开192.168.4.1"
  162. elseif evt == "DISCONNECTED" then
  163. event = "配置工具断开"
  164. end
  165. log.info("收到AP事件", evt, data and data:toHex())
  166. end)
  167. sys.subscribe("WLAN_STA_INC", function(evt, data)
  168. if evt == "CONNECTED" then
  169. event = "连接成功,连接的SSID 是:" .. data
  170. wifi_net_state = "STA 连接成功"
  171. sysplus.taskInitEx(start_muti_network,"start_muti_network")
  172. elseif evt == "DISCONNECTED" then
  173. event = "断开了,断开的原因是:" .. data
  174. end
  175. log.info("收到STA事件", evt, data )
  176. end)
  177. function multi_network.run()
  178. log.info("multi_network.run")
  179. lcd.setFont(lcd.font_opposansm12_chinese) -- 具体取值可参考api文档的常量表
  180. run_state = true
  181. while true do
  182. sys.wait(10)
  183. -- airlink.statistics()
  184. lcd.clear(_G.bkcolor)
  185. lcd.drawStr(0,80,"WIFI STA状态:"..wifi_net_state )
  186. if sta_state then
  187. lcd.drawStr(0,100,"WIFI ssid:" .. ssid )
  188. lcd.drawStr(0,120,"WIFI password:" .. password )
  189. lcd.drawStr(0,150, event)
  190. end
  191. lcd.showImage(20,360,"/luadb/back.jpg")
  192. if sta_state then
  193. lcd.showImage(130,370,"/luadb/stop.jpg")
  194. else
  195. lcd.showImage(130,370,"/luadb/start.jpg")
  196. end
  197. lcd.showImage(0,448,"/luadb/Lbottom.jpg")
  198. lcd.flush()
  199. if not run_state then -- 等待结束
  200. return true
  201. end
  202. end
  203. end
  204. local function start_sta_task()
  205. sta_state = true
  206. start_sta()
  207. end
  208. local function stop_sta_task()
  209. wlan.disconnect()
  210. sta_state = false
  211. end
  212. function multi_network.start_sta()
  213. start_sta()
  214. end
  215. function multi_network.tp_handal(x,y,event) -- 判断是否需要停止播放
  216. if x > 20 and x < 100 and y > 360 and y < 440 then
  217. run_state = false
  218. elseif x > 130 and x < 230 and y > 370 and y < 417 then
  219. if sta_state then
  220. sysplus.taskInitEx(stop_sta_task, "stop_sta_task")
  221. else
  222. sysplus.taskInitEx(start_sta_task , "start_sta_task")
  223. end
  224. end
  225. end
  226. return multi_network