建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块
直达楼层
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

采纳成功

您已采纳当前回复为最佳回复

buyi

发帖: 14粉丝: 4

发消息 + 关注

发表于2020年04月27日 22:46:06 1197 5
直达本楼层的链接
楼主
显示全部楼层
[技术干货] 使用Lua脚本连接华为云物联网服务

今天收到合宙的4G开发板,很是激动,第一时间就想连到华为云物联网平台,官方有教程,我也分享给大家。先展示一下开发板。



image.png

准备工作

打开华为云物联网后台(如果无账号,需要注册):
OceanConnect开发中心

新建项目,项目名称和行业按需求填写:

image.png

记录下应用id与密钥,进入项目:

image.png

产品开发新建产品,内容按需求填写,注意接入应用层协议类型要选择MQTT

image.png

image.png

给这个产品添加Profile定义:

image.png

按下图新建属性

image.png

按照下图,再添加两个命令(string长度图里应为4)

image.png

image.png

保存设置。

左侧设备管理添加真实设备,注意类型要选直连:

image.png

image.png

image.png


设备信息记下来,后面会用到:

设备ID:355d812e-ad55-47a5-b811-760f760b63a1密钥:10f0a44d66a582b3ddee

模块连接实现

模块连接需要使用MQTT+SSL的方式,具体鉴权协议可以参考华为云的文档:MQTT CONNECT连接鉴权

首先需要注意,由于上面定义了int类型,并且在华为云的int类型会带小数点的尾缀,所以我们需要使用SSL+FLOAT的固件,并且保证固件版本大于0034以确保可以使用HMACSHA256计算函数

首先准备一下mqtt的证书文件,保存下面的文本内容为hw.crt

-----BEGIN CERTIFICATE-----MIID4DCCAsigAwIBAgIJAK97nNS67HRvMA0GCSqGSIb3DQEBCwUAMFMxCzAJBgNVBAYTAkNOMQswCQYDVQQIEwJHRDELMAkGA1UEBxMCU1oxDzANBgNVBAoTBkh1YXdlaTELMAkGA1UECxMCQ04xDDAKBgNVBAMTA0lPVDAeFw0xNjA1MDQxMjE3MjdaFw0yNjA1MDIxMjE3MjdaMFMxCzAJBgNVBAYTAkNOMQswCQYDVQQIEwJHRDELMAkGA1UEBxMCU1oxDzANBgNVBAoTBkh1YXdlaTELMAkGA1UECxMCQ04xDDAKBgNVBAMTA0lPVDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJxM9fwkwvxeILpkvoAMGdqq3x0G9o445F6Shg3I0xmmzu9Of8wYuW3c4jtQ/6zscuIGyWf06ke1z//AVZ/odp8LkuFbBbDXR5swjUJ6z15b6yaYH614Ty/d6DrCM+RaU+FWmxmOon9W/VELu2BBNXDQHJBSbWrLNGnZA2erk4JSMp7RhHrZ0QaNtT4HhIczFYtQ2lYF+sQJpQMrjoRndSV9WB872Ja4DgcISU1+wuWLmS/NKjIvOWW1upS79yu2I4Rxos2mFy9xxz311rGCZ3X65ejFNzCUrNgf6NEP1N7wB9hUu7u50aA+/56D7EgjeI0gpFytC+a4f6JCPVWILr0CAwEAAaOBtjCBszAdBgNVHQ4EFgQUcGqy59oawLEgMl21//7F5RyABpwwgYMGA1UdIwR8MHqAFHBqsufaGsCxIDJdtf/+xeUcgAacoVekVTBTMQswCQYDVQQGEwJDTjELMAkGA1UECBMCR0QxCzAJBgNVBAcTAlNaMQ8wDQYDVQQKEwZIdWF3ZWkxCzAJBgNVBAsTAkNOMQwwCgYDVQQDEwNJT1SCCQCve5zUuux0bzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBgv2PQn66gRMbGJMSYS48GIFqpCo783TUTePNStV8G1MIiQCpYNdk2wNw/iFjoLRkdx4va6jgceht5iX6SdjpoQF7y5qVDVrScQmsPU95IFcOkZJCNtOpUXdT+a3N+NlpxiScyIOtSrQnDFixWMCJQwEfg8j74qO96UvDAFuTCocOouER3ZZjQ8MEsMMquNEvMHJkMRX11L5Rxo1pc6J/EMWW5scK2rC0Hg91aLod6aezh2K7KleC0V5ZlIuEvFoBc7bCwcBSAKA3BnQveJ8nEu9pbuBsVAjHOroVb8/bL5retJigmAN2GIyFv39TFXIySw+lW0wlp+iSPxO9s9J+t-----END CERTIFICATE-----

