main.lua 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "oneNET_demo"
  3. VERSION = "1.0.0"
  4. -- sys库是标配
  5. _G.sys = require("sys")
  6. --[[特别注意, 使用mqtt库需要下列语句]]
  7. _G.sysplus = require("sysplus")
  8. lbsLoc2 = require("lbsLoc2")
  9. local iotcloud = require("iotcloud")
  10. mobile.simid(2, true)
  11. -- Air780E的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
  12. if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
  13. pm.power(pm.PWK_MODE, false)
  14. end
  15. local produt_id = "4qM5N1Sa4T"
  16. local userid = "226691"
  17. local userkey = "pk1M3FKXBvvmjF8If/xDfSFFmr96NZCEg00sxlLBMjjh9vOD5hpIs42rmAYnMh5b3m9B1+0rmYdqzUyoQVrxow=="
  18. local device_name = mobile.imei()
  19. local send_data_time = 5 * 60 * 1000 -- 定时发送数据的时间,单位ms
  20. -- 统一联网函数
  21. sys.taskInit(function()
  22. local device_id = mcu.unique_id():toHex()
  23. -- 默认都等到联网成功
  24. sys.waitUntil("IP_READY")
  25. sys.publish("net_ready", device_id)
  26. end)
  27. sys.taskInit(function()
  28. -- 等待联网
  29. local ret, device_id = sys.waitUntil("net_ready")
  30. -------- 以下接入方式根据自己需要修改,相关参数修改为自己的 ---------
  31. -- ONENET云
  32. -- 动态注册
  33. iotcloudc = iotcloud.new(iotcloud.ONENET, {
  34. device_name = device_name,
  35. produt_id = produt_id,
  36. userid = userid,
  37. userkey = userkey
  38. })
  39. -- 一型一密
  40. -- iotcloudc = iotcloud.new(iotcloud.ONENET,{produt_id = "xxx",product_secret = "xxx"})
  41. -- 一机一密
  42. -- iotcloudc = iotcloud.new(iotcloud.ONENET,{produt_id = "xxx",device_name = "xxx",device_secret = "xxx"})
  43. if iotcloudc then
  44. iotcloudc:connect()
  45. end
  46. end)
  47. -- 发布和订阅的主题
  48. local oneNET_sub = "$sys/" .. produt_id .. "/" .. device_name .. "/thing/property/post/reply"
  49. local oneNET_pub = "$sys/" .. produt_id .. "/" .. device_name .. "/thing/property/post"
  50. local function oneNET_send_data()
  51. log.info("oneNET 链接成功,准备开始发送数据")
  52. while 1 do
  53. -- 没有mobile库就没有基站定位
  54. mobile.reqCellInfo(15)
  55. -- 由于基站定位需要等待扫描周围基站,推荐扫描时间为15S
  56. sys.waitUntil("CELL_INFO_UPDATE", 15000)
  57. local lat, lng, t = lbsLoc2.request(5000)
  58. log.info("lbsLoc2", lat, lng, (json.encode(t or {})))
  59. -- 如果没扫描到基站则给lat和lng赋值为0
  60. if lat and lng then
  61. log.info("扫描到了,有位置信息")
  62. else
  63. lat = "0"
  64. lng = "0"
  65. end
  66. -- 读取CPU温度, 单位为0.001摄氏度, 是内部温度, 非环境温度
  67. adc.open(adc.CH_CPU)
  68. local cpu_temp = adc.get(adc.CH_CPU)
  69. adc.close(adc.CH_CPU)
  70. local gpio_pin = 6 -- GPIO编号
  71. local gpio_state = gpio.get(gpio_pin)
  72. local send_data = {
  73. id = "123",
  74. verson = VERSION,
  75. params = {
  76. gpio_state = {
  77. value = gpio_state
  78. },
  79. cpu_temp = {
  80. value = cpu_temp / 1000
  81. },
  82. lbs_lat = {
  83. value = tonumber(lat)
  84. },
  85. lbs_lng = {
  86. value = tonumber(lng)
  87. -- value = lng
  88. }
  89. }
  90. }
  91. local send_data = json.encode(send_data)
  92. log.info("发送的数据为", send_data)
  93. -- 正式发布数据
  94. iotcloudc:publish(oneNET_pub, send_data)
  95. -- 循环发送数据的定时时间
  96. sys.wait(send_data_time)
  97. end
  98. end
  99. local con = 0
  100. --oneNET断开后的处理函数,
  101. local function oneNET_DISCONNECT()
  102. log.info("云平台断开了,隔一分钟重连一次,如果10次都没有连上则重启设备")
  103. while con < 10 do
  104. sys.wait(60*1000)
  105. log.info("oneNET reconnection",con)
  106. iotcloudc:connect()
  107. end
  108. pm.reboot()
  109. end
  110. sys.subscribe("iotcloud", function(cloudc, event, data, payload)
  111. -- 注意,此处不是协程内,复杂操作发消息给协程内进行处理
  112. if event == iotcloud.CONNECT then -- 云平台联上了
  113. log.info("iotcloud", "CONNECT", "oneNET平台连接成功")
  114. iotcloudc:subscribe({
  115. [oneNET_sub] = 1
  116. }) -- 订阅服务器下发数据的主题
  117. -- 链接成功,启动一个task专门用来定时发消息
  118. sys.taskInit(oneNET_send_data)
  119. elseif event == iotcloud.RECEIVE then
  120. log.info("收到服务器下发的数据")
  121. log.info("iotcloud", "topic", data, "payload", payload)
  122. -- 用户处理代码
  123. if payload then
  124. payload = json.decode(payload)
  125. if payload["code"] == 200 then
  126. log.info("服务器收到了刚刚上传的数据", payload["msg"])
  127. else
  128. log.info("服务器接收数据有误", "错误码为", payload["code"], "错误信息为",
  129. payload["msg"])
  130. end
  131. end
  132. elseif event == iotcloud.SEND then
  133. log.info("发送数据成功")
  134. elseif event == iotcloud.DISCONNECT then -- 云平台断开了
  135. sys.taskInit(oneNET_DISCONNECT)
  136. end
  137. end)
  138. -- 用户代码已结束---------------------------------------------
  139. -- 结尾总是这一句
  140. sys.run()
  141. -- sys.run()之后后面不要加任何语句!!!!!