阿里云物联网平台使用

数据的流程

数据从节点设备产生,到用户自己的服务器这一过程,我们把它分为两部分。前半部分是节点设备产生数据,经过网络传递到阿里云物联网平台,这一过程使用MQTT协议。后半部分则有阿里云物联网平台将数据转交给阿里云的其他产品,如用户自己的云平台。

节点接入的两种方式。
资源受限的节点设备。
使用Paho MQTT Client协议栈接入
没有TLS
透传模式
MQTT通信协议与服务器约定:

  • 消息负载的二进制表达
  • 消息主题

资源丰富的节点设备。
使用Linkkit SDK接入
FreeRTOS,Json,TLS
物模型
MQTT通信协议安装物模型规定(解耦设备端与应用端开发)

Web 后端
基于阿里云物联网平台HTTP/2 SDK订阅设备数据
使用SpringBoot + Mybatis轻量级框架可开发服务端逻辑
MySQL存储设备数据

Web 前端
React
Umi.js Antd 框架组件
dva.js数据管理
Bizcharts数据可视化
定时向后端请求数据

软件
STM32CubeMX
IAR Embedded Workbench
Pahoo MQTT Client Stack
Linkkit C-SDK
MbedTLS
FreeRTOS

JDK 8
Intellij IDEA
Node.js
MySQL
Navicat for MySQL
VSCode
Git

MQTT

MQTT 介绍

MQTT(消息队列遥测传输)是一种基于TCP开发的协议,工作在应用层,使用异步通信模式,解耦通信双方。

MQTT协议具有许多优点,如可靠性,双向传输性,低开销,有序性,低带宽等,采用发布订阅模式。

MQTT协议中包含了四类关键字。

客户端(client)
服务器端/代理(server/broker)

会话(session)

消息(message)
主题(Topic)

订阅(subscribe)
发布(publish)

角色:代理,负责收发数据;发布者,发布消息到代理;订阅者,订阅消息,接收代理推送的消息。

发布者和订阅者通过不同的Topic进行消息的双向传输。二者可以从Topic中发布和订阅消息。

每个产品会定义Topic类,下属的所有设备都会生成相应的Topic。例如某设备的气压,温度,湿度等Topic。

MQTT 协议格式

主题:主题具有层级结构,支持通配符。通配符有单级通配符+与多级通配符#

连接与会话:连接由客户端发起,服务器根据连接参数(客户端ID,用户名,密码,心跳间隔,消息-主题-遗嘱,会话保持等)对客户端鉴权和授权,连接参数也将决定此次会话是否是持久会话。

MQTT报文格式:
固定报头:2~5 Bytes,是所有报文必须包含的(MSB在前,LSB在后)。

4 bits 1 bit 2 bits 1 bit 1 ~ 4 Bytes
Message Type UDP QoS Level RETAIN Remaining Length

可变报头:长度由Remaining Length决定;

有效载荷:长度由Remaining Length决定。

Message Type:共14种。
UDP,QoS Level,RETAIN:只有PUBLISH报文使用。
QoS:
0 – 最多收到一次,接收方不产生应答;
1 – 最少收到一次,接收方返回PUBACK报文;
2 – 保证仅收到一次,且消耗资源较大。
RETAIN:当客户端发送的消息中Retain置位,则服务器保留该条消息以及QoS级别,当有新的订阅发生,并与该消息主题一致,服务器就会马上把该Retain置位的消息转发给订阅者(相当于给订阅者写了留言,订阅者一上线就收到了这条消息)。服务器仅保留最近一个Retain置位的消息。删除Retain置位的消息是通过客户端发送一条Payload为空的Retain为空的消息。
Remaining Length:决定可变报头与有效载荷的总长度。

CONNECT – 连接报文(0x01):

  • 可变报头

|2 Bytes|4 Bytes|1 Byte|1 bit|1 bit|1 bit|2 bits|1 bit|1 bit|1 bit|2 Bytes|
|–|–|–|–|–|–|–|–|–|–|
|可变报头长度|MQTT|版本(0x03)|用户名Flag|密码Flag|Will Retail|Will QoS|Will Flag| Clean Session|保留|Keep Alive Timer|

标志位 为 1 时表示负载中包含该部分信息。

  • 负载
1 Byte 1 Byte 1 Byte 1 Byte 1 Byte
Client Indentifier Will Topic Will Message 用户名 密码

遗嘱(Will):是连接服务器时告诉服务器的消息,服务器会保存这些消息。当连接意外断开时,服务器会将遗嘱消息转发给所有订阅该设备上Topic的设备。