新建main.lua

PROJECT = "HWMQTT"
VERSION = "1.0.0"
--加载日志功能模块,并且设置日志输出等级
require "log"
LOG_LEVEL = log.LOGLEVEL_TRACE
require "sys"
require "net"
--每1分钟查询一次GSM信号强度
--每1分钟查询一次基站信息
net.startQueryAll(60000, 60000)
--加载硬件看门狗功能模块
--require "wdt"
--wdt.setup(pio.P0_30, pio.P0_31)
--加载网络指示灯功能模块
--require "netLed"
--netLed.setup(true,pio.P1_1)
--加载MQTT功能测试模块
require "mqttTask"
--启动系统框架
sys.init(0, 0)
sys.run()

新建mqttTask.lua

require "mqtt"
module(..., package.seeall)
-- 这里请填写华为云后台对接信息所展示的设备信息MQTT接入方式信息
local host, port = "49.4.93.24", 8883
--这里设置设备的device id和密钥,之前新建设备时得到的两个字符串
--实际使用中,这两个值可以存在SN中,在生产时一个个烧录进去
local device = "355d812e-ad55-47a5-b811-760f760b63a1"
local secret = "10f0a44d66a582b3ddee"
--同步NTP时间,因为鉴权需要用到UTC时间
require"ntp"
local function ntbcb(r)
    if r then
        sys.publish("NTP_OK")--时间同步完成后,发送命令,开始mqtt连接
    else
        ntp.timeSync(nil,ntbcb)
    end
end
ntp.timeSync(nil,ntbcb)--开始同步时间任务
--此处参照华为云文档,生成连接时使用的密钥
local function keyGenerate(key)
    local clk = os.date("*t",os.time()-3600*8)--获取UTC时间的table
    local timeStr = string.format("%02d%02d%02d%02d",clk.year,clk.month,clk.day,clk.hour)--时间戳
    local result = crypto.hmac_sha256(key,timeStr):lower()
    log.info("keyGenerate",timeStr,key,result)
    if crypto.hmac_sha256 then
        return result
    else
        log.error("crypto.hmac_sha256","please update your lod version, higher than 0034!")
        rtos.poweroff()
    end
