通讯协议
所有消息的消息体,需要以*#
开头,以#*
结尾,当服务端收到的消息不满足此条件时,将不予响应。
上行
上行必须参数:
字段名 | 类型 | 说明 |
---|---|---|
imei | string | 设备imei,作为设备的唯一识别码 |
time | int | 秒级时间戳,表示设备上报内容的发送时间 |
code | int | 业务代码,详见业务代码说明 |
data | object | 数据对象,里面承载事件所需的必要业务字段 |
sign | string | 签名,生成规则为 md5("xxxx" + imei + time) ,后端在收到请求的时候会进行鉴权,鉴权不通过对数据不予处理。 |
上行业务代码:
状态码 | 中文名 | 说明 | 所需业务字段 |
---|---|---|---|
10001 | 登录 | 每次开机登陆一次 | |
10002 | 拆除报警 | ||
10003 | SOS | ||
10004 | 开门报警 | ||
10005 | 心跳 | 默认10秒,需要根据下行字段的周期进行设置 | |
10006 | 设备异常 | device_error_code | |
10007 | 图片上传 | 对图片进行分块上传,详见示例 | |
10008 | 温度上报 | temp | |
下行
基础下行字段:
字段名 | 类型 | 说明 |
---|---|---|
imei | string | 设备imei,作为设备的唯一识别码 |
time | int | 秒级时间戳,表示消息相应时间 |
code | int | 状态码,1为成功处理 |
data | object | 数据对象,每次请求都将返回所有【下行业务字段】 |
sign | string | 签名,生成规则为 md5("liandun" + imei + time) |
msg | string | 返回消息 |
业务字段
指的是放在data中的字段。
上行业务字段
字段 | 类型 | 说明 |
---|---|---|
pic_url | string | 图片地址 |
temp | number | 温度 |
device_error_code | string | 设备异常码,由硬件自行定义补充 |
phone | string | 设备手机号 |
call_phone | string | 设备触发拨号时拨打的电话号码 |
battery | number | 剩余电量百分比 |
下行业务字段
字段 | 类型 | 说明 |
---|---|---|
sos_phone | string | 紧急联系人数组,用英文逗号分隔【1,2,3】 |
duty_phone | string | 负责人电话 |
open_split_alarm | int | 1为开启拆除报警,2为关闭 |
open_open_door_alarm | int | 1为开启开门报警,2为关闭 |
heart_cycle_seconds | int | 心跳周期(秒) ,默认10s |
device_status | int | 【设备状态】当为1时为启用状态,2为未启用的状态(未安装),未启用时,报警默认关闭,不再关注上面两个报警设置。 |
图片上传说明
图片上传需要调用单独的业务码进行上传,上传后获得图片地址后,再进行其他涉及到图片的业务上报逻辑。
以下为涉及的上行字段说明
参数名 | 类型 | 说明 |
---|---|---|
img | string | 当前分片的图片数据 |
length | int | 图片分片总数量 |
index | int | 当前是第几片,从0开始 |
file_id | string | 图片id,在第一个分片上传时返回获取,后续分片上传必须带上这个img_id |
步骤说明
1. 用字节流传输图片,但是创建的时候参数要告知后端此文件的后缀
2. 对图片长度进行计算,进行分包处理
3. 每次图片上传的包大小暂定为`1000` 字节
4. 每个图片上传任务,空窗期为1分钟,比如创建了图片上传任务后,一分钟内没收到下一包,这个图片上传任务就取消了,无法复用此`img_id`进行上传。
5. 上传流程
1. 创建图片上传任务
依照`通讯协议` `上行` `上行必须参数` 进行请求参数的组装,其中data的参数如下
*#{
"data": {
"length": 3,
"ext":"jpg" // 文件后缀名
},
"imei": "861238712937129837129",
"code": 10007,
"time": 1650960893,
"sign": "11289298b1fcb5f55f59ac8b9d182479"
}#*
1. 服务端响应
此时依托客户端请求,创建了一个图片上传任务,返回一个`img_id`,后续图片上传需要带上`img_id`
{
"data": {
"length": 50,
"next": 0, // 下一包的数据下标,
"file_id": "asddfads12312321",
},
"imei": "861238712937129837129",
"code": 1,
"time": 1650960893,
"sign": "11289298b1fcb5f55f59ac8b9d182479"
}
1. 开始上传(上传图片不需要按照标准格式的字段进行上传)
{
"d":"图片数据",
"l":50, // 图片分片长度
"id":"861238712937129837129YTbVPv", //file_id
"i":0, // 当前数据在图片分片数组中的下标
"imei":"861238712937129837129"
}
1. 服务端在收到数据包以后,会对请求作出响应
**接收成功响应**
{
"data": {
"length": 50,
"next": 1, // 下一包的数据下标,
"file_id": "asddfads12312321"
},
"imei": "861238712937129837129",
"code": 1, // 1表示接收第一包成功,0的话就要重头再来了
"time": 1650960893,
"sign": "11289298b1fcb5f55f59ac8b9d182479"
}
**当中途有接收失败**,`next`将会返回失败的包下标,硬件此时需要重新发送此包
{
"data": {
"length": 50,
"next": 2, // 将会重复将接收失败的包下标返回,硬件端重复发送此分片的数据即可
"file_id": "asddfads12312321"
},
"imei": "861238712937129837129",
"code": 1, // 1表示接收成功,0的话就要重头再来了
"time": 1650960893,
"sign": "11289298b1fcb5f55f59ac8b9d182479"
}
1. 当服务端所有包都收集完毕后,将会返回图片地址。
{
"data": {
"file_id": "asddfads12312321",
"file_url": "http://asdjkflaksdjflasd.com/a.jpg"
},
"imei": "861238712937129837129",
"code": 1, // 1表示接收成功
"time": 1650960893,
"sign": "11289298b1fcb5f55f59ac8b9d182479"
}
### 案例
1. 开启上传任务
*#{
"data": {
"length": 2,
"ext":"txt"
},
"imei": "861238712937129837129",
"code": 10007,
"time": 1650960893,
"sign": "11289298b1fcb5f55f59ac8b9d182479"
}#*
1. 服务端返回id
*#{"code":1,"data":{"img_id":"861238712937129837129QKjEL1","next":0},"imei":"861238712937129837129","sign":"2783d3bccc5d7105f24027be3959fa56","time":1651043460}#*
1. 上传第一包
*#
{
"d":"1",
"l":2,
"id":"861238712937129837129QKjEL1",
"i":0 ,
"imei":"861238712937129837129"
}
#*
1. 服务端索要第二包
*#{"code":1,"data":{"img_id":"861238712937129837129QKjEL1","length":2,"next":1},"imei":"861238712937129837129","sign":"282146a8fa15ae2c7945c5f6e6818525","time":1651043468}#*
1. 上传第二包
*#{
"d":"-2",
"l":2,
"id":"861238712937129837129QKjEL1",
"i":1,
"imei":"861238712937129837129"
}#*
1. 服务端反馈上传完成,且返回文件链接
*#{"code":1,"data":{"img_id":"861238712937129837129QKjEL1","img_url":"http://www.door.test/uploads/imgs/86123871293712983712920220427151108.txt"},"imei":"861238712937129837129","sign":"282146a8fa15ae2c7945c5f6e6818525","time":1651043468}#*
业务参考
登录
*#{
“data”: {
"phone":"13800138000"
},
“imei”: “863220220323083”,
“code”: 10001,
“time”: 1650960893,
“sign”: “18eb0075850985361ed6141ca7119247”
}#*
心跳
*#{
“data”: null,
“imei”: “861238712937129837129”,
“code”: 10005,
“time”: 1650960893,
“sign”: “5a020bfbdd813e259d4e90961d31662e”
}#*
拆除
*#{
“data”:
{
"pic_url": "[https://img1.baidu.com/it/u=1036045262,241542374&fm=253&fmt=auto&app=120&f=JPEG?w=1422&h=800](https://img1.baidu.com/it/u=1036045262,241542374&fm=253&fmt=auto&app=120&f=JPEG?w=1422&h=800)"
},
“imei”: “861238712937129837129”,
“code”: 10002,
“time”: 1650960893,
“sign”: “5a020bfbdd813e259d4e90961d31662e”
}#*
开门
*#{
“data”:
{
"pic_url": "[https://img1.baidu.com/it/u=1036045262,241542374&fm=253&fmt=auto&app=120&f=JPEG?w=1422&h=800](https://img1.baidu.com/it/u=1036045262,241542374&fm=253&fmt=auto&app=120&f=JPEG?w=1422&h=800)",
"temp":36.2
},
“imei”: “861238712937129837129”,
“code”: 10004,
“time”: 1650960893,
“sign”: “5a020bfbdd813e259d4e90961d31662e”
}#*
sos
*#{
“data”:null,
“imei”: “861238712937129837129”,
“code”: 10003,
“time”: 1650960893,
“sign”: “5a020bfbdd813e259d4e90961d31662e”
}#*
设备异常
*#{
“data”: {
"device_error_code":5001
},
“imei”: “861238712937129837129”,
“code”: 10006,
“time”: 1650960893,
“sign”: “5a020bfbdd813e259d4e90961d31662e”
}#*
体温上报
*#{
“data”: {
"temp":37.2
},
“imei”: “861238712937129837129”,
“code”: 10008,
“time”: 1650960893,
“sign”: “5a020bfbdd813e259d4e90961d31662e”
}#*