首页 > 代码库 > 国内物联网平台初探(八):中移物联网开放平台OneNet
国内物联网平台初探(八):中移物联网开放平台OneNet
平台定位
OneNET是中移物联网有限公司搭建的开放、共赢设备云平台,为各种跨平台物联网应用、行业解决方案,提供简便的云端接入、存储、计算和展现,快速打造物联网产品应用,降低开发成本。
IoT PaaS基础能力:提供智能设备自助开发工具、后台技术支持服务、物联网专网、短彩信、位置定位、设备管理、消息分发、远程升级等基础服务
SaaS业务服务:提供第三方应用开发平台,快速实现不同业务需求,借助轻应用孵化器快速搭建Web和APP应用
IoT数据云:提供高扩展的数据库、实时数据处理、智能预测离线数据分析、数据可视化展示等多维度的业务运营服务
开发者社区:高频的开发者社区,汇聚着不同的知识源,集合更多的物联网爱好者,让项目与开发成果开始传播
架构
作为PaaS层,OneNET为SaaS层和IaaS层搭建连接桥梁,分别向上下游提供中间层核心能力。
应用场景
平台功能
平台信息模型
术语介绍
-
产品ID(Product ID, PID)
- 产品ID是指由OneNET后台为您的某一款真实产品分配的一个独立的ID号,如果您旗下的某一款产品有两款不同的系列(如Iphone7/Iphone7 PLUS),那么建议创建两款产品来分别获得两个产品ID。
-
APIKey
- 用于对OneNET进行操作的鉴权以及权限控制,在使用OneNET Restful API时,HTTP请求消息的头域必须携带该APIKey字段,OneNET会依据APIKey字段判别该用户是否具有对应操作的权限。
- APIKey的权限模型是通过设定对云端资源是否可以增加、查看、修改、删除等方式来描述的,最低的权限级别可细化到对某个数据流的访问权限。APIKey分为两种:
- 1. 产品APIKey:在创建产品时,OneNET会为该产品生成一个默认的APIKey,这个APIKey是Masterkey,具有最大权限,能够对本产品下所有资源进行访问。
- 2. 设备APIKey:用户为某一产品下的某一台设备创建的Key称为设备APIKey,设备APIKey的作用权限只限于本设备的资源,而不能对其他设备进行访问操作。
-
设备
- 云端的"设备"是指在上面提到的"产品"下的实体,亦指用户的某一台真实设备在OneNET上对应的唯一的虚拟名称。
-
设备ID(Device ID, DID)
- 设备ID是指由OneNET后台为您的某一台真实设备分配的一个独立且唯一的ID号,一款产品下可以有多台设备,每一台独立的设备都有唯一的设备ID。
-
注册码 (Register code)
- 一个产品拥有唯一一个注册码,在API中作为参数,用于设备注册。
-
设备编号
- 用户在OneNET上创建设备时,如果设备接入协议选择HTTP,则需要填写"设备编号"。设备编号是每一台真实设备所拥有的唯一识别号,不需要OneNET后台分配,用户可以自定义设备编号,但必须保证每台设备之间的独立性和唯一性,建议用户在输入设备编号时采用原有产品线的序列号。
-
鉴权信息(Auth_info)
- 用户在OneNET上创建设备时,如果设备接入协议选择EDP或者MQTT,则需要填写"鉴权信息"。鉴权信息是每一台真实设备所拥有的唯一识别号,不需要OneNET后台分配,用户可以自定义鉴权信息,但必须保证每台设备之间的独立性和唯一性,建议用户在输入鉴权信息时采用原有产品线的序列号或者MAC地址。
-
SN(serial number,序列号)
- 即每台真实设备的唯一识别号,由用户自己提供,其作用在于实现设备绑定功能。
- 请注意:本质上来说,设备编号、鉴权信息以及SN都表示用户的每一台真实设备所具有的唯一的并且独立的身份标识码,其作用都是一样的,用于OneNET据此来准确定位是哪款产品下的哪一台设备,之所以没有对它们进行统一称呼,其原因在于采用不同协议方式接入设备时,后台部分系统因为规划原因,原组件普遍保持本协议下的定义方式,因此接口中仍沿用初始写法,您只需要知道从作用上来讲:设备编号=鉴权信息=SN就可以了。
-
数据流(Datastream)
- 一个数据流可以理解为一类数据,如传感器之温度、位置之经纬度,空气之湿度等。用户可以自定义数据流名称,即数据流ID;一个设备可以添加多个数据流。
-
数据点(Datapoint)
- 即一个数据流中的一个具体的数据值。数据点采用"Key-Value"的方式存储。其中Key的组成包括设备ID、数据流ID、时间等信息,value部分可以为任何数据对象,如整数、字符串或者JSON数据类型。
-
SDK
- 标准协议产品SDK:用于设备接入协议为公开协议的终端侧软件开发包,OneNET提供多种语言的SDK,提供设备连接、数据上传等基本功能。
- 私有协议产品SDK:使用私有协议接入设备时,OneNET将根据开发者定义的设备数据模型自动生成SDK源码,开发者将SDK嵌入到设备中,自动实现与平台的对接。OneNET提供私有协议产品的SDK全源码。
总体接入流程
设备接入
-
在OneNET平台上创建产品
- 在产品中创建设备,为设备新增数据流。
- 设备端编写终端接入代码,主要完成数据采集、协议封装、数据上传等工作。
- 终端设备的数据上传成功后,平台在相应数据流下会生成随时间推移的数据点。
- 为了更直观的呈现数据的变化情况,用户可以运用应用孵化器自定义个性化应用并发布。
- 设备可通过私有协议和标准协议与平台对接
-
私有协议说明:
- RGMP(remote gateway management protocol)是平台的私有协议,平台不提供协议报文说明,根据开发者定义的设备数据模型,平台将自动生成SDK源码,开发者将SDK嵌入到设备中,实现与平台的对接。
-
标准协议说明:
- 包括HTTP,EDP,MQTT,MODBUS,JT/T808。 平台提供每种协议的报文说明文档,开发者可以根据文档自己实现设备与平台对接的协议,也可以用平台提供的相应协议SDK实现与平台的对接。
标准协议 – EDP协议
- EDP协议(Enhanced Device Protocol)是OneNET平台根据物联网特点专门定制的完全公开的基于TCP的长连接协议,提供设备接入、加密传输、数据存储等功能,协议的特点和功能包括:
-
长连接协议
终端数据点上报,支持的数据点类型包括- 整型(int)
- 浮点数(float)
- 字符串(string)
- JSON
- 二进制数据
- 平台数据下发
- 端到端数据转发
标准协议 – Modbus协议
- Modbus协议是应用于电子控制器上的一种通用工业标准协议。此协议支持传统的RS-232、RS-422、RS-485和以太网设备。典型工业设备包括 PLC、DTU等均使用Modbus协议作为它们之间的标准协议,协议的特点和功能包括:
- 长连接协议
- OneNET平台为Modbus主机
- 通过单条数据流的属性确定单条下发命令的内容以及周期
- 自动将终端上报的数据转化为数据流中的数据点
标准协议 – MQTT协议
- MQTT协议是一个面向物联网应用的即时通信协议,使用TCP/IP提供网络连接,能够对负载内容实现消息屏蔽传输,开销小,可以有效降低网络流量,协议的特点和功能包括:
- 长连接协议
-
终端数据点上报,支持的数据点类型包括:
- 整型(int)
- 浮点数(float)
- 字符串(string)
- JSON格式
- 平台消息下发
- 基于Topic的订阅、发布以及消息推送,可以实现设备间的消息单播以及组播
标准协议 – HTTP协议
- OneNET支持设备采用HTTP 协议即遵循RestFul原则接入平台,协议具有接入鉴权、控制命令下发、告警出发等功能,适合平台与平台之间数据对接,其特点和功能包括:
- 短连接协议
-
终端数据点上报,支持的数据点类型包括:
- 整型(int)
- 浮点数(float)
- 字符串(string)
- JSON格式
- 二进制数据
- 平台侧相关资源管理
标准协议 – JT/T808协议
- OneNET基于JT/T808协议定义了一个扩展协议JTEXT,可以让已经基于JT/T808协议传输数据的设备快速接入平台,协议的特点和功能包括:
- 交通部定制的用于车辆动态监控的标准通信协议
- 设备和平台可以保持长连接,可及时检测设备的上/下线状态
- 标准的"位置信息汇报"等消息格式,方便已支持JT/T808协议的终端快速接入平台
- 基于"上/下数据透传"模式,可以灵活上传用户自定义的数据,查询数据最新响应
私有协议 – RGMP协议
- 为简化开发者的开发流程,提高用户设备数据传输的安全性,OneNET为设备接入平台提供了专门的私有协议,即RGMP协议(Remote Gateway Management Protocol)。
- RGMP 协议与公开协议最大的不同是OneNET平台不提供协议的报文说明,而是根据开发者定义的设备数据模型自动生成SDK源码,开发者将SDK嵌入到设备中,实现与平台的对接。
- RGMP协议具有业务数据格式灵活、数据传输紧凑高效以及实时性高等优点,其主要特点和功能包括:
- 私有的报文格式,保证数据安全性
- 远程配置更新
- 平台通知信息下发
- 远程固件升级(OTA)
-
终端数据点上报,支持的数据点类型包括:
- 整型(int)
- 浮点数(float)
- 字符串(string)
- 二进制数据
- 布尔值
第三方平台接入
- 用于开发者使用OneNET提供的数据推送和API服务来开发自己的个性化业务系统
-
在OneNET平台填写用于接收数据的第三方URL地址,该URL地址应为一个可达地址,并提供Token验证的get方法;
- Token值作为用户在OneNET上的身份标识,用于消息摘要
- 随机生成EncodingAESKey和选择消息加解密方式后
- 对已配置成功的配置内容,用户可进行编辑、修改操作
第三方平台接入 - 数据推送消息格式
- 平台以HTTP POST请求形式向第三方平台注册地址推送数据,推送数据相关信息以JSON串的形式置于HTTP请求中的body部分。
- 第三方平台在接收数据时,根据加密选择,会接收到数据的明文消息或者密文消息。
-
明文格式
- 根据msg部分type字段的不同,可分为数据点消息、设备上下线消息
- 在明文传输时,存在msg、msg_signature、nonce字段,分别表示明文传输的数据、msg部分的消息摘要、用于摘要计算的随机字符串
-
密文格式
- 在加密传输时,存在enc_msg、msg_signature、nonce字段,enc_msg字段表示加密传输的数据,后两字段与明文传输一致
第三方平台接入 - 加解密方案
- 平台基于AES算法提供加解密技术
- EncodingAESKey即消息加解密Key的BASE64编码形式,长度固定为43个字符,从a-z,A-Z,0-9共62个字符中选取。由服务开启时填写,后也可申请修改。
- AES密钥计算为 AESKey=Base64_Decode(EncodingAESKey + "="),EncodingAESKey尾部填充一个字符的"=", 用Base64_Decode生成32个字节的AESKey。
- AES采用CBC模式,秘钥长度为32个字节(256位),数据采用PKCS#7填充 ,初始化iv向量取秘钥前16字节;
PKCS#7:K为秘钥字节数(采用32),buf为待加密的内容,N为其字节数。Buf 需要被填充为K的整数倍。在buf的尾部填充(K-N%K)个字节,每个字节的内容 是(K- N%K)。
具体详见:http://tools.ietf.org/html/rfc2315 - BASE64采用MIME格式,字符包括大小写字母各26个,加上10个数字,和加号"+",斜杠"/",一共64个字符,等号"="用作后缀填充;
出于安全考虑,平台网站提供了修改EncodingAESKey的功能(在EncodingAESKey可能泄漏时进行修改,对应上第三方平台申请时填写的接收消息的加密对称密钥),所以建议保存当前的和上一次的EncodingAESKey,若当前EncodingAESKey生成的AESKey解密失败,则尝试用上一次的AESKey的解密。 - 平台的加密消息部分为enc_msg= Base64_Encode( AES_Encrypt[random(16B)+msg_len(4B)+msg] ),即以16字节随机字节串拼接4字节表示消息体长度的字节串(此处4字节长度表示为网络字节序),再加上消息本身的字节串作为AES加密的明文,再以AES算法对明文进行加密生成密文,最后对密文进行BASE64的编码操作生成加密消息体。
- 对加密消息体的解密流程为:1)首先进行加密消息体的BASE64解码操作,aes_msg=Base64_Decode(enc_msg);2)对获取的解码内容以AES算法进行解密操作,获取明文部分,plain_msg=AES_Decrypt(aes_msg),解密中使用的秘钥由EncodingAESKey计算得来,使用的初始化iv向量为计算出的aes秘钥的前16字节;3)去掉plain_msg的前16字节,再以前4字节取出消息体长度,根据消息体长度获取真实的消息部分(推荐以消息体长度获取真实消息,以兼容plain_msg未来可能出现的结构变更)。
第三方平台接入 - 摘要计算方案
- 为了验证消息体的合法性,每一条平台推送消息中包含了消息签名,第三方可用以验证消息体的真实性,明文消息对msg部分整体进行摘要计算,密文消息对enc_msg部分整体进行摘要计算。具体做法如下:
- msg_signature=Base64(md5(sort(token+ nonce+ enc_msg/msg))),即按token、nonce(8字节随机串)、消息体(明文或密文)的顺序以字节为单位拼接为一个整体,计算其md5值并按BASE64编码做为消息摘要。验证时,取出nonce部分计算收到消息的md5值,计算相应的BASE64编码,与收到的msg_signature进行比较,即可知道是否存在消息篡改。
第三方平台接入 - 开放API
OneNet提供以下类别的开放API
- 设备
- 数据流
- 数据点
- 触发器
- 二级制数据
- 命令
- MQTT相关
命令是指应用发送命令数据给OneNet设备云、再由OneNet设备云转发给终端设备、终端设备收到命令后可以向设备云反馈响应的一种工作机制。
命令下发后,应用可以通过API查询命令状态和提取命令的响应数据。
命令的执行步骤如下:
1、 应用通过API向设备云发送命令数据;
2、 设备云生成该命令的uuid作为该命令的唯一标识并向应用返回,同时向终端设备转发命令数据;
3、 终端设备收到命令数据后执行命令数据,可以生成响应,也可以不响应;
4、 设备云跟踪记录命令的响应,如果设备有响应,就关联命令uuid和响应结果;
5、 应用通过API向设备云提取命令执行结果(API请求中携带命令uuid标识)。
平台界面 – 创建产品
平台界面 – 创建设备
平台界面 – 添加数据流
平台界面 – 添加触发器
用户可以用触发器对数据流进行监控,实现特定条件的事件告警,目前触发器支持以短信、邮件以及用户提供的URL地址三种途径推送事件告警信息。用户事先设定好所要监控的数据流、事件触发条件、告警信息的接受方式,一旦监控的数据流数据满足设定的条件,触发器就会以设定的接受方式发送告警信息
平台界面 – 添加应用
用户可以为设备下的数据流创建相关的应用,发布对用户数据的直观展示页面,目前在OneNET应用孵化器中提供了曲线图、柱状图、表盘、物体位置、图片和开关等应用,用户添加应用进行数据展示的前提是用户数据已经上传至平台。
国内物联网平台初探(八):中移物联网开放平台OneNet