本文分享自华为云社区《鍗庝负浜戣鍧沖浜戣绠楄鍧沖寮€鍙戣€呰鍧沖鎶€鏈鍧�-鍗庝负浜�》,做者:DS小龙哥。

一、媒介

当前的场景是,在高速公路上摆设温度收罗设备,在高速路地表安拆温度检测传感器,检测当前路段的路面现实温度。一段高速路上有多个地点需要收罗温度数据。 收罗温度数据需要上传到云平台停止数据存储,而且通过可视化界面展现温度变革曲线,撑持查询比来几天的温度信息。

二、设想思绪

(1)云平台选型:利用华为云物联网云平台。

(2)云数据存储: 利用OBS存储,存放设备上传的汗青数据。

(3)设备选项:NBIOT模块+温度收罗模块,实现温度收罗上报。

(4)数据可视化:接纳华为云IoT应用侧接口,获取传感器设备上传到云端的数据,在当地设想界面停止可视化显示温度数据。

下面是温度数据可视化展现效果:

带你动手设计一个高速公路多节点温度采集系统  第1张

带你动手设计一个高速公路多节点温度采集系统  第2张

本篇文章次要介绍设备上云的详细流程,介绍华为云物联网云端产物、设备创建流程,数据转存体例,应用侧开发接口等等。

硬件选型:

(1)STM32开发板: STM32F103C8T6

带你动手设计一个高速公路多节点温度采集系统  第3张

(2)NBIOT模块--BC26

BC26模块是一款高性能、低功耗、多频段LTE Cat NB1无线通信模块。

带你动手设计一个高速公路多节点温度采集系统  第4张

(3)温度收罗模块

pt100是铂热电阻,它的阻值会跟着温度的变革而改动。PT后的100即暗示它在0℃时阻值为100欧姆,在100℃时它的阻值约为138.5欧姆。其工做原理:当PT100在0℃时,其电阻为100欧姆。它的电阻会跟着温度的升高而上升,而且它的电阻会匀速增加。热电阻是一种常用于中低温的温度传感器。它的工做原理是基于电阻的热效应,即电阻的阻值随温度的变革而变革。铂金热敏电阻的热阻精度更高,具有抗振动、不变性好、耐高压等特点。因而,它被造成各类尺度温度计停止丈量和校准。

带你动手设计一个高速公路多节点温度采集系统  第5张

三、华为云IOT平台3.1 创建产物

官网地址: https://www.huaweicloud.com/

3.1.1设备接入IOTDA

在产物页面找到iot物联网,选择设备接入IOTDA

带你动手设计一个高速公路多节点温度采集系统  第6张

设备接入办事(IoT Device Access)是华为云的物联网平台,供给海量设备毗连上云、设备和云端双向动静通信、批量设备办理、长途控造和监控、OTA晋级、设备联动规则等才能,并可将设备数据灵敏流转到华为云其他办事,帮忙物联网行业用户快速完成设备联网及行业应用集成,根底版每月一百万条动静免费。

在页面上选择免费试用。

带你动手设计一个高速公路多节点温度采集系统  第7张

点击后,会进入到设备接入控造台页面。

带你动手设计一个高速公路多节点温度采集系统  第8张

3.1.2设备接入地址

在根底版详情页面,点击右边的按需计费详情,能够查看物联网办事器接入的IP地址,端标语、接入体例。

带你动手设计一个高速公路多节点温度采集系统  第9张

带你动手设计一个高速公路多节点温度采集系统  第10张

若是是设备接入,能够选择MQTT或者MQTTS协议,在单片机上只要MQTT协议验证比力便利,通过MQTT三元组即可完成设备毗连,当前我那里的设备选择是MQTT协议毗连华为云平台。

域名:a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com IP地址: 121.36.42.100 端标语: 18833.1.3创建产物

在右边选项卡里点击产物,进入产物页面,点击右上角创建产物。

带你动手设计一个高速公路多节点温度采集系统  第11张

按照本身的产物信息,填写表单:

带你动手设计一个高速公路多节点温度采集系统  第12张

3.1.4完成产物创建带你动手设计一个高速公路多节点温度采集系统  第13张

点击查看详情,能够进入到创建胜利的产物页面。

带你动手设计一个高速公路多节点温度采集系统  第14张

3.1.5定义产物模子

产物创建之后,接着需要在平台上构建一款设备的笼统模子,使平台理解该款设备撑持的功用。

好比:温度收罗设备必定会向云平台上传收罗的温度信息;在产物模子里就能够定义一个温度的属性字段。

带你动手设计一个高速公路多节点温度采集系统  第15张

