172 lines
4.5 KiB
C++
172 lines
4.5 KiB
C++
#pragma once
|
|
|
|
#include <QObject>
|
|
#include <QString>
|
|
#include <QByteArray>
|
|
#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;; // 串口对象
|
|
|
|
};
|