SUBSCRIBE – 订阅报文(0x08):

  • 可变报头
2 Bytes
Message ID
  • 负载
2 Bytes N Bytes 6 bits 2 bits
Topic name String Length Topic Name 保留 QoS Level

QoS Level:作用于服务器到客户端的下行链路。

PUBLISH – 发布报文(0x03):

  • 可变报头
2 Bytes N Bytes 2 Bytes
Topic name String Length Topic Name Message ID
  • 负载
N Bytes
Publish Message(可选)

QoS Level:作用于客户端到服务器的上行链路。

UNSUBSCRIBE – 取消订阅(0xA):
有可变头部和负载

PINGREQ – 发送心跳(0xC):
无可变头部和负载

DISCONNECT – 断开连接(0xE):
无可变头部和负载

阿里云物联网平台

物联网体系

应用层

应用层主要包括了关于物联网的Web应用,例如智慧交通,智能家居等服务端应用,也包括物联网应用接口。

在阿里云物联网体系中还加入了阿里云物联网平台作为物联网应用的总接口。

网络层

终端与应用层的各个应用通信,需要借助网络。例如:2/3/4G,NB-IoT,WiFi,蓝牙,LoRaWAN等。

感知层

包括物联网终端设备,例如传感器,芯片,控制器,通信模组等。

平台功能

设备接入:支持多种通信协议,提供多种通信协议SDK,即可满足长连接,也满足短连接,提供多种入网接入访问。
设备通信:可以实现双向通信。
设备管理:支持完整的设备声明周期管理,包括设备注册,功能定义,脚本解析,在线调试,远程配置,固件升级,远程维护,实时监控,分组管理,设备删除等。提供上下线通知,数据存储,OTA升级,设备影子缓存(用于解决不可靠网络通信问题)。
安全能力:一机一密的设备认证,安全级别高;一型一密的安全机制,安全级别普通。支持TLS(HTTP,MQTT),DTLS(CoAP),安全级别高;支持TCP(MQTT),UDP(CoAP),安全级别普通。
数据转发:可配置规则实现设备与设备的通信;支持消息转发至消息队列,表格存储,流计算,TSDB,函数计算等应用中。

另外还有:
服务端订阅设备消息:平台数据可以通过HTTP/2通道至服务器,并提供HTTP/2 SDK,实现数据订阅功能。服务器也可以使用SDK传输数据至平台。

产品

产品是设备的集合,指通常具有相同功能的一组设备。每一个产品都有一个ProductKey。

设备

归属于某个产品之下,指具体的某一个终端。每一个设备都有一个DeviceName。

设备直连

设备直接连接物联网平台。

网关连接

网关:网关是可以直接连接物联网平台的设备,可以拥有子设备。网关是代理子设备连接云端的设备。

子设备:只能通过网关连接平台。

三元组

平台会为每一台设备分配一个三元组。三元组内容如下:
ProductKey:产品标识,在全网具有唯一性。
DeviceName:设备标识,仅在产品维度内具有唯一性。
DeviceSecret:设备秘钥,与DeviceName成对出现。

认证方案

一共有三种认证方案:
一机一密:该方案要求设备事先烧录自己的三元组,在建立连接时,设备携带自己的三元组在平台上进行认证,认证通过后才可以传输数据。
一型一密:所有设备可以烧录相同的固件(ProductKey和DeviceName),设备在认证通过后接收自己的DeviceSecret。
子设备认证:网关联入平台后,子设备的认证方案。

通信模式

发布/订阅模式:平台维护所有的Topic的发布/订阅用户列表,当有发布者发布某Topic消息的时候,平台会在用户列表中查询所有订阅者,并将消息下发给订阅某Topic的订阅者。适用于非实时场景。

RRPC模式:基于MQTT协议封装的同步通信模式,服务端下发消息,设备可以同步得到响应。适用于实时场景。

设备声明周期管理

创建设备:在平台上创建设备。
激活设备:由设备申请激活。
启用设备:由平台控制设备的启用。
禁用设备:由平台控制设备的禁用。
删除设备:在平台上删除设备。

设备状态:可以查看设备是否激活,是否在线等。
设备标签:可以查看设备厂商、型号等。

物模型

属性:设备运行状态,支持GET与SET服务,应用可以发起对属性的读取和设置请求。
服务:设备可以被外部调用的方法,可以设置输入参数与输出参数。
事件:设备运行时的事件在感知外部和处理通知消息后等激发,可以包含多个输出参数,如设备故障、完成某任务的消息等。事件可以被订阅和推送。