选择下面的自定义模子。

带你动手设计一个高速公路多节点温度采集系统  第16张

添加办事ID。

带你动手设计一个高速公路多节点温度采集系统  第17张

添加属性。

带你动手设计一个高速公路多节点温度采集系统  第18张

新增属性字段。当前在多节点温度收罗的设备里,次要是收罗温度上传,那里就新增一个温度的属性。

带你动手设计一个高速公路多节点温度采集系统  第19张

产物模子创建完成。

带你动手设计一个高速公路多节点温度采集系统  第20张

3.2 创建立备3.2.1创建单个设备

设备注册的体例有良多:

【1】创建撑持单个设备手动创建。

【2】若是设备出格多能够选择批量注册。

【3】通过API接口停止动态注册。

当前为了演示流程,那里选择第一种体例,手动创建单个设备。

在设备页面,选择所有设备选项,点击右边的注册设备按钮。

带你动手设计一个高速公路多节点温度采集系统  第21张

3.2.2单设备注册填写信息

点击注册设备之后,会弹出一个表单填写信息。

此中产物就选择适才创建的产物,设备标识码那一项一般是填设备的ID(设备的独一标识符,便利绑定设备)。目前还没有对接硬件,我那里就填dev1,便利接下来的测试。 下面的设备ID那一项若是不填,会主动生成,能够不管;最初输入密匙(那个密匙的感化:通过对每个设备停止身份验证,能够平安地将每个设备毗连到平台,而且平安地办理那些设备),填好之后点击确定。

带你动手设计一个高速公路多节点温度采集系统  第22张

3.2.3设备创建完成

创建好之后,保留生成的设备ID和密匙。

带你动手设计一个高速公路多节点温度采集系统  第23张

得到的密匙和ID的格局文本如下:

{ "device_id": "6353a8163ec34a6d03c8dfe5_dev1", "secret": "12345678" }

那个设备密匙和ID,后面生成MQTT登录参数时需要用到。

3.2.4创建多个温度设备节点

因为本项目是实现多节点温度上传到云平台,每个节点都是一个独立的温度收罗设备,为了便利演示效果,还需要多创建几个设备。

接下来的创建流程,和适才第一个设备一样,那里就不再截图演示了。

点击创建立备按钮,继续注册。

带你动手设计一个高速公路多节点温度采集系统  第24张

带你动手设计一个高速公路多节点温度采集系统  第25张

目前一共创建了4个设备,此中main_dev设备是用来做为显示末端,在当地用显示屏显示其他温度收罗节点收罗的温度信息。 剩下3个设备dev1,dev2,dev3是暗示3个独立的温度收罗节点。

带你动手设计一个高速公路多节点温度采集系统  第26张

那4个设备的密匙和ID信息如下:

{ "device_id": "6353a8163ec34a6d03c8dfe5_dev1", "secret": "12345678" } ​ { "device_id": "6353a8163ec34a6d03c8dfe5_dev2", "secret": "12345678" } ​ ​ { "device_id": "6353a8163ec34a6d03c8dfe5_dev3", "secret": "12345678" } ​ ​ { "device_id": "6353a8163ec34a6d03c8dfe5_main_dev", "secret": "12345678" }3.3 模仿设备上云测试

目前设备创建之后,那些设备都还没有激活。接下来会利用MQTT客户端来模仿实在设备上云,上传温度数据。

那里的上云,包罗数据交互都接纳MQTT客户端来模仿实现,不涉及到现实的硬件,只要模仿能测试胜利,而且能得到本身想要的成果,那硬件就没有问题了。

3.3.1生成MQTT鉴权三元组

设备要毗连华为云平台的体例,在第一节创建产物的时候就已经介绍了,本次项目里的设备是接纳MQTT协议接入云平台。 在完成设备模仿上云之前,需要先生成设备的MQTT协议鉴权三元组。

华为云供给了一个在线东西,用来生成MQTT鉴权三元组: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

东西翻开的界面如下效果:

带你动手设计一个高速公路多节点温度采集系统  第27张

前面两行就是填设备创建后生成的设备ID和设备密匙,填好之后,生成下面3行信息,生成的3行就是MQTT协议登录需要用的参数。

根据格局别离生成4个设备的鉴权信息:

带你动手设计一个高速公路多节点温度采集系统  第28张

得到的三元组如下:

