#pragma once #include #include #include #include "posix_qextserialport.h" class RFIDFunction:public QObject { Q_OBJECT public: enum ControlBlock//加密块 { Sector_0_Block_3 = 3, Sector_1_Block_3 = 7, Sector_2_Block_3 = 11, Sector_3_Block_3 = 15, Sector_4_Block_3 = 19, Sector_5_Block_3 = 23, Sector_6_Block_3 = 27, Sector_7_Block_3 = 31, Sector_8_Block_3 = 35, Sector_9_Block_3 = 39, Sector_10_Block_3 = 43, Sector_11_Block_3 = 47, Sector_12_Block_3 = 51, Sector_13_Block_3 = 55, Sector_14_Block_3 = 59, Sector_15_Block_3 = 63 }; enum KeyType//密钥类型 { KEY_A = 0, // 密钥A KEY_B // 密钥B }; enum DataBlock //数据块 { Sector_0_Block_1 = 1, Sector_0_Block_2 = 2, Sector_1_Block_0 = 4, Sector_1_Block_1 = 5, Sector_1_Block_2 = 6, Sector_2_Block_0 = 8, Sector_2_Block_1 = 9, Sector_2_Block_2 = 10, Sector_3_Block_0 = 12, Sector_3_Block_1 = 13, Sector_3_Block_2 = 14, Sector_4_Block_0 = 16, Sector_4_Block_1 = 17, Sector_4_Block_2 = 18, Sector_5_Block_0 = 20, Sector_5_Block_1 = 21, Sector_5_Block_2 = 22, Sector_6_Block_0 = 24, Sector_6_Block_1 = 25, Sector_6_Block_2 = 26, Sector_7_Block_0 = 28, Sector_7_Block_1 = 29, Sector_7_Block_2 = 30, Sector_8_Block_0 = 32, Sector_8_Block_1 = 33, Sector_8_Block_2 = 34, Sector_9_Block_0 = 36, Sector_9_Block_1 = 37, Sector_9_Block_2 = 38, Sector_10_Block_0 = 40, Sector_10_Block_1 = 41, Sector_10_Block_2 = 42, Sector_11_Block_0 = 44, Sector_11_Block_1 = 45, Sector_11_Block_2 = 46, Sector_12_Block_0 = 48, Sector_12_Block_1 = 49, Sector_12_Block_2 = 50, Sector_13_Block_0 = 52, Sector_13_Block_1 = 53, Sector_13_Block_2 = 54, Sector_14_Block_0 = 56, Sector_14_Block_1 = 57, Sector_14_Block_2 = 58, Sector_15_Block_0 = 60, Sector_15_Block_1 = 61, Sector_15_Block_2 = 62 }; enum KeyFunction { KeyA_Same_KeyB = 0, // KEYA和KEYB相同 KeyB_Control_KeyA // KEYB控制KEYA }; enum WorkMode //工作模式 { Command_Mode = 0x01,//命令模式(关闭自动读卡),该模式会关闭自动读卡功能 Auto_Read_Card_Num_Mode = 0x02,//自动读卡号 Auto_Read_Data_Mode = 0x03,//自动读块数据,块号为要自动读的数据块编号 Auto_Read_Card_Num_Data_Mode = 0x04//自动读卡号与指定块数据,块号为要自动读的数据块编号 }; enum UploadMode//上传模式 { Auto_Upload = 0x00,//读卡后主动发送数据,主动将读到的数据发送给上位机 Command_Upload = 0x01//读卡后被动发送数据,需要收到上位机获取数据的命令才将读到的数据发送给上位机 }; enum ErrorCode { No_Error = 0, // 无错误 Serial_Error, // 串口错误 Send_Data_Error, // 发送数据错误 Data_Is_Empty_Error, // 数据为空错误 Data_Size_More_Than_8192_Error, // 数据大小超过8192错误 Received_Data_Check_Error, // 接收数据校验错误 Received_Data_Error, // 接收数据错误 Data_Is_Illegal_Error // 数据非法错误 }; public: RFIDFunction(QObject* parent); // 构造函数 ~RFIDFunction(); // 析构函数 void CheckSumOut(unsigned char* buf, unsigned char len); bool CheckSumIn(unsigned char* buf, unsigned char len); ErrorCode initSerialPortAndOpen(const QString& portName, // 初始化串口并打开 BaudRateType baudRate = BAUD9600, // 波特率 DataBitsType setDataBits = DATA_8, // 数据位 StopBitsType stopBits = STOP_1, // 停止位 ParityType parity = PAR_NONE // 校验位 ); static const QByteArray createPassword(const QByteArray& info); // 创建密码 bool getSerialState(); // 获取串口状态 ErrorCode setOriginPassword(const QByteArray& psw); // 设置原始密码 ErrorCode setWriteAndReadPassword(const QByteArray& writePassword, const QByteArray& readPassword, KeyFunction keyFunc); // 设置读写密码 ErrorCode setEncryptedBlock(KeyType type, ControlBlock block); // 设置加密块 ErrorCode writeDataToBlock(KeyType type, DataBlock block, const QByteArray& data); // 写数据到块 ErrorCode readDataFromBlock(KeyType type, DataBlock block, QByteArray& data); // 从块读取数据 ErrorCode setWorkMode(WorkMode mode, DataBlock block = Sector_1_Block_2, UploadMode uploadMode = Auto_Upload);//设置工作模式 ErrorCode getReaderAddress(QByteArray& psw); // 获取读卡器地址 private: bool m_SerialSate; // 串口状态 Posix_QextSerialPort *m_SerialPort;; // 串口对象 };