onenet.lua 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. --- 模块功能:onenet studio功能测试.
  2. -- @module onenet
  3. -- @author Dozingfiretruck
  4. -- @license MIT
  5. -- @copyright OpenLuat.com
  6. -- @release 2021.4.7
  7. module(...,package.seeall)
  8. require "ntp"
  9. require "pm"
  10. require "misc"
  11. require "mqtt"
  12. require "utils"
  13. require "patch"
  14. require "socket"
  15. require "http"
  16. require "common"
  17. -- 产品ID和产品动态注册秘钥
  18. local ProductId = "vh8xhj9sxz"
  19. local ProductSecret = "t7Ojq/VBDQO3r8l5nQXXPZdzZQ3JCY8riZMj87vX96c="
  20. local onenet_mqttClient
  21. --[[
  22. 函数名:getDeviceName
  23. 功能 :获取设备名称
  24. 参数 :无
  25. 返回值:设备名称
  26. ]]
  27. local function getDeviceName()
  28. --默认使用设备的IMEI作为设备名称,用户可以根据项目需求自行修改
  29. return misc.getImei()
  30. --用户单体测试时,可以在此处直接返回阿里云的iot控制台上注册的设备名称,例如return "862991419835241"
  31. --return "862991419835241"
  32. end
  33. function onenet_publish()
  34. --sys.publish("APP_SOCKET_SEND_DATA")
  35. --mqtt发布主题根据自己需要修改
  36. local publish_data =
  37. {
  38. id = "123",
  39. version = "1.0",
  40. params = {},
  41. }
  42. local jsondata = json.encode(publish_data)
  43. onenet_mqttClient:publish("$sys/"..ProductId.."/"..getDeviceName().."/thing/property/post", jsondata, 0)
  44. end
  45. local function onenet_subscribe()
  46. --mqtt订阅主题,根据自己需要修改
  47. local onenet_topic = {
  48. ["$sys/"..ProductId.."/"..getDeviceName().."/thing/property/post/reply"]=0
  49. }
  50. if onenet_mqttClient:subscribe(onenet_topic) then
  51. return true
  52. else
  53. return false
  54. end
  55. end
  56. -- 无网络重启时间,飞行模式启动时间
  57. local rstTim, flyTim = 600000, 300000
  58. local mqtt_ready = false
  59. --- MQTT连接是否处于激活状态
  60. -- @return 激活状态返回true,非激活状态返回false
  61. -- @usage mqttTask.isReady()
  62. function isReady()
  63. return mqtt_ready
  64. end
  65. local function get_token()
  66. local version = '2018-10-31'
  67. -- 通过MQ实例名称访问MQ
  68. local res = "products/"..ProductId.."/devices/"..getDeviceName()
  69. -- 用户自定义token过期时间
  70. local et = tostring(os.time() + 3600)
  71. -- 签名方法,支持md5、sha1、sha256
  72. local method = 'sha256'
  73. -- 对access_key进行decode
  74. local key = crypto.base64_decode(ProductSecret,#ProductSecret)
  75. -- 计算sign
  76. local StringForSignature = et .. '\n' .. method .. '\n' .. res ..'\n' .. version
  77. local sign1 = crypto.hmac_sha256(StringForSignature,key)
  78. local sign2 = sign1:fromHex()
  79. local sign = crypto.base64_encode(sign2,#sign2)
  80. -- value 部分进行url编码
  81. sign = string.urlEncode(sign)
  82. res = string.urlEncode(res)
  83. -- token参数拼接
  84. local token = string.format('version=%s&res=%s&et=%s&method=%s&sign=%s',version, res, et, method, sign)
  85. return token
  86. end
  87. --- MQTT客户端数据接收处理
  88. -- @param onenet_mqttClient,MQTT客户端对象
  89. -- @return 处理成功返回true,处理出错返回false
  90. -- @usage mqttInMsg.proc(onenet_mqttClient)
  91. local function proc(onenet_mqttClient)
  92. local result,data
  93. while true do
  94. result,data = onenet_mqttClient:receive(60000,"APP_SOCKET_SEND_DATA")
  95. --接收到数据
  96. if result then
  97. log.info("mqttInMsg.proc",data.topic,string.toHex(data.payload))
  98. --TODO:根据需求自行处理data.payload
  99. else
  100. break
  101. end
  102. end
  103. return result or data=="timeout" or data=="APP_SOCKET_SEND_DATA"
  104. end
  105. local function onenet_iot()
  106. while true do
  107. if not socket.isReady() and not sys.waitUntil("IP_READY_IND", rstTim) then sys.restart("网络初始化失败!") end
  108. local clientid = getDeviceName()
  109. local username = ProductId
  110. local password = get_token()
  111. --创建一个MQTT客户端
  112. onenet_mqttClient = mqtt.client(clientid,300,username,password)
  113. --阻塞执行MQTT CONNECT动作,直至成功
  114. while not onenet_mqttClient:connect("218.201.45.7",1883) do sys.wait(2000) end
  115. log.info("mqtt连接成功")
  116. --订阅主题
  117. if onenet_subscribe() then
  118. log.info("mqtt订阅成功")
  119. --循环处理接收和发送的数据
  120. while true do
  121. mqtt_ready = true
  122. if not proc(onenet_mqttClient) then log.error("mqttTask.mqttInMsg.proc error") break end
  123. end
  124. else
  125. log.info("mqtt订阅失败")
  126. end
  127. mqtt_ready = false
  128. --断开MQTT连接
  129. onenet_mqttClient:disconnect()
  130. end
  131. end
  132. local function iot()
  133. if not socket.isReady() and not sys.waitUntil("IP_READY_IND", rstTim) then sys.restart("网络初始化失败!") end
  134. while not ntp.isEnd() do sys.wait(1000) end
  135. onenet_iot()
  136. end
  137. net.switchFly(false)
  138. -- NTP同步失败强制重启
  139. local tid = sys.timerStart(function()
  140. net.switchFly(true)
  141. sys.timerStart(net.switchFly, 5000, false)
  142. end, flyTim)
  143. sys.subscribe("IP_READY_IND", function()
  144. sys.timerStop(tid)
  145. log.info("---------------------- 网络注册已成功 ----------------------")
  146. end)
  147. sys.taskInit(iot)