ClientId 6353a8163ec34a6d03c8dfe5_dev1_0_0_2022102209 Username 6353a8163ec34a6d03c8dfe5_dev1 Password c58c45d514832b119b4302eafb3e74854849ca94079e9aed75efedf176e9c388 ​ ClientId 6353a8163ec34a6d03c8dfe5_dev2_0_0_2022102209 Username 6353a8163ec34a6d03c8dfe5_dev2 Password c58c45d514832b119b4302eafb3e74854849ca94079e9aed75efedf176e9c388 ​ ClientId 6353a8163ec34a6d03c8dfe5_dev3_0_0_2022102209 Username 6353a8163ec34a6d03c8dfe5_dev3 Password c58c45d514832b119b4302eafb3e74854849ca94079e9aed75efedf176e9c388 ​ ClientId 6353a8163ec34a6d03c8dfe5_main_dev_0_0_2022102209 Username 6353a8163ec34a6d03c8dfe5_main_dev Password c58c45d514832b119b4302eafb3e74854849ca94079e9aed75efedf176e9c3883.3.2MQTT客户端模仿设备登录

得到MQTT三元组之后,接下来用MQTT客户端模仿设备登录云平台。

根据软件的输入框提醒,输入对应的信息,点击登录。 此中的IP地址和端标语在第一末节的产物创建里就介绍过了。 后面输入的那3行就是上一步生成的MQTT鉴权三元组。

带你动手设计一个高速公路多节点温度采集系统  第29张

登录胜利。

带你动手设计一个高速公路多节点温度采集系统  第30张

然后翻开云平台的控造台,查看设备在线情况:

带你动手设计一个高速公路多节点温度采集系统  第31张

能够看到dev1已经在线了, 适才模仿的设备就是dev1。

3.3.3主题订阅与发布

目前设备已经胜利登录,接下来要处理的问题就是数据传输问题了。

MQTT协议里要理解的两个概念就是主题订阅,主题发布。 设备上传数据到平台,属于 主题发布。 设备想要晓得其他设备的数据或者云平台下发的指令,需要停止主题订阅。

帮忙文档的地址: https://support.huaweicloud.com/api-iothub/iot_06_v5_3002.html

MQTT动静由固定报头(Fixed header)、可变报头(Variable header)和有效载荷(Payload)三部门构成。

此中固定报头(Fixed header)和可变报头(Variable header)格局的填写请参考MQTT尺度标准,有效载荷(Payload)的格局由应用定义,即设备和物联网平台之间本身定义。

常见MQTT动静类型次要有CONNECT、SUBSCRIBE、PUBLISH。

CONNECT:指客户端恳求和办事端毗连。有效载荷(Payload)的次要参数,参考设备毗连鉴权填写。 SUBSCRIBE:指客户端订阅恳求。有效载荷(Payload)中的次要参数“Topic name”,参考Topic定义中订阅者为设备的Topic。 PUBLISH:平台发布动静。 可变报头(Variable header)中的次要参数“Topic name”,指设备上报到物联网平台时发布者为设备的Topic。详细请参考Topic定义。 有效载荷(Payload)中的次要参数为完好的数据上报和号令下发的动静内容,目前是一个JSON对象。 ​ 上行Topic是指设备向平台发送恳求,或上报数据,或回复响应。 下行Topic是指平台向设备下发指令,或回复响应。 设备与平台成立毗连后,需要订阅下行Topic,不然无法收到平台下发的指令或回复的响应。应用侧接口的挪用,需要设备侧的共同,例如应用侧下发号令,设备侧需要先订阅“平台号令下发”的下行Topic,不然设备无法收到平台号令,应用下发号令的接口也会报超时。

在产物页面,能够看到主题的格局,以及关于主题的用处:**

带你动手设计一个高速公路多节点温度采集系统  第32张

【1】订阅主题

关于设备而言,一般会订阅平台下发动静给设备 那个主题。

设备想领受平台下发的动静,就需要订阅平台下发动静给设备 的主题,订阅后,平台下发动静给设备,设备就会收到动静。

主题的格局如下:

$oc/devices/{device_id}/sys/messages/down 以dev1设备1为例,最末的格局: $oc/devices/6353a8163ec34a6d03c8dfe5_dev1/sys/messages/down

【2】发布主题

关于设备,发布主题,也就显示向云平台上传数据。

发布的主题格局如下:

$oc/devices/{device_id}/sys/PRoPErties/report ​ 以dev1设备1为例最末的格局: $oc/devices/6353a8163ec34a6d03c8dfe5_dev1/sys/properties/report

发布主题时,需要上传数据,那个数据格局是JSON格局。

上传的JSON数据格局如下:

{ "services": [ { "service_id": <填办事ID>, "properties": { "<填属性名称1>": <填属性值>, "<填属性名称2>": <填属性值>, .......... } } ] }

