DESKTOP-2QGM7IR\Lab01 5de3c3cc90 第一次提交
2025-04-09 09:49:42 +08:00

587 lines
21 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from ctypes import *
import time
class Nfc_Reader(object):
def __init__(self, nfc_dev):
self.nfc_reader = nfc_dev
# self.nfc_reader = serial.Serial("com6")
self.dev_info = NFC_INFO()
self.dev_conf = NFC_CONF()
self.init_nfc_message()
self.rfidm_c2_wpack = RFIDM_C2_WRITE_HEADER()
self.rfidm_c2_rpack = RFIDM_C2_READ_HEADER()
self.nfc_uuid = None
def write_info(self, info_data):
info_bytes = bytes(info_data) +b'\x00'
ret = self.rfidm_c2_multi_write(0, 10, info_bytes)
return ret
def write_conf(self, conf_data):
conf_bytes = bytes(conf_data) + bytes([0, 0, 0])
print("配置信息", conf_bytes)
ret1 = self.rfidm_c2_multi_write(16, 15, conf_bytes[:60])
ret2 = self.rfidm_c2_multi_write(31, 15, conf_bytes[60:])
return ret1&ret2
def read_info(self):
# info_pack = NFC_INFO()
ret = self.rfidm_c2_multi_read(0, 10, timout=2)
# print("nfc info:", str(ret))
if ret:
memmove(addressof(self.dev_info), ret, sizeof(self.dev_info))
# self.dev_info_analysis()
return True
else:
return False
def read_conf(self):
# conf_pack = NFC_CONF()
ret1 = self.rfidm_c2_multi_read(16, 15, timout=2)
ret2 = self.rfidm_c2_multi_read(31, 15, timout=2)
# print("nfc info:", str(ret1), str(ret2))
if ret1:
if ret2:
ret = ret1+ret2
memmove(addressof(self.dev_conf), ret, sizeof(self.dev_conf))
print("测点名称:", list(self.dev_conf.node_name))
# self.dev_conf_analysis()
return True
return False
def close(self):
self.nfc_reader.close()
def default(self):
conf_file = open("conf.txt", 'r')
def rfidm_c2_single_write(self, cmd, data):
pass
#自动搜索NFC标签
def rfidm_c2_search(self):
tagpack = RFIDM_C2_TAG_INFO_PACK()
self.nfc_reader.timeout = 0.5
self.nfc_reader.reset_output_buffer()
self.nfc_reader.reset_input_buffer()
self.nfc_reader.write([0x00, 0x00, 0x02, 0x11, 0x13]) #清查NFC
ret = self.nfc_reader.read(14)
print(ret)
if len(ret)==14:
memmove(addressof(tagpack), ret, sizeof(tagpack))
self.nfc_uuid = tagpack.uuid
else:
self.nfc_uuid = False
def rfidm_c2_conf(self):
self.nfc_reader.write([0x00, 0x00, 0x03, 0x02, 0x01, 0x00]) #打开天线,关闭自动寻卡
self.nfc_reader.write([0x00, 0x00 , 0x03 , 0x0C , 0x00 , 0x0F]) #打开主动输出卡ID
def senser_unative(self): #将激活标志置零
conf_data = bytes([0x00, 0x05, 0x00, 0x78])
ret = self.rfidm_c2_multi_write(16, 1, conf_data)
return ret
def rfidm_c2_multi_write(self, block_index, block_count, wdata, timeout=2):
wpack = self.rfidm_c2_multi_write_pack(block_index, block_count, wdata)
self.nfc_reader.reset_input_buffer()
self.nfc_reader.reset_output_buffer()
self.nfc_reader.write(wpack)
#检查返回的信息,是否写入成功
retpack = RFIDM_C2_RET_PACK()
ret = self.nfc_reader.read(sizeof(retpack))
memmove(addressof(retpack), ret, sizeof(retpack))
if retpack.sucess_flag == 0xE7:
return False
else:
return True
def rfidm_c2_multi_read(self, block_index, block_count, timout=0.5):
read_info_cmd = self.rfidm_c2_multi_read_pack(block_index, block_count)
self.nfc_reader.reset_input_buffer()
self.nfc_reader.reset_output_buffer()
self.nfc_reader.write(read_info_cmd)
print("read info cmd:", [hex(data) for data in list(read_info_cmd)])
self.nfc_reader.timeout = timout
ret = self.nfc_reader.read(4*block_count+4)
print(ret)
if len(ret) == (4*block_count+4):
return ret[3:-1]
else:
return None
def rfidm_c2_single_read(self, cmd, retlen, timout=0.5):
cmdpack = RFIDM_C2_WRITE_HEADER()
cmdpack.adress = 0
cmdpack.dlen = 0x02
cmdpack.cmd = cmd
crc = self.bcc_check(bytes(cmdpack)[2:-1])
cmdpack.crc = crc
self.nfc_reader.reset_input_buffer()
self.nfc_reader.reset_output_buffer()
self.nfc_reader.write(bytes(cmdpack))
self.nfc_reader.timeout = 0.5
ret = self.nfc_reader.read(retlen)
if len(ret)==retlen:
return ret
else:
print(ret)
return None
def get_uuid(self):
tagpack = RFIDM_C2_TAG_INFO_PACK()
ret = self.rfidm_c2_single_read(0x11, sizeof(tagpack)) #获取标签命令
if ret:
memmove(addressof(tagpack), ret, sizeof(tagpack))
self.nfc_uuid = tagpack.uuid
else:
self.nfc_uuid = False
def rfidm_c2_multi_write_pack(self, start_block, block_count, data):
"""
写多个block 数据格式
:param start_block: 起始块序号
:param block_count: 一共要写的块
:param data: 要写的数据
:return: bytes格式数据包
"""
mwrite_pack = RFIDM_C2_MULTI_WRITE_PACK()
wpack = RFIDM_C2_WRITE_HEADER()
wpack.address = 0
wpack.dlen = sizeof(wpack) + sizeof(mwrite_pack) + len(data) - 3
wpack.cmd = 0x24
# memmove(addressof(mwrite_pack.uuid), self.nfc_uuid, sizeof(mwrite_pack.uuid))
mwrite_pack.uuid = self.nfc_uuid
mwrite_pack.flag = 0x22
mwrite_pack.start_block = start_block
mwrite_pack.block_len = block_count
wdata = bytes(wpack)[:-1] + bytes(mwrite_pack)+data
crc = self.bcc_check(wdata[2:])
wpack.crc = crc
wdata = bytes(wpack)[:-1] + bytes(mwrite_pack) + data + bytes(wpack)[-1:]
return wdata
def rfidm_c2_single_write_pack(self, block_index, data):
"""
写入单个数据块
:param block_index: 块序号
:param data: 要写入的数据
:return: bytes数据包
"""
wpack = RFIDM_C2_SINGLE_WRITE_PACK()
wpack.address = 0
wpack.dlen = 0x10
wpack.cmd = 0x21
# memmove(addressof(wpack.uuid), self.nfc_uuid, sizeof(wpack.uuid))
wpack.uuid = self.nfc_uuid
wpack.flag = 0x22
wpack.block_index = block_index
memmove(addressof(wpack.data), data, sizeof(wpack.data))
crc = self.bcc_check(bytes(wpack[2:-1]))
wpack.crc = crc
return bytes(wpack)
def rfidm_c2_multi_read_pack(self, block_index, block_count):
rpack = RFIDM_C2_MULTI_READ_PACK()
rpack.address = 0
rpack.dlen = 0x0C
rpack.cmd = 0x23
rpack.uuid = self.nfc_uuid
rpack.block_index = block_index
rpack.block_count = block_count
crc = self.bcc_check(bytes(rpack)[2:-1])
rpack.crc = crc
return bytes(rpack)
def rfidm_c2_single_read_pack(self, block_index):
rpack = RFIDM_C2_SINGLE_READ_PACK()
rpack.address = 0
rpack.dlen = 0x0B
rpack.cmd = 0x20
memmove(addressof(rpack.uuid), self.nfc_uuid, sizeof(rpack.uuid))
rpack.block_index = block_index
crc = self.bcc_check(bytes(rpack[2:-1]))
rpack.crc = crc
return bytes(rpack)
def bcc_check(self, data):
bcc = 0
for d in data:
bcc = bcc^d
return bcc
def rfidm_c2_init(self):
wpack = RFIDM_C2_CMD_PACK()
wpack.address = 0
wpack.dlen = 0x03
wpack.cmd = 0x02
wpack.conf = 0x01
wpack.crc = 0x00
self.nfc_reader.reset_input_buffer()
self.nfc_reader.reset_output_buffer()
self.nfc_reader.write(bytes(wpack))
time.sleep(0.2)
wpack.cmd = 0x0D
wpack.conf = 0x01
wpack.crc = 0x0F
self.nfc_reader.reset_input_buffer()
self.nfc_reader.reset_output_buffer()
self.nfc_reader.write(bytes(wpack))
time.sleep(0.2)
wpack.cmd = 0x0E
wpack.conf = 100
wpack.crc = self.bcc_check(bytes(wpack)[2:-1])
self.nfc_reader.reset_input_buffer()
self.nfc_reader.reset_output_buffer()
self.nfc_reader.write(bytes(wpack))
time.sleep(0.2)
def dev_info_analysis(self):
self.dev_info_msg["初始化标志"] = self.dev_info.uInitFlag
self.dev_info_msg["加速度传感器状态"] = self.dev_info.uAccSta
self.dev_info_msg["Zigbee模块状态"] = self.dev_info.uZigbeeSta
self.dev_info_msg["设备温度传感器状态"] = self.dev_info.uLowerTempSta
self.dev_info_msg["环境温度传感器状态"] = self.dev_info.uUpperTempSta
self.dev_info_msg["设备运行状态"] = self.dev_info.uRunningFlag
self.dev_info_msg["MAC地址"] = hex(self.dev_info.zigbeeMac)[2:].zfill(16)
self.dev_info_msg["硬件版本"] = self.dev_info.hwVersion/10
self.dev_info_msg["软件版本"] = self.dev_info.sfVersion/10
self.dev_info_msg["生产批号"] = self.dev_info.pn
self.dev_info_msg["生产序列号"] = self.dev_info.sn
self.dev_info_msg["首次上电日期"] = self.dev_info.sTime
self.dev_info_msg["唤醒次数"] = self.dev_info.wakeupTimes
self.dev_info_msg["特征值发送次数"] = self.dev_info.tzTimes
self.dev_info_msg["原始波形发送次数"] = self.dev_info.wvTimes
self.dev_info_msg["电池电压"] = self.dev_info.batVol
self.dev_info_msg["产品型号"] = self.dev_info.productType
self.dev_info_msg["无线信号强度"] = self.dev_info.rss
print(bytes(self.dev_conf.node_name))
try:
self.dev_info_msg["测点名称"] = bytes(self.dev_conf.node_name).decode('GB18030')
except:
self.dev_info_msg["测点名称"] = "解析错误"
def dev_conf_analysis(self):
self.dev_conf_msg["配置标志"] = self.dev_conf.active_flag
self.dev_conf_msg["唤醒周期"] = self.dev_conf.wakeup_period
self.dev_conf_msg["原始波形发送周期"] = self.dev_conf.wave_period
self.dev_conf_msg["Zigbee PID"] = hex(self.dev_conf.zig_panid)[2:]
self.dev_conf_msg["Zigbee 信道"] = self.dev_conf.zig_channel
# self.dev_conf_msg["Zigbee 本地地址"] = hex(self.dev_conf.zig_local_addr)[2:]
self.dev_conf_msg["Zigbee 本地地址"] = format(int(hex(self.dev_conf.zig_local_addr), 16), '04x')
self.dev_conf_msg["Zigbee 目标地址"] = hex(self.dev_conf.zig_dst_addr)[2:]
self.dev_conf_msg["Zigbee 发射功率"] = self.dev_conf.zig_power_level
self.dev_conf_msg["Zigbee 重试次数"] = self.dev_conf.zig_retry_num
self.dev_conf_msg["Zigbee 重试间隔"] = self.dev_conf.zig_retry_time
self.dev_conf_msg["ACC采样率"] = self.acc_freq_cal(self.dev_conf.acc_acq_freq)
self.dev_conf_msg["ACC量程"] = self.acc_range_cal(self.dev_conf.acc_acq_range)
self.dev_conf_msg["ACC采样率时间"] = self.dev_conf.acc_acq_time
self.dev_conf_msg["频带能量参数1 START"] = self.dev_conf.freq_power1_start
self.dev_conf_msg["频带能量参数1 END"] = self.dev_conf.freq_power1_stop
self.dev_conf_msg["频带能量参数2 START"] = self.dev_conf.freq_power2_start
self.dev_conf_msg["频带能量参数2 END"] = self.dev_conf.freq_power2_stop
self.dev_conf_msg["频带能量参数3 START"] = self.dev_conf.freq_power3_start
self.dev_conf_msg["频带能量参数3 END"] = self.dev_conf.freq_power3_stop
self.dev_conf_msg["频带能量参数4 START"] = self.dev_conf.freq_power4_start
self.dev_conf_msg["频带能量参数4 END"] = self.dev_conf.freq_power4_stop
self.dev_conf_msg["频带能量参数5 START"] = self.dev_conf.freq_power5_start
self.dev_conf_msg["频带能量参数5 END"] = self.dev_conf.freq_power5_stop
self.dev_conf_msg["冲击带通频率START"] = self.dev_conf.envel_freq_start
self.dev_conf_msg["冲击带通频率END"] = self.dev_conf.envel_freq_stop
self.dev_conf_msg["故障频率1"] = self.dev_conf.fail_freq1
self.dev_conf_msg["故障频率2"] = self.dev_conf.fail_freq2
self.dev_conf_msg["故障频率3"] = self.dev_conf.fail_freq3
self.dev_conf_msg["故障频率4"] = self.dev_conf.fail_freq4
self.dev_conf_msg["配置时间"] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(self.dev_conf.conf_date))
self.dev_conf_msg["速度积分滤波频率"] = self.dev_conf.speed_freq_start
def init_nfc_message(self):
self.dev_info_msg = {"测点名称": None,
"初始化标志": None,
"加速度传感器状态": None,
"Zigbee模块状态": None,
"设备温度传感器状态": None,
"环境温度传感器状态": None,
"设备运行状态": None,
"MAC地址": None,
"硬件版本": None,
"软件版本": None,
"生产批号": None,
"生产序列号": None,
"首次上电日期": None,
"唤醒次数": None,
"特征值发送次数": None,
"原始波形发送次数": None,
"电池电压": None,
"产品型号": None,
"无线信号强度": None,
}
self.dev_conf_msg = {"配置标志": None,
"唤醒周期": None,
"原始波形发送周期": None,
"Zigbee PID": None,
"Zigbee 信道": None,
"Zigbee 本地地址": None,
"Zigbee 目标地址": None,
"Zigbee 发射功率": None,
"Zigbee 重试次数": None,
"Zigbee 重试间隔": None,
"ACC采样率": None,
"ACC量程": None,
"ACC采样率时间": None,
"频带能量参数1 START": None,
"频带能量参数1 END": None,
"频带能量参数2 START": None,
"频带能量参数2 END": None,
"频带能量参数3 START": None,
"频带能量参数3 END": None,
"频带能量参数4 START": None,
"频带能量参数4 END": None,
"频带能量参数5 START": None,
"频带能量参数5 END": None,
"冲击带通频率START": None,
"冲击带通频率END": None,
"故障频率1": None,
"故障频率2": None,
"故障频率3": None,
"故障频率4": None,
"配置时间": None,
"速度积分滤波频率": None
}
def acc_range_cal(self, sdata):
if sdata == 0b00:
return "±8g"
elif sdata == 0b01:
return "±16g"
elif sdata == 0b10:
return "±32g"
elif sdata == 0b11:
return "±64g"
def acc_freq_cal(self, sdata):
if sdata == 0b00:
return "3.2kHz"
elif sdata == 0b01:
return "6.4kHz"
elif sdata == 0b10:
return "12.8kHz"
elif sdata == 0b11:
return "25.6kHz"
#传感器信息
class NFC_INFO(BigEndianStructure):
_pack_ = 1
_fields_ = [
#设备状态标志
('uInitFlag', c_ubyte, 1),
('uAccSta', c_ubyte, 1),
('uZigbeeSta', c_ubyte, 1),
('uLowerTempSta', c_ubyte, 1),
('uUpperTempSta', c_ubyte, 1),
('uRunningFlag', c_ubyte, 1),
('zigbeeMac', c_uint64), #Zigbee MAC地址
('hwVersion', c_uint8), #硬件版本
('sfVersion', c_uint8), #软件版本
('pn', c_uint32), #批号
('sn', c_uint32), #序列号
('sTime', c_uint32), #首次上电时间
('wakeupTimes', c_uint32), #唤醒次数
('tzTimes', c_uint32), #特征值发送次数
('wvTimes', c_uint32), #原始波形发送次数
('batVol', c_uint16), #电池电压
('productType', c_uint8), #产品型号
('rss', c_uint8), #Zigbee信号强度
]
class NFC_CONF(BigEndianStructure):
_pack_ = 1
_fields_ = [
('active_flag', c_uint8), # 激活标志
('wakeup_period', c_uint8), # 唤醒周期
('wave_period', c_uint16), # 原始波形发送周期
('zig_panid', c_uint16), # zigbee panid
('zig_channel', c_uint8), # zigbee channel
('zig_local_addr', c_uint16), # zigbee本地地址
('zig_dst_addr', c_uint16), # zigbee目标地址
('zig_power_level', c_uint8), # zigbee发射功率
("zig_retry_num", c_uint8), # 重试次数
("zig_retry_time", c_uint8), # 重试间隔
("reserve", c_ubyte, 4),
("acc_acq_range", c_ubyte, 2), # 量程
("acc_acq_freq", c_ubyte, 2), # 采样率
("acc_acq_time", c_uint8), # 采样时长
("freq_power1_start", c_uint16), # 频带能量参数1
("freq_power1_stop", c_uint16), # 频带能量参数1
("freq_power2_start", c_uint16), # 频带能量参数2
("freq_power2_stop", c_uint16), # 频带能量参数2
("freq_power3_start", c_uint16), # 频带能量参数3
("freq_power3_stop", c_uint16), # 频带能量参数3
("freq_power4_start", c_uint16), # 频带能量参数4
("freq_power4_stop", c_uint16), # 频带能量参数4
("freq_power5_start", c_uint16), # 频带能量参数5
("freq_power5_stop", c_uint16), # 频带能量参数5
("envel_freq_start", c_uint16), # 包络带通频率
("envel_freq_stop", c_uint16), # 包络带通频率
("fail_freq1", c_uint16), # 故障频率1
("fail_freq2", c_uint16), # 故障频率2
("fail_freq3", c_uint16), # 故障频率3
("fail_freq4", c_uint16), # 故障频率4
("conf_date", c_uint32), # 配置时间
("speed_freq_start", c_uint8), # 速度积分起始频率
("node_name", c_uint16*32), # 节点名称
]
class RFIDM_C2_WRITE_HEADER(BigEndianStructure):
_pack_ = 1
_fields_ = [
('address', c_uint16), # 模块地址
('dlen', c_uint8), # 长度
('cmd', c_uint8), # 命令
('crc', c_uint8)
]
class RFIDM_C2_READ_HEADER(BigEndianStructure):
_pack_ = 1
_fields_ = [
('cmd', c_uint8), # 模块地址
('dlen', c_uint8), # 长度
('flag', c_uint8), # 命令
('crc', c_uint8)
]
class RFIDM_C2_MULTI_WRITE_PACK(BigEndianStructure):
_pack_ = 1
_fields_ = [
('uuid', c_uint64), # UUID
('flag', c_uint8), # 标志字节固定值0x22
('start_block', c_uint8), # 起始块号
('block_len', c_uint8), #块数
]
class RFIDM_C2_SINGLE_WRITE_PACK(BigEndianStructure):
_pack_ = 1
_fields_ = [
('address', c_uint16), # 模块地址
('dlen', c_uint8), # 长度0x10
('cmd', c_uint8), # 命令 0x21
('uuid', c_uint64), # UUID
('flag', c_uint8), # 标志字节固定值0x22
('block_index', c_uint8), # 起始块号
('data', c_uint8*4), # 写入的数据
('crc', c_uint8)
]
class RFIDM_C2_MULTI_READ_PACK(BigEndianStructure):
_pack_ = 1
_fields_ = [
('address', c_uint16), # 模块地址
('dlen', c_uint8), # 长度0x10
('cmd', c_uint8), # 命令 0x21
('uuid', c_uint64), # UUID
('block_index', c_uint8), # 起始块号
('block_count', c_uint8), # 块数
('crc', c_uint8)
]
class RFIDM_C2_SINGLE_READ_PACK(BigEndianStructure):
_pack_ = 1
_fields_ = [
('address', c_uint16), # 模块地址
('dlen', c_uint8), # 长度0x10
('cmd', c_uint8), # 命令 0x21
('uuid', c_uint64), # UUID
('block_index', c_uint8), # 数据块号
('crc', c_uint8)
]
class RFIDM_C2_TAG_INFO_PACK(BigEndianStructure):
_pack_ = 1
_fields_ = [
('cmd', c_uint8), # 命令头 0xFE
('dlen', c_uint8), # 长度 0x0C
('sucess_flag', c_uint8), # 成功:0x11, 失败0xE2
('flag', c_uint8), # flag
('dsfid', c_uint8), # DSFID信息
('uuid', c_uint64), # UUID
('crc', c_uint8)
]
class RFIDM_C2_RET_PACK(BigEndianStructure):
_pack_ = 1
_fields_ = [
('cmd', c_uint8), # 命令头 0xFE
('dlen', c_uint8), # 长度 0x02
('sucess_flag', c_uint8), # 成功:0x11, 失败0xE2
('crc', c_uint8)
]
class RFIDM_C2_CMD_PACK(BigEndianStructure):
_pack_ = 1
_fields_ = [
('address', c_uint16), # 模块地址
('dlen', c_uint8), # 长度
('cmd', c_uint8), # 命令
('conf', c_uint8), # 设置
('crc', c_uint8)
]