联通IoT自定义透传数据接入流程

联通IoT ULink自定义透传数据接入流程

联通平台支持自定义协议和ULink协议。产品开发流程见下图:

image

本文讨论的是用户通过自定义协议接入联通IoT平台实现自身业务平台。

一、创建产品

  1. 产品信息:产品名称,产品品类,型号,品牌。
  2. 节点类型:设备,网关,中继

产品信息和节点类型,根据自己的产品进行填写即可。

  1. 联网与数据:
    1. 联网方式:根据自己设备通信模组类型进行填写,这里我用的是测试模组是联通4G模块。
    2. 交互协议:根据设备模块支持的协议方式进行选择,这里我们选择MQTT。
    3. 数据格式:
      1. ULink:联通平台定义的ULink数据格式协议,采用Json格式,设备严格按照文档定义的Json格式进行组装和解析。
      2. 自定义:非ULink数据格式协议,比如我们用到的16进制协议。
    4. 功能参数校验格式:
      定义校验的模式,是否进行严格校验等。

image

二、创建设备

需要连接联通IoT平台的设备首先要在联通平台上创建设备。

image

  1. 所属产品:需要是创建过的产品
  2. 设备名称:根据需要自己定义
  3. 设备ID:设备的唯一标识,一般用设备的MAC地址或者IMEI号,序列号等。

根据以上描述,接入联通IoT的每个设备都需要创建设备,这个时候可以通过批量添加的方式。

image

录入设备成功后,会生成设备,在生成的设备详情里面,可以看到设备的属性。

image

  • 产品pk: 设备所属的产品pk
  • 设备ID: 设备的唯一标识ID
  • devSecret: 设备的连接密码,在后续的设备连接中需要用到进行设备登录验证。

三、调试开发

调试开发分为三个主体。

  1. 应用平台
  2. 联通IoT
  3. 设备端

本次调试,设备端和联通IoT平台之间通过mqtt客户端调试。

应用平台和联通IoT平台之间通过postman调试

1. 设备连接登录调试(设备->联通IoT->应用平台)

* 通过mqtt客户端模拟设备连接

设备连接联通IoT平台的情况下,默认是需要进行进行登录校验的,mqtt连接的时候携带密码。
而每个设备的密码password是根据devSecret生成的。
devSecret是在联通平台录入devId后IoT生产的。
对于大批量设备生产的情况下,设备devId需要先批量导入平台,然后再把生成的devSecret提供给工厂,工厂需要在设备出厂之前一个一个录入到设备端。

image
如果数据校验不要求太严格,可以设置设备登录安全校验为:不校验

image

这样的情况下,就不用关心设备的devSecret了。

设备端可以用mqtt客户端进行模拟。具体配置如下:

  • mqtt连接address和port根据上图所示即可
  • ClientID:组成方式如上图所示:dev:{pk}:{devId}

image

在不开启设备登录校验的情况下,如下图所示:

  • User Name:可以用devId
  • password:用随机的密码进行填充。

image

点击连接即可连接成功。

* 通过mqtt客户端模拟设备上报数据(publish)

image

如上图所示填入对应的topic即可,然后在消息输入栏输入想要上报的数据。

  • 通过mqtt客户端模拟设备接收订阅数据(subscribe)

image

subscribe同理,填入对应的topic。

关于设备端的topic,可以在设备的详情中查看,如下:

image

设备connect成功后,在平台可以看到设备默认会上报两条数据。

第一条是设备登出消息(devLogout)

第二条是设备登录消息(devLogin)

image

此消息是可以通过在产品端配置回调地址,推送给应用平台的,如下:

image

image

2. 设备数据上报调试(设备->联通IoT->应用平台)

首先设置数据回调地址:

image

然后在功能定义里面创建自定义参数和命令如下:

说明:本文讨论的是设备自定义数据,通过联通IoT平台透传裸数据到应用平台,应用平台将自定义的裸数据通过联通IoT平台下发到设备。端对端处理,双端保证数据纯净,联通IoT不参与数据处理。