按照JSON格局,一次能够上传多个属性字段。 那个JSON格局里的,办事ID,属性字段名称,属性值类型,在前面创建产物的时候就已经介绍了,不记得能够翻到前面去查看。

按照那个格局,组合温度节点一次上传的数据:

{"services": [{"service_id": "temp","properties":{"temp":24.6}}]}3.3.4MQTT客户端模仿设备上报数据

翻开MQTT客户端填入订阅主题,发布主题,和需要发布的数据,然后别离点击订阅主题按钮,发布主题按钮。 右边提醒胜利之后,就能够翻开云平台看上传的效果了。 (那里是以dev1,设备1为例)

带你动手设计一个高速公路多节点温度采集系统  第33张

翻开云平台看到dev1已经在线。

带你动手设计一个高速公路多节点温度采集系统  第34张

点击dev1,进去查看设备上传的数据。 能够看到,适才上传的数据已经收到了。

带你动手设计一个高速公路多节点温度采集系统  第35张

到此,设备上传数据到云平台已经完成。

四、设备数据转存

若是设备上传的数据需要停止保留,后续停止阐发做其他用处,能够操纵数据转发办事,让平台将设备上报数据推送给本身的应用办事器,由应用办事器停止保留;也能够选择让平台将设备上报数据转发给OBS对象存储办事,由OBS停止存储,停止永久保留,十分便利。若是存储在OBS里,本身设想应用侧界面时,也能够间接拉取OBS里的数据下来停止显示,处置,阐发。

4.1 创建OSB存储桶

地址: https://www.huaweicloud.com/product/obs.html

对象存储办事(Object Storage Service,OBS)是一个基于对象的存储办事,供给了海量、平安、高可靠、低成本的数据存储才能。

4.1.1选择办理控造台带你动手设计一个高速公路多节点温度采集系统  第36张

4.1.2创建桶带你动手设计一个高速公路多节点温度采集系统  第37张

填充桶信息: 我那里选择的是 华北-北京一

带你动手设计一个高速公路多节点温度采集系统  第38张

我那里因为要持久利用,那里选择1年的购置权。

带你动手设计一个高速公路多节点温度采集系统  第39张

4.1.3创建胜利带你动手设计一个高速公路多节点温度采集系统  第40张

4.2 设置装备摆设数据转发规则4.2.1创建规则

选择左侧导航栏的规则>数据转发,单击右上角的创建规则。

带你动手设计一个高速公路多节点温度采集系统  第41张

填充规则转发的信息:

带你动手设计一个高速公路多节点温度采集系统  第42张

带你动手设计一个高速公路多节点温度采集系统  第43张

4.2.2设置转发目的

单击添加,设置转发目的。

那里的区域选择--华北-北京一。 因为前面的OBS桶创建的时候,设置区域设置的是北京一,然后点击受权。

带你动手设计一个高速公路多节点温度采集系统  第44张

带你动手设计一个高速公路多节点温度采集系统  第45张

带你动手设计一个高速公路多节点温度采集系统  第46张

受权之后,选择适才创建的OBS桶,设置存储数据的目次和文件名字。

存储的数据能够间接转存JSON数据到OBS存储桶,也能够存放成CSV文件到存储桶。

若是选择存储JSON,就是间接将设备上传的数据存放到OBS存储里,若是选择存储CSV文件,能够本身选择需要存储的字段。 下面我演示一下存储成CSV文件时若何停止设置。 (选择JSON文件不需要停止任何设置,间接将设备上传的数据JSON存储进去了)。

带你动手设计一个高速公路多节点温度采集系统  第47张

下面设置转发的字段: (若是提醒没有受权,点击受权即可)

那个转发字段就是暗示需要存放的数据是那些,关于路灯而言,必定是需要存储上报的温度、湿度、电量、光照强度的属性的。 那些属性在创建产物的时候设置,设备上报的也是那些属性。

那是设备上传一次云平台的完好JSON数据格局:

{ "resource": "device.property", "event": "report", "event_time": "20221018T131627Z", "request_id": "5ee95a0c-262d-43c3-8d31-af453f9952ef", "notify_data": { "header": { "app_id": "7211833377cf435c8c0580de390eedbe", "device_id": "634e3e423ec34a6d03c84bfb_1126626497", "node_id": "1126626497", "product_id": "634e3e423ec34a6d03c84bfb", "gateway_id": "634e3e423ec34a6d03c84bfb_1126626497" }, "body": { "services": [ { "service_id": "temp", "properties": { "temp": 28, }, "event_time": "20221018T131627Z" } ] } } }

当前设备上传到云端办事器有一个温度属性字段temp,若是想转发设备上传的那个温度字段,就能够如许写:

