Commit 62293f11 authored by liyuanhong's avatar liyuanhong

平台版本信息上传应答解析类

parent fe8cf72f
......@@ -96,7 +96,7 @@ class Location_msg(MessageBase):
#报警事件 ID 数据项列表
extra_FA = "FA" + self.int2hexStringByBytes(int(len(AlarmEvent_data().generateAlarmEvent_data()) / 2)) + AlarmEvent_data().generateAlarmEvent_data()
data = extra_01
data = extra_01 + extra_02 + extra_11 + extra_12 + extra_13 + extra_FA
# data = extra_01 + extra_02 + extra_11 + extra_12 + extra_13
# data = data + extra_2A + extra_30 + extra_31 + extra_EA + extra_EB
# data = data + extra_EC
......@@ -294,7 +294,7 @@ class Location_msg(MessageBase):
#######################################################
def getMsgHeader(self):
# msgID = self.int2hexStringByBytes(102,2) #消息id
msgID = "0002"
msgID = "0200"
msgBodyProperty = self.getMsgBodyProperty(int(len(self.getMsgBody()) / 2)) #消息体属性
phoneNum = self.int2BCD(13146201119) #终端手机号
msgWaterCode = self.int2BCD(1) #消息流水号
......
......@@ -108,6 +108,17 @@ class MessageBase(Base):
dataHex += hex(tem)[2:]
return dataHex
#######################################################
# 16进制转字符串
#######################################################
def hex2Str(self,data):
theStr = ""
while data != "":
tmp = data[:2]
data = data[2:]
theStr = theStr + chr(int(tmp,16))
return theStr
#####################################################
# 将字符串转换为对应的ascii值数组
#####################################################
......@@ -157,30 +168,22 @@ class MessageBase(Base):
return data
#######################################################
# 获取UTC时间转换位BCD格式
# 字符串转换为GBK的16进制
#######################################################
def GBKString2Hex(self,data):
data = str("渝B23CX".encode("gbk"))
data = data[2:len(data) - 1]
print(data)
print(type(data))
print(type("\xd3\xe5B23CX"))
print(data == "\xd3\xe5B23CX")
print(data)
print(b"\xd3\xe5B23CX")
data = self.str2Hex(data)
return data
data = str(data.encode("gbk"))
dataHex = self.str2Hex(data[2:len(data) - 1])
return dataHex
#######################################################
# 16进制转字符串
# 16进制转换为GBK字符串
#######################################################
def hex2Str(self,data):
theStr = ""
while data != "":
tmp = data[:2]
data = data[2:]
theStr = theStr + chr(int(tmp,16))
return theStr
def hex2GBKString(self,dataHex):
dataStr = self.hex2Str(dataHex)
data = bytes(map(ord,str(dataStr)))
data = data.decode("gbk")
return data
......@@ -189,15 +192,18 @@ class MessageBase(Base):
if __name__ == "__main__":
# print(MessageBase().str2Hex("uvwxyz"))
print(MessageBase().str2Ascsii("uvwxyz"))
# print(MessageBase().str2Ascsii("uvwxyz"))
# print(MessageBase().int2hexStringByBytes(220400566542345564784802,20))
print(MessageBase().str2Hex("a865h643gfdj64fd7432"))
print(MessageBase().hex2Str("61383635683634336766646a3634666437343332"))
# print(MessageBase().str2Hex("a865h643gfdj64fd7432"))
# print(MessageBase().hex2Str("61383635683634336766646a3634666437343332"))
print(MessageBase().GBKString2Hex("KZP200_V201001"))
print(MessageBase().hex2GBKString("4b5a503230305f56323031303031"))
# print(MessageBase().str2Hex("\xd3\xe5B23CX"))
# print(MessageBase().getMsgBodyProperty())
# print(MessageBase().int2BCD(13146201117))
# print(MessageBase().getCheckCode("8001000501314620111800000000000200"))
# print(MessageBase().getMsgHeader())
# print(MessageBase().generateMsg())
# print(MessageBase().GBKString2Hex("渝B23CX"))
print(MessageBase().GBKString2Hex("渝B23CX"))
print(MessageBase().hex2GBKString("5c7864335c7865354232334358"))
......@@ -42,7 +42,7 @@ class SetTerminalParam_msg(MessageBase):
#######################################################
def getMsgHeader(self):
# msgID = self.int2hexStringByBytes(102,2) #消息id
msgID = "0002"
msgID = "8103"
msgBodyProperty = self.getMsgBodyProperty(int(len(self.getMsgBody()) / 2)) #消息体属性
phoneNum = self.int2BCD(13146201119) #终端手机号
msgWaterCode = self.int2hexStringByBytes(1,2) #消息流水号
......
......@@ -43,7 +43,7 @@ class TerminalCommonMsgRes_msg(MessageBase):
def getMsgHeader(self):
msgID = self.int2hexStringByBytes(102,2) #消息id
msgBodyProperty = self.getMsgBodyProperty(int(len(self.getMsgBody()) / 2)) #消息体属性
phoneNum = self.int2BCD(13146201118) #终端手机号
phoneNum = self.int2BCD(13146201119) #终端手机号
msgWaterCode = self.int2hexStringByBytes(1,2) #消息流水号
subPkgContent = "" #消息包封装项
data = msgID + msgBodyProperty + phoneNum + msgWaterCode + subPkgContent
......
......@@ -6,7 +6,7 @@
from lib.protocol.message.MessageBase import MessageBase
class TerminalVersionInfo_msg(MessageBase):
class TerminalVersionInfo_msg(MessageBase):
def __init__(self):
super().__init__() #不执行该方法,无法使用父类里面定义的属性
pass
......@@ -31,6 +31,21 @@ class TerminalVersionInfo_msg(MessageBase):
#######################################################
def getMsgBody(self):
msg = ""
softwareVersion = self.GBKString2Hex("KZP200_V201001") #软件版本号
softwareVersionDate = self.GBKString2Hex("2020-02-10") #终端版本日期
CPUId = self.str2Hex("CPU-12345678") #cpuId
GMSType = self.GBKString2Hex("GMS-TYPE-123456") #GMS型号
GMS_IMEI = self.GBKString2Hex("GMS_IMEI_123456") #GSM IMEI 号
SIM_IMSI = self.GBKString2Hex("SIM_13146201119") #终端 SIM 卡 IMSI 号
SIM_ICCID = self.GBKString2Hex("SIM_ICCID13146201119") #终端 SIM 卡 ICCID 号
carType = self.int2hexStringByBytes(22,2) #车系车型 ID
VIN = self.GBKString2Hex("VIN_1234567891234") #汽车 VIN 码
totalMileage = self.int2hexStringByBytes(389000,4) #装上终端后车辆累计总里程或车辆仪表里程(单位米)
totalOilExpend = self.int2hexStringByBytes(420000,4) #装上终端后车辆累计总耗油量(ml)
msg = msg + softwareVersion + softwareVersionDate + CPUId + GMSType + GMS_IMEI
msg = msg + SIM_IMSI + SIM_ICCID + carType + VIN + totalMileage
msg = msg + totalOilExpend
return msg
#######################################################
......
#encoding:utf-8
'''
定义平台版本信息包上传应答解码类
'''
from lib.protocol.message.MessageBase import MessageBase
from lib.protocol.messageRes.ResponseBase import ResponseBase
class PlatefromVersionInfo_res(ResponseBase):
def __init__(self,msg):
super().__init__()
if type(msg) == bytes:
self.msg = self.binary2ascii(msg)
else:
self.msg = msg
pass
#######################################################
# 获取消息
#######################################################
def getMsg(self):
json_msg = {}
json_msg["header"] = self.getMsgHeader()
json_msg["body"] = self.getMsgBody()
json_msg["checkCode"] = self.getCheckCode()
json_msg["calculateCheckCode"] = self.getCalculateCheckCode() #自己计算消息后得到的校验码
return json_msg
#######################################################
# 获取消息头
#######################################################
def getMsgHeader(self):
json_header = {}
data = self.removeIdentify(self.msg)
data = self.restore_7e7d(data)
header = data[:24]
msgId = header[:4] #消息id
msgBodyProperty = header[4:8] #消息体属性
phoneNum = header[8:20] #终端手机号
msgWaterCode = header[20:24] #消息流水号
json_header["msgId"] = msgId
json_header["msgBodyProperty"] = self.getMsgBodyProperty(msgBodyProperty)
json_header["phoneNum"] = phoneNum[1:]
json_header["msgWaterCode"] = int(msgWaterCode,16)
return json_header
#获取消息体属性
def getMsgBodyProperty(self,data):
data = self.int2binStr(int(data,16),2)
data = self.restore_7e7d(data)
json_data = {}
subPkg = data[2:3] #分包
encryptionType = data[3:6] #加密方式
msgBodyLen = data[6:] #消息体长度
json_data["subPkg"] = int(subPkg,2)
json_data["encryptionType"] = int(encryptionType,2)
json_data["msgBodyLen"] = int(msgBodyLen,2)
return json_data
#######################################################
# 获取消息体
#######################################################
def getMsgBody(self):
json_body = {}
data = self.removeIdentify(self.msg)
data = self.restore_7e7d(data)
dataLen = len(data)
body = data[24:dataLen - 2]
plateformCurrentTime = self.getBCD2GMTTime(body[:12]) #平台当前时间
carId = self.hexString2int(body[12:16]) #车型id
displacement = self.hexString2int(body[16:20]) #排量
isUpdate = body[20:]
json_body["plateformCurrentTime"] = plateformCurrentTime
json_body["carId"] = carId
json_body["displacement"] = displacement
json_body["isUpdate"] = isUpdate
return json_body
#######################################################
# 获取校验码
#######################################################
def getCheckCode(self):
data = self.removeIdentify(self.msg)
data = self.restore_7e7d(data)
dataLen = len(data)
checkCode = data[dataLen - 2:]
return checkCode
#######################################################
# 计算消息得到校验码
#######################################################
def getCalculateCheckCode(self):
data = self.removeIdentify(self.msg)
data = self.restore_7e7d(data)
dataLen = len(data)
data = data[:dataLen - 2]
calculateCheckCode = MessageBase().getCheckCode(data)
return calculateCheckCode
#######################################################
# 获取最原始的消息数据(没有替换7e,7d之前的状态)
#######################################################
def getOriginalMsg(self):
data = self.removeIdentify(self.msg)
data = self.restore_7e7d(data)
data = "7e" + data + "7e"
return data
......@@ -9,6 +9,7 @@ from lib.protocol.message.TerminalAuthenticate_msg import TerminalAuthenticate_m
from lib.protocol.message.TerminalCommonMsgRes_msg import TerminalCommonMsgRes_msg
from lib.protocol.message.TerminalHeartbeat_msg import TerminalHeartbeat_msg
from lib.protocol.message.TerminalRegister_msg import TerminalRegister_msg
from lib.protocol.message.TerminalVersionInfo_msg import TerminalVersionInfo_msg
from lib.protocol.message.data.TerminalCancle_msg import TerminalCancle_msg
from lib.protocol.messageRes.PlatformCommon_res import PlatformCommon_res
from lib.protocol.messageRes.TerminalRegister_res import TerminalRegister_res
......@@ -19,29 +20,31 @@ port = 9001
# msg = MessageBase().generateMsg()
# msg = TerminalCommonMsgRes_msg().generateMsg() #终端通用应答
# msg = TerminalHeartbeat_msg().generateMsg() #终端心跳
msg = TerminalRegister_msg().generateMsg() #终端注册
# msg = TerminalRegister_msg().generateMsg() #终端注册
# msg = TerminalCancle_msg().generateMsg() #终端注销
# msg = TerminalAuthenticate_msg().generateMsg() #终端鉴权
# msg = Location_msg().generateMsg() #位置信息汇报
# msg = TerminalVersionInfo_msg().generateMsg() #终端版本信息上报
msg = Location_msg().generateMsg() #位置信息汇报
# msg = DataUpstreamTransport_msg().generateMsg() #数据上行透传消息
print(msg)
BUF_SIZE = 1024
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) # 在客户端开启心跳
client.connect((host, port))
client.send(binascii.a2b_hex(msg))
# client.send(bytes.fromhex(msg))
data = client.recv(BUF_SIZE)
print(binascii.a2b_hex(msg))
print(data)
# print(binascii.b2a_hex(data))
# print(PlatformCommon_res(data).binary2ascii(data))
# print(PlatformCommon_res(data).getOriginalMsg())
# print(PlatformCommon_res(data).getMsg())
print(TerminalRegister_res(data).getMsg())
client.close()
#发送单条消息
def sendSingleMsg():
print(msg)
BUF_SIZE = 1024
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) # 在客户端开启心跳
client.connect((host, port))
client.send(binascii.a2b_hex(msg))
# client.send(bytes.fromhex(msg))
data = client.recv(BUF_SIZE)
print(data)
print(PlatformCommon_res(data).getMsg())
# print(TerminalRegister_res(data).getMsg())
client.close()
if __name__ == "__main__":
sendSingleMsg()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment