Header | 设备类型 | 设备ID | 数据类型 | 命令字 | 参数长度 | 参数 | 校验字 | Tail |
---|---|---|---|---|---|---|---|---|
1ACFFC1D | 01 | FFFFFFFFFFFFFFFFFFFFFFFF | 04 | 01 | 01 | 01 | FF | 2EE9C8FD |
data_DealWith.py
strs="1ACFFC1D 01 FFFFFFFFFFFFFFFFFFFFFFFF 04 01 01 01 07 2EE9C8FD" #模拟完全数据流
# strs="1ACFFC1D 01 FFFFFFFFFFFFFFFFFFFFFFFE 04 02 2EE9C8FD" #模拟命令字、参数长度、参数缺失
strs_list=strs.replace(" ","")
header=strs_list[0:8] #报头
deviceType=strs_list[8:10] #设备类型
deviceID=strs_list[10:34] #设备ID
dataType = strs_list[34:36] # 数据类型
if(len(strs_list[36:])==10): #判断数据帧的参数长度、参数字段是否存在,判断依据:数据类型后字符串长度是否仅仅满足校验字和报尾的长度。
command = 'FF' # 命令字
parameterLength = '' # 参数长度
parameters = ''
else: #命令字、参数长度、参数都是从前往后截取
command=strs_list[36:38] #命令字
parameterLength=strs_list[38:40] #参数长度
parameters=strs_list[40:42] #参数
checkWord=strs_list[-10:-8] #校验字 从后往前截取,先将设备类型、设备ID、数据类型、命令字、参数长度、参数累加和累加和的低八位(有问题)
checkWord_first=str(hex(int(deviceType,16)+int(deviceID, 16)+int(dataType,16)+int(command,16)+int(parameterLength if parameterLength!="" else "0",16)+int(parameters if parameters!="" else "0",16)))
checkWord_final=checkWord_first[-2:] #校验字计算为2个16进制=1个字节
tail=strs_list[-8:] #报尾
if(checkWord_final==checkWord): #判断接收到的校验字checkWord是否等于计算后的校验字checkWord_final
# 数据翻译
# 设备类型
deviceType_list = {'01': '应急灯具', '02': '逃生标识', '03': '烟雾报警器', '55': '网关设备'}
deviceType = deviceType_list.get(deviceType)
# 命令字
parameters_list=""
if dataType == '03':
if command == '01':
parameters_list = {'0': '停止测试', '1': '开始测试'}
elif command == '02':
parameters_list = {'0': '关闭', '1': '打开','2':'闪烁'}
elif command == '05':
parameters_list = {'0': '停止功能测试', '1': '开始功能测试'}
elif command == '09':
parameters_list = {'00': '充电亮灯', '01': '充电灭灯'}
elif dataType == '04':
if command == '01':
parameters_list = {'0': '停止测试', '1': '测试开始','2':'电池非充满状态,现在不能进行测试'}
elif command == '02':
parameters_list = {'1': '打开','2':'闪烁'}
elif command == '05':
parameters_list = {'0': '测试停止', '1': '测试中'}
elif command == '08':
parameters_list = {'0': '断电恢复,但条件不允许进入任何测试', '1': '断电恢复,条件允许进入功能检测', '2': '断电恢复,条件允许进入寿命检测'}
elif command == '09':
parameters_list = {'00': '充电亮灯', '01': '充电灭灯'}
parameters=parameters_list.get(parameters.lstrip("0"))
# 命令字或状态帧
command_list = ''
if (dataType == '03'):
command_list = {'01': '寿命测试开始开关', '02': '应急电源开关', '03': '应急灯具闪烁测试', '04': '查询应急设备状态', '05': '开始功能测试',
'09': '充电时亮灯或灭灯'}
elif dataType == '04':
command_list = {'01': '寿命测试状态', '02': '应急电源开关状态', '03': '应急灯具闪烁测试状态', '04': '应急电源状态', '05': '功能测试状态',
'06': '初始ZigBee设备', '07': '检测过程中发现断电,设备退出检测', '08': '断电恢复', '09': '充电时亮灯或灭灯'}
command = command_list.get(command)
# 数据类型
dataType_list = {'01': '登录帧', '02': 'heartbeat帧', '03': '命令字', '04': '状态帧'}
dataType = dataType_list.get(dataType)
else:
exit()
mysqlConnect.py(电脑里有mysql,所以暂时用mysql模拟)
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from mysqlTest.data_DealWith import *
import MySQLdb
# 打开数据库连接
db = MySQLdb.connect("localhost", "root", "11111", "zzw", charset='utf8')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
sql = """INSERT INTO deviceinfo_Translation(Header,Device_Type, Device_ID, Data_Type, Command,Parameter_length,Parameters,Check_word,Tail)
VALUES ('"""+header+"""','"""+deviceType+"""','"""+deviceID+"""','"""+dataType+"""','"""+command+"""','"""+parameterLength+"""','"""+parameters+"""','"""+checkWord+"""','"""+tail+"""')"""
try:
# 执行sql语句
print(sql)
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# Rollback in case there is any error
msg=db.rollback()
# 关闭数据库连接
db.close()
经过翻译后的数据插入:
未经翻译后的数据插入:
数据库的表模拟设计
字段名 | 字段类型 | 备注 |
---|---|---|
Header | varchar(10) | 报头 |
Device_Type | varchar(20) | 设备类型 |
Device_ID | varchar(30) | 设备ID |
Data_Type | varchar(10) | 数据类型 |
Command | varchar(10) | 命令字 |
Parameter_Length | varchar(4) | 参数长度 |
Parameters | varchar(100) | 参数 |
Check_Word | varchar(4) | 校验字 |
Tail | varchar(10) | 报尾 |