notify_data.body.services[0].properties.temp

后面的存储目的字段,为了好区分,间接填temp即可。

若是设备还上传了其他属性字段也想转发,根据上面格局设置即可。

若是存储数据时,想晓得那个数据是阿谁产物,阿谁设备上传的,也能够将设备ID和产物ID转发存储起来:格局如下。

notify_data.header.app_id notify_data.header.device_id

下面是我设置好,转发存储的字段:

带你动手设计一个高速公路多节点温度采集系统  第48张

确定后,点击设置完成。

带你动手设计一个高速公路多节点温度采集系统  第49张

4.2.3测试规则

设置好之后,在设置转发目的的页面点击测试。

带你动手设计一个高速公路多节点温度采集系统  第50张

输入数据模板,然后点击连通性测试。若是测试成果显示胜利,申明整体流程没有问题了。

带你动手设计一个高速公路多节点温度采集系统  第51张

4.2.4启用规则

设置完成后,点击启用规则。

带你动手设计一个高速公路多节点温度采集系统  第52张

带你动手设计一个高速公路多节点温度采集系统  第53张

4.2.5数据上报测试

为了验证转发规则能否生效,接下来利用MQTT客户端多上报几次数据到云平台。

带你动手设计一个高速公路多节点温度采集系统  第54张

上传之后,翻开OBS存储桶的控造台页面。翻开转发规则存储的OBS桶。

带你动手设计一个高速公路多节点温度采集系统  第55张

找到存储数据的文件,点击下载。

带你动手设计一个高速公路多节点温度采集系统  第56张

下载下来,翻开能够看到存储的数据:

带你动手设计一个高速公路多节点温度采集系统  第57张

到此,数据转发,存储已经胜利了。

五、应用侧-可视化大屏开发

关于数据的可视化显示,华为云供给了(Data Lake Visualization)一站式数据可视化平台,数据可视化办事(DLV)能够从OBS文件读取数据呈现为可视化报表,实现数据的可视化显示。

下面是华为云的DLV大屏从OBS读取数据显示的流程:

带你动手设计一个高速公路多节点温度采集系统  第58张

当前我那里的需求是需要在当地本身设想界面显示数据,没有接纳华为云的DLV大屏,若是本身当地软件需要显示设备上传的数据,就需要利用华为云物联网的平台的应用侧API接口,读取设备上传的数据停止,当地停止显示;若是需要汗青数据,能够读取OBS存储桶里存储的数据停止显示。

5.1 应用侧接口

帮忙文档地址: https://support.huaweicloud.com/usermanual-iothub/iot_01_0045.html

带你动手设计一个高速公路多节点温度采集系统  第59张

5.2 查询设备影子数据接口

应用侧接口能够查询发送指令给设备查询属性,也能够读取设备的影子数据。

【1】查询设备查询: 那个是实时查询,相当于应用侧接口发送指令给在线设备,设备收到指令,将当前最新的数据再上传。那个需要包管设备在线,离线是无法挪用的。

【2】影子数据:影子数据相当于保留设备上传的最新一次数据。 读取读取影子设备数据,是不需要设备在线。

5.2.1接口URI地址带你动手设计一个高速公路多节点温度采集系统  第60张

5.2.2恳求参数申明带你动手设计一个高速公路多节点温度采集系统  第61张

5.2.3响应参数带你动手设计一个高速公路多节点温度采集系统  第62张

带你动手设计一个高速公路多节点温度采集系统  第63张

带你动手设计一个高速公路多节点温度采集系统  第64张

5.2.4恳求示例 GET https://{Endpoint}/v5/iot/{project_id}/devices/{device_id}/shadow Content-Type: application/json X-Auth-Token: ******** Instance-Id: ********5.2.5响应示例

Status Code: 200 OK

Content-Type: application/json ​ { "device_id" : "40fe3542-f4cc-4b6a-98c3-61a49ba1acd4", "shadow" : [ { "service_id" : "WaterMeter", "desired" : { "properties" : { "temperature" : "60" }, "event_time" : "20151212T121212Z" }, "reported" : { "properties" : { "temperature" : "60" }, "event_time" : "20151212T121212Z" }, "version" : 1 } ] }5.2.6错误码带你动手设计一个高速公路多节点温度采集系统  第65张

5.3 接口调试

在线调试地址:https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=IoTDA&api=ShowDeviceShadow

下面是调试影子 数据查询接口,查询设备影子数据: 右边返回的是设备上传的最新数据。

带你动手设计一个高速公路多节点温度采集系统  第66张

