| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- --- 模块功能:onenet studio功能测试.
- -- @module onenet
- -- @author Dozingfiretruck
- -- @license MIT
- -- @copyright OpenLuat.com
- -- @release 2021.4.7
- module(...,package.seeall)
- require "ntp"
- require "pm"
- require "misc"
- require "mqtt"
- require "utils"
- require "patch"
- require "socket"
- require "http"
- require "common"
- -- 产品ID和产品动态注册秘钥
- local ProductId = "vh8xhj9sxz"
- local ProductSecret = "t7Ojq/VBDQO3r8l5nQXXPZdzZQ3JCY8riZMj87vX96c="
- local onenet_mqttClient
- --[[
- 函数名:getDeviceName
- 功能 :获取设备名称
- 参数 :无
- 返回值:设备名称
- ]]
- local function getDeviceName()
- --默认使用设备的IMEI作为设备名称,用户可以根据项目需求自行修改
- return misc.getImei()
- --用户单体测试时,可以在此处直接返回阿里云的iot控制台上注册的设备名称,例如return "862991419835241"
- --return "862991419835241"
- end
- function onenet_publish()
- --sys.publish("APP_SOCKET_SEND_DATA")
- --mqtt发布主题根据自己需要修改
- local publish_data =
- {
- id = "123",
- version = "1.0",
- params = {},
- }
- local jsondata = json.encode(publish_data)
- onenet_mqttClient:publish("$sys/"..ProductId.."/"..getDeviceName().."/thing/property/post", jsondata, 0)
- end
- local function onenet_subscribe()
- --mqtt订阅主题,根据自己需要修改
- local onenet_topic = {
- ["$sys/"..ProductId.."/"..getDeviceName().."/thing/property/post/reply"]=0
- }
- if onenet_mqttClient:subscribe(onenet_topic) then
- return true
- else
- return false
- end
- end
- -- 无网络重启时间,飞行模式启动时间
- local rstTim, flyTim = 600000, 300000
- local mqtt_ready = false
- --- MQTT连接是否处于激活状态
- -- @return 激活状态返回true,非激活状态返回false
- -- @usage mqttTask.isReady()
- function isReady()
- return mqtt_ready
- end
- local function get_token()
- local version = '2018-10-31'
- -- 通过MQ实例名称访问MQ
- local res = "products/"..ProductId.."/devices/"..getDeviceName()
- -- 用户自定义token过期时间
- local et = tostring(os.time() + 3600)
- -- 签名方法,支持md5、sha1、sha256
- local method = 'sha256'
- -- 对access_key进行decode
- local key = crypto.base64_decode(ProductSecret,#ProductSecret)
- -- 计算sign
- local StringForSignature = et .. '\n' .. method .. '\n' .. res ..'\n' .. version
- local sign1 = crypto.hmac_sha256(StringForSignature,key)
- local sign2 = sign1:fromHex()
- local sign = crypto.base64_encode(sign2,#sign2)
- -- value 部分进行url编码
- sign = string.urlEncode(sign)
- res = string.urlEncode(res)
- -- token参数拼接
- local token = string.format('version=%s&res=%s&et=%s&method=%s&sign=%s',version, res, et, method, sign)
- return token
- end
- --- MQTT客户端数据接收处理
- -- @param onenet_mqttClient,MQTT客户端对象
- -- @return 处理成功返回true,处理出错返回false
- -- @usage mqttInMsg.proc(onenet_mqttClient)
- local function proc(onenet_mqttClient)
- local result,data
- while true do
- result,data = onenet_mqttClient:receive(60000,"APP_SOCKET_SEND_DATA")
- --接收到数据
- if result then
- log.info("mqttInMsg.proc",data.topic,string.toHex(data.payload))
- --TODO:根据需求自行处理data.payload
- else
- break
- end
- end
- return result or data=="timeout" or data=="APP_SOCKET_SEND_DATA"
- end
- local function onenet_iot()
- while true do
- if not socket.isReady() and not sys.waitUntil("IP_READY_IND", rstTim) then sys.restart("网络初始化失败!") end
- local clientid = getDeviceName()
- local username = ProductId
- local password = get_token()
- --创建一个MQTT客户端
- onenet_mqttClient = mqtt.client(clientid,300,username,password)
- --阻塞执行MQTT CONNECT动作,直至成功
- while not onenet_mqttClient:connect("218.201.45.7",1883) do sys.wait(2000) end
- log.info("mqtt连接成功")
- --订阅主题
- if onenet_subscribe() then
- log.info("mqtt订阅成功")
- --循环处理接收和发送的数据
- while true do
- mqtt_ready = true
- if not proc(onenet_mqttClient) then log.error("mqttTask.mqttInMsg.proc error") break end
- end
- else
- log.info("mqtt订阅失败")
- end
- mqtt_ready = false
- --断开MQTT连接
- onenet_mqttClient:disconnect()
- end
- end
- local function iot()
- if not socket.isReady() and not sys.waitUntil("IP_READY_IND", rstTim) then sys.restart("网络初始化失败!") end
- while not ntp.isEnd() do sys.wait(1000) end
- onenet_iot()
- end
- net.switchFly(false)
- -- NTP同步失败强制重启
- local tid = sys.timerStart(function()
- net.switchFly(true)
- sys.timerStart(net.switchFly, 5000, false)
- end, flyTim)
- sys.subscribe("IP_READY_IND", function()
- sys.timerStop(tid)
- log.info("---------------------- 网络注册已成功 ----------------------")
- end)
- sys.taskInit(iot)
|