image

image

创建好自定义参数后,在创建命令,需要将需要的参数放到对应的命令里。

这里的使用方法是,上报的数据,需要在ULink的Upload里面填充命令标识符。

如下消息格式:

image

如果在脚本中不把设备端上报的数据,组装成这个格式,则无法通过联通平台推送给应用平台。

我们此方法是将设备上报的数据组成标识符为:upload的命令。

参数填充到rawdata里面。

由于我们采用的是自定义数据格式上报,那么基本逻辑是:

  • 设备端上报自定义格式的联通IoT,比如16进制字符串(D1AA3412345ADFF),联通IoT平台收到后会放入数据解析脚本进行解析。

image

  • 根据脚本解析成功后,会转成联通IoT平台的ULink协议格式,即为自定义的参数和命令中的格式。

image

  • 联通IoT平台会把此消息根据ULink格式推送给订阅的URL地址

image

其中iot_sys_req字段则是经过联通转换成ULink的协议,作为整个字符串放入了iot_sys_req中。

iot_sys*_*params字段则是自定义参数rawdata。

按照我们设计,应用平台只需要对iot_sys*_*params的rawdata进行解析处理即可。

至此设备上报数据流程完成。

3. 应用平台下发数据到设备调试(设备->联通IoT->应用平台)

应用平台下发是通过HTTP进行下发的。

具体完整协议格式参考:https://unilink.wochanye.com/docs/content/%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/%E5%BA%94%E7%94%A8%E6%8E%A5%E5%85%A5.html

我们采用postman客户端来模拟应用平台的请求。

根据ULink协议描述,调用API接口是需要进行token认证的。

官方提供了Java的token组装示例。

python的token组装示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

import time
import hmac
import socket
import urllib
import http.client

from hashlib import sha1
from urllib import parse
from urllib.parse import quote

def hash_hmac_sha1(key, code):
hmac_code = hmac.new(key.encode(), code.encode(), sha1)
return hmac_code.hexdigest()


def get_str_sha1_secret_str(res:str):
import hashlib
"""
使用sha1加密算法,返回str加密后的字符串
"""
sha = hashlib.sha1(res.encode('utf-8'))
encrypts = sha.hexdigest()
print(encrypts)
return encrypts



accessKeyId = '6qF8AN78EYWq6TbIMqXVYQtj'
accessKeySecret = 'WqAxFbCJPut2nAfJJLOHPuXcZGr6bT'
path = '/api/device/cloudSend/bad23dbd1f73418786b03d5b15122fab/cmtest'
pathurl = quote(path, 'utf-8')
print("pathurl:" + pathurl)
t = time.time()
timestamp = str(round(t*1000))
print("timestamp:" + timestamp)
methodsha = 'SHA1'

data = path + '\n' + timestamp + '\n' + methodsha
#print(data)
sign= hash_hmac_sha1(accessKeySecret,data)
print("sign:" + sign)

token = "accessKey="+accessKeyId+"&path="+pathurl+"&timestamp="+timestamp+"&method="+methodsha+"&sign="+sign
print("tokenn:"+token)

生成token如下:accessKey=6qF8AN78EYWq6TbIMqXVYQtj&path=%2Fapi%2Fdevice%2FcloudSend%2Fbad23dbd1f73418786b03d5b15122fab%2Fcmtest&timestamp=1640588922745&method=SHA1&sign=fae5fecf14e192497815f909967bbb408c214fc3

生成完token之后,再通过postman进行调用api测试。

image

http消息body填充的json体是根据文档描述进行的:

image

而两个参数,cmd和params是根据之前创建的参数和命令进行填充。

联通IoT平台在收到消息后,会通过脚本将数据进行解析。

image

此脚本是将rawdata取出,返回出去,然后联通IoT下发给设备。

如此设备在订阅的地址即可收到应用平台下发的裸数据:D900AF0123456789123123123