代码拉取完成,页面将自动刷新
package parse_eb90
import (
"encoding/hex"
"encoding/json"
. "gitee.com/dell_software_department/parse_eb90/models"
"gitee.com/dell_software_department/parse_eb90/util"
"strings"
"time"
)
/*
EB90EB90EB90
48 //个数
02 //功能码
0500 //设备ID
000800140500 //时间,年月日时分秒
00 //GPRS状态
2F 1C //电池电压
4c //信号强度 -76
FEFFFFFF //通信状态
01 7C 08564401000000 03000000 08 33020000 2C 00000000 17 00000000 35 7E080000 00 80080000 00 02000000 00 00000000 00 00000000 00 //解析格式同热量表采集器
02 7C 08564401000000 0300000008330200002C000000001700000000357E080000008008000000020000000000000000000000000000
03 7C 08564401000000 0300000008330200002C000000001700000000357E080000008008000000020000000000000000000000000000
04 7C 08564401000000 0300000008330200002C000000001700000000357E080000008008000000020000000000000000000000000000
26
*/
func parseCjqArr(data []byte) ([]ParseMsg, *ParseMsgError) {
var d []string
result := make([]ParseMsg, 0)
err := json.Unmarshal(data, &d)
if err != nil {
return nil, &ParseMsgError{Error: "格式不对", ErrorNo: -1}
} else {
for _, v := range d {
result = append(result, parseCjq(v))
}
}
return result, nil
}
func parseCjq(str string) ParseMsg {
str = strings.Replace(str, " ", "", -1)
str = strings.Replace(str, "\n", "", -1)
str = strings.Replace(str, "\r", "", -1)
str = strings.Replace(str, "\t", "", -1)
data, err := hex.DecodeString(str)
if err != nil {
return ParseMsg{ParseMsgError{ErrorNo: -1, Error: err.Error()}, nil}
}
if len(data) < 25 {
return ParseMsg{ParseMsgError{ErrorNo: 1, Error: "长度不够"}, nil}
}
if len(data) != int(data[6])+7 {
return ParseMsg{ParseMsgError{ErrorNo: 2, Error: "长度字段与实际长度不符"}, nil}
}
if len(data)%54 != 25 {
return ParseMsg{ParseMsgError{ErrorNo: 2, Error: "长度不对"}, nil}
}
if util.BytesSum(data[7:len(data)-1]) != data[len(data)-1] {
return ParseMsg{ParseMsgError{ErrorNo: 3, Error: "校验未通过"}, nil}
}
var wdy Cjq
wdy.Gnm = data[7]
if wdy.Gnm == 0x02 || wdy.Gnm == 0x22 {
wdy.Gn = "主动上传"
}
wdy.CenterNo = int(data[8]) | int(data[9])<<8
year := 2000 + int(data[10])
wdy.Date =
time.Date(year, time.Month(data[11]), int(data[12]), int(data[13]), int(data[14]), int(data[15]), 0, time.Local).
Format(util.DATESTR1)
wdy.GPRS = getGPRS(data[16])
wdy.Dcdy = float64(int(data[17])|int(data[18])<<8) / 1000
wdy.SignalStrength = 0 - int(data[19])
// 通信状态 解析方法 为 低字节 在前 最低字节 的 最低位 表示 该包 第一个表的通讯状态 1为成功,0为失败,依次类推
txztArray := data[20:24]
var j byte = 0
for i := 24; i < len(data)-1; i += 54 {
var txzt string
if (txztArray[j/8]>>(j%8))&0x01 == 1 {
txzt = "成功"
} else {
txzt = "失败"
}
j++
mpid := data[i]
meterTypeCode := data[i+1]
meterType := MeterType[meterTypeCode]
meterNo := util.GetMeterNo(data[i+2 : i+9])
dqrl := get4ByteFloat(data[i+9 : i+13])
dqrlUnitCode := data[i+13]
dqrlUnit := DqrlUnit[dqrlUnitCode]
ljll := get4ByteFloat(data[i+14 : i+18])
ljllUnitCode := data[i+18]
ljllUnit := LjllUnit[ljllUnitCode]
gl := get4ByteFloat(data[i+19 : i+23])
glUnitCode := data[i+23]
glUnit := GlUnit[glUnitCode]
ls := get4ByteFloat(data[i+24 : i+28])
lsUnitCode := data[i+28]
lsUnit := LsUnit[lsUnitCode]
jswd := get4ByteFloat(data[i+29 : i+33])
_ = data[i+33]
hswd := get4ByteFloat(data[i+34 : i+38])
_ = data[i+38]
wdc := get4ByteFloat(data[i+39 : i+43])
_ = data[i+43]
runTime := get4Byte(data[i+44 : i+48])
runTimeUnitCode := data[i+48]
runTimeUnit := RunTimeUnit[runTimeUnitCode]
gzdm := get4Byte(data[i+49 : i+53])
_ = data[i+53]
d := CjqData{
MpId: mpid,
MeterNo: meterNo,
MeterTypeCode: meterTypeCode,
MeterType: meterType,
RawDqrl: dqrl,
RawDqrlUnit: dqrlUnit,
RawDqrlUnitCode: dqrlUnitCode,
RawLjll: ljll,
RawLjllUnit: ljllUnit,
RawLjllUnitCode: ljllUnitCode,
RawGl: gl,
RawGlUnitCode: glUnitCode,
RawGlUnit: glUnit,
RawLs: ls,
RawLsUnitCode: lsUnitCode,
RawLsUnit: lsUnit,
Jswd: jswd,
Hswd: hswd,
Wdc: wdc,
RawRunTime: runTime,
RawRunTimeUnitCode: runTimeUnitCode,
RawRunTimeUnit: runTimeUnit,
Gzdm: gzdm,
Bjxx: "",
Txzt: txzt,
Dqrl: getDqrl(dqrl, dqrlUnitCode),
DqrlUnit: DqrlUnit[0x05],
Ljll: getLjll(ljll, ljllUnitCode),
LjllUnit: LjllUnit[0x2C],
Gl: getGl(gl, glUnitCode),
GlUnit: GlUnit[0x17],
Ls: getLs(ls, lsUnitCode),
LsUnit: LsUnit[0x34],
RunTime: getRunTime(runTime, runTimeUnitCode),
RunTimeUnit: RunTimeUnit[0x00],
}
wdy.Value = append(wdy.Value, d)
}
return ParseMsg{ParseMsgError{ErrorNo: 0, Error: "succ"}, wdy}
}
func get4ByteFloat(bs []byte) float64 {
return float64(get4Byte(bs)) / 100
}
func get4Byte(bs []byte) int {
return int(bs[0]) | int(bs[1])<<8 | int(bs[2])<<16 | int(bs[3])<<24
}
func getDqrl(d float64, unit byte) float64 {
var dqrl = d
switch unit {
case 0x02:
dqrl = d / 1000
case 0x07:
fallthrough
case 0x08:
fallthrough
case 0x87:
dqrl = d * 1000
case 0x0A:
dqrl = d * 100000
case 0x01:
dqrl = d / 3600000
case 0x0B:
dqrl = d / 3600
case 0x0E:
fallthrough
case 0x0D:
dqrl = d / 3.6
case 0x11:
fallthrough
case 0x0F:
fallthrough
case 0x8F:
dqrl = d * 1000 / 3.6
case 0x13:
dqrl = d * 100000 / 3.6
}
return dqrl
}
func getLjll(d float64, unit byte) float64 {
var ljll = d
switch unit {
case 0x2A:
ljll = d / 10
case 0x29:
fallthrough
case 0x13:
fallthrough
case 0x12:
ljll = d / 1000
}
return ljll
}
func getGl(d float64, unit byte) float64 {
var gl = d
switch unit {
case 0x1A:
gl = d * 1000
case 0x14:
fallthrough
case 0x2B:
fallthrough
case 0x2A:
gl = d / 1000
}
return gl
}
func getLs(d float64, unit byte) float64 {
var ls = d
switch unit {
case 0x32:
fallthrough
case 0x3B:
fallthrough
case 0x3A:
ls = d / 1000
}
return ls
}
func getRunTime(d int, unit byte) int {
var runTime = d
switch unit {
case 0x23:
fallthrough
case 0x27:
runTime = d * 24
}
return runTime
}
var MeterType = map[byte]string{
0: "海纳HN-HMMS-25-20-M",
1: "兰吉尔(2WR620口径)",
2: "爱拓利(CFECHO)",
3: "临沂沂光(YGM20RL)",
4: "力创E-UWZ大表",
5: "唐山汇中超声热量表",
6: "江苏迈拓",
7: "威海天罡",
8: "大连世达",
9: "临沂沂光YGM-20(MBUS)",
10: "创展同成(新)",
11: "创展同成(旧)",
12: "合肥瑞纳表计",
13: "山东联强节能",
14: "兰吉尔UH50",
15: "兰吉尔F4",
16: "洛阳CRL-G",
17: "洛阳VX1000",
18: "洛阳FC20",
19: "荷德鲁美特",
20: "创展同成3",
21: "山东力创lcru20",
22: "山东智方",
23: "天津万华RN-2",
24: "丹佛斯INFOCAL-5",
25: "丹佛斯INFOCAL5",
26: "丹佛斯EEM-C",
27: "真兰",
28: "恩乐曼ES30",
29: "卡姆鲁普402",
30: "天津丹弗斯",
31: "威海贝特BRC-150",
32: "洛阳SCL-61",
33: "洛阳CRL-G-2",
34: "洛阳VX1005",
35: "洛阳VX1004",
36: "洛阳VX1003",
37: "洛阳FC20-2006",
38: "虹润LC80",
39: "洛阳VX1002",
40: "艾博温控器",
41: "威海贝特BRC-25",
42: "北京嘉洁能JJNH-20/40",
43: "广饶海德瑞",
44: "东营裕丰",
45: "合肥中亚",
46: "泰安轻松",
47: "山东联强节能(新)",
48: "丹佛斯EEM-C-B",
49: "丹佛斯INFOCAL-5-B",
50: "大华电表DLT645-97",
51: "FC8200-OLD",
52: "FC8200-NEW",
53: "FC2000开发区",
54: "林洋电表DLT645-97",
55: "深圳捷先直读水表",
56: "开发区STD-2005",
57: "德尔温度监测仪",
58: "德尔脉冲水表采集器",
59: "德尔温控阀",
60: "德尔采集器",
61: "北京嘉洁能JJNH-25/10",
62: "丹佛斯SONOMETER1000",
63: "威海三实",
64: "沧州燕赵",
65: "北京益都",
66: "兰吉尔T230",
67: "威盛电表645-2007",
68: "开发区ZWLY-B",
69: "青岛鑫三达ZLJ2200",
70: "重庆伟岸",
71: "南京西奥XA-C",
72: "日照鸿翔HXYB",
73: "天津新岭XL-C",
74: "唐山海通HT-25",
75: "寿光科迪KDH",
76: "济宁5颗星WKXCR-25",
77: "山东新宇XYCR",
78: "济宁金水JSHMU-25",
79: "唐山汇中CRL-G-D",
80: "吉林瀚渼HMLC-R",
81: "天罡大表",
82: "山西汾西",
83: "连云港腾越",
84: "河南新天",
85: "诸城CRL-G-D2",
86: "诸城SCL-61D",
87: "诸城SCL-61D2",
88: "依斯塔T250",
89: "吉林宏远HYRL-V",
90: "洛阳VX10021",
91: "洛阳VX10022",
92: "洛阳VX10023",
93: "山东和同",
94: "浙江博凯BKCPDN25",
95: "德尔无线温度测量仪",
96: "连云港腾越阀控",
97: "沈阳航宇星-A",
98: "沈阳航宇星-B",
99: "德尔低功耗水表采集器",
100: "天津金凤凌云",
101: "潍微数字直读水表",
102: "合肥瑞纳阀表一体",
103: "潍坊国建高创热表",
104: "厦门亿林有线阀控",
105: "厦门亿林无线阀控",
106: "济南瑞泉直读水表",
107: "HDWP-RLQ802",
108: "北京嘉洁能JJNH-25/10(2400)",
109: "重庆伟岸远程控制阀",
110: "HDWP-RLQ802OLD",
111: "西门子SITRANSFUE950",
112: "恩乐曼SS2U",
113: "威海贝特BRC-125",
114: "汇中CRL-G-2(2400)",
115: "迁安西奥",
116: "南京西奥2",
117: "德尔MBUS温度测量仪-MODBUS",
118: "国能旧协议阀控",
119: "国能新协议阀控",
120: "青岛盛诚创新阀控",
121: "威海米特",
122: "山东德鲁",
123: "北京黑蚂蚁MBUS转MODBUS",
124: "山东经纬",
125: "重庆伟岸远程控制阀V2.0",
126: "国能MBUS温度测量仪",
127: "依斯塔(北京)actego",
128: "山东鸿翔温控阀",
129: "济南邦硕BS2009",
130: "威海震宇ZY-G",
131: "欧凯龙热能表",
132: "欧凯龙RY-H",
133: "普惠PHRLB-C",
134: "甬港热表",
135: "江苏丙辰BCLR",
136: "北京德宝",
137: "山东经纬(熄屏版)",
138: "广州柏诚",
139: "兰吉尔F4(2400)",
140: "北京添瑞祥",
141: "威海天罡智能控制阀ICV-W",
142: "济南普赛温控阀",
143: "浙江华仪乐业LYRB-US",
144: "百暖汇阀控",
145: "厦门安东LU920",
146: "上海肯特KEF电磁热量表",
147: "卡姆鲁普302",
148: "恩乐曼SENSOSTAR2BU",
149: "包头新达阀控",
150: "甬港热表-1",
151: "甬港热表-2",
152: "甬港热表-3",
153: "天津金佳同达",
154: "甬港热表-4",
155: "德鲁有线阀控",
156: "力创无线阀控",
157: "卡姆鲁普401",
158: "宁波直读水表",
159: "深圳千宝直读水表",
160: "深圳兴源水表",
161: "济宁金水水表",
162: "三川直读水表",
163: "国能有线阀控V2.0",
164: "百暖汇温控阀",
165: "迈拓温控阀",
166: "DY-SC4型RTU",
167: "L_MAG型电磁流量计",
168: "吉安精程超声波水表",
169: "临沂华龙水表",
170: "北京硕人无线阀控",
171: "爱迪生温控阀",
172: "天罡温控阀TICV",
173: "新天无线温控阀",
174: "海威茨无线温控阀",
175: "德尔单元立管阀控",
176: "北京嘉洁能远程控制阀",
177: "德尔智能阀控",
178: "山东鸿翔面积分摊法",
179: "elis热表",
180: "真兰机械大表EN1434",
181: "丹佛斯SonoSafe10",
182: "海威茨HiwitsURT",
183: "恩乐曼SS2C",
184: "百暖汇无线温控阀2017",
185: "唐山汇中远程控制阀2017",
186: "广州柏诚热量表",
187: "北京东联国海无线温控阀",
188: "华立直读水表",
189: "科德直读水表",
190: "瑞纳无线温控阀",
191: "百暖汇有线温控阀2017",
192: "北京嘉洁能无线温控阀2",
193: "江苏丙辰无线阀控器",
194: "威盛无线温控阀",
195: "意大利EMMETI电调阀",
196: "FC6000",
197: "恩乐曼S3E",
198: "清泉亿林温控阀",
}
var DqrlUnit = map[byte]string{
0x02: "Wh",
0x05: "kWh",
0x06: "kWh",
0x08: "MWh",
0x07: "MWh",
0x87: "MWh",
0x0A: "MWh×100",
0x01: "J",
0x0B: "kJ",
0x0E: "MJ",
0x0D: "MJ",
0x11: "GJ",
0x0F: "GJ",
0x8F: "GJ",
0x13: "GJ×100",
}
var LjllUnit = map[byte]string{
0x29: "L",
0x13: "L",
0x12: "L",
0x2A: "100L",
0x2C: "m³",
0x14: "m³",
0x15: "m³",
0x16: "m³",
0x17: "m³",
}
var GlUnit = map[byte]string{
0x14: "W",
0x2B: "W",
0x2A: "W",
0x17: "kW",
0x2C: "kW",
0x2D: "kW",
0x2E: "kW",
0x2F: "kW",
0x1A: "MW",
}
var LsUnit = map[byte]string{
0x32: "L/h",
0x3B: "L/h",
0x3A: "L/h",
0x34: "m³/h",
0x35: "m³/h",
0x3C: "m³/h",
0x3D: "m³/h",
0x3E: "m³/h",
}
var RunTimeUnit = map[byte]string{
0x00: "h",
0x22: "h",
0x26: "h",
0x23: "d",
0x27: "d",
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。