通讯协议

所有消息的消息体,需要以*#开头,以#*结尾,当服务端收到的消息不满足此条件时,将不予响应。

上行

上行必须参数:
字段名 类型 说明
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”

}#*