模块介绍
cloud-data-channel
功能:
- 数据存储:将结构化数据存入MySQL,将图片数据存入FastDFS。
- 数据查询:经鉴权后对外提供数据查询服务(HTTPS),根据NodeId查询其终端设备上传的数据。数据经查询后设置过期时间,到期销毁。
- 证书颁发:给边缘edge-data-channel模块颁发证书,以便鉴权。
- 数据接收:对于可信任edge,鉴权后与其保持websocket长连接,配置连接池接收数据。
接口:
一、查询结构化数据接口
- 接口描述
- 名称:/getUserDeviceData
- 功能:根据请求头中的content-type类型判断请求数据类型,获取数据
- 请求方法: post
- 请求头:content-type :multipart/form-data、application/json
- 输入参数
| 参数名称 | 必选 | 值类型 | 描述 |
| -------------- | ---- | ------- | ----------------------------------------- |
| RequestId | 是 | String | 请求ID,UUID格式 |
| UserId | 是 | String | 用户ID |
| Token | 是 | String | 权限 |
| DeviceDataId | 否 | String | 数据ID |
| DeviceId | 否 | String | 设备ID |
| NumsOfData | 否 | int | 数据条数 |
其中,DeviceDataId和DeviceId必须二选一,若NumsOfData为空,默认取1。
对于图片数据,每次发送1条。 - 输出参数
成功返回:将查询到的数据结果传输到客户端。将RequestId,文件信息存入响应头。请求的数据直接通过conn传输。
失败返回:
| 参数名称 | 类型 | 描述 |
| ------------------ | ------ | -------- |
| Response | Map | 返回结果 |
| Response.RequestId | String | 请求ID |
| Response.Error | String | 错误信息 |
| Response.Error.Code | String | 错误码 |
| Response.Error.Message | String | 错误描述 |
输入:
{
"RequestId": "5ebf13a2-f925-4ba7-adff-ddbc21d355e3",
"UserId": "1",
"Token": 1,
"DeviceDataId": “1”,
"NumsOfData":"1",
}
二、获得edge上传的数据
- 名称:/getDataFromEdge
- 功能:wws+tls双向认证后,接收从edge上传的数据,根据协议头判断数据类型。解析协议后将数据存入mysql/go-fastdfs。
edge-data-channel
功能:
- 数据上传:与iot-cloud-data-channel模块建立webSocket连接,配置连接池。持续将数据(包括图片数据及结构化数据)push到云端。设计协议实现数据传输。根据消息头区分图片数据/结构化数据。其中,图片数据大小在500k左右。后续可动态调整。
- 证书颁发:给device设备颁发证书,以便鉴权。
- 数据接收:鉴权后提供接口使device端设备上传数据至edge,并通过自定http.header字段判断其数据类型,且根据其实际数据进行验证。接收数据后查看webSocket连接情况,如通信正常直接启动数据上传服务,如通信异常启动数据暂存服务,并持续发送心跳包,待通信正常时,将暂存数据都发往云端,并清空暂存数据。
- 数据暂存:设备上传至边缘后,能将数据暂存一段时间,并设置暂存数据的容量。如果超过容量仍有数据进入,则淘汰旧数据。
接口:
一、device上传数据至edge接口
- 接口描述
- 名称:/uploadDevieceData
- 功能:根据请求头中的content-type类型判断请求数据类型。
- 请求方法: post
- 请求头:content-type :multipart/form-data、application/json
- 自定义请求头:
| 参数名称 | 必选 | 值类型 | 描述 |
| -------------- | ---- | ------- | ----------------------------------------- |
| RequestId | 是 | String | 请求ID,UUID格式 |
| DeviceId | 是 |String | 设备ID |
| DeviceDataId | 是 |String | 数据ID |
输入参数
| 参数名称 | 必选 | 值类型 | 描述 |
| -------------- | ---- | ------- | ----------------------------------------- |
| Data | 是 | String | 所上传的数据 |输出参数
成功返回:
| 参数名称 | 类型 | 描述 |
| ------------------ | ------ | -------- |
| Response | Map | 返回结果 |
| Response.RequestId | String | 请求ID |
| Response.DeviceDataId | String | 数据ID |
失败返回:
| 参数名称 | 类型 | 描述 |
| ------------------ | ------ | -------- |
| Response | Map | 返回结果 |
| Response.RequestId | String | 请求ID |
| Response.Error | String | 错误信息 |
| Response.Error.Code | String | 错误码 |
| Response.Error.Message | String | 错误描述 |
输入:
{
"Data":"{"aaa":"1111"},...",
}
输出:
{
"Response": {
"RequestId": "5ebf13a2-f925-4ba7-adff-ddbc21d355e3",
"DeviceDataId":"1"
}
}
二、edge数据上传至cloud接口
- 接口描述
- 名称:uploadDataToCloud -> 分成uploadImageDataToCloud以及uploadStructDataToCloud两个接口,该接口不被外部调用。程序内部自动开启协程调用上传。
- 功能:通过wss连接池将数据上传至云端
涉及的外部服务
fastdfs:采用go-fastdfs存储图片数据。相比fastdfs提供了go的api接口,方便开发。
mysql:采用go原生库database/sql,对结构化数据进行存储。
数据库表设计:
structuraData表:结构化数据直接存于mysql
| id | userId | deviceId | deviceDataId |structuraData|
| :--- | :---: | ---: |
imagePath表:图片上传至go-fastdfs后,存储路径
| id | userId | deviceId | deviceDataId |path|
| :--- | :---: | ---: |
go-fastdfs:
以deviceId-deviceDataId作为文件命名方式,直接从存储路径中查找文件。
wss协议设计:
消息头-消息长度-消息内容
其中,消息头包括消息类型:structuraData/imageData
消息内容封装了requestId,data,deviceDataId,deviceId字段,转成json格式传输