1. 设置网关
1.1. 网关接入
1.2. 发送注册请求(检查注册标识,如果注册了就没有这个步骤)
数据项 | 获取方式 |
---|---|
网关ID | 读配置 |
注册rpc协议:
{
“id”:123,
“jsonrpc”:2.0,
“method”:”registerAcquisitor”,
“params”:{“gateway_id”: gateway_id}
}
平台响应注册请求:
{
"id":123,
"jsonrpc":2.0,
"result": true,
"error":null
}
错误响应:
{
"id":123,
"jsonrpc":2.0,
"result":false,
"error":"reason"
}
1.3. 基础信息
设置基础信息rpc协议:
{
"id":123,
"method":"setDataCenter",
"params":{
"gateway_id":gateway_id,
"dataCenter":"dc.energyiot.cn",
"dataPort":9998
}
}
获取基础信息rpc协议:
{
“id”:123,
“jsonrpc”:2.0,
“method”:”getDataCenter”
}
响应rpc:
{
“id”:123,
“jsonrpc”:2.0,
“result”:{“gateway_id”: gateway_id,”dataCenter”:”dc.energyiot.cn”,”dataPort”:9998}
}
1.4. 采集器信息
设置采集信息rpc协议:
{
"id":123,
"jsonrpc":2.0,
"method":"setAcquisitorInfo",
"params":{"gateway_id": gateway_id,"property":"楼道信息"}
}
获取采集信息rpc协议:
{
“id”:123,
“jsonrpc”:2.0,
“method”:”getAcquisitorInfo”,
“params”:{“gateway_id”: gateway_id,”property”:”楼道信息”}
}
响应rpc:
设置采集信息rpc协议:
{
“id”:123,
“jsonrpc”:2.0,
“result”:{“gateway_id”: gateway_id,”property”:”楼道信息”}
}
1.5. 采集器通讯网关
设置采集器网关rpc协议:
{
“id”:123,
“jsonrpc”:2.0,
“method”:”setGateway”,
“params”:{“gateway_id”: gateway_id,
“gateway”:{“lan”:”lan1”,
“mode”:”static”/”dynamic”,
”ipaddr”:”192.168.1.230”,”netmask”:”255.255.255.0”,”defaultgateway”:”192.168.1.1”}
}
}
获取采集器网关rpc协议:
{
“id”:123,
“jsonrpc”:2.0,
“method”:”getGateway”
}
响应rpc协议:
{
“id”:123,
“jsonrpc”:2.0,
“result”:{“gateway_id”: gateway_id,
“gateway”:{“lan”:”lan1”,
“mode”:”static”/”dynamic”,
”ipaddr”:”192.168.1.230”,”netmask”:”255.255.255.0”,”defaultgateway”:”192.168.1.1”}
}
}
2. 仪表处理
2.1. 平台端获取设备列表
获取设备列表
{
“id”:123,
“jsonrpc”:2.0,
“method”:"getDeviceList",
“params”:{“status”:“all”}
}
params 的值可以是以下情况:
设备状态 | 意义 | 响应 |
---|---|---|
all | 所有设备 | 返回所有设备列表 |
added | 已经添加的设备 | 返回状态为已添加设备列表 |
unadd | 未添加设备 | 返回状态为未添加设备列表 |
unknown | 未知设备,可能是之前已经添加了,但是又拔出去的设备 | 返回状态为未知设备列表 |
2.2. 网关端发送设备列表
网关响应设备列表rpc:
{
“id”:123
“jsonrpc”:2.0
“result”:
[
{
“name”:”device1”,
“id”:12345678,
“status”:”added”,
“chn”:”COM1”
},
{/* 此时不知道名称和id */
“status”:”unadd”,
“chn”:”COM2”
},
{
“name”:”device3”,
“id”:12345678,
“status”:”unknown”,
“chn”:”COM3”
},
…
]
}
也有可能一个设备都没有
2.3. 平台端选择其中一个设备,不同状态,处理不同
2.3.1 added:
发送的rpc:
{
"id":123,
"jsonrpc":"2.0",
"method":"getDeviceInfo",
"params":{"chn":"COM1","id":"12345678"}
}
返回设备的基本信息:
{
“id”:123
“jsonrpc”:2.0
“result”:{
“name”:”device1”,
“id”:12345678,
“status”:”added”,
"sample":30,/*单位:分钟*/
“lifeuse”:”生活用水”,
“model”: “设备型号”,
“type”:”WaterMeter”,
“communication”:{
“mode”:”socket”,
"addr":{
“ipaddr”:”192.168.1.22”,
”port”:3737,
”delay”:1500
}
或
“mode”: ”serial”,
"addr":{
“chn”:”COM1”,
”baudRate”:19200,
”dataBits”:8,
”stopBits”:1,
delay”:1500
}
}
}
}
2.3.2 unadded
应该进入添加设备界面,点击添加:
params部分都是需要用户设置的内容,
“chn”:”COM2”可以使用网关提供的,也可以改
用户设置厂商,型号,仪表类型,得到配置文件;
用户设置通讯地址(串口通道、波特率、校验码、停止位);
根据以上信息网关可以返回设备ID的一个列表,具体rpc如下:
获取设备ID rpc:
{
"id":123,
"method":"getDeviceIds",
"params":{
"model": "1235",
"communication":{
"mode":"socket",
"delay":1500,
"addr":{
"ipaddr":"192.168.1.22",
"port":3737
}
或
"mode": "serial",
"delay":1500,
"addr": {
"chn":"COM1",
"baudRate":19200,
"dataBits":8,
"stopBits":1,
"addr":"12345678"
}
}
}
}
返回ID列表:
{
"id":123,
"jsonrpc":"2.0",
"result":
[
{
"id":"12345678",
"model":"1234"
},
{
"id":"92345678",
"model":"1235"
}
]
}
表达式格式
序号 | 表达式 |
---|---|
01 | bcd/100.0 |
02 | int*0.1 |
获取设备列表
{
"id":1234,
"jsonrpc":"2.0",
"method":"getDevicesList"
}
返回设备列表:
{
"id":1234,
"jsonrpc":"2.0",
"result":
[
{
"name":"device1",
"id":"12345678",
"sample":30,/*单位:分钟*/
"model":"lianli_dns20", /* 设备型号 */
"type":1, /* 1 表示水表,2表示电表,3其他表等等*/
"protocol":"modbus_rtu", /*协议模板*/
"communication":{
"mode": "serial",
"delay":1500,
"addr":{
"chn":"COM1",
"baudRate":2400,
"dataBits":8,
"stopBits":1,
"parity":2 /* 0 无,1 奇,2 偶*/
},
{/*其他设备*/}
]
}
获取表达式列表
{
"id":1234,
"jsonrpc":"2.0",
"method":"getExprsList"
}
返回表达式列表
{
"id":1234,
"jsonrpc":"2.0",
"result":[
{"id":0,"expr":"$data","comment":"指令格式"},
{"id":1,"expr":"$bcd($data)","comment":"BCD编码"},
{"id":2,"expr":"$int($data)","comment":"整数"},
{"id":3,"expr":"$float($data)","comment":"IEEE 754 标准浮点数"}
]
}
获取采样参数列表
{
"id":1234,
"jsonrpc":"2.0",
"method":"getAquireList"
}
返回采样参数列表
{
"id":1234,
"jsonrpc":"2.0",
"result":[
{"model":"lianli_dns20","acqId":0x0000,"params":["11H","33H 78H","0aH 81H 01H"],"reglen":5,"expr":0,"rate":0},
{"model":"lianli_dns20","acqId":0x0101,"params":["11H","33H 78H","1fH 90H 01H"],"reglen":4,"expr":1,"rate":100.0},
{"model":"lianli_dns20","acqId":0x0000,"params":["10H","33H 78H","0aH 81H 01H"],"reglen":5,"expr":0,"rate":0},
{"model":"lianli_dns20_bigcore","acqId":0x0101,"params":["10H","33H 78H","1fH 90H 01H"],"reglen":4,"expr":1,"rate":100.0},
{"model":"hed09e3y","acqId":0x0000,"params":["00H 45H"],"reglen":1,"expr":0,"rate":0},
{"model":"hed09e3y","acqId":0x0201,"params":["00H 36H"],"reglen":2,"expr":3,"rate":10.0},
{"model":"hed09e3y","acqId":0x0202,"params":["00H 38H"],"reglen":2,"expr":3,"rate":10.0},
{"model":"hed09e3y","acqId":0x0203,"params":["00H 3CH"],"reglen":2,"expr":3,"rate":10.0},
{"model":"hed09e3y","acqId":0x0204,"params":["00H 3EH"],"reglen":2,"expr":3,"rate":10.0},
{"model":"dds228_l","acqId":0x0000,"params":["00H 45H"],"reglen":1,"expr":0,"rate":0},
{"model":"dds228_l","acqId":0x0210,"params":["00H 36H"],"reglen":2,"expr":3,"rate":10.0},
{"model":"dds228_l","acqId":0x0211,"params":["00H 3AH"],"reglen":2,"expr":3,"rate":10.0}
]
}
获取配置:
{
"id":1234,
"jsonrpc":"2.0",
"method":"getConfigures"/"updateConfigures",
"params":
{
"exprs":
[
{"id":1,"expr":"$data","comment":"指令格式"},
{"id":1,"expr":"$bcd($data)","comment":"BCD编码"},
{"id":2,"expr":"$int($data)","comment":"整数"},
{"id":3,"expr":"$float($data)","comment":"IEEE 754 标准浮点数"}
],
"acqtypes":
[
{"acqId":0x0000,"name":"设备地址","unit":"none"},
{"acqId":0x0101,"name":"计量数据","unit":"m3"},
{"acqId":0x0201,"name":"正向有功电度","unit":"kwh"},
{"acqId":0x0202,"name":"负向有功电度","unit":"kwh"},
{"acqId":0x0203,"name":"正向无功电度","unit":"kvarh"},
{"acqId":0x0204,"name":"负向无功电度","unit":"kvarh"},
{"acqId":0x0210,"name":"有功总电度","unit":"kwh"},
{"acqId":0x0211,"name":"无功总电度","unit":"kvarh"}
],
"acquire":
[
{"model":"lianli_dns20","acqId":0x0000,"params":"11H;[33H 78H];[0aH 81H 01H]","reglen":5,"expr":0,"rate":0},
{"model":"lianli_dns20","acqId":0x0101,"params":"11H;[33H 78H];[1fH 90H 01H]","reglen":4,"expr":1,"rate":100.0},
{"model":"lianli_dns20","acqId":0x0000,"params":"10H;[33H 78H];[0aH 81H 01H]","reglen":5,"expr":0,"rate":0},
{"model":"lianli_dns20_bigcore","acqId":0x0101,"params":"10H;[33H 78H];[1fH 90H 01H]","reglen":4,"expr":1,"rate":100.0},
{"model":"hed09e3y","acqId":0x0000,"params":"[00H 45H]","reglen":1,"expr":0,"rate":0},
{"model":"hed09e3y","acqId":0x0201,"params":"[00H 36H]","reglen":2,"expr":3,"rate":10.0},
{"model":"hed09e3y","acqId":0x0202,"params":"[00H 38H]","reglen":2,"expr":3,"rate":10.0},
{"model":"hed09e3y","acqId":0x0203,"params":"[00H 3CH]","reglen":2,"expr":3,"rate":10.0},
{"model":"hed09e3y","acqId":0x0204,"params":"[00H 3EH]","reglen":2,"expr":3,"rate":10.0},
{"model":"dds228_l","acqId":0x0000,"params":"[00H 45H]","reglen":1,"expr":0,"rate":0},
{"model":"dds228_l","acqId":0x0210,"params":"[00H 36H]","reglen":2,"expr":3,"rate":10.0},
{"model":"dds228_l","acqId":0x0211,"params":"[00H 3AH]","reglen":2,"expr":3,"rate":10.0}
]
}
}
}
发送的rpc:
{
"id":123,
"jsonrpc":"2.0",
"method":"addDevice"
"params":{
"name":"device1",
"id":"12345678",
"sample":30,/*单位:分钟*/
"lifeuse":"生活用水",
"model":"lianli_dns20", /* 设备型号 */
"type":1, /* 1 表示水表,2表示电表*/
"protocol":"modbus_rtu",
"communication":{
"mode": "serial",
"delay":1500,
"addr":{
"chn":"/dev/ttySAC0",
"baudRate":2400,
"dataBits":8,
"stopBits":1,
"parity":2 /* 0 无,1 奇,2 偶*/
}
}
}
}
返回的结果:
{
“id”:123,
“jsonrpc”:2.0,
“result”:true/false,
“error”:”reason”
}
2.3.3 unknown
首先发送: “getDeviceInfo”获取该仪表所有信息,然后可以进行以下两种操作:
一是删除:
{
“id”:123,
“jsonrpc”:2.0,
“method”:”deleteDevice”,
“params”:{“id”:12345678}
}
返回的rpc:
{
“id”:123,
“jsonrpc”:2.0,
“result”:true/false,
“error”:”reason”
}
二是修改:有可能只是这个设备地址不一致,可以改下地址,或通道,或其他参数,然后发送:(params部分都是可以修改的内容)
{
“id”:123
“jsonrpc”:2.0,
"method":"modifyDevice"
“params”:{
"name":"device1",
"id":"12345678",
"sample":30,/*单位:分钟*/
"lifeuse":"生活用水",
"model":"lianli_dns20", /* 设备型号 */
"type":1, /* 1 表示水表,2表示电表*/
"protocol":"modbus_rtu",
"acquire": /* 采集列表 */
[
{
"id": 0x0101,
"name": "计量数据",
"cmdword":0x36,
"reglen": 2,
"expr": "$bcd($data)/100.00",
"unit": "m3"
},
.../*其他仪表可能有多个数据需要采集*/
]
"communication":{
"mode": "serial",
"delay":1500,
"addr":{
"chn":"/dev/ttySAC0",
"baudRate":2400,
"dataBits":8,
"stopBits":1,
"parity":2 /* 0 无,1 奇,2 偶*/
}
}
}
}
返回的结果:
{
“id”:123,
“jsonrpc”:2.0,
“result”:true/false,
“error”:”reason”
}
{
“id”:123,
“jsonrpc”:2.0,
“method”:"getDeviceStatus",
“params”:{"id":"12345678"}
}
{
“id”:123,
“jsonrpc”:2.0,
“method”:"getDeviceStatus",
“result":"added"
}
2.4. 获取设备配置文件
仪器设备的解析配置文件和解析插件存放在服务器上,在第一次添加设备之后需要立即获取采样配置文件。
在网关上发送请求rpc:
{
"id":123,
"jsonrpc":2.0,
"method":"getConfigFiles",
"params":{
"id":"12345678",
"model":设备型号,
"type":"WaterMeter"
}
}
平台端响应:
{
"id":123,
"jsonrpc":2.0,
"result":{
"id":"12345678",
"manu":"厂商",
"model":设备型号,
"type":"WaterMeter",
"configfile":{"filename":文件名,"content":文件内容},/*解析配置文件*/
"parseplugin":{"filename":文件名,"content":文件内容}/*把解析插件的二进制文件转换成base64编码发送*/
}
}
解析配置文件:配置每个数据的指令格式
数据 | 发送指令 | 响应指令 | 类型 |
---|---|---|---|
数据1 | 发送指令1 | 响应指令1 | S32 |
数据2 | 发送指令2 | 响应指令2 | U8 |
数据3 | 发送指令3 | 响应指令3 | F32 |
… | … | … | … |
S32:有符号整型,32位
U:无符号整型,8位
F:浮点数,32位
自定义类型,在解析插件里面定义,然后定义一个名称即可。
解析插件:负责指令的组合和解析
仪表相同厂家同型号的指令格式一样,这时候解析插件可能
3. 采样
3.1. 在网关上采集数据
3.2. 发送采集数据到服务器
{
"id":123,
"jsonrpc":2.0,
"method":"acquireData",
"params":{
"id":12345678,
"chn":"COM1",
或
"ip":"192.168.0.1",
"port":2211,
"data":[
{
"itemid":201,
"time":1435987632,
"value":1.00
},
...
]
}
}
data1,data2,data3,…,datan,按配置文件定义的先后顺序存放
平台端不需要无响应,如果网络无法连接会暂存在本地。
4. 远程调试
在平台端用户需要设置好设备id,设备通讯地址和调试命令,然后发送给网关:
发送的rpc:
{
“id”:123
“jsonrpc”:2.0,
"method":"debugDevice"
“params”:{
“id”:12345678,
"command":"16进制指令" //(在平台端给用户提供两种模式,一种是直接输命令,另一种是输入数据,由平台端把它转变成命令)
“communication”:{
“mode”:”socket”,
"addr":{
“ipaddr”:”192.168.1.22”,
”port”:3737,
”delay”:1500
}
或
“mode”: ”serial”,
"addr":{
“chn”:”COM1”,
”baudRate”:19200,
”dataBits”:8,
”stopBits”:1,
”delay”:1500,
“parity”:2
}
}
}
}
4.2 心跳检测
发送:
{
“id”:123,
“jsonrpc”:”2.0”,
“method”:”checkHeartbeat”,
}
返回:
{
“id”:123,
“jsonrpc”:”2.0”,
“result”:true/false
}
5 远程升级
{
“id”:123,
“jsonrpc”:”2.0”,
“method”:”updatePacket”,
“params”:
{
“shell”: 一个脚本的内容
“packet” 升级包,编码成base64编码再传
}
}