from ctypes import * import numpy as np import datetime from zigbee_message_pack import * SENSER_INF_PACK1 = 0x01 SENSER_INF_PACK2 = 0x07 EVEL_DATA_PACK1 = 0x02 EVEL_DATA_PACK2 = 0x06 WAVE_X_PACK = 0x03 WAVE_Y_PACK = 0x04 WAVE_Z_PACK = 0x05 class EvelPack(LittleEndianStructure): _fields_ = [ # 特征值 ("temp_dev", c_uint16), ("temp_env", c_uint16), ("angle", c_uint16), ("bat_vol", c_uint16), ("acc_x_pk", c_uint16), ("acc_x_rms", c_uint16), ("speed_x_pk", c_uint16), ("speed_x_rms", c_uint16), ("fpower_x_1", c_uint16), ("fpower_x_2", c_uint16), ("fpower_x_3", c_uint16), ("fpower_x_4", c_uint16), ("fpower_x_5", c_uint16), ("envepower_x", c_uint16), ("errpower_x_1", c_uint16), ("errpower_x_2", c_uint16), ("errpower_x_3", c_uint16), ("errpower_x_4", c_uint16), ("acc_y_pk", c_uint16), ("acc_y_rms", c_uint16), ("speed_y_pk", c_uint16), ("speed_y_rms", c_uint16), ("fpower_y_1", c_uint16), ("fpower_y_2", c_uint16), ("fpower_y_3", c_uint16), ("fpower_y_4", c_uint16), ("fpower_y_5", c_uint16), ("envepower_y", c_uint16), ("errpower_y_1", c_uint16), ("errpower_y_2", c_uint16), ("errpower_y_3", c_uint16), ("errpower_y_4", c_uint16), ("acc_z_pk", c_uint16), ("acc_z_rms", c_uint16), ("speed_z_pk", c_uint16), ("speed_z_rms", c_uint16), ("fpower_z_1", c_uint16), ("fpower_z_2", c_uint16), ("fpower_z_3", c_uint16), ("fpower_z_4", c_uint16), ("fpower_z_5", c_uint16), ("envepower_z", c_uint16), ("errpower_z_1", c_uint16), ("errpower_z_2", c_uint16), ("errpower_z_3", c_uint16), ("errpower_z_4", c_uint16), ] class WavePack(Structure): _fields_ = [ ("wvdata", c_uint16 * 46), # 原始波形 ] # 传感器设备信息 class DevInfo1(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), ("reserve", c_ubyte, 2), ('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信号强度 ('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_int32), # 配置时间 ("speed_freq_start", c_int8), # 速度积分起始频率 ] # 传感器信息2 class DevInfo2(Structure): _fields_ = [ # 特征值 ("node_name", c_int16 * 32), # 节点名称 ("reserve", c_int8 * 28), # 保留 ] class ZigPack(Structure): _fields_ = [ ("msg_header", c_uint8 * 3), # 帧头 ("msg_addr", c_uint8 * 2), # 源地址 ("msg_type", c_uint8), # 数据类型 ("msg_index", c_uint8), # 包序号 ("data", c_uint8 * 92), # 数据 ("crc", c_uint8), # 校验 ] class Zig_Reader(object): def __init__(self, zig_dev): self.evelpack = EvelPack() self.wavepack = WavePack() self.prev_index = 0 self.zig_reader = zig_dev # 串口设备 # self.zig_reader = serial.Serial('com5') self.recv_data_buf = b'' self.zigpack = ZigPack() self.senser_info1 = DevInfo1() self.senser_info2 = DevInfo2() self.senser_evel = EvelPack() self.senser_wave = WavePack() self.init_zigbee_message() def read(self): sdata = self.zig_reader.read(self.zig_reader.inWaiting()) self.recv_data_buf = self.recv_data_buf + sdata ret = self.data_analysis() return ret def data_analysis(self): if (len(self.recv_data_buf) >= 100): # 缓存中数据量大于等于数据包 if ((self.recv_data_buf[:3] == b'\xaaU\xaa') | (self.crc_check(self.recv_data_buf[:100]))): memmove(addressof(self.zigpack), self.recv_data_buf, sizeof(self.zigpack)) if self.zigpack.msg_type == SENSER_INF_PACK1: memmove(addressof(self.senser_info1), self.zigpack.data, sizeof(self.senser_info1)) elif self.zigpack.msg_type == SENSER_INF_PACK2: memmove(addressof(self.senser_info2), self.zigpack.data, sizeof(self.senser_info2)) self.dev_info_analysis() self.dev_conf_analysis() elif (self.zigpack.msg_type == EVEL_DATA_PACK1) | (self.zigpack.msg_type == EVEL_DATA_PACK2): memmove(addressof(self.senser_evel), self.zigpack.data, sizeof(self.senser_evel)) self.evel_data_analysis() elif self.zigpack.msg_type == WAVE_X_PACK: memmove(addressof(self.senser_wave), self.zigpack.data, sizeof(self.senser_wave)) elif self.zigpack.msg_type == WAVE_Y_PACK: memmove(addressof(self.senser_wave), self.zigpack.data, sizeof(self.senser_wave)) elif self.zigpack.msg_type == WAVE_Z_PACK: memmove(addressof(self.senser_wave), self.zigpack.data, sizeof(self.senser_wave)) self.recv_data_buf = self.recv_data_buf[100:] return self.zigpack.msg_type else: self.recv_data_buf = self.recv_data_buf[1:] return False else: return False def crc_check(self, sdata): sdata = [d for d in sdata] sum_vl = np.sum(sdata[:-1]) if (sum_vl & 0xff) == sdata[-1]: return True else: msg = self.get_date_time() + '\n' msg = msg + "CRC Cal Error\n" msg = msg + str([hex(d) for d in sdata]) + '\n' print(msg) return False def get_date_time(self): now_time = datetime.datetime.now() time_str = now_time.strftime('%Y.%m.%d %H:%M:%S') return time_str def close(self): self.zig_reader.close() def dev_info_analysis(self): self.dev_info_msg["初始化标志"] = self.senser_info1.uInitFlag self.dev_info_msg["加速度传感器状态"] = self.senser_info1.uAccSta self.dev_info_msg["Zigbee模块状态"] = self.senser_info1.uZigbeeSta self.dev_info_msg["设备温度传感器状态"] = self.senser_info1.uLowerTempSta self.dev_info_msg["环境温度传感器状态"] = self.senser_info1.uUpperTempSta self.dev_info_msg["设备运行状态"] = self.senser_info1.uRunningFlag self.dev_info_msg["MAC地址"] = hex(self.senser_info1.zigbeeMac)[2:] self.dev_info_msg["硬件版本"] = self.senser_info1.hwVersion/10 self.dev_info_msg["软件版本"] = self.senser_info1.sfVersion/10 self.dev_info_msg["生产批号"] = self.senser_info1.pn self.dev_info_msg["生产序列号"] = self.senser_info1.sn self.dev_info_msg["首次上电日期"] = self.senser_info1.sTime self.dev_info_msg["唤醒次数"] = self.senser_info1.wakeupTimes self.dev_info_msg["特征值发送次数"] = self.senser_info1.tzTimes self.dev_info_msg["原始波形发送次数"] = self.senser_info1.wvTimes self.dev_info_msg["电池电压"] = self.senser_info1.batVol self.dev_info_msg["产品型号"] = self.senser_info1.productType self.dev_info_msg["无线信号强度"] = self.senser_info1.rss self.dev_info_msg["测点名称"] = bytes(self.senser_info2.node_name).decode('GB18030') def dev_conf_analysis(self): self.dev_conf_msg["配置标志"] = self.senser_info1.active_flag self.dev_conf_msg["唤醒周期"] = self.senser_info1.wakeup_period self.dev_conf_msg["原始波形发送周期"] = self.senser_info1.wave_period self.dev_conf_msg["Zigbee PID"] = hex(self.senser_info1.zig_panid)[2:] self.dev_conf_msg["Zigbee 信道"] = self.senser_info1.zig_channel self.dev_conf_msg["Zigbee 本地地址"] = hex(self.senser_info1.zig_local_addr)[2:] self.dev_conf_msg["Zigbee 目标地址"] = hex(self.senser_info1.zig_dst_addr)[2:] self.dev_conf_msg["Zigbee 发射功率"] = self.senser_info1.zig_power_level self.dev_conf_msg["Zigbee 重试次数"] = self.senser_info1.zig_retry_num self.dev_conf_msg["Zigbee 重试间隔"] = self.senser_info1.zig_retry_time self.dev_conf_msg["ACC采样率"] = self.acc_freq_cal(self.senser_info1.acc_acq_freq) self.dev_conf_msg["ACC量程"] = self.acc_range_cal(self.senser_info1.acc_acq_range) self.dev_conf_msg["ACC采样率时间"] = self.senser_info1.acc_acq_time self.dev_conf_msg["频带能量参数1 START"] = self.senser_info1.freq_power1_start self.dev_conf_msg["频带能量参数1 END"] = self.senser_info1.freq_power1_stop self.dev_conf_msg["频带能量参数2 START"] = self.senser_info1.freq_power2_start self.dev_conf_msg["频带能量参数2 END"] = self.senser_info1.freq_power2_stop self.dev_conf_msg["频带能量参数3 START"] = self.senser_info1.freq_power3_start self.dev_conf_msg["频带能量参数3 END"] = self.senser_info1.freq_power3_stop self.dev_conf_msg["频带能量参数4 START"] = self.senser_info1.freq_power4_start self.dev_conf_msg["频带能量参数4 END"] = self.senser_info1.freq_power4_stop self.dev_conf_msg["频带能量参数5 START"] = self.senser_info1.freq_power5_start self.dev_conf_msg["频带能量参数5 END"] = self.senser_info1.freq_power5_stop self.dev_conf_msg["冲击带通频率START"] = self.senser_info1.envel_freq_start self.dev_conf_msg["冲击带通频率END"] = self.senser_info1.envel_freq_stop self.dev_conf_msg["故障频率1"] = self.senser_info1.fail_freq1 self.dev_conf_msg["故障频率2"] = self.senser_info1.fail_freq2 self.dev_conf_msg["故障频率3"] = self.senser_info1.fail_freq3 self.dev_conf_msg["故障频率4"] = self.senser_info1.fail_freq4 self.dev_conf_msg["配置时间"] = self.senser_info1.conf_date self.dev_conf_msg["速度积分滤波频率"] = self.senser_info1.speed_freq_start def evel_data_analysis(self): self.dev_evel_msg["采集时间"] = self.get_date_time() self.dev_evel_msg["设备温度"] = temp_cal(self.senser_evel.temp_dev) self.dev_evel_msg["环境温度"] = temp_cal(self.senser_evel.temp_env) self.dev_evel_msg["倾角"] = self.senser_evel.angle self.dev_evel_msg["电池电压"] = self.senser_evel.bat_vol self.dev_evel_msg["X轴峰值"] = self.evel_cal(self.senser_evel.acc_x_pk) self.dev_evel_msg["X轴有效值"] = self.evel_cal(self.senser_evel.acc_x_rms) self.dev_evel_msg["X轴速度峰值"] = self.evel_cal(self.senser_evel.speed_x_pk) self.dev_evel_msg["X轴速度有效值"] = self.evel_cal(self.senser_evel.speed_x_rms) self.dev_evel_msg["X轴频带能量1"] = self.evel_cal(self.senser_evel.fpower_x_1) self.dev_evel_msg["X轴频带能量2"] = self.evel_cal(self.senser_evel.fpower_x_2) self.dev_evel_msg["X轴频带能量3"] = self.evel_cal(self.senser_evel.fpower_x_3) self.dev_evel_msg["X轴频带能量4"] = self.evel_cal(self.senser_evel.fpower_x_4) self.dev_evel_msg["X轴频带能量5"] = self.evel_cal(self.senser_evel.fpower_x_5) self.dev_evel_msg["X轴冲击能量"] = self.evel_cal(self.senser_evel.envepower_x) self.dev_evel_msg["X轴故障频率1"] = self.evel_cal(self.senser_evel.errpower_x_1) self.dev_evel_msg["X轴故障频率2"] = self.evel_cal(self.senser_evel.errpower_x_2) self.dev_evel_msg["X轴故障频率3"] = self.evel_cal(self.senser_evel.errpower_x_3) self.dev_evel_msg["X轴故障频率4"] = self.evel_cal(self.senser_evel.errpower_x_4) self.dev_evel_msg["Y轴峰值"] = self.evel_cal(self.senser_evel.acc_y_pk) self.dev_evel_msg["Y轴有效值"] = self.evel_cal(self.senser_evel.acc_y_rms) self.dev_evel_msg["Y轴速度峰值"] = self.evel_cal(self.senser_evel.speed_y_pk) self.dev_evel_msg["Y轴速度有效值"] = self.evel_cal(self.senser_evel.speed_y_rms) self.dev_evel_msg["Y轴频带能量1"] = self.evel_cal(self.senser_evel.fpower_y_1) self.dev_evel_msg["Y轴频带能量2"] = self.evel_cal(self.senser_evel.fpower_y_2) self.dev_evel_msg["Y轴频带能量3"] = self.evel_cal(self.senser_evel.fpower_y_3) self.dev_evel_msg["Y轴频带能量4"] = self.evel_cal(self.senser_evel.fpower_y_4) self.dev_evel_msg["Y轴频带能量5"] = self.evel_cal(self.senser_evel.fpower_y_5) self.dev_evel_msg["Y轴冲击能量"] = self.evel_cal(self.senser_evel.envepower_y) self.dev_evel_msg["Y轴故障频率1"] = self.evel_cal(self.senser_evel.errpower_y_1) self.dev_evel_msg["Y轴故障频率2"] = self.evel_cal(self.senser_evel.errpower_y_2) self.dev_evel_msg["Y轴故障频率3"] = self.evel_cal(self.senser_evel.errpower_y_3) self.dev_evel_msg["Y轴故障频率4"] = self.evel_cal(self.senser_evel.errpower_y_4) self.dev_evel_msg["Z轴峰值"] = self.evel_cal(self.senser_evel.acc_z_pk) self.dev_evel_msg["Z轴有效值"] = self.evel_cal(self.senser_evel.acc_z_rms) self.dev_evel_msg["Z轴速度峰值"] = self.evel_cal(self.senser_evel.speed_z_pk) self.dev_evel_msg["Z轴速度有效值"] = self.evel_cal(self.senser_evel.speed_z_rms) self.dev_evel_msg["Z轴频带能量1"] = self.evel_cal(self.senser_evel.fpower_z_1) self.dev_evel_msg["Z轴频带能量2"] = self.evel_cal(self.senser_evel.fpower_z_2) self.dev_evel_msg["Z轴频带能量3"] = self.evel_cal(self.senser_evel.fpower_z_3) self.dev_evel_msg["Z轴频带能量4"] = self.evel_cal(self.senser_evel.fpower_z_4) self.dev_evel_msg["Z轴频带能量5"] = self.evel_cal(self.senser_evel.fpower_z_5) self.dev_evel_msg["Z轴冲击能量"] = self.evel_cal(self.senser_evel.envepower_z) self.dev_evel_msg["Z轴故障频率1"] = self.evel_cal(self.senser_evel.errpower_z_1) self.dev_evel_msg["Z轴故障频率2"] = self.evel_cal(self.senser_evel.errpower_z_2) self.dev_evel_msg["Z轴故障频率3"] = self.evel_cal(self.senser_evel.errpower_z_3) self.dev_evel_msg["Z轴故障频率4"] = self.evel_cal(self.senser_evel.errpower_z_4) def temp_cal(self, sdata): if sdata > 2048: temp = -(256 - sdata * 0.0625) else: temp = sdata * 0.0625 return temp def evel_cal(self, sdata): s1 = sdata >> 14 s2 = sdata & (0xffff >> 2) if s1 == 0: vl = s2 * 0.0001 elif s1 == 1: vl = s2 * 0.01 elif s1 == 2: vl = s2 elif s1 == 3: vl = s2 / 100 else: vl = 16383 return vl 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" def init_zigbee_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, "原始数据": None } self.dev_evel_msg = {"采集时间": None, "设备温度": None, "环境温度": None, "倾角": None, "电池电压": None, "X轴峰值": None, "X轴有效值": None, "X轴速度峰值": None, "X轴速度有效值": None, "Y轴峰值": None, "Y轴有效值": None, "Y轴速度峰值": None, "Y轴速度有效值": None, "Z轴峰值": None, "Z轴有效值": None, "Z轴速度峰值": None, "Z轴速度有效值": None, "X轴频带能量1": None, "X轴频带能量2": None, "X轴频带能量3": None, "X轴频带能量4": None, "X轴频带能量5": None, "X轴冲击能量": None, "X轴故障频率1": None, "X轴故障频率2": None, "X轴故障频率3": None, "X轴故障频率4": None, "Y轴频带能量1": None, "Y轴频带能量2": None, "Y轴频带能量3": None, "Y轴频带能量4": None, "Y轴频带能量5": None, "Y轴冲击能量": None, "Y轴故障频率1": None, "Y轴故障频率2": None, "Y轴故障频率3": None, "Y轴故障频率4": None, "Z轴频带能量1": None, "Z轴频带能量2": None, "Z轴频带能量3": None, "Z轴频带能量4": None, "Z轴频带能量5": None, "Z轴冲击能量": None, "Z轴故障频率1": None, "Z轴故障频率2": None, "Z轴故障频率3": None, "Z轴故障频率4": None, # "原始数据": None }