main.lua 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. local sys = require("sys")
  2. -- 项目信息,预留
  3. PROJECT = "playit" -- W600 on LuatOS
  4. VERSION = "1.0.0"
  5. PRODUCT_KEY = "1234567890"
  6. -- 日志TAG, 非必须
  7. local TAG = "main"
  8. local last_temp_data = "0"
  9. sys.subscribe("WLAN_READY", function ()
  10. print("!!! wlan ready event !!!")
  11. -- 马上进行时间同步
  12. socket.ntpSync()
  13. end)
  14. ----------------------------------------------------------------------
  15. -- 对接SSD1306, 当前显示一行就好了
  16. function display_str(str)
  17. disp.clear()
  18. disp.drawStr(str, 1, 18)
  19. disp.update()
  20. end
  21. function ui_update()
  22. disp.clear()
  23. disp.drawStr(os.date(), 1, 12)
  24. disp.drawStr("Temp: " .. last_temp_data, 1, 24)
  25. disp.drawStr("rssi: " .. tostring(wlan.rssi()), 1, 36)
  26. disp.update()
  27. end
  28. -- 初始化显示屏
  29. log.info(TAG, "init ssd1306")
  30. disp.init("ssd1306")
  31. display_str("Booting ...")
  32. -- 配网回调
  33. sys.subscribe("WLAN_PW_RE", function(ssid, password)
  34. if ssid then
  35. log.info(TAG, "airkiss GOT", ssid, password)
  36. local conf = {ssid=ssid,password=password}
  37. local jdata = json.encode(conf)
  38. if jdata ~= nil then
  39. log.info(TAG, "save to conf.json", jdata)
  40. local f = io.open("/conf.json", "w")
  41. f:write(jdata)
  42. f:close()
  43. end
  44. else
  45. log.info(TAG, "airkiss fail")
  46. end
  47. end)
  48. -- wifi连接的回调, 这时候还没获取ip, socket不可用
  49. sys.subscribe("WLAN_STA_CONNECTED", function(re)
  50. if re == 1 then
  51. log.info(TAG, "wifi connect ok, wait for ip")
  52. display_str("Connect wifi OK")
  53. else
  54. log.info(TAG, "wifi connect fail")
  55. display_str("Connect wifi FAIL")
  56. end
  57. end)
  58. -- wifi就绪,已获取ip, socket可用
  59. sys.subscribe("WLAN_READY", function(re)
  60. log.info(TAG, "wifi is ready, ip ready")
  61. display_str("wifi is ready")
  62. end)
  63. -- 联网主流程
  64. sys.taskInit(function()
  65. wlan.setMode("wlan0", wlan.STATION)
  66. -- 看看有没有配网信息, 保存在config.json里面
  67. local f = io.open("/conf.json")
  68. log.info(TAG, "conf.json", f)
  69. if f ~= nil then
  70. log.info(TAG, "reading config.json")
  71. local str = f:read()
  72. f:close()
  73. log.info(TAG, "config.json", str)
  74. local conf,result,errinfo = json.decode(str)
  75. log.info(TAG, "config.json", conf, result, errinfo)
  76. if result then
  77. local ssid = conf["ssid"]
  78. local password = conf["password"]
  79. log.info(TAG, "wifi info in config.json", ssid, password)
  80. if ssid then
  81. display_str("Connecting to " .. ssid)
  82. wlan.connect(ssid, password)
  83. return
  84. else
  85. log.info(TAG, "no ssid in config.json")
  86. end
  87. else
  88. log.info(TAG, "config.json NOT JSON", errinfo)
  89. end
  90. else
  91. log.info(TAG, "/config.json not exist")
  92. end
  93. -- 没有配网信息, 开始airkiss配网
  94. while not wlan.ready() do
  95. log.info(TAG, "begin airkiss ...")
  96. display_str("begin airkiss ...")
  97. wlan.airkiss_start()
  98. sys.waitUntil("WLAN_PW_RE", 180*1000)
  99. sys.wait(5000)
  100. end
  101. end)
  102. -- sys.timerLoopStart(function()
  103. -- last_temp_data = (sensor.ds18b20(28) or "0")
  104. -- log.info("ds18b20", "TEMP: ", last_temp_data, os.date())
  105. -- if wlan.ready() then
  106. -- --display_str("Temp: " .. last_temp .. " rssi:" .. tostring(wlan.rssi()))
  107. -- ui_update()
  108. -- end
  109. -- end, 1000)
  110. -- 业务流程, 联网后定时发送温度数据到服务器
  111. sys.taskInit(function()
  112. local mac = "AABBCCDDEEFF"
  113. while 1 do
  114. log.info("main", "what happen?")
  115. if wlan.ready() then
  116. log.info("main", "wait 1000ms")
  117. sys.wait(1000)
  118. --log.info("ds18b20", "start to read ds18b20 ...")
  119. local t = {"GET /api/w60x/report/ds18b20?mac=", mac, "&temp=", last_temp_data, " HTTP/1.0\r\n",
  120. "Host: site0.cn\r\n",
  121. "User-Agent: LuatOS/0.1.0\r\n",
  122. "\r\n"}
  123. --local data = table.concat(t)
  124. --print(data)
  125. -- TODO: 改成socket/netc对象
  126. --socket.tsend("site0.cn", 80, table.concat(t))
  127. log.info("main", "create netc ...")
  128. local netc = socket.tcp()
  129. local connect_topic = "NETC_connect_" .. tostring(netc:id())
  130. local close_topic = "NETC_END_" .. tostring(netc:id())
  131. netc:host("site0.cn")
  132. netc:port(80)
  133. netc:on("connect", function(id, re)
  134. if re then
  135. sys.publish(connect_topic)
  136. end
  137. end)
  138. netc:on("recv", function(id, data)
  139. log.info("uplink.recv", id, data)
  140. end)
  141. netc:connect()
  142. sys.waitUntil(connect_topic, 5*1000)
  143. netc:send(table.concat(t))
  144. sys.waitUntil(close_topic, 5*1000)
  145. netc:clean()
  146. --log.info("network", "tsend complete, sleep 5s")
  147. sys.wait(3000)
  148. else
  149. log.warn("main", "wlan is not ready yet")
  150. sys.waitUntil("WLAN_READY", 30000)
  151. end
  152. end
  153. end)
  154. -- TODO: 用户按钮(PB7), 用于清除配网信息,重新airkiss
  155. -- TODO: 联网更新脚本和底层(也许)
  156. -- 主循环, 必须加
  157. sys.run()