end
socket.setSendMode(1)
-- 测试MQTT的任务代码
sys.taskInit(function()
    sys.waitUntil("NTP_OK")--等待时间同步成功
    while true do
        while not socket.isReady() do sys.wait(1000) end
        local clk = os.date("*t",os.time()-3600*8)--获取UTC时间的table
        local mqttc = mqtt.client(
            device.."_0_1_"..string.format("%02d%02d%02d%02d",clk.year,clk.month,clk.day,clk.hour),--时间戳鉴权模式
            300,
            device,
            keyGenerate(secret))
        while not mqttc:connect(host, port, "tcp_ssl",{caCert="hw.crt"}) do sys.wait(2000) end
        --topic订阅规则详细请见华为云文档:https://support.huaweicloud.com/api-IoT/iot_06_3008.html#ZH-CN_TOPIC_0172230104
        if mqttc:subscribe("/huawei/v1/devices/"..device.."/command/json") then
            while true do
                local r, data, param = mqttc:receive(120000, "pub_msg")
                if r then
                    log.info("这是收到了服务器下发的消息:", data.payload or "nil")
                    sys.publish("rev_msg",data.payload)--把收到的数据推送出去
                elseif data == "pub_msg" then
                    log.info("这是收到了订阅的消息和参数显示:", param)
                    --topic订阅规则详细请见华为云文档
                    mqttc:publish("/huawei/v1/devices/"..device.."/data/json", param)
                elseif data == "timeout" then
                    --等待超时,进行下一轮等待
                else
                    break
                end
            end
        end
        mqttc:disconnect()
    end
end)
--接收到mqtt之后,对数据进行处理
sys.subscribe("rev_msg",function(data)
    local t,r,e = json.decode(data)--解包收到的json数据,具体参考手册:https://support.huaweicloud.com/api-IoT/iot_06_3011.html
    if r and type(t)=="table" then
        log.info("receive.msgType",t.msgType)--表示平台下发的请求,固定值“cloudReq”
        log.info("receive.serviceId",t.serviceId)--设备服务的ID
        log.info("receive.cmd",t.cmd)--服务的命令名,参见profile的服务命令定义
        log.info("receive.mid",t.mid)--2字节无符号的命令id,平台内部分配(范围1-65535),设备命令响应平台时,需要返回该值
        if t.cmd == "testcmd" then--匹配上了之前写的cmd名称
            log.info("receive.paras.testControl",t.paras.testControl)
            local clk = os.date("*t",os.time()-3600*8)--获取UTC时间的table
            --组包回复用的json,具体参考手册:https://support.huaweicloud.com/api-IoT/iot_06_3012.html
            local reply = {
                msgType = "deviceRsp",--固定值“deviceRsp”,表示设备的应答消息
                mid = t.mid,--2字节无符号的命令ID,根据平台下发命令时的mid返回给平台。建议在消息中携带此参数
                errcode = 0,--请求处理的结果码。“0”表示成功。“1”表示失败
                body = {--命令的应答,具体字段由profile定义
                    testReply = "done",--这是之前后台设置的那个
                }
            }
            sys.publish("pub_msg",json.encode(reply))--上报返回的报文
            --组包上报用的json,具体参考手册:https://support.huaweicloud.com/api-IoT/iot_06_3010.html
            local upload = {
                msgType = "deviceReq",--表示设备上报数据,固定值“deviceReq”
                data = {--一组服务的数据(具体结构参考下表ServiceData定义表),当需要上传批量数据时,可在该字段中添加数据
                    {
                        serviceId = "testServer",--设备服务的ID
                        serviceData = {--一个服务的数据,具体字段在profile里定义
                            testProperty = t.paras.testControl,--把刚刚下发的东西,上报上去
                        },
                        eventTime = string.format("%02d%02d%02d%02d%02d%02dZ",--设备采集数据UTC时间(格式:yyyyMMddTHHmmssZ)
                                    clk.year,clk.month,clk.day,clk.hour,clk.min,clk.sec)--时间戳
                    },
                }
            }
            sys.publish("pub_msg",json.encode(upload))--上报返回的报文
        end
    else
        log.info("json.decode error",e)
    end
end)

烧录到设备里,以备测试


测试

后台下发数据,模块回复

image.png


声明:账号密钥均以无法使用,请自行设置,这是只是为了详细展示,为大家提供一种连入华为iot平台的方法,同时感谢合宙支持。

举报
分享

分享文章到朋友圈

分享文章到微博

采纳成功

您已采纳当前回复为最佳回复

华为IoT云服务

发帖: 264粉丝: 262

级别 : 版主,版块专家

发消息 + 关注

发表于2020年04月27日 22:47:23
直达本楼层的链接
沙发
显示全部楼层

写的非常详细了!

评论
buyi 2020-4-27 22:51 评论

你真辛苦,到现在还在工作!

... 查看全部
点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

ttking

发帖: 380粉丝: 22

发消息 + 关注

发表于2020年04月28日 09:12:37
直达本楼层的链接
板凳
显示全部楼层

我也是拿到了板子,用at指令连的

评论
buyi 2020-4-28 09:15 评论

... 查看全部
点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

scu-w

发帖: 333粉丝: 9

发消息 + 关注

发表于2020年04月28日 23:35:15
直达本楼层的链接
地板
显示全部楼层

厉害啦

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

我是卤蛋

发帖: 121粉丝: 292

级别 : 版主,版块专家

发消息 + 关注

发表于2020年04月30日 09:34:18
直达本楼层的链接
5#
显示全部楼层

这是通过原生MQTT协议吗?厉害了

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

极客潇

发帖: 477粉丝: 68

发消息 + 关注

发表于2020年05月06日 16:11:54
直达本楼层的链接
6#
显示全部楼层

点赞,感谢分享

点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册

结贴

您对问题的回复是否满意?
满意度
非常满意 满意 一般 不满意
我要反馈
0/200