# OPEN API
说明:openApi调用需要进行鉴权,初次调用接口需要在物联网平台申请账号并详细了解调用方法。
# 对接前准备
# 账号申请
# 申请申请来源
用户可通过物联网平台 (opens new window)自行提交申请体验账号,由我司工作员人审核有效后使用。
用户可以直接联系我司物联网管理员进行账号注册使用,实时生效。
# 申请结果
- 申请通过后,用户可获得接口调用需要的appKey和appSecret(即调用接口时配置项中的app_key和secret),如下图。

# 配置项及签名
# 配置项
注意
在api请求中,不同接口使用统一请求地址,接口名作为参数进行POST请求。
| 序号 | 配置项 | 值 |
|---|---|---|
| 1 | 统一请求地址 | http://172.17.0.2:8092/api(演示地址,正式地址请与管理员核实) |
| 2 | 统一请求方式 | 统一使用POST请求 |
| 3 | app_key | LjRDFtfyPuH8KzG9euOM(实际账号由用户申请获得) |
| 4 | secret | aSDLJa3Asc5HN9Kr6KyA5CpppSTdbvpe(实际账号由用户申请获得) |
# 签名
将请求参数按参数名升序排序;按请求参数名及参数值相互连接组成一个字符串:<paramName1><paramValue1><paramName2><paramValue2>...;将应用密钥分别添加到以上请求参数串的头部和尾部:<secret><请求参数字符串><secret>;对该字符串进行MD5(全部大写),MD5后的字符串即是这些请求参数对应的签名;该签名值使用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": ""//接口版本号
}
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
}
}
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"
}
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"
}
}
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"
}
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"
}
}
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
}
]
}
]
}
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
}
}
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
}
}
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"
}
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"
}
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"
}
}
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":"测试设备协议",
},
...
]
}
}
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"
}
}
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);
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());
}
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());
}
}
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