# OPEN API

说明:openApi调用需要进行鉴权,初次调用接口需要在物联网平台申请账号并详细了解调用方法

# 对接前准备

# 账号申请

# 申请申请来源

  1. 用户可通过物联网平台 (opens new window)自行提交申请体验账号,由我司工作员人审核有效后使用。

  2. 用户可以直接联系我司物联网管理员进行账号注册使用,实时生效。

# 申请结果

  • 申请通过后,用户可获得接口调用需要的appKey和appSecret(即调用接口时配置项中的app_key和secret),如下图。

# 配置项及签名

# 配置项

注意

在api请求中,不同接口使用统一请求地址,接口名作为参数进行POST请求。

序号 配置项
1 统一请求地址 http://172.17.0.2:8092/api(演示地址,正式地址请与管理员核实)
2 统一请求方式 统一使用POST请求
3 app_key LjRDFtfyPuH8KzG9euOM(实际账号由用户申请获得)
4 secret aSDLJa3Asc5HN9Kr6KyA5CpppSTdbvpe(实际账号由用户申请获得)

# 签名

  1. 将请求参数按参数名升序排序;
  2. 按请求参数名及参数值相互连接组成一个字符串:<paramName1><paramValue1><paramName2><paramValue2>...;
  3. 将应用密钥分别添加到以上请求参数串的头部和尾部:<secret><请求参数字符串><secret>;
  4. 对该字符串进行MD5(全部大写),MD5后的字符串即是这些请求参数对应的签名;
  5. 该签名值使用sign参数一起和其它请求参数一起发送给服务开放平台。

最终向平台发出的请求参数如下:

{
    "sign": "2AE534A15AACE112EE43B9CCF6BD4383",//签名结果
    "timestamp": "2018-03-21 12:57:30",//时间
    "name": "goods.get",//接口名
    "data": "%7B%22goodsName%22%3A%22iphoneX%22%7D",//请求的业务参数
    "app_key": "test",//用户生成的appKey
    "version": ""//接口版本号
}
1
2
3
4
5
6
7
8

详细签名算法可查看附录->签名算法

# 接口参数及返回说明

# 接口参数

注意

接口参数(业务参数)参与签名计算,并组装成Json字符串形式作为data的vlue值,在向平台发出请求时一并发出。

# 返回结果说明

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示提示文字
data object 返回的数据,没有则返回{}

# HTTP推送服务管理API

# 删除HTTP推送服务数据1.0

**接口名(name):**push.delete

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
id string 服务标识

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 编辑HTTP推送服务1.0

**接口名(name):**push.edit

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
id string 服务标识
name string 名称
pushUrl integer 推送url
pushKey string 密钥
pushType integer 推送数据类型:1:设备json数据;2:设备上下线消息
enable integer 服务状态:0停用,1启用
deviceType integer 推送设备类型:1:全部设备,2:指定设备分类所属设备,3:指定设备协议所属设备
deviceProId integer deviceType=2时,代表设备分类ID集,deviceType=3时,代表设备协议ID集,逗号隔开
remarks integer 备注

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 根据id获取HTTP推送服务详情1.0

**接口名(name):**push.getById

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
id string 服务标识

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# HTTP推送服务列表页面显示1.0

**接口名(name):**push.page

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
name string 名称
currentPage integer 第几页
pageSize integer 每页记录数

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 产品API

# 根据产品id查询1.0

**接口名(name):**product.get

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
id string 产品id

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 获取产品下拉框列表1.0

**接口名(name):**product.selectList

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 模组API

# 新增模组 1.0

接口名(name): module.create

版本号(version): 1.0

请求参数:

名称 类型 是否必须 示例值 描述
code string 编号
name string 名称
commuType integer 通信类型,1:tcp; 2:udp; 3:mqtt; 4:http; 5:coap;
mduProtocolId string 模组协议id
simIccid string SIM卡ICCID
mqttUsername string mqtt用户名(通信类型为3时有效)
mqttPassword string mqtt密码(通信类型为3时有效)
remarks string 备注

# 删除模组 1.0

接口名(name): module.delete

版本号(version): 1.0

请求参数:

名称 类型 是否必须 示例值 描述
id string 模组协议标识

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 根据编号查询模组 1.0

接口名(name): module.find

版本号(version): 1.0

请求参数:

名称 类型 是否必须 示例值 描述
模组编号 string 模组编号

返回结果:

参数 类型 描述
id String 模组标识
code String 模组编号
name String 模组名称
protocolId String 模组协议标识
protocolName String 模组协议名称
createDate long 创建时间
onlineStatus int 在线状态:0离线;1在线
offlineCheckInterval int 离线检测时间间隔,单位(秒)

返回示例:

