合宙air724 onenet_studio 例程3种md5、sha1、sha256签名方法

合宙官方onenet_studio例程只写了sha256签名,其它2种签名方法参照官方文档

官方crypto文档

主要改写的部分

local sign1
    local method = 'sha1'
    -- 对access_key进行decode
    local key = crypto.base64_decode(ProductSecret, #ProductSecret)
    -- 计算sign
    local StringForSignature = et .. '\n' .. method .. '\n' .. res .. '\n' .. version
    if (method == 'md5') then
        sign1 = crypto.hmac_md5(StringForSignature, #StringForSignature, key, #key)
        log.info('md5')
    end

    if (method == 'sha1') then
        sign1 = crypto.hmac_sha1(StringForSignature, #StringForSignature, key, #key)
        log.info('sha1')
    end
    if (method == 'sha256') then
        sign1 = crypto.hmac_sha256(StringForSignature, key)
        log.info('sha256')
    end

完整示例代码

--- 模块功能: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 = '6PdG89F6S4'--请填写自己的产品ID
local ProductSecret = '4567B8ZnPUYkbdduLBzvLn2vRyT+LjVFje3Fx3YFt2Wc='--请填写自己的key

local onenet_mqttClient
--[[
函数名:getDeviceName
功能  :获取设备名称
参数  :无
返回值:设备名称
]]
local function getDeviceName()
    --默认使用设备的IMEI作为设备名称,用户可以根据项目需求自行修改
    -- return misc.getImei()

    --用户单体测试时,可以在此处直接返回阿里云的iot控制台上注册的设备名称,例如return "862991419835241"
    --return "862991419835241"
    return 'M_device1'
end

function onenet_publish()
    --sys.publish("APP_SOCKET_SEND_DATA")
    --mqtt发布主题根据自己需要修改
    local publish_data = {
        id = '123456',
        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() + 16000)
    local et = 1672735919
    log.info('et')
    log.info(et)

    -- 签名方法,支持md5、sha1、sha256
    -- local method = 'sha256'
    local sign1
    local method = 'sha1'
    -- 对access_key进行decode
    local key = crypto.base64_decode(ProductSecret, #ProductSecret)
    -- 计算sign
    local StringForSignature = et .. '\n' .. method .. '\n' .. res .. '\n' .. version
    if (method == 'md5') then
        sign1 = crypto.hmac_md5(StringForSignature, #StringForSignature, key, #key)
        log.info('md5')
    end

    if (method == 'sha1') then
        sign1 = crypto.hmac_sha1(StringForSignature, #StringForSignature, key, #key)
        log.info('sha1')
    end
    if (method == 'sha256') then
        sign1 = crypto.hmac_sha256(StringForSignature, key)
        log.info('sha256')
    end

    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)
    log.info('token--------------------------------')
    log.info(token)
    return token
    -- return "version=2018-10-31&res=products%2F7PdG8YF6S4%2Fdevices%2FM_device1&et=1672735919&method=md5&sign=XuJZlTQfDFRsoHAghg9MFg%3D%3D"
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
            --TODO:根据需求自行处理data.payload
            log.info('mqttInMsg.proc', data.topic, string.toHex(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(3000)
        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)

mqtt连接成功 截图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

armcsdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值