消息流程

终端设备 <–> MQTT协议 <–> 阿里云平台 <–> HTTP/2协议 <–> 个人服务器 <–> HTTPS/HTTP <–> 浏览器,用户终端

设备管理

查看数据:支持一次数据快照与历史数据查看。
固件升级:支持OTA升级。

数据传输

Alink协议接入:用于设备与云端的双向通信,格式为Json。
透传接入:设备直接上传二进制数据,云端对数据进行解析,并转化为Alink协议的格式。

服务端订阅

配置HTTP/2服务端订阅后,物联网平台会将消息推送到服务端,服务端通过接入HTTP/2 SDK后就可以接收物联网平台的消息。HTTP/2 SDK提供身份认证,Topic订阅,消息发送和接收的能力,并支持设备接入和云端接入。HTTP/2 SDK即适用于服务端与平台传输大量信息,也支持设备与物联网平台之间的消息传输。

规则引擎

当设备基于Topic与平台进行消息通信时,用户可以通过规则引擎实现对设备数据的处理和转发,实现将数据转发至阿里云其他产品中。

转发支持转发到RDS,Table Store,HiTSDB等数据库,DataHub进行流计算、离线计算,函数计算,另一个Topic,消息队列五种形式。

设备端开发

设备端开发SDK包含:

  • C SDK
  • Android SDK
  • NodeJS SDK
  • Java SDK
  • Python SDK
  • iOS SDK

云端开发

云端开发SDK支持

  • Java
  • Python
  • PHP
  • .NET。

API 包含:

  • 产品管理
  • 设备管理
  • 分组管理
  • 规则引擎
  • Topic管理
  • 消息通信
  • 设备影子

温湿度传感器案例

功能描述

配置一个温湿度检测物联网终端设备,可以监测当前温湿度,可以配置温度阈值,当高于温度阈值时,发出报警。

设备方面:

  • 设备每5秒上报温湿度,闪烁绿灯;
  • 温度超过阈值,亮红灯,并每10秒向用户报警一次;
  • 收到用户解除警报信息后红灯闪烁;
  • 温度正常后,灭掉红灯。

平台方面:

  • 温湿度值转发到用户服务器,同时在Web端显示温湿度曲线;
  • 报警消息转发到用户服务器,在Web端显示;
  • Web页面可以解除警报。
  • Web页面可以设置阈值。

物模型

属性:

  • 当前温度
  • 当前湿度
  • 温度阈值

事件:

  • 属性达到上限
  • 温度超过阈值

服务:

  • 设置阈值
  • 获取属性值
  • 解除警报

项目流程

节点方面:

  • 初始化
    • 系统初始化
    • 平台初始化
    • MQTT连接参数计算
    • 连接阿里物联网平台
    • 订阅相关主题
  • 主循环
    • MQTT连接是否正常
    • 读取温湿度
    • 判断是否报警
    • 发布设备属性
  • MQTT订阅回调函数
    • 收到设置阈值Topic消息
      • 更新温度阈值
    • 收到解除警报Topic消息
      • 解除警报

阿里云IoT平台配置

打开阿里物联网云平台页面,登录并进入产品管理页面。点击创建产品,选择基础版,输入产品名称,选择设备,认证选择

进入设备页面,点击添加设备,输入设备名称,就可以生产三元组了。

回到产品页面,在Topic类列表定义Topic类实现自定义Topic。

服务端订阅设置设备上报消息设备状态变化通知,点击保存。

服务端应用开发

开发流程为:

  • 需求分析:功能、交互
  • 系统设计:UI设计、API设计、数据库设计
  • 编码开发:前端编码、后端编码
  • 联调测试:功能测试、交互测试
  • 系统运维:发布上线、持续运维

后端开发流程

  • 数据库设计
  • API 约定
  • 后端编写
  • 前后端联调
  • 部署上线运维

框架

  • MySQL
  • Mybatis:在Java中操作MySQL
  • SpringBoot:整合了MyBatis + SpringMVC等
  • Maven:跨平台项目管理工具

使用 IoT Studio 快速开发

在IoT Studio中,用户可以快速构建Web应用,手机APP,以及后端服务。

进入IoT Studio,选择开发服务新建项目,在项目产品项目设备关联自己的设备。

之后选择Web可视化开发移动应用开发,编辑相关内容,生成应用程序。例如生成Android App,经过几分钟编译打包后,在移动应用开发界面的设置构建管理中下载安装APP。