# wf-iot
#### 项目介绍
IOT云平台
#### 软件架构
软件架构说明
#### 安装教程
1. xxxx
2. xxxx
3. xxxx
#### 使用说明
1. xxxx
2. xxxx
3. xxxx
#### 参与贡献
1. Fork 本项目
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
#### 码云特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目
5. 码云官方提供的使用手册 [http://git.mydoc.io/](http://git.mydoc.io/)
6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
#### 开发文档
# **多路智能通信平台**
## **统一名词**
名称|类型|说明
-|-|-
accountId|string|接入我们云平台的企业id
productionId|string|产品id
productionKey|string|产品key
productionKeySecure|string|用于设备登陆认证强校验
deviceId|string|设备id
sessionId|string |设备或者H5终端的会话id
applicationId|string|应用id
userId|string|用户id,企业不同应用下各自用户体系下的用户
serverHost|string|主机地址
serverPort|int|主机端口
deviceIp|string|设备联网分配的ip地址
## **曲速透明传输协议**
### **设备--云端**
#### **登陆认证**
设备通过负载均衡节点查询获得主机地址,连接对应的主机和端口,然后去进行登陆验证。
##### 基本协议格式
设备向云端进行登陆认证时发送的的协议的格式分两种情况。认证登陆时消息数据的参数要以一个空格字符分割,以换行符作为结束标记。认证登陆后透传的数据以换行符作为一条消息数据的结束标记。消息数据为字符串形式。
##### (1)当设备与云端通信选择不加密时,即MODE 为N(弱校验)
MC MODE PK DID\n
##### (2)当设备云端通信选择加密时,即MODE非N(强校验)
MC MODE PKSTOKEN\n
说明:
>MC :消息数据的启始标志,指定为@#*WF ,如果云端接收数据后发现数据头部不含有该标志则丢弃。<br>
MODE:登陆认证的加解密方式,可选参数为[N,ECC,RSA] ,N即None,不采用任何加解密;ECC即椭圆加密算法;RSA即非对称加密算法。<br>
PK:productionKey,即产品key。
DID:deviceId即设备id,登陆认证deviceId。<br>
PSKTOKEN:[PK,DID,nowtime].pks;'.'符号的前面部分是加密后的数据,后面部分是采用的加密算法对应的公钥。<br>
nowtime 时间戳是为了被截包暴力验证。
##### 心跳
心跳具体用接入的设备自己定义大小格式等信息,发送到前置机,前置机会对其做心跳检测,设备登陆认证后透传的数据也可以当做心跳。
##### 重连机制
设备30秒超时未发送数据(包括心跳),前置机断开连接,等待设备重新连接;设备断开连接后重新验证登陆。
**登陆认证流程**
![image](https://note.youdao.com/yws/api/personal/file/BA7575B20B654C33A9CD26616F2BBFC4?method=download&shareKey=0092d0e36497a3afbfc966259d194762)
#### 设备鉴权
当登陆认证过程不采用加密方式时,直接获取设备登陆认证透传的productKey和deviceId参数,调用设备鉴权服务api。当登陆认证过程采用加密方式时,获取PKSTOKEN再调用对应api。鉴权成功则设备认证成功,设备与云端建立通信设备透传数据;鉴权失败则云端断开这个连接。
##### 设备鉴权API
###### 不采用加密方式,做弱校验时:
请求地址|请求方式
-|-
https://cloud.warpfuture.com/iot/auth/checkWithKey|Post
###### 请求参数
名称|类型|说明
-|-|-
productionKey|string|产品key
deviceId|string|设备id
###### 返回参数
名称|类型|说明
-|-|-
accountId|string|企业id
productionId|string|产品id
deviceId|string|设备id
###### 采用加密方式,做强校验时:
请求地址|请求方式
-|-
https://cloud.warpfuture.com/iot/auth/checkWithSecure|Post
###### 请求参数
名称|类型|说明
-|-|-
pkstoken|string|含有公钥的加密字符串
productionSecure|string|产品公钥
###### 返回参数
名称|类型|说明
-|-|-
accountId|string|企业id
productionId|string|产品id
deviceId|string|设备id
**设备登陆认证失败或成功记录**
设备登陆认证失败与否都将数据按一定格式丢到kafka,供后面数据分析所用
>{<br>
"message": ,<br>
"messageTime":"" , //时间戳 <br>
"data":{<br>
"accountId":"" ,//企业id <br>
"deviceId":"", //设备id <br>
"productionId":"",//产品id <br>
"deviceIp":"" //设备联网的ip <br>
}<br>
}
#### **数据上报**
设备认证成功后透传的数据以Base64解码后在云端以数据上报的规定好的格式放到kafka里面(kafka以accountId分topic),给消费者监听。
数据上报的格式如下:
>{<br>
"accountId":"",<br>
"source":{<br>
"deviceId":"",<br>
"productionId":"",<br>
"deviceIp":"" //为实时定位设备所在位置作分布图所需<br>
},<br>
"messageTime":, //时间类型long <br>
"data":"" //设备透传的数据<br>
}
**固件信息上报说明**
>设备固件基本信息通过设备通过https定时检查固件版本升级时将固件详细的信息以json格式传递给云端OTA固件升级服务那边。
固件基本信息参数表
名称|类型|说明
-|-|-
originOtaVersion|string|固件版本
deviceId|string|设备id
## **Websocket协议**
### **应用--云端**
#### **app登陆认证**
用户使用已经注册的账号调用云端登陆验证接口登陆app后会返回一个token,app利用返回的token调用建立websocket长连接的接口建立连接通道。若用户已经登陆直接带token到云端,云端校验这个token合法性,若合法建立连接通道。
token时效为24小时,若token在调用建立连接通道的接口前已经失效,则接口调用失败即app与云端建立连接通道失败。若token在建立连接通道后才失效,则在连接通道断开之前依然可以通信。
在与云端建立连接通信前,需要调用负载均衡服务获取云端连接地址和端口(或者域名),然后带着token与云端建立通信。
app与云端通信协议的数据格式如下:
>{<br>
"accountId":"",<br>
"data":"",<br>
"messageTime": , //long类型<br>
"source":{<br>
"applicationId":"",<br>
"sessionId":"",<br>
"deviceId":"",<br>
"userId":"" <br>
},<br>
"target":{<br>
"productionId":"",<br>
"deviceId":"" <br>
}<br>
}
#### **token校验**
app通过负载均衡节点查询获取到连接地址后建立websocket连接带上token参数,云端获取到token调用token校验接口去校验token的合法性质。若token校验合法,返回userId给云端。
##### token校验API
请求地址|请求方式
-|-
请求参数
名称|类型|说明
-|-|-
token|string|app请求云端建立websocket长连接时带来的token
返回参数
名称|类型|说明
-|-|-
userId|string|app应用下对应的用户id
applicationId|string|应用id
accountId|string|企业id
返回格式例子
>{<br>
"code":"" ,<br>
"message": , //说明消息的内容<br>
"data":{
"accountId":"" ,//企业id <br>
"applicationId":"" ,//应用id <br>
"userId":"", //用户id <br>
"deviceId":"" //用户使用设备id <br>