main.lua 5.1 KB

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