{
    "code":1,
    "data":{
        "code":"868704042506558",
        "commuType":1,
        "createDate":1597629464000,
        "createId":"7cdf9337eb454f2281051176ce9fdf1f",
        "encryptType":0,
        "id":"0b98dfd733774187b90ead123f1e1916",
        "mduProtocolId":"6d0c8e4011a04070bdd5bd4c056e6946",
        "model":"",
        "name":"灯控模组",
        "offlineCheckInterval":10,
        "onlineStatus":1,
        "status":1,
        "type":1
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 获取模组列表 1.0

接口名(name): module.list

版本号(version): 1.0

请求参数:

名称 类型 是否必须 示例值 描述
code string 编号
currentPage integer 第几页
pageSize integer 每页记录数

返回结果:

参数 类型 描述
id String 模组标识
code String 模组编号
name String 模组名称
protocolId String 模组协议标识
protocolName String 模组协议名称
createDate long 创建时间
onlineStatus int 在线状态:0离线;1在线
offlineCheckInterval int 离线检测时间间隔,单位(秒)

返回示例:

{
    "code":1,
    "data":{
        "total":10,
        "resultPage":[
            {
                "code":"865823049766081",
                "createDate":"2020-06-18 17:37:48",
                "encryptType":0,
                "id":"04b7a64a8b3646b284ec8bfbd701327c",
                "name":"大华烟感7",
                "offlineCheckInterval":1440,
                "onlineStatus":0,
                "protocolId":"7579577fdfee4691bb1412dbd444c5c4",
                "protocolName":"大华烟感协议"
            },
            ...
        ]
    },
    "msg":"success"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 更新模组 1.0

接口名(name): module.update

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
id string id
code string 编号
name string 名称
mduProtocolId string 模组协议id
simIccid string SIM卡ICCID
mqttUsername string mqtt用户名(通信类型为3时有效)
mqttPassword string mqtt密码(通信类型为3时有效)
remarks string 备注

# 模组协议API

# 新增模组协议 1.0

接口名(name): moduleprotocol.create

版本号(version): 1.0

请求参数:

名称 类型 是否必须 示例值 描述
code string 模组编号
name string 模组名称
analysisTemplateType integer 协议模板类型:1:平台已有模板;2:自有模板;
analysisTemplate integer 协议解析模板(协议模板类型选择1时有效):1.DLT45-2007规约;2.DLT45-1997规约;3.ModbusTCP;4.ModbusRTU
heartbeat string 心跳包的值:16进制字符串
commuType integer 通信类型,1:tcp; 2:udp; 3:mqtt; 4:http; 5:coap;
commuPort integer 通信端口
analysisScript string 透传类型下解析脚本文件内容(协议模板类型选择2时有效)
remarks string 备注

# 删除模组协议 1.0

接口名(name): moduleprotocol.delete

版本号(version): 1.0

请求参数:

名称 类型 是否必须 示例值 描述
id string 模组协议标识

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 根据编号查询模组协议 1.0

接口名(name): moduleprotocol.find

版本号(version): 1.0

请求参数:

名称 类型 是否必须 示例值 描述
code string 模组协议编号

返回结果:

参数 类型 描述
id String 模组协议标识
code String 模组协议编号
name String 模组协议名称
commuType int 通信类型:1.tcp;2.udp;3.mqtt;4.http;5.coap
type int 1:平台协议 2:自有协议
commuPort String 通信端口
analysisTemplateType int 协议模板类型:1.平台已有模板;2自有模板;
createDate long 创建时间
creator String 创建人
analysisScript String 模组协议的解析脚本,groovy语言

返回示例:

{
    "code":1,
    "data":{
        "analysisScript":"package mdu

import com.alibaba.fastjson.JSONObject
import org.apache.commons.lang3.StringUtils

JSONObject analysis(JSONObject sourceJsonInfo) {
    //封装解析返回的结果
    JSONObject mJson = new JSONObject()
    mJson.put("status", true)
    mJson.put("err_msg", "")
    String sourceData = sourceJsonInfo.getString("source_data")
    println("数据:" + sourceData)

    String moduleCode = sourceJsonInfo.getString("module_code")
    //mqtt的主题,可选项信息存放在这
    String options = sourceJsonInfo.getString("options")
    JSONObject optionsJson = JSONObject.parseObject(options)
    String topic = optionsJson.getString("topic")
    
    JSONObject dataJson = JSONObject.parseObject(sourceData)
    if (StringUtils.endsWith(topic, "/door_record")) {
        mJson.put("packet_code", "door_record")
    } else if (StringUtils.endsWith(topic, "/push_personofsn")) {
        mJson.put("packet_code", "push_personofsn")
    } else {
        mJson.put("status", false)
        mJson.put("err_msg", "发布非法主题:" + topic)
    }


    mJson.put("module_code", moduleCode)
    String deviceCode = moduleCode + "_" + dataJson.getString("sn")
    mJson.put("device_code", deviceCode)
    mJson.put("source_data", sourceData)
    mJson.put("remain_data", dataJson.toJSONString())
    mJson.put("reply_data", "")
    mJson.put("event_time", new Date().getTime())
    return mJson

}

",
        "analysisScriptAttachmentId":"",
        "analysisScriptMd5":"AEC45FC2E8F024E5F081DC1097B7CECA",
        "analysisTemplateType":2,
        "attachmentId":"",
        "code":"MQTT_1589511781799",
        "commuPort":1883,
        "commuType":3,
        "createDate":1589511867000,
        "createId":"12436f48749f45d88108a14127ad5a3f",
        "heartbeat":"",
        "id":"07b8962e10924d00b6732cc2855b7aa4",
        "manual":"",
        "name":"海康门禁插件协议",
        "status":1,
        "type":2,
        "updateDate":1589514224000,
        "updateId":"12436f48749f45d88108a14127ad5a3f"
    }
}
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

# 获取模组列表协议 1.0

接口名(name): moduleprotocol.list

版本号(version): 1.0

请求参数:

名称 类型 是否必须 示例值 描述
code string 编号
type integer 1:平台协议 2:自有协议 3:全部,默认全部
currentPage integer 第几页
pageSize integer 每页记录数

返回结果:

参数 类型 描述
id String 模组协议标识
code String 模组协议编号
name String 模组协议名称
commuType int 通信类型:1.tcp;2.udp;3.mqtt;4.http;5.coap
type int 1:平台协议 2:自有协议
commuPort String 通信端口
analysisTemplateType int 协议模板类型:1.平台已有模板;2自有模板;
createDate long 创建时间
creator String 创建人

返回示例:

{
    "code":1,
    "data":{
        "total":10,
        "resultPage":[
            {
                "analysisTemplateType":2,
                "code":"DH_SMOKE_PRO",
                "commuPort":"8087",
                "commuType":"4",
                "createDate":1592205226000,
                "creator":"公司管理员",
                "id":"7579577fdfee4691bb1412dbd444c5c4",
                "name":"大华烟感协议",
                "type":2
            },
            ...
        ]
    },
    "msg":"success"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 更新模组协议 1.0

接口名(name): moduleprotocol.update

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
id string id
name string 名称
analysisTemplateType integer 协议模板类型:1:平台已有模板;2:自有模板;
analysisTemplate integer 协议解析模板(协议模板类型选择1时有效):1.DLT45-2007规约;2.DLT45-1997规约;3.ModbusTCP;4.ModbusRTU
heartbeat string 心跳包的值:16进制字符串
commuType integer 通信类型:1.tcp;2.udp;3.mqtt;4.coap;5.http
commuPort integer 通信端口
analysisScript string 透传类型下解析脚本文件内容(协议模板类型选择2时有效)
remarks string 备注

# 规则引擎API

# 创建规则1.0

**接口名(name):**rule.create

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
name string 规则名称
remark string 备注
strategyId string 策略id
ruleDetailJson string 规则详情JSON字符串,格式:{ "platformRuleTriggerAddDtoList": [ { "ruleEngineId": "", "devId": "", "devProtocolPacketFieldCode": "", "devProtocolPacketFieldId": "", "type": 0, "checkOperate": 0, "startValue": "", "endValue": "", "cron": "", "cronInstruction": "" } ], "platformRuleFilterAddDtoList": [ { "ruleEngineId": "", "devId": "", "type": 0, "devProtocolPacketFieldCode": "", "devProtocolPacketFieldId": "", "operate": 0, "startValue": "", "endValue": "", "startTime": "", "endTime": "" } ], "platformRuleActionAddDtoList": [ { "type": 0, "devId": "", "devProtocolPacketCode": "", "devProtocolPacketId": "", "ruleEngineId": "", "subRuleEngineId": "", "fieldVoList": [ { "id": "", "actionId": "", "code": "", "name": "", "value": "", "fieldType": 0 } ] } ] }

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 根据id查询1.0

**接口名(name):**rule.getDetail

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
id string 规则id

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 获取规则列表1.0

**接口名(name):**rule.list

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
name string 规则名称

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 删除规则1.0

**接口名(name):**rule.remove

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
ids string 规则id

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 禁用/启用规则1.0

**接口名(name):**rule.switch

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
id string 规则id
enable integer 禁用或启用,1:启用,0:禁用

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 创建策略1.0

**接口名(name):**strategy.create

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
name string 策略
instruction string 备注

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 策略列表1.0

**接口名(name):**strategy.page

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
name string 策略名称
currentPage integer 第几页
pageSize integer 每页记录数

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 删除策略1.0

**接口名(name):**strategy.remove

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
ids string 策略

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 设备API

# 查询设备属性 1.0

接口名(name): device.attrs

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
id string id
code string 设备编号
packetType integer 包类型:1.上行包;2.下行包
downType integer 包类型为下行包时有效:1.下发获取数据;2.下发控制命令

返回结果:

参数 类型 描述
id String 设备协议标识
name String 设备协议名称
protocolType int 接入协议类型,1:脚本解析,2:模板解析
commuType int 通信类型:1.tcp;2.udp;3.mqtt;4.http;5.coap
createDate long 创建时间
updateDate long 更新时间
devProtocolPacketList array 服务集合,参见下表
devProtocolPacketList说明
参数 类型 描述
id String 服务标识
name String 服务名称
code String 服务代码
packetType int 服务类型:1.上行包;2.下行包
downType int 服务类型为2时有效:1.下发获取数据;2.下发控制命令
devProtocolPacketFields array 属性集合,参见下表
devProtocolPacketFields说明
参数 类型 描述
id String 属性标识
name String 属性名称
code String 属性代码
dataType int 数据类型:1.数值类型;2.布尔类型;3.字符串,4:16进制ascii码,5:枚举
dataUnit int 数字类型时该字段有效:单位
length int 属性长度,单位(字节)
storage int 属性是否需要存储:0:不存储;1:存储
formula String js计算公式
dataMax int 数字类型时该字段有效:字段的最大值
dataMin int 数字类型时该字段有效:字段的最小值

返回示例:

{
    "code":1,
    "data":{
        "analysisScript":"",
        "analysisScriptMd5":"",
        "attachmentId":"",
        "commuType":1,
        "createDate":1565749810000,
        "createId":"7cdf9337eb454f2281051176ce9fdf1f",
        "devProtocolPacketList":[
            {
                "code":"03",
                "devProtocolId":"fff2a04983a940868251d04be9ae8333",
                "devProtocolPacketFields":[
                    {
                        "code":"noise",
                        "dataMax":150,
                        "dataMin":0,
                        "dataType":1,
                        "dataUnit":"db",
                        "devProtocolPacketId":"219eb2601039493e88464feb90858e58",
                        "fieldOrder":1,
                        "formula":"{noise}/10",
                        "id":"807d3d15f26f4b1db9a7eba3da1a6e3d",
                        "length":2,
                        "name":"noise",
                        "storage":1
                    }
                ],
                "id":"219eb2601039493e88464feb90858e58",
                "name":"噪音",
                "packetType":1
            },
            {
                "code":"GetNoise",
                "devProtocolId":"fff2a04983a940868251d04be9ae8333",
                "devProtocolPacketFields":[
                    {
                        "code":"add",
                        "devProtocolPacketId":"2328231734a9430998098572bb723e81",
                        "fieldOrder":1,
                        "fieldType":2,
                        "id":"e936644cb12845ad9a0733555bc02e00",
                        "length":1,
                        "name":"地址号"
                    },
                    {
                        "code":"code",
                        "devProtocolPacketId":"2328231734a9430998098572bb723e81",
                        "fieldOrder":2,
                        "fieldType":1,
                        "fieldValue":"03",
                        "id":"9e5cec9c13f74339bb9bdbecd4a4c839",
                        "length":1,
                        "name":"功能码"
                    },
                    {
                        "code":"data",
                        "devProtocolPacketId":"2328231734a9430998098572bb723e81",
                        "fieldOrder":3,
                        "fieldType":1,
                        "fieldValue":"00000001",
                        "id":"6bd0787a49db4200bb0dfea0fa92e907",
                        "length":4,
                        "name":"数据"
                    },
                    {
                        "code":"check",
                        "devProtocolPacketId":"2328231734a9430998098572bb723e81",
                        "fieldOrder":4,
                        "fieldType":4,
                        "id":"25f23e040ff642149483b409581b0ea2",
                        "length":2,
                        "name":"校验值"
                    }
                ],
                "downType":1,
                "id":"2328231734a9430998098572bb723e81",
                "name":"获取噪音数据",
                "packetType":2
            }
        ],
        "id":"fff2a04983a940868251d04be9ae8333",
        "manual":"噪音协议(展台使用)",
        "name":"噪音协议",
        "protocolType":2,
        "status":1,
        "updateDate":1565769247000,
        "updateId":"7cdf9337eb454f2281051176ce9fdf1f"
    }
}
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91

# 新增设备 1.0

接口名(name): device.create

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
code string 编号
name string 名称
mduModuleId integer 通讯模组ID
devProtocolId string 设备协议Id
collectCron string 采集频率,cron表达式,为空不采集
remarks string 备注

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 设备控制1.0

**接口名(name):**device.ctrl

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
id string 设备标识
packetCode string 服务编号
params string 控制参数的json对象字符串,如:{"key1":"value1","key2":"value2"}

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 获取设备当前数据1.0

**接口名(name):**device.currentData

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
id string 设备标识

返回结果:

参数 类型 描述
packetCode String 产品标识
packetName String 对接平台
realTimeDataVos int 协议类型
code String 产品名称
dataType
dataUnit
devProtocolPacketId
id
name
timestamp
value

返回示例:

{
    "code":1,
    "data":[
        {
            "packetCode":"03",
            "packetName":"温湿度",
            "realTimeDataVos":[
                {
                    "code":"hum",
                    "dataType":1,
                    "dataUnit":"%",
                    "devProtocolPacketId":"ff482668783048779917346299ff576f",
                    "id":"9354fcd414b94470940a11da97c43650",
                    "name":"湿度",
                    "timestamp":1594048100071,
                    "value":56.3
                },
                {
                    "code":"temp",
                    "dataType":1,
                    "dataUnit":"摄氏度",
                    "devProtocolPacketId":"ff482668783048779917346299ff576f",
                    "id":"b872d899e1ca4a1aa05ca7d4847328f4",
                    "name":"温度",
                    "timestamp":1594048100071,
                    "value":28.2
                }
            ]
        }
    ]
}
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

# 删除设备 1.0

接口名(name): device.delete

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
id string 设备Id

# 根据编号查询设备 1.0

接口名(name): device.find

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
code string 设备编号

返回结果:

参数 类型 描述
id String 设备标识
name String 设备名称
code String 设备编码
commuType int 通信类型:1.tcp;2.udp;3.mqtt;4.http;5.coap
onlineStatus int 在线状态:0离线;1在线;
createDate long 创建时间
status int 删除状态:0已删除;1未删除;

返回示例:

{
    "code":1,
    "data":{
        "code":"12345678AAA_01",
        "commuType":1,
        "createDate":1592469227000,
        "createId":"7cdf9337eb454f2281051176ce9fdf1f",
        "devProtocolId":"fff2a04983a940868251d04be9ae8333",
        "id":"07eef6a9f46240ffb24a8ebedcd91382",
        "name":"wys烟感1",
        "onlineStatus":0,
        "status":1
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 根据设备ID获取设备 1.0

接口名(name): device.get

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
id string 设备标识

返回结果:

参数 类型 描述
id String 设备标识
name String 设备名称
code String 设备编码
commuType int 通信类型:1.tcp;2.udp;3.mqtt;4.http;5.coap
onlineStatus int 在线状态:0离线;1在线;
createDate long 创建时间
status int 删除状态:0已删除;1未删除;

返回示例:

{
    "code":1,
    "data":{
        "code":"12345678AAA_01",
        "commuType":1,
        "createDate":1592469227000,
        "createId":"7cdf9337eb454f2281051176ce9fdf1f",
        "devProtocolId":"fff2a04983a940868251d04be9ae8333",
        "id":"07eef6a9f46240ffb24a8ebedcd91382",
        "name":"wys烟感1",
        "onlineStatus":0,
        "status":1
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 根据多个设备ID获取多个设备 1.0

接口名(name): device.getMultiple

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
ids string 设备Id ,以逗号隔开

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 获取设备某项属性历史数据1.0

**接口名(name):**device.historyData

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
id string 设备标识
fieldCode string 属性code
endDate string 开始时间
startDate string 结束时间

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 获取设备列表 1.0

接口名(name): device.list

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
code string 编号
categoryId string 设备分类ID
currentPage integer 第几页
pageSize integer 每页记录数

返回结果:

参数 类型 描述
id String 设备标识
name String 设备名称
code String 设备编号
commuType int 通信类型:1.tcp;2.udp;3.mqtt;4.http;5.coap
devProtocolId String 设备协议id
devProtocolName String 设备协议名称
onlineStatus int 在线状态:0离线;1在线;
createDate long 创建时间

返回示例:

{
    "code":1,
    "data":{
        "total":10,
        "resultPage":[
            {
                "code":"12345678AAA_01",
                "commuType":1,
                "createDate":"2020-06-18 16:33:47",
                "devProtocolId":"fff2a04983a940868251d04be9ae8333",
                "devProtocolName":"噪音协议",
                "id":"07eef6a9f46240ffb24a8ebedcd91382",
                "name":"wys烟感1",
                "onlineStatus":0
            },
            ...
        ]
    },
    "msg":"success"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 根据产品id查询设备1.0

**接口名(name):**device.pageByProduct

**版本号(version):**1.0

请求参数:

名称 类型 是否必须 示例值 描述
productId string 产品ID
currentPage integer 第几页
pageSize integer 每页记录数

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 往设备发送指令 1.0

接口名(name): device.sendCmd

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
id string 设备ID
hexCommand integer 指令(16进制)

返回结果:

名称 类型 描述
code string 状态值,"1"表示成功,其它都是失败
msg string 错误信息,出错时显示
data object 返回的数据,没有则返回{}名称类型示例值描述

# 更新设备 1.0

接口名(name): device.update

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
id string id
code string 编号
name string 名称
mduModuleId integer 通讯模组ID
devProtocolId string 设备协议Id
collectCron string 采集频率,cron表达式,为空不采集
remarks string 备注

# 设备分类API

# 查询设备分类列表树结构数据 1.0

接口名(name): category.tree

版本号(version): 1.0

请求参数:

名称 类型 是否必须
name string

返回结果:

参数 类型 描述
label String 分类名称
value String 分类标识
children Array 子类列表
parentId String 父类标识

返回示例:

{
    "code":1,
    "data":{
        "devCategoryTreeList":[
            {
            	"label":"通行设备",
                "value":"f9cd3d1e25294ebd95171ff3426fc2fd",
                "children":[
                    {
                        "children":[
                            {
                                "label":"蓝牙门禁",
                                "parentId":"89dc7be485804ee78e025497d0c52445",
                                "value":"378b3d4ee93c436fb63cab7a616e0e5b"
                            },
                            {
                                "label":"人脸识别门禁",
                                "parentId":"89dc7be485804ee78e025497d0c52445",
                                "value":"4e8c1d1d1f8a4843bf8352f2f6d0fda4"
                            }
                        ],
                        "label":"门禁",
                        "parentId":"f9cd3d1e25294ebd95171ff3426fc2fd",
                        "value":"89dc7be485804ee78e025497d0c52445"
                    }
                ]
            },
            {
                "label":"供配电系统",
                "value":"1556e8dad00342d0bf1f131fc080c53a"
            },
            {
                "label":"环境监测",
                "value":"178b020e45fa4df6bd006fc4cc55e4d0"
            },
            ...
        ]
    },
    "msg":"success"
}
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

# 设备协议API

# 新增设备协议 1.0

接口名(name): devprotocol.create

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
code string 设备协议编号
name string 设备协议名称
commuType string 通信类型:1.tcp;2.udp;3.mqtt;4.coap;5.http
protocolType integer 接入协议类型,1:脚本解析,2:模板解析
analysisScript string 解析脚本内容
analysisScriptMd5 string 脚本文件名
remarks string 备注
devProtocolPacketReq object 协议包

# 删除设备协议 1.0

接口名(name): devprotocol.delete

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
id string 设备协议Id

# 根据编号查询设备协议 1.0

接口名(name): devprotocol.find

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
code string 设备Id

# 根据id查询设备协议 1.0

接口名(name): devprotocol.get

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
id string 设备协议标识

返回结果:

参数 类型 描述
id String 记录标识
name String 设备协议名称
commuType int 通信类型:1.tcp;2.udp;3.mqtt;4.http;5.coap
type int 1:平台协议 2:自有协议
protocolType int 接入协议类型,1:脚本解析,2:模板解析
creator String 创建人
createDate long 创建时间
remarks String 备注

返回示例:

{
    "code":1,
    "msg":"success",
    "data":{
        "analysisScriptAttachmentId":"",
        "analysisScriptMd5":"",
        "attachmentId":"",
        "commuType":1,
        "createDate":1552642794000,
        "createId":"7cdf9337eb454f2281051176ce9fdf1f",
        "id":"8a8a8a045864436799683b46657c1c29",
        "manual":"",
        "name":"温湿度协议",
        "protocolType":2,
        "status":1,
        "type":1,
        "updateDate":1567479586000,
        "updateId":"7cdf9337eb454f2281051176ce9fdf1f"
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 获取设备协议列表 1.0

接口名(name): devprotocol.list

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
code string 编号
type integer 1:平台协议 2:自有协议 3:全部
currentPage integer 第几页
pageSize integer 每页记录数

返回结果:

参数 类型 描述
id String 记录标识
name String 设备协议名称
type int 1:平台协议 2:自有协议
protocolType int 接入协议类型,1:脚本解析,2:模板解析
creator String 创建人
createDate long 创建时间
remarks String 备注

返回示例:

{
    "code":1,
    "msg":"success",
    "data":{
        "total":10,
        "resultPage": [
            {
                "id":"23e2cd57b52761c6e8c1993538ab1913",
                "name":"测试设备协议"
                "type":2,
                "protocolType":1,
                "creator":"管理员"
                "createDate":1595402168000,
                "remarks":"测试设备协议",
            },
            ...
        ]
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 根据设备协议查询字段信息 1.0

接口名(name): devprotocol.packetField

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
id string 设备协议标识
packetType integer 包类型,1.上行包;2.下行包
downType integer 发送指令类型,1.下发获取数据;2.下发控制命令

返回结果:

参数 类型 描述
id String 记录标识
name String 设备协议名称
commuType int 通信类型:1.tcp;2.udp;3.mqtt;4.http;5.coap
protocolType int 接入协议类型,1:脚本解析,2:模板解析
creator String 创建人
createDate long 创建时间
remarks String 备注

返回示例:

{
    "code":1,
    "msg":"success",
    "data"::{
        "analysisScriptMd5":"",
        "attachmentId":"",
        "commuType":1,
        "createDate":1552642794000,
        "createId":"7cdf9337eb454f2281051176ce9fdf1f",
        "devProtocolPacketList":[
            {
                "code":"GetTempHum",
                "devProtocolId":"8a8a8a045864436799683b46657c1c29",
                "devProtocolPacketFields":[
                    {
                        "code":"addr",
                        "dataType":3,
                        "devProtocolPacketId":"99511df1a0f643b9b5e9255679926c81",
                        "fieldOrder":1,
                        "fieldType":2,
                        "id":"99b8c065cfa5478c86b9638f9155e171",
                        "name":"地址码"
                    },
                    {
                        "code":"funcode",
                        "dataType":3,
                        "devProtocolPacketId":"99511df1a0f643b9b5e9255679926c81",
                        "fieldOrder":2,
                        "fieldType":1,
                        "fieldValue":"03",
                        "id":"b6d4fe274337407b8073e3e5feac98f0",
                        "name":"功能码"
                    },
                    {
                        "code":"addrang",
                        "dataType":3,
                        "devProtocolPacketId":"99511df1a0f643b9b5e9255679926c81",
                        "fieldOrder":3,
                        "fieldType":1,
                        "fieldValue":"00 00 00 02",
                        "id":"fd485d1099fc425181ea62748e1ace5a",
                        "name":"起始地址范围"
                    },
                    {
                        "code":"crc",
                        "dataType":3,
                        "devProtocolPacketId":"99511df1a0f643b9b5e9255679926c81",
                        "fieldOrder":4,
                        "fieldType":4,
                        "id":"208ff1192c034d77ae8d68bd90e03265",
                        "name":"校验和"
                    }
                ],
                "downType":1,
                "id":"99511df1a0f643b9b5e9255679926c81",
                "name":"读取温湿度",
                "packetType":2
            },
            {
                "code":"03",
                "devProtocolId":"8a8a8a045864436799683b46657c1c29",
                "devProtocolPacketFields":[
                    {
                        "code":"hum",
                        "dataMax":101,
                        "dataMin":0,
                        "dataType":1,
                        "dataUnit":"%",
                        "devProtocolPacketId":"ff482668783048779917346299ff576f",
                        "fieldOrder":1,
                        "formula":"{hum} / 10",
                        "id":"9354fcd414b94470940a11da97c43650",
                        "length":2,
                        "name":"湿度",
                        "storage":1
                    },
                    {
                        "code":"temp",
                        "dataMax":100,
                        "dataMin":0,
                        "dataType":1,
                        "dataUnit":"摄氏度",
                        "devProtocolPacketId":"ff482668783048779917346299ff576f",
                        "fieldOrder":2,
                        "formula":"{temp} / 10",
                        "id":"b872d899e1ca4a1aa05ca7d4847328f4",
                        "length":2,
                        "name":"温度",
                        "storage":1
                    }
                ],
                "id":"ff482668783048779917346299ff576f",
                "name":"温湿度",
                "packetType":1
            }
        ],
        "id":"8a8a8a045864436799683b46657c1c29",
        "manual":"",
        "name":"温湿度协议",
        "protocolType":2,
        "status":1,
        "updateDate":1567479586000,
        "updateId":"7cdf9337eb454f2281051176ce9fdf1f"
    }
}

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106

# 更新设备协议 1.0

接口名(name): devprotocol.update

版本号(version): 1.0

请求参数:

名称 类型 是否必须 描述
id string id
code string 编号
name string 名称
analysisTemplateType integer 透传类型:1.透传;2.非透传
commuType integer 通信类型:1.tcp;2.udp;3.mqtt;4.coap;5.http
commuPort integer 通信端口
analysisScript string 透传类型下解析脚本文件内容
remarks string 备注

# 附录

# 签名算法

Map<String,Object> paramsMap = new ...; // 参数

Set<String> keySet = paramsMap.keySet();
List<String> paramNames = new ArrayList<String>(keySet);
// 1.
Collections.sort(paramNames);

StringBuilder paramNameValue = new StringBuilder();
// 2.
for (String paramName : paramNames) {
    paramNameValue.append(paramName).append(paramsMap.get(paramName));
}
// 3.
String source = secret + paramNameValue.toString() + secret;
// 4.
String sign = md5(source);
// 5.
paramsMap.put("sign",sign);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

示例

/**
     * 构建签名
     *
     * @param paramsMap
     *            参数
     * @param secret
     *            密钥
     * @return
     * @throws IOException
     */
    public static String buildSign(Map<String, ?> paramsMap, String secret) throws IOException {
        Set<String> keySet = paramsMap.keySet();
        List<String> paramNames = new ArrayList<String>(keySet);

        Collections.sort(paramNames);

        StringBuilder paramNameValue = new StringBuilder();

        for (String paramName : paramNames) {
            paramNameValue.append(paramName).append(paramsMap.get(paramName));
        }

        String source = secret + paramNameValue.toString() + secret;

        return md5(source);
    }

    /**
     * 生成md5,全部大写
     *
     * @param message
     * @return
     */
    public static String md5(String message) {
        try {
            // 1 创建一个提供信息摘要算法的对象,初始化为md5算法对象
            MessageDigest md = MessageDigest.getInstance("MD5");

            // 2 将消息变成byte数组
            byte[] input = message.getBytes();

            // 3 计算后获得字节数组,这就是那128位了
            byte[] buff = md.digest(input);

            // 4 把数组每一字节(一个字节占八位)换成16进制连成md5字符串
            return byte2hex(buff);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 二进制转十六进制字符串
     *
     * @param bytes
     * @return
     */
    private static String byte2hex(byte[] bytes) {
        StringBuilder sign = new StringBuilder();
        for (int i = 0; i < bytes.length; i++) {
            String hex = Integer.toHexString(bytes[i] & 0xFF);
            if (hex.length() == 1) {
                sign.append("0");
            }
            sign.append(hex.toUpperCase());
        }
        return sign.toString();
    }

    public String getTime() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    }
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

# 详细请求示例

import java.io.IOException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;

import com.alibaba.fastjson.JSON;

import junit.framework.TestCase;

public class PostTest extends TestCase{
    @Test
    public void testPost()throws IOException{
        String appKey = "test";
        String secret = "123456";
        // 业务参数
        Map<String, String> jsonMap = new HashMap<String, String>();
        jsonMap.put("goodsName", "iphoneX");

        String json = JSON.toJSONString(jsonMap);
        json = URLEncoder.encode(json, "utf-8");

        // 系统参数
        Map<String, Object> param = new HashMap<String, Object>();
        param.put("name", "goods.get");
        param.put("app_key", appKey);
        param.put("data", json);
        param.put("timestamp", getTime());
        param.put("version", "");
        param.put("access_token", "");

        String sign = buildSign(param, secret);

        param.put("sign", sign);

        /*
        // 最终请求数据
        {
            "sign": "111487ED140CCFD1B9C79FF984A94BEE",
            "timestamp": "2018-03-21 12:57:30",
            "name": "goods.get",
            "data": "%7B%22goodsName%22%3A%22iphoneX%22%7D",
            "app_key": "test",
            "version": ""
        }
        */
        System.out.println("=====请求数据=====");
        String postJson = JSON.toJSONString(param);
        System.out.println(postJson);
        // String resp = HttpUtil.post(postJson); // 发送请求
        /*
        响应结果:
        {
            "code":"1",
            "data":{
                "pageIndex":1,
                "pageSize":10,
                "rows":[
                    {
	                    "goods_name":"iPhoneX",
	                    "id":1,
	                    "price":8000
                    },
                    {
	                    "goods_name":"三星",
	                    "id":2,
	                    "price":7000
                    }
	           ],
	           "total":100
            }
        }
        */
    }

    /**
     * 构建签名
     *
     * @param paramsMap
     *            参数
     * @param secret
     *            密钥
     * @return
     * @throws IOException
     */
    public static String buildSign(Map<String, ?> paramsMap, String secret) throws IOException {
        Set<String> keySet = paramsMap.keySet();
        List<String> paramNames = new ArrayList<String>(keySet);

        Collections.sort(paramNames);

        StringBuilder paramNameValue = new StringBuilder();

        for (String paramName : paramNames) {
            paramNameValue.append(paramName).append(paramsMap.get(paramName));
        }

        String source = secret + paramNameValue.toString() + secret;

        return md5(source);
    }

    /**
     * 生成md5,全部大写
     *
     * @param message
     * @return
     */
    public static String md5(String message) {
        try {
            // 1 创建一个提供信息摘要算法的对象,初始化为md5算法对象
            MessageDigest md = MessageDigest.getInstance("MD5");

            // 2 将消息变成byte数组
            byte[] input = message.getBytes();

            // 3 计算后获得字节数组,这就是那128位了
            byte[] buff = md.digest(input);

            // 4 把数组每一字节(一个字节占八位)换成16进制连成md5字符串
            return byte2hex(buff);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 二进制转十六进制字符串
     *
     * @param bytes
     * @return
     */
    private static String byte2hex(byte[] bytes) {
        StringBuilder sign = new StringBuilder();
        for (int i = 0; i < bytes.length; i++) {
            String hex = Integer.toHexString(bytes[i] & 0xFF);
            if (hex.length() == 1) {
                sign.append("0");
            }
            sign.append(hex.toUpperCase());
        }
        return sign.toString();
    }

    public String getTime() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    }
}

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
Last Updated: 1/18/2022, 4:36:29 PM