上报地址以及秘钥
- 节能平台能耗数据上报服务器地址为:115.233.209.158:8082
- 上报数据包AES密钥:0102030405060708090a0b0c0d0e0f10
- 向量:0102030405060708090a0b0c0d0e0f10
- MD5:12345
- AES采用CBC算法模式、填充模式为Zeros
能耗数据类型编码
序号 | 能耗数据类型 | 编码 |
---|---|---|
1. | 正向有功总电能累积量 | 1090 |
2. | 水表累积量 | 1F90 |
3. | 燃气表累积量 | 1190 |
4. | A相电压 | 11B6 |
5. | B相电压 | 12B6 |
6. | C相电压 | 13B6 |
7. | A相电流 | 21B6 |
8. | B相电流 | 22B6 |
9. | C相电流 | 23B6 |
10. | 功率因素 | 50B6 |
11. | A相功率因素 | 51B6 |
12. | B相功率因素 | 52B6 |
13. | C相功率因素 | 53B6 |
14. | 有功功率 | SKW |
15. | 冷冻水出水温度 | SLDSC |
16. | 冷冻水回水温度 | SLDSH |
17. | 冷冻水流量 | SLDSLL |
18. | 室外温度 | RNA01 |
19. | 太阳辐照度 | RNA02 |
20. | 光伏组件背面表面温度 | RNA03 |
21. | 发电量 | RNA04 |
22. | 光伏逆变器转换效率 | RNA05 |
23. | 集热系统进水温度 | RNA06 |
24. | 集热系统出水温度 | RNA07 |
25. | 集热系统循环流量 | RNA08 |
26. | 辅助热源耗能量 | RNA09 |
27. | 系统耗电量 | RNA10 |
28. | 机组用户侧进水温度 | RNA11 |
29. | 机组用户侧出水温度 | RNA12 |
30. | 机组用户侧流量 | RNA13 |
31. | 机组输入功率 | RNA14 |
32. | 系统热源侧流量 | RNA15 |
33. | 系统用户侧流量 | RNA16 |
34. | 系统热源侧进水温度 | RNA17 |
35. | 系统热源侧出水温度 | RNA18 |
36. | 系统用户侧进水温度 | RNA19 |
37. | 系统用户侧出温度度 | RNA20 |
38. | 机组热源侧流量 | RNA21 |
39. | 机组热源侧进水温度 | RNA22 |
40. | 机组热源侧出水温度 | RNA23 |
41. | 系统能效(COP) | RNA24 |
采集设备类型列表
采集设备类型编号 | 采集设备类型名称 |
---|---|
001 | 单相电表 |
002 | 水表 |
003 | 燃气表 |
004 | 多功能电表 |
005 | 三相四线有功电表 |
GE01 | GE冷量表 |
能耗类型列表
能耗类型编号 | 能耗类型名称 |
---|---|
01 | 电(electricity) |
02 | 水(water) |
03 | 气(gas) |
04 | 集中供热量(hot) |
05 | 集中供冷量(cool) |
06 | 其他能源(other) |
07 | 煤(coal) |
08 | 液化石油气 |
09 | 人工煤气 |
10 | 汽油 |
11 | 煤油 |
12 | 柴油 |
13 | 可再生能源 |
计量单位列表
计量单位编号 | 计量单位名称 |
---|---|
U001 | 千瓦时(电) |
U002 | 立方米(水) |
U003 | 立方米(煤气) |
U004 | 千瓦时(电)/平方米 |
U005 | 立方米(水)/平方米 |
U006 | 立方米(煤气)/平方米 |
U007 | 千瓦(电) |
U008 | n |
U009 | 分钟 |
U010 | GJ/h |
U011 | GJ |
U012 | 摄氏度 |
U013 | 立方米/秒 |
U014 | 升/分钟 |
U015 | 千克/分钟 |
U016 | 吨/小时 |
U017 | 立方米/小时 |
U018 | 升 |
U019 | 千克 |
U020 | 吨 |
U021 | 立方米(柴油) |
U022 | 冷量MJ 流量 M3 |
数据采集器身份认证过程和数据加密
身份认证过程
数据中心使用MD5算法进行数据采集器身份认证,密钥长度为128bit,具体过程如下:
- TCP连接建立成功后,数据采集器向数据中心发送身份认证请求;
- 数据中心向数据采集器发送一个随机序列;
- 数据采集器将接收到的随机序列和本地存储的认证密钥组合成一连接串,计算连接串的MD5值并发送给数据中心;
- 数据中心将接收到的MD5值和本地计算结果相比较,如果一致则认证成功,否则认证失败。
认证密钥存储在数据中心和数据采集器的本地文件系统中,数据中心可以通过网络对数据采集器的认证密钥进行更新。
- 数据加密
使用AES加密算法对XML数据包进行加密,密钥长度为128bit。加密密钥存储在数据中心和数据采集器的本地文件系统中,数据中心可以通过网络对数据采集器的加密密钥进行更新
数据采集器和数据中心通信过程
数据封包格式
数据封包的基本结构 | 项目 | 长度 | 定义 | 说明 | | —- | —- | —- | —- | | 包头 | 4字节 | 0x68 0x68 0x16 0x16 |
| | 有效数据总长度 | 4字节 |
| 代表当前数据包中的“有效数据”的长度。 | | 有效数据 | N字节(M+4) |
| “有效数据”为数据包的实体内容,M指令内容为经过AES加密后的XML文本长度。 | | CBC校验 | 2字节 |
| 只对“有效数据”进行CBC校验,CBC校验采用CBC-16-CCITT。 CBC-16/XMODEM
需要字节颠倒,如校验结果是1234,报文里需要是3412 | | 包尾 | 4字节 | 0x55 0xAA 0x55 0xAA |
|有效数据 | 项目 | 长度 | 定义 | 说明 | | —- | —- | —- | —- | | 指令序号 | 4字节 |
| 该标识符由指令发起方指定,标识了指令发起方向指令应答方发送的指令,指令应答方应答时,本项内容需要按照指令发起方提供的标识符来进行填充。指令序号 4字节,需要两个字节两个字节颠倒,如序号是12345678的话,报文里需要是56781234 | | 指令内容 | M字节 |
| 根据指令的不同,内容不同,指令内容为经过AES加密后的XML文本 |
数据传输的XML数据格式
- 身份验证和校时数据包
```xml
<?xml version=”1.0” encoding=”utf-8” ?>
request
```xml
<?xml version="1.0" encoding="utf-8" ?>
<root>
<common>
<building_id><!-- 分项计量建筑识别码(10位) --></building_id>
<gateway_id><!-- 采集装置编号 --></gateway_id>
<type>sequence</type>
</common>
<id_validate operation="sequence">
<sequence ><!-- 随机序列 --></sequence>
</id_validate>
</root>
<?xml version="1.0" encoding="utf-8" ?>
<root>
<common>
<building_id><!-- 分项计量建筑识别码(10位) --></building_id>
<gateway_id><!-- 采集装置编号(2位),如01 --></gateway_id>
<type>md5</type>
</common>
<id_validate operation="md5">
<md5><!-- 数据中心随机序列+MD5码的MD5计算值 --></md5>
</id_validate>
</root>
<?xml version="1.0" encoding="utf-8" ?>
<root>
<common>
<building_id><!-- 分项计量建筑识别码(10位) --></building_id>
<gateway_id><!-- 采集装置编号(2位),如01 --></gateway_id>
<type>result</type>
<type>time</type>
</common>
<id_validate operation="result">
<result><!-- 验证成功:pass;验证失败:fail --></result>
<time><!-- 格式: yyyyMMddHHmmss --></time>
</id_validate>
</root>
- 心跳数据包
```xml
<?xml version=”1.0” encoding=”utf-8” ?>
notify
```xml
<?xml version="1.0" encoding="utf-8" ?>
<root>
<common>
<building_id><!-- 分项计量建筑识别码(10位) --></building_id>
<gateway_id><!-- 采集装置编号(2位),如01 --></gateway_id>
<type>heart_result</type>
</common>
<id_validate operation="heart_result">
<heart_result><!--0000--></heart_result>
</id_validate>
</root>
- 设备验证及数据上报数据包
```xml
<?xml version=”1.0” encoding=”utf-8” ?>
query
```xml
<?xml version="1.0" encoding="utf-8" ?>
<root>
<common>
<building_id><!-- 分项计量建筑识别码(10位) --></building_id>
<gateway_id><!-- 采集装置编号(2位),如01 --></gateway_id>
<type>reply</type>
</common>
<data operation="reply">
<sequence>
<!-- 采集装置向数据中心发送数据的序号 -->
</sequence>
<parse>
<!--
yes: 向数据中心发送的数据经过采集装置解析;
no: 向数据中心发送的数据未经过采集装置解析;
-->
</parse>
<time>
<!-- 数据采集时间 -->
</time>
<!--
计量装置信息, 一个或多个
meter元素属性:
id: 仪表序号(当前仪表在所有仪表中的序号)
name: 采集点识别码
conn: 计量装置诊断信息,取值 conn: 计量装置连接正常 disconn: 计量装置连接断开
-->
<meter id="1" name="330102E066090001" conn="conn">
<!--
计量装置的具体采集功能,一个或多个
function元素属性:
id: 计量装置的具体采集功能编号
name: 采集点识别码-能耗数据类型编码
coding: 监测数据分类/分项编号
error: 该功能出现错误的状态码,192表示没有错误
-->
<function id="1" coding="abc" name="330102E066090001-1090" error="0" sample_time="yyyyMMddHHmmss">
<!-- 具体数据 -->
</function>
</meter>
<meter id="1" name="330102E066090001" conn="conn">
<function id="1" coding="abc" name="330102E066090001-1090" error="0" sample_time="yyyyMMddHHmmss">
<!-- 具体数据 -->
</function>
<function id="1" coding="abc" name="330102E066090001-1090" error="0" sample_time="yyyyMMddHHmmss">
<!-- 具体数据 -->
</function>
</meter>
</data>
</root>
<?xml version="1.0" encoding="utf-8" ?>
<root>
<common>
<building_id><!-- 分项计量建筑识别码(10位) --></building_id>
<gateway_id><!-- 采集装置编号(2位),如01 --></gateway_id>
<type>report</type>
</common>
<data operation="report">
<sequence>
<!-- 采集装置向数据中心发送数据的序号 -->
</sequence>
<parse>
<!--
yes: 向数据中心发送的数据经过采集装置解析;
no: 向数据中心发送的数据未经过采集装置解析;
-->
</parse>
<time>
<!-- 数据采集时间 -->
</time>
<!--
计量装置信息, 一个或多个
meter元素属性:
id: 仪表序号(当前仪表在所有仪表中的序号)
name: 采集点识别码
conn: 计量装置诊断信息,取值 conn: 计量装置连接正常 disconn: 计量装置连接断开
-->
<meter id="1" name="330102E066090001" conn="conn">
<!--
计量装置的具体采集功能,一个或多个
function元素属性:
id: 计量装置的具体采集功能编号
coding: 监测数据分类/分项编号
name: 采集点识别码-能耗数据类型编码
error: 该功能出现错误的状态码,192表示没有错误
-->
<function id="1" coding="abc" name="330102E066090001-1090" error="0" sample_time="yyyyMMddHHmmss">
<!-- 具体数据 -->
</function>
</meter>
</data>
</root>
<?xml version="1.0" encoding="utf-8" ?>
<root>
<common>
<building_id><!-- 分项计量建筑识别码(10位) --></building_id>
<gateway_id><!-- 采集装置编号(2位),如01 --></gateway_id>
<type>continuous</type>
</common>
<data operation="continuous">
<sequence>
<!-- 采集装置向数据中心发送数据的序号 -->
</sequence>
<parse>
<!--
yes: 向数据中心发送的数据经过采集装置解析;
no: 向数据中心发送的数据未经过采集装置解析;
-->
</parse>
<time>
<!-- 数据采集时间 -->
</time>
<total>
<!-- 需要断点续传数据包的总数 -->
</total>
<current>
<!-- 当前断点续传数据包的编号 -->
</current>
<!--
计量装置信息, 一个或多个
meter元素属性:
id: 仪表序号(当前仪表在所有仪表中的序号)
name: 采集点识别码
conn: 计量装置诊断信息,取值 conn: 计量装置连接正常 disconn: 计量装置连接断开
-->
<meter id="1" name="330102E066090001" conn="conn">
<!--
计量装置的具体采集功能,一个或多个
function元素属性:
id: 计量装置的具体采集功能编号
coding: 监测数据分类/分项编号
name: 采集点识别码-能耗数据类型编码
error: 该功能出现错误的状态码,192表示没有错误
-->
<function id="1" coding="abc" name="330102E066090001-1090" error="0" sample_time="yyyyMMddHHmmss">
<!-- 具体数据 -->
</function>
</meter>
</data>
</root>
<?xml version="1.0" encoding="utf-8" ?>
<root>
<common>
<building_id><!-- 分项计量建筑识别码(10位) --></building_id>
<gateway_id><!-- 采集装置编号(2位),如01 --></gateway_id>
<type>continuous_ack</type>
</common>
<data operation="continuous_ack" />
< continuous_ack >
<!—当前包 -->
</ continuous_ack >
</data>
</root>
- 配置信息数据包
```xml
<?xml version=”1.0” encoding=”utf-8” ?>
period
```xml
<?xml version="1.0" encoding="utf-8" ?>
<root>
<common>
<building_id><!-- 分项计量建筑识别码(10位) --></building_id>
<gateway_id><!-- 采集装置编号(2位),如01 --></gateway_id>
<type>period_ack</type>
</common>
<config operation="period_ack" />
</config>
</root>
2022-04-13 11:42:56.8900 [ INFO] [ 7] [msl.Cloud.BizService.GovBuildingEnergyConsumption.Encoder.EnergyPackageEncoder] Send:
<?xml version="1.0" encoding="utf -8" ?>
<root>
<id_validate operation="request" />
<common>
<building_id>330421J002</building_id>
<gateway_id>01</gateway_id>
<type>request</type>
</common>
</root>
2022-04-13 11:42:56.9035 [ INFO] [ 7] [msl.Cloud.BizService.GovBuildingEnergyConsumption.Encoder.EnergyPackageEncoder] Send:68681616E4000000000100008D80DB2E2085CADB5FA68FDD664DE43362E2535208A27EBEDEA85484553FB5FABBB96F0177151EF082CB129D09034F2A30FC8DA13BBCF17A486E6E6DB2EBF87FB413415541E82481E1779C7E4F76C83613A5728BC99B93A7E686DAFDF652336CF6EADF64CB2281898E580021E03E72131FB5FB504A83DB3521484023F30DA56FA0CDA5E4891F83B8049B82F547E28B3AFF38205C890AA9E2F93EF4BEAD68780C7FC5F5465A817403307D7854A64BF897DAC2BEA85666BB983048E2677C8AE93392591F12DBCC1F3C43044C363AB9FF823B4641E59793BCAF17ADEEB90E3C1061C70055AA55AA
2022-04-13 11:42:57.0024 [ INFO] [ 4] [msl.Cloud.App.IoT.Driver.Energy.MslEnergyPackageHandler] Received:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<common>
<building_id>330421J002</building_id>
<gateway_id>01</gateway_id>
<type>sequence</type>
</common>
<id_validate operation="sequence">
<sequence>A123456d-1333027671</sequence>
</id_validate>
</root>
2022-04-13 11:42:57.0434 [ INFO] [ 4] [msl.Cloud.App.IoT.Driver.Energy.MslEnergyPackageHandler] Sequence:A123456d-1333027671
2022-04-13 11:42:57.0434 [ INFO] [ 4] [msl.Cloud.BizService.GovBuildingEnergyConsumption.Encoder.EnergyPackageEncoder] Send:
<?xml version="1.0" encoding="utf -8" ?>
<root>
<id_validate operation="md5">
<md5>2AF48530ABDAFACE0E3D8802F7E33597</md5>
</id_validate>
<common>
<building_id>330421J002</building_id>
<gateway_id>01</gateway_id>
<type>md5</type>
</common>
</root>
2022-04-13 11:42:57.0434 [ INFO] [ 4] [msl.Cloud.BizService.GovBuildingEnergyConsumption.Encoder.EnergyPackageEncoder] Send:6868161624010000000200008D80DB2E2085CADB5FA68FDD664DE43362E2535208A27EBEDEA85484553FB5FABBB96F0177151EF082CB129D09034F2A30FC8DA13BBCF17A486E6E6DB2EBF87F7AA0B7EFEA9EF5C53F3C723D6EADE67A66624E5B9299AB0E797A5B9E07073169E7E99CB7F23DD3453FE0958BC23E89BD397B26DD9BC1D4057F5EF4035429B91E294896BAE0411962785C4BD3131E2A25674907B58EB939F0135BF26BBC1103FC4BBC0D7EF887F67B029409E72D2EC7599DC8E231A6FA5680C79B7DF993B58852176337625F269A6C1C10C129A63ACB5461FC0B99E0C3049E4545740DF75993913CC743CD90A1DD603B8FCA617F7B875A5800C7C60526E408D2031DF686ECD1F8C725A23B568F87FBCB09DB929CE4011001D6B07E0FB34FCCE93105BAD57647020DB655AA55AA
2022-04-13 11:42:57.0904 [ INFO] [ 5] [msl.Cloud.App.IoT.Driver.Energy.MslEnergyPackageHandler] Received:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<common>
<building_id>330421J002</building_id>
<gateway_id>01</gateway_id >
<type>result</type>
</common>
<id_validate operation="result">
<result>pass</result>
</id_validate>
</root>
2022-04-13 11:42:57.0904 [ INFO] [ 5] [msl.Cloud.App.IoT.Driver.Energy.MslEnergyPackageHandler] MD5 Check Result:pass
The thread 0x20ec has exited with code 0 (0x0).
2022-04-13 11:43:07.1164 [ INFO] [ 5] [msl.Cloud.BizService.GovBuildingEnergyConsumption.Encoder.EnergyPackageEncoder] Send:
<?xml version="1.0" encoding="utf -8" ?>
<root>
<heart_beat operation="notify" />
<common>
<building_id>330421J002</building_id>
<gateway_id>01</gateway_id>
<type>notify</type>
</common>
</root>
2022-04-13 11:43:07.1164 [ INFO] [ 5] [msl.Cloud.BizService.GovBuildingEnergyConsumption.Encoder.EnergyPackageEncoder] Send:68681616E4000000000300008D80DB2E2085CADB5FA68FDD664DE43362E2535208A27EBEDEA85484553FB5FABBB96F0177151EF082CB129D09034F2ADA33CEFD9C32C002A1E5D55D3E4B9FACA88CC3EB81730E4D2ECC2D27BAB4E2EA6E7A841A9BD1B64550ADA91FF59E2338E6EB406F56482F037D00BBA52B13CBE1196E81C29FB9D67F17C4E1452183400C2A837BBBBB55D7B23871E97269FEC0FA8440BE238469A3BAF44D3DB91223D518FA1EABB4E4DEB50E15F01418DBC60A890EB0B571B020B34FABB7F415A929B436010E721C3DBA4C0CC913BCD448B7668D4BE69BC29EB244513DDF315FDC1F11EDDA1455AA55AA
2022-04-13 11:43:07.4010 [ INFO] [ 5] [msl.Cloud.App.IoT.Driver.Energy.MslEnergyPackageHandler] Received:
<?xml version="1.0" encoding="utf-8"?>
<root><common><building_id>330421J002</building_id><gateway_id>01</gateway_id><type>time</type></common><heart_beat operation="time"><time>20220413114303</time></heart_beat></root>
<?xml version="1.0" encoding="utf -8" ?>
<root>
<data operation="report">
<sequence>1649875980</sequence>
<parse>yes</parse>
<time>20220413185300</time>
<meter id="2" name="330421J002040004" conn="conn">
<function id="1" coding="01000" name="330421J002040004-01" error="192" sample_time="20220413185300">
90
</function>
</meter>
</data>
<common>
<building_id>330421J002</building_id>
<gateway_id>01</gateway_id>
<type>report</type>
</common>
</root>
数据包
{
root:{
common:{
building_id:"",//建筑识别码
gateway_id:"", //采集装置编号 00~99
type:"", //reply;query;report;continuous
},
data:{
operation:"", //reply;report;continuous
sequence:"",//采集装置向数据中心发送数据的序号
parse:"", //Yes:采集装置已解析;No:未解析
time:"",
total:"", //断点续传使用
current:"",//断点续传使用
meter:[
{
"@id":"", //仪表序号 @ 标识此项对应 xml 节点的属性
"@name":"", //采集点识别码
"@conn":"", //计量装置诊断信息
function:[
{
"@id":"", //计量装置的具体采集功能编号
"@name":"", //采集点识别码-能耗数据类型编码
"@coding":"",//检测数据分类/分项编号
"@error":"", //该功能出现错误的状态码,192标识没有错误
"@sample_time":"", //采样时间
"%value":"", //采样值,xml对应节点值
}
]
}
]
}
}
}
{
building_id:"",//建筑识别码
gateway_id:"", //采集装置编号 00~99
ip:"",
port:"",
aesHexKey:"",
aesHexVector:"",
md5Salt:"",
}
{
building_id:"",//建筑识别码
gateway_id:"", //采集装置编号 00~99
meters:[
{
"id":"", //仪表序号
"name":"", //采集点识别码
functions:[
{
"id":"", //计量装置的具体采集功能编号
"name":"", //采集点识别码-能耗数据类型编码
"coding":"",//检测数据分类/分项编号
"error":"", //该功能出现错误的状态码,192标识没有错误
"value":"", //采样值
}
]
}
]
}