5.4 接口总结 恳求地址: https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/{project_id}/devices/{device_id}/shadow ​ 恳求体例: GET ​ 恳求头: { "X-Auth-Token": "那个需要本身获取", "Content-Type": "application/json" }5.5 若何获取X-Subject-Token

利用API拜候华为云的所有办事接口,都需要填X-Subject-Token参数,下面介绍步调:

5.5.1创建一个新的IAM帐户

鼠标悬停在右上角的用户名称上,弹出下拉框,选择同一身份认证。

带你动手设计一个高速公路多节点温度采集系统  第67张

5.5.2选择创建用户带你动手设计一个高速公路多节点温度采集系统  第68张

带你动手设计一个高速公路多节点温度采集系统  第69张

带你动手设计一个高速公路多节点温度采集系统  第70张

带你动手设计一个高速公路多节点温度采集系统  第71张

5.5.3利用调试接口测试获取oken

调试接口地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=IAM&api=KeystoneCreateUserTokenByPassword

带你动手设计一个高速公路多节点温度采集系统  第72张

右边响应头里的X-Subject-Token就是获取的token。

带你动手设计一个高速公路多节点温度采集系统  第73张

5.5.4上面的那些账户名称从哪里获取?带你动手设计一个高速公路多节点温度采集系统  第74张

带你动手设计一个高速公路多节点温度采集系统  第75张

5.5.5恳求地址和数据格局

获取X-Subject-Token恳求的地址: https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens

恳求头数据:

{ "User-Agent": "API Explorer", "X-Auth-Token": "******", "Content-Type": "application/json;charset=UTF-8" }

恳求体数据:

{ "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "domain": { "name": "xxxxx" //那里填当前主账户名称 }, "name": "xxxx", //那个新建的子账户名称 "password": "xxxxx" //那个是新建的子账户密码 } } }, "scope": { "project": { "name": "cn-north-4" } } } }5.5.6代码实现 /* 功用: 获取token */ void Widget::GetToken() { //暗示获取token function_select=3; QString requestUrl; QNetworkRequest request; //设置恳求地址 QUrl url; //获取token恳求地址 requestUrl = QString("https://iam.%1.myhuaweicloud.com/v3/auth/tokens") .arg(SERVER_ID); //本身创建的TCP办事器,测试用 //requestUrl="http://10.0.0.6:8080"; //设置数据提交格局 request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=UTF-8")); //构造恳求 url.setUrl(requestUrl); request.setUrl(url); QString text =QString("{"auth":{"identity":{"methods":["password"],"password":" "{"user":{"domain": {" ""name":"%1"},"name": "%2","password": "%3"}}}," ""scope":{"project":{"name":"%4"}}}}") .arg(MAIN_USER) .arg(IAM_USER) .arg(IAM_PASSWORD) .arg(SERVER_ID); //发送恳求 manager->post(request, text.toUtf8()); }5.6 查询设备影子数据代码5.6.1那是恳求代码 //查询设备属性 void Widget::Get_device_properties() { //暗示获取token function_select=0; ​ QString requestUrl; QNetworkRequest request; ​ //设置恳求地址 QUrl url; ​ //获取token恳求地址 requestUrl = QString("https://iotda.%1.myhuaweicloud.com/v5/iot/%2/devices/%3/shadow") .arg(SERVER_ID) .arg(PROJECT_ID) .arg(device_id); ​ //设置数据提交格局 request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json")); ​ //设置token request.setRawHeader("X-Auth-Token",Token); ​ //构造恳求 url.setUrl(requestUrl); ​ request.setUrl(url); ​ //发送恳求 manager->get(request); } ​ //更新设备属性 void Widget::on_pushButton_update_device_clicked() { Get_device_properties(); }5.6.2那是恳求一次返回的JSON数据 { "device_id": "6353a8163ec34a6d03c8dfe5_dev1", "shadow": [ { "service_id": "temp", "desired": { "properties": null, "event_time": null }, "reported": { "properties": { "temp": 45.6 }, "event_time": "20221024T013607Z" }, "version": 49 } ] }5.7 界面设想最末效果带你动手设计一个高速公路多节点温度采集系统  第76张

六、硬件部门6.1 MQTT版本

留意:华为云、OneNet、腾讯IOT 等平台规定接入的MQTT协议版本必需是3.1.1 。

在BC26里,需要施行那行代码设置装备摆设MQTT协议版本为3.1.1

AT+QMTCFG="version",0,46.2 BC26上云设置装备摆设代码 #include "BC26.h" ​ //BC26复位 //引脚是PC0 //高电平有效 void BC26_Reset(void) { //开时钟 RCC->APB2ENR|=1<<4; ​ //设置装备摆设GPIO口 GPIOC->CRL&=0xFFFFFFF0; GPIOC->CRL|=0x00000003; //起头复位 GPIOC->ODR|=1<<0; DelayMs(2000); GPIOC->ODR&=~(1<<0); } ​ ​ /* 函数功用:向BC26模块发送指令 函数参数: char *cmd 发送的号令 char *check_data 检测返回的数据 返回值: 0暗示胜利 1暗示失败 */ u8 BC26_SenDCmd(char *cmd,char *check_data) { u16 i,j; for(i=0;i<5;i++) //测试的总次数 { USART2_RX_FLAG=0; USART2_RX_CNT=0; memset(USART2_RX_BUFFER,0,sizeof(USART2_RX_BUFFER)); USARTx_StringSend(USART2,cmd); //发送指令 for(j=0;j<500;j++) //期待的时间(ms单元) { if(USART2_RX_FLAG) { USART2_RX_BUFFER[USART2_RX_CNT]='\0'; if(strstr((char*)USART2_RX_BUFFER,check_data)) { return 0; } else break; } delay_ms(30); //一次的时间 } } return 1; } ​ ​ ​ ​ //初始化BC26模块 int BC26_Init(void) { if(BC26_SendCmd("AT\r\n","OK")) { USART1_Printf("BC26模块不存在.\r\n"); return 1; } else { USART1_Printf("BC26模块一般!\r\n"); } ​ if(BC26_SendCmd("AT+CIMI\r\n","OK")) { USART1_Printf("模块未插卡.\r\n"); return 3; } else { USART1_Printf("卡已经插好.\r\n"); } ​ if(BC26_SendCmd("AT+CGATT=1\r\n","OK")) { USART1_Printf("设置装备摆设:收集激活失败.\r\n"); return 3; } else { USART1_Printf("设置装备摆设:收集激活胜利.\r\n"); } if(BC26_SendCmd("AT+CGATT?\r\n","OK")) { USART1_Printf("形态:收集激活失败.\r\n"); return 4; } else { USART1_Printf("形态:收集激活胜利.\r\n"); } if(BC26_SendCmd("AT+CSQ\r\n","OK")) { USART1_Printf("查询信号量量失败.\r\n"); return 5; } else { USART1_Printf("信号量量:%s\r\n",USART2_RX_BUFFER); } // if(BC26_SendCmd("AT+QGNSSC=1\r\n","OK")) // { // USART1_Printf("激活GPS定位失败.\r\n"); // return 6; // } // else // { // USART1_Printf("激活GPS定位胜利.\r\n"); // } // // if(BC26_SendCmd("AT+QGNSSAGPS=1\r\n","OK")) // { // USART1_Printf("开启AGPS定位失败.\r\n"); // return 6; // } // else // { // USART1_Printf("开启AGPS定位胜利.\r\n"); // } // // if(BC26_SendCmd("AT+CGPADDR=1\r\n","OK")) // { // USART1_Printf("激活GPRS场景失败.\r\n"); // return 7; // } // else // { // USART1_Printf("激活GPRS场景胜利.\r\n"); // } // // DelayMs(1000); // DelayMs(1000); if(BC26_SendCmd("AT+CEREG?\r\n","+CEREG: 0,1")) { USART1_Printf("收集注册形态:失败.\r\n"); return 9; } else { USART1_Printf("收集注册形态:胜利.\r\n"); } return 0; } ​ ​ //发送利用的缓冲区 char BC26_SEND_BUFF[500]; ​ //MQTT协议登录办事器 int BC26_MQTT_Connect(void) { //1. 先封闭之前的毗连 USART1_Printf("正在封闭之前的毗连...\r\n"); BC26_SendCmd("AT+QMTCLOSE=0\r\n","OK"); DelayMs(4000); //封闭办事 BC26_SendCmd("AT+QMTCONN?\r\n","OK"); DelayMs(4000); //2. 毗连MQTT办事器 USART1_Printf("正在毗连MQTT办事器..\r\n"); sprintf(BC26_SEND_BUFF,"AT+QMTOPEN=0,"%s",%s\r\n",MQTT_SERVER_ADDR,MQTT_SERVER_PORT); if(BC26_SendCmd(BC26_SEND_BUFF,"OK")) { USART1_Printf("MQTT办事器毗连失败:%s\r\n",BC26_SEND_BUFF); return 1; } else { USART1_Printf("MQTT办事器毗连胜利.\r\n"); } DelayMs(3000); //3. 登录MQTT办事器 USART1_Printf("正在登录MQTT办事器...\r\n"); sprintf(BC26_SEND_BUFF,"AT+QMTCONN=0,"%s","%s","%s"\r\n",MQTT_CLIENT_ID,MQTT_USERNAME,MQTT_PASSWORD); if(BC26_SendCmd(BC26_SEND_BUFF,"OK")) { USART1_Printf("MQTT办事器登录失败:%s\r\n",BC26_SEND_BUFF); return 2; } else { USART1_Printf("MQTT办事器登录胜利.\r\n"); } DelayMs(3000); //4. 订阅主题 USART1_Printf("正在订阅主题...\r\n"); sprintf(BC26_SEND_BUFF,"AT+QMTSUB=0,1,"%s",2\r\n",MQTT_TOPIC_SUB_GET); if(BC26_SendCmd(BC26_SEND_BUFF,"OK")) { USART1_Printf("MQTT主题订阅失败:%s\r\n",BC26_SEND_BUFF); } else { USART1_Printf("MQTT主题订阅胜利.\r\n"); } return 0; } ​ ​ //MQTT发布主题 int MQTT_PublishTheme(char *text) { char send_buf[3]; sprintf(BC26_SEND_BUFF,"AT+QMTPUB=0,0,0,0,"%s"\r\n",MQTT_TOPIC_SUB_SET); if(BC26_SendCmd(BC26_SEND_BUFF,">")) { USART1_Printf("发布主题期待输入失败:%s\r\n",BC26_SEND_BUFF); return 1; } USARTx_StringSend(USART2,text); //发送主题内容 //发送完毕符 send_buf[0] = 0x1a; send_buf[1] = '\0'; if(BC26_SendCmd(send_buf,"OK")) { USART1_Printf("发布主题内容失败:%s\r\n",BC26_SEND_BUFF); return 2; //发送完毕符号 } else { USART1_Printf("发布主题内容胜利.\r\n"); } USART1_Printf("发布主题内容:%s\r\n",text); return 0; } ​ //MQTT响应应用层的属性恳求 int MQTT_SendAttribute(char *text,char *request_id) { char send_buf[3]; sprintf(BC26_SEND_BUFF,"AT+QMTPUB=0,0,0,0,"%s%s"\r\n",MQTT_TOPIC_SUB_SET_RUN,request_id); if(BC26_SendCmd(BC26_SEND_BUFF,">")) { USART1_Printf("(响应)发布主题期待输入失败:%s\r\n",BC26_SEND_BUFF); return 1; } USARTx_StringSend(USART2,text); //发送主题内容 //发送完毕符 send_buf[0] = 0x1a; send_buf[1] = '\0'; if(BC26_SendCmd(send_buf,"OK")) { USART1_Printf("(响应)发布主题内容失败:%s\r\n",BC26_SEND_BUFF); return 2; //发送完毕符号 } else { USART1_Printf("(响应)发布主题内容胜利.\r\n"); } USART1_Printf("(响应)发布主题内容:%s\r\n",text); return 0; } ​ ​ ​ /* 函数功用: 获取一次GPS经纬度数据 函数参数: double *Longitude :经度 double *latitude :纬度 返回值: 0暗示定位胜利,1暗示数据领受失败,2暗示定位失败 */ u8 BC26_GetGPS_Data(double *Longitude,double *latitude) { /*1. 发送获取GPS数据的指令*/ if(BC26_SendCmd("AT+QGNSSRD="NMEA/RMC"\r\n", "OK\r\n"))return 1; /*2. 对GPS数据停止解码*/ if(GPS_GNRMC_Decoding((char *)USART2_RX_BUFFER,Longitude,latitude))return 2; //解码胜利 return 0; } ​ ​ /* 函数功用: 开启GPS功用 返 回 值:0暗示胜利 1暗示失败 */ u8 BC26_StartGPS(void) { //先判断GPS功用能否启动 if(BC26_SendCmd("AT+QGNSSC?\r\n","+QGNSSC: 1")) { //没有启动就启动GPS功用 if(BC26_SendCmd("AT+QGNSSC=1\r\n","OK\r\n")) { USART1_Printf("开启GPS功用失败.\r\n"); return 1; //GPS功用启动失败 } else { USART1_Printf("开启GPS功用胜利.\r\n"); } } return 0; }6.3 MQTT 3.1协议介绍

地址: http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html

标准共分七章:

第一章 - 介绍第二章 - MQTT控造包格局第三章 - MQTT控造包、第四章 - 操做行为第五章 - 平安第六章 - 利用WebSocket停止收集传输第七章 - 一致性目的

点击下方,第一时间领会华为云新颖手艺~

华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云