跳转至

串行通信协议文档 Gwiot_Serial_Protocol_v1.4

版本: V1.4.2
日期: 20241218
拟定人: 蔡承恩
审核人:
修订记录
日期 版本 修订内容 修订人
20200319 V1.0 制定协议
20201123 V1.1 增加修改部分指令
20210705 V1.2 精简完善部分指令
20220311 V1.3 增加PSAM和CPU多通道APDU命令
20240131 V1.4 增加同步时间和控制继电器命令
20241113 V1.4.1 增加部分卡片类型
20241218 V1.4.2 增加软加密算法指令

1. 文档说明

1.1 编写目的

此文档主要用于详细说明读卡模块、读卡器、发卡器等产品所使用的通信方式以及通信协议。其中包括TTL、RS232、RS485、USB等接口。产品可能支持一个或者多个接口,具体参考产品说明书。

1.2 关键词说明

此文档中可能包含的关键词有:mifare卡、desfire卡、cpu卡、扇区、数据块、应用、密码、读卡流程。

此文档中的读卡设备已简化大部分卡片操作流程,但是操作卡片依然需要相关的卡片知识。

2. 通信接口说明

2.1 硬件接口连接方式

  • TTL接口

    硬件TTL,0V - 5V电压,交叉连接,读卡设备上的RXD线连接到主机上的TXD,读卡设备上的TXD线连接到主机上的RXD。

  • RS232接口

    硬件RS232,-12V - +12V电压,交叉连接,读卡设备上的RXD线连接到主机上的TXD,读卡设备上的TXD线连接到主机上的RXD。

  • RS485接口

    硬件RS485,差分信号,0V - 6V电压,直连,读卡设备上的485+/A线连接到主机上的485+/A,读卡设备上的485-/B线连接到主机上的485-/B。

  • USB接口

    硬件USB为2.0版本,差分信号,0V – 5V电压,直连,D+对应连接D+,D-对应连接D-。

2.2 软件设置

  • ** TTL/RS232/RS485端口设置**

    主板上的软件需要找到连接模块对应的端口(COM),然后简单的配置端口即可正常和模块进行通信。配置参数如下:

参数 描述
波特率 可选: 9600, 19200, 38400, 57600, 115200
数据位 固定: 8 bits
起始位 固定: 1 Bits
停止位 固定: 1 bit.
校验位 可选: Odd, Even, None

下面为默认配置:

波特率 数据位 起始位 停止位 校验位
115200 8 1 1 None
  • USB端口通信设置

    USB设备为HID通信模式。

HID通信端点:

通信端点 通信方向
0x82 读卡设备发往主机
0x02 主机发往读卡设备

3. 通信协议说明

3.1 数据包格式

  • 命令包格式

一包完整的数据包含有包头、类型、地址、数据长度、命令字、数据、校验、包尾。其中命令包是由主机发送到模块,返回包是由模块返回主机。

发送包格式(主机到模块):

STX DEVICE TYPE DEVICE NUM DATA LENGTH CMD DATA [0..N] XOR ETX

返回包格式(模块到主机):

STX DEVICE TYPE DEVICE NUM DATA LENGTH STATUS DATA [0..N] XOR ETX
  • 命令包中字段描述
字段 长度 描述 备注
STX 1 0xAB–包头。标准控制字节. 表示一个数据包的开始
DEVICE TYPE 1 设备类型 设备类型0则表示不论什么设备都需要响应命令。
DEVICE NUM 1 设备地址,在多机通讯所必需,模块在收到数据包后判断包内的地址与自身预设地址是否相符,相符才会响应。 读卡设备会响应任何带0x00和0xFF地址的数据包(不进行地址判断)。
DATALENGTH 2 数据包中数据字节的长度.包括 CMD/STATUS 和 DATA,但不包括 XOR. LENGTH=字节数(CMD/STATUS + DATA[0-N])
CMD/STATUS 1 CMD: 主机发送至读卡设备 STAUS:读卡设备返回主机,指示命令处理结果 分别对应3.2命令列表和3.3状态列表
DATA [0-N] N 这是一个长度与命令字有关的数据流。也有部分命令不需要附加数据.
XOR 1 8bits的校验字节.它包括除STX, ETX外所有字节的异或校验.
ETX 1 0xBA-包尾。标准控制字节,表示数据包的结束.

3.2 命令列表

命令列表
命令码 名称 描述
通信设备
0x0B dev_GetInfo 读取设备信息
0x0C dev_UpFirmware 更新固件
0x0E dev_EnterIAP 进入IAP模式
0x0F dev_ExitIAP 退出IAP模式
0x10 dev_SetBaud 设置通信速率
0x11 dev_SetAddr 设置设备编号
0x16 dev_SetWorkMode 设置设备的工作模式
0x17 dev_Restart 重启设备
0x1A dev_SwitchRF 开关射频信号
0x1B dev_SwitchBEEP 控制蜂鸣器
0x1C dev_SwitchLED 控制LED灯
0x1D dev_SwitchDisplay 屏幕显示
0x1F Dev_SwitchRelay 控制继电器
0x23 dev_SycTime 同步时间
0x2E dev_ReadNow 从命令超时等待立刻切换回正常读卡方式
ISO14443协议
0x40 iso14_RequestA TypeA寻卡
0x41 iso14_Anticoll TypeA防冲突
0x42 iso14_Select TypeA选定卡
0x43 iso14_ReqAntiSelect TypeA集寻卡,防冲突,选卡一体
0x44 iso14_HaltA TypeA卡休眠
0x45 iso14_RequestB TypeB寻卡
0x46 iso14_SlotMarker TypeB设置间隙
0x47 iso14_AttriB TypeB协商设置速率
0x48 iso14_HaltB TypeB卡休眠
0x49 iso14_RatsA TypeA获取卡片速率
0x4A iso14_PpsRate TypeA协商设置速率
0x4B iso14_APDU ISO14443-4 APDU通道
0x4C card_GetSnr 获取卡片序列号。TypeA、TypeB、ID卡、iso15693、felica
Mifare卡操作
0x50 mf_AuthKey Mifare卡验证密码
0x51 mf_Read Mifare卡读块
0x52 mf_Write Mifare卡写块
0x54 mf_OSRead Mifare卡操作集合寻卡、反冲突、选卡、验证密码、读块
0x55 mf_OSWrite Mifare卡操作集合寻卡、反冲突、选卡、验证密码、写块
0x56 mf_OSInitValue Mifare卡操作集合寻卡、反冲突、选卡、验证密码、初始化钱包值
0x57 mf_OSDecrement Mifare卡操作集合寻卡、反冲突、选卡、验证密码、扣款
0x58 mf_OSIncrement Mifare卡操作集合寻卡、反冲突、选卡、验证密码、充值
0x59 mf_OSGetValue Mifare卡操作集合寻卡、反冲突、选卡、验证密码、获取钱包值
125KHz低频卡操作
0x5A lf_ReadBlock T5577卡读块
0x5B lf_WriteBlock T5577卡写块
0x5C lf_FormatIDnum T5577卡格式化成ID卡
0x5D lf_AnthReadBlock T5577卡验证密码读块
0x5E lf_AnthWriteBlock T5577卡验证密码写块
智能卡操作
0x85 sc_Status 卡片在位状态
0x86 sc_Rats 复位指定卡片,获取ATR信息
0x87 sc_APDU 卡片APDU通信通道,包括PSAM卡和CPU卡
软加密算法
0x8A algo_INIT 对称加密算法初始化。AES\DES\SM1\SM4\SM7
0x8B algo_CRYPTO 对称算法加解密
0x8C algo_CLOSE 对称算法关闭

3.3 命令返回状态列表

状态列表
状态码 名称 描述
0x00 ret_Ok 命令执行成功
0x01 ret_Fail 命令操作失败(具体说明参见函数)
0x31 ret_MonitorData 主动上传的数据
0x80 ret_NoSupportCmd 不支持此命令
0x81 ret_LenghtErr 数据长度错误
0x82 ret_AuthErr 验证失败
0x83 ret_TimeOut 处理超时
0x84 ret_NoCard 无卡响应
0x85 ret_ParamErr 传入参数不正确
0x86 ret_CmdCheckErr 命令校验错误
0x87 ret_UndefErr 未定义错误
0x88 ret_NoEnoughSpace 没有足够的空间

4. 命令详细分析

4.1 dev_GetInfo (0x0B)

  • 命令描述:

    可读取出设备的部分信息,

  • 发送数据: N/A

  • 正确返回:

    STATUS: 0x00-OK

    数据包含设备名称、硬件版本、芯片序列号、固件编译日期

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 01 0B 0A BA

    返回数据包:AB 02 00 00 53 00 44 45 56 5F 4E 41 4D 45 3A 47 36 20 48 57 3A 30 33 34 31 20 0D 0A 53 4E 3A 31 43 43 30 30 32 30 39 42 44 35 32 36 30 30 34 30 30 33 32 34 44 34 44 0D 0A 42 75 69 6C 64 20 54 69 6D 65 3A 4E 6F 76 20 31 38 20 32 30 32 30 20 31 37 3A 31 37 3A 34 31 1B BA

    DEV_NAME:G6 HW:0341

    SN:1CC00209BD52600400324D4D

    Build Time:Nov 18 2020 17:17:41


4.2 dev_UpFirmware (0x0C)

  • 命令描述:

    对设备固件进行更新升级,进入IAP模式之后才能使用。更新固件模式下,波特率固定为115200。固件分包最大1024字节一包。

  • 发送数据:

    DATA[0-1]: 固件一共多少包。

    DATA[2-3]: 当前是第几包。从0包开始。

    DATA[4-N]: 一包最大1024字节。最后一包按实际大小。

  • 正确返回:

    STATUS: 0x00-OK

    最后一包成功会返回4字节的CRC校验结果。

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:

    返回数据包:


4.3 dev_EnterIAP (0x0E)

  • 命令描述:

    该命令使正常工作状态的设备重启进入升级模式。

  • 发送数据: N/A

  • 正确返回:

    STATUS: 0x00-OK

    模块进入升级模式的之后蜂鸣器会快速嘀嘀嘀几次,灯也会快速闪烁几次。

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 01 0E 0F BA

    返回数据包:AB 02 00 00 01 00 03 BA


4.4 dev_ExitIAP (0x0F)

  • 命令描述:

    该命令使升级模式下的设备重启进入正常工作模式,如果没有升级固件成功,或者没有固件,则可能会导致设备无法再使用。

  • 发送数据: N/A

  • 正确返回:

    STATUS: 0x00-OK

    模块进入升级模式的时候蜂鸣器会快速嘀嘀嘀几次,灯也会快速闪烁几次。

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 01 0F 0E BA

    返回数据包:AB 01 00 00 01 00 00 BA


4.5 dev_SetBaud(0x10)

  • 命令描述:

    该命令用于设置设备和主机的通信波特率,重启模块生效。支持TTL、RS232、RS485进行设置。

  • 发送数据:

    DATA[0]: 通信波特率

    0x00-115200bps(默认)

    0x01-57600bps

    0x02-38400bps

    0x03-19200bps

    0x04-9600bps

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 02 10 01 13 BA(设置波特率为57600,N,8,1)

    返回数据包:AB 01 00 00 01 00 00 BA


4.6 dev_SetAddr(0x11)

  • 命令描述:

    该命令用于设置模块的通信地址,可不用设置,默认为0x00。该模式立即生效,重启依然有效。模块不过滤0x00和0xFF地址。

  • 发送数据:

    DATA[0]: 模块地址

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0]: 当前设备地址

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 02 11 01 12 BA(设置的设备地址为0x01)

    返回数据包:AB 01 01 00 01 00 01 BA


4.7 dev_SetWorkMode(0x16)

  • 命令描述:

    该命令可切换设备的工作模式。该模式立即生效,重启依然有效。

  • 发送数据:

    DATA[0]: 设备工作模式

    0x00-主动上传模式(默认)

    0x01-命令通信模式

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 02 16 01 15 BA (仅使用命令通信)

    返回数据包:AB 01 00 00 01 00 00 BA


4.8 dev_Restart(0x17)

  • 命令描述:

    该命令可让设备立即重启。

  • 发送数据: N/A

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

    返回命令之后,延迟100ms设备立即重启。

  • 通信例子:

    发送数据包:AB 00 00 00 01 17 16 BA

    返回数据包:AB 00 00 00 01 00 01 BA


4.9 dev_SwitchRF(0x1A)

  • 命令描述:

    该命令单独设置高低频射频信号的开和关,只在命令模式有效,重启恢复。

  • 发送数据:

    DATA[0]: 0x01-HF高频13.56MHz

    DATA[1]: 0x00-开

    0x01-关

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0]: 射频信号当前状态

    0x00-开

    0x01-关

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 02 1A 00 18 BA

    返回数据包:AB 01 00 00 02 00 00 03 BA


4.10 dev_SwitchBEEP(0x1B)

  • 命令描述:

    该命令单独设置蜂鸣器响灭的时间和频率

  • 发送数据:

    DATA[0]: 响的时间。单位为10ms,1-255。可以只有这一个参数。

    DATA[1]: 灭的时间。单位为10ms,0-255。

    DATA[2]: 响几次。1-20,最大20次

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 02 1B 14 0D BA (响200ms)

    返回数据包:AB 01 00 01 00 00 BA

    发送数据包:AB 00 00 00 04 1B 14 14 02 1D BA (响200ms灭200ms两次)

    返回数据包:AB 01 00 01 00 00 BA


4.11 dev_SwitchLED(0x1C)

  • 命令描述:

    该命令单独设置LED灯亮灭的时间和频率

  • 发送数据:

    DATA[0]: 亮的时间。单位为10ms,1-255。可以只有这一个参数。

    DATA[1]: 灭的时间。单位为10ms,0-255。

    DATA[2]: 亮几次。1-255

    DATA[3]: 操作几个灯。(该参数可不发送)

    DATA[4-N]: 灯号。(该参数根据DATA[3]发送)

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 02 1C 32 2C BA (灯闪500ms)

    返回数据包:AB 00 00 00 01 00 01 BA


4.12 dev_SwitchDisplay (0x1D)

  • 命令描述:

    用于在屏幕上显示内容。

  • 发送数据:

    DATA[0]: 0-屏幕文字显示颜色,1-在屏幕上显示文字,0xFF-跳转到屏幕指定页面。

    如果DATA[0]是0,则:

    DATA[1-2]: 565颜色值,屏幕背景颜色。

    DATA[3-4]: 565颜色值,文字颜色。

    如果DATA[0]是1,则:

    DATA[1]: 指定文字显示在屏幕第几行。

    DATA[2-n]: 文字字符串内容。

    如果DATA[0]是0xFF,则:

    DATA[1]: 跳转到屏幕哪个显示页面。0-开机页,1-待机页,2-文字显示页

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 0D 1D 01 00 30 31 32 33 34 35 36 37 38 39 10 BA (第一行显示字符串)

    发送数据包:AB 00 00 00 0D 1D 01 01 30 31 32 33 34 35 36 37 38 39 11 BA (第二行显示字符串)

    发送数据包:AB 00 00 00 0D 1D 01 02 30 31 32 33 34 35 36 37 38 39 12 BA (第三行显示字符串)

    发送数据包:AB 00 00 00 0D 1D 01 03 30 31 32 33 34 35 36 37 38 39 13 BA (第四行显示字符串)

    发送数据包:AB 00 00 00 0D 1D 01 04 30 31 32 33 34 35 36 37 38 39 14 BA (第五行显示字符串)

    发送数据包:AB 00 00 00 06 1D 00 FFFF 0000 1B BA (清空屏幕白底黑字)

    发送数据包:AB 00 00 00 06 1D 00 34FF 0000 D0 BA (清空屏幕蓝底黑字)

    发送数据包:AB 00 00 00 03 1D FF 00 E1 BA (显示开机页 2秒后自动跳到待机界面)

    发送数据包:AB 00 00 00 03 1D FF 01 E0 BA (显示待机页)

    发送数据包:AB 00 00 00 03 1D FF 02 E3 BA (显示文字页 15秒后自动跳到待机界面)


4.13 dev_SwitchRelay(0x1F)

  • 命令描述:

    该命令用于控制继电器,无板载继电器则控制通过D0和D1连接到TCP转换器上的继电器。继电器吸合时间结束之后自动释放。

  • 发送数据:

    DATA[0]: 继电器吸合时间。单位为100ms,0-255。最大25.5秒。

    DATA[1]: 继电器释放时间。单位为100ms,0-255。最大25.5秒。

    DATA[2]: 继电器吸合次数。1-255。

    DATA[3-n]: 继电器位号。从0号开始,0-255。没有该字节则默认0号继电器。可以同时操作多个继电器。

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 06 1F 0A 00 01 00 01 13 BA (0号、1号继电器同时吸合10*100ms)

    发送数据包:AB 00 00 00 05 1F 0A 00 01 00 11 BA (0号继电器吸合10*100ms)

    发送数据包:AB 00 00 00 05 1F 0A 0A 03 01 18 BA (1号继电器吸合10*100ms,接着又释放10*100ms,一共动作3次)

    发送数据包:AB 00 00 00 04 1F 0A 00 01 10 BA (无指定继电器位号,默认0号继电器吸合10*100ms之后自动释放)

    返回数据包:AB 00 00 00 01 00 01 BA


4.14 dev_SycTime (0x23)

  • 命令描述:

    用于同步读卡器时间

  • 发送数据:

    DATA[0]: 秒,BCD编码。如0x23代表23秒。

    DATA[1]: 分,BCD编码。如0x49代表49分。

    DATA[2]: 时,BCD编码。如0x10代表10小时。

    DATA[3]: 日,BCD编码。如0x02代表2日。

    DATA[4]: 星期,BCD编码。如0x02代表星期3。RTC时钟不适用,可为任意值。

    DATA[5]: 月,BCD编码。如0x01代表一月。

    DATA[6]: 年,BCD编码。如0x24代表24年。从2000年开始。

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 07 23 23 49 10 02 02 01 24 7B BA

    返回数据包:AB 02 00 00 01 00 03 BA


4.15 dev_ReadNow(0x2E)

  • 命令描述:

    从命令超时等待立刻切换会正常读卡方式。此命令可用于主动读卡模式下,又需要命令通信读扇区,发送命令之后不需要3秒超时等待切换到主动读卡模式。

  • 发送数据: N/A

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 01 2E 2F BA

    返回数据包:AB 02 00 00 01 00 03 BA


4.16 iso14_RequestA(0x40)

  • 命令描述:

    ISO14443A协议中的寻卡指令。

  • 发送数据:

    DATA[0]: 0x26-寻找没在休眠状态的卡片

    0x52-寻找所有卡片

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0-1]: 卡片请求应答ATQA

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 02 40 26 64 BA

    返回数据包:AB 00 00 00 03 00 04 00 07 BA


4.17 iso14_Anticoll(0x41)

  • 命令描述:

    ISO14443A协议中的防冲突指令。

  • 发送数据:

    DATA[0]: 0x93-一级防冲突代码

    0x95-二级防冲突代码

    0x97-三级防冲突代码

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0-3]: 4字节卡片序列号

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 02 41 93 D0 BA

    返回数据包:AB 00 00 00 05 00 A6 10 68 C2 19 BA


4.18 iso14_Select(0x42)

  • 命令描述:

    ISO14443A协议中的选定卡片指令。

  • 发送数据:

    DATA[0]: 0x93-一级防冲突代码

    0x95-二级防冲突代码

    0x97-三级防冲突代码

    DATA[1-5]: 防冲突指令中返回的卡片序列号

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0]: 卡片选择应答SAK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 06 42 93 A6 10 68 C2 CB BA

    返回数据包:AB 00 00 00 02 00 08 0A BA


4.19 iso14_ReqAntiSelect(0x43)

  • 命令描述:

    集合ISO14443A寻卡、防冲突、选卡操作,一条命令即可获取卡号。

  • 发送数据:

    DATA[0]: 寻卡模式

    0x26-IDEL模块

    0x52-ALL模式

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0-1]: 卡片ATQA

    DATA[2]: 卡片应答SAK

    DATA[3]: 卡号长度

    DATA[4-N]: 卡号

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 02 43 26 67 BA

    返回数据包:AB 00 00 00 09 00 04 00 08 04 A6 10 68 C2 1D BA


4.20 iso14_HaltA(0x44)

  • 命令描述:

    该命令用于使卡片进入休眠状态,卡片工作在ISO14443-4层CPU卡状态的情况下不能使用。

  • 发送数据: N/A

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 01 44 45 BA

    返回数据包:AB 00 00 00 01 00 01 BA


4.21 iso14_RequestB(0x45)

  • 命令描述:

    ISO14443B协议中的寻卡指令。

  • 发送数据:

    DATA[0]: 0x00-空闲的卡

    0x08-所有的卡

    DATA[1]: AFI应用标识符,默认0x00全选

    DATA[2]: 时隙总数N(0-1N,1-2N,2-4N,3-8N,4-16N)

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0-11]: 卡片请求应答ATQB

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 04 45 08 00 00 49 BA

    返回数据包:AB 02 00 00 0D 00 50 00 00 00 00 D1 03 00 81 00 70 C0 BC BA

    (PUPI为:00 00 00 00)


4.22 iso14_SlotMarker(0x46)

  • 命令描述:

    该命令用于选择时隙。

  • 发送数据:

    DATA[0]: 时隙总数N(0-1N,1-2N,2-4N,3-8N,4-16N)

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 02 46 00 44 BA(0-1N)

    返回数据包:AB 00 00 00 01 00 01 BA


4.23 iso14_AttriB(0x47)

  • 命令描述:

    ISO14443B协议卡片协商通信速率。

  • 发送数据:

    DATA[0-3]: 4字节PUPI

    DATA[4]: BIT1(EOF:0-开启,1-关闭) BIT0(SOF:0-开启,1-关闭)

    DATA[5]: PCD<-->PICC 速率选择

    BIT3-BIT2(PICC->PCD:0-106K、1-212K、2-424K、3-848K)

    BIT1-BIT0(PCD->PICC:0-106K、1-212K、2-424K、3-848K)

    DATA[6]: CID

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 08 47 00 00 00 00 00 00 00 4F BA

    返回数据包:AB 00 00 00 01 00 01 BA


4.24 iso14_HaltB(0x48)

  • 命令描述:

    ISO14443B协议卡片进入休眠。

  • 发送数据:

    DATA[0-3]: 4字节PUPI

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 05 48 00 00 00 00 4D BA

    返回数据包:AB 00 00 00 01 00 01 BA


4.25 iso14_RatsA(0x49)

  • 命令描述:

    该命令为ISO14443A中RatsA指令,主要用于支持ISO14443-4协议的卡片复位。选择卡片之后才能使用该命令。

  • 发送数据:

    DATA[0]: CID

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0-N]: 卡片ATS应答的数据。

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 02 49 01 4A BA

    返回数据包:AB 00 00 00 11 00 10 78 80 A0 02 20 90 00 00 00 00 00 93 43 7A 0A 4B BA


4.26 iso14_PpsRate(0x4A)

  • 命令描述:

    ISO14443A协议卡片协商通信速率,需要卡片返回的ATS支持才行。

  • 发送数据:

    DATA[0]: PCD<-->PICC 速率选择

    BIT3-BIT2(PICC->PCD:0-106K、1-212K、2-424K、3-848K)

    BIT1-BIT0(PCD->PICC:0-106K、1-212K、2-424K、3-848K)

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 02 4A 0A 42 BA(设置通信速率为424K)

    返回数据包:AB 00 00 00 01 00 01 BA


4.27 iso14_APDU(0x4B)

  • 命令描述:

    该命令用于支持ISO14443-4协议的卡片。复位卡片之后才能正确使用该命令。

  • 发送数据:

    DATA[0]: CLA

    DATA[1]: INS

    DATA[2]: P1

    DATA[3]: P2

    DATA[4]: Lc

    DATA[5-N]: Data(如果Lc为0,则没有数据需要发送)

    DATA[N+1]: Le(如果没有则不发送)

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0-N]: 卡片返回的数据。

  • 错误返回:

    STATUS: 0x01-FAIL

    DATA[0]: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 08 4B 00 A4 00 00 02 3F 00 DA BA(目录MF 3F00)

    返回数据包:AB 00 00 00 1A 00 6F 15 84 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31 A5 03 88 01 01 90 00 33 BA


4.28 card_GetSnr(0x4C)

  • 命令描述:

    通过设备获取当前卡片序列号,轮询所有设备支持的卡片协议。比较耗时的命令

  • 发送数据: N/A

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0]: 卡片类型

    DATA[1]: 卡号长度

    DATA[2-N]: 卡号

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 01 4C 4D BA

    返回数据包:AB 02 00 00 07 00 10 04 AB CC 06 B3 C3 BA


4.29 mf_AuthKey(0x50)

  • 命令描述:

    Mifare卡片密钥验证。

  • 发送数据:

    DATA[0]: 0x60-A组密钥

    0x61-B组密钥

    DATA[1]: 指定块 S50最大63块,S70最大255块

    DATA[2-7]: 6字节密钥,默认全为FF

    DATA[8-11]; 4字节卡片序列号

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 0D 50 60 04 FF FF FF FF FF FF A6 10 68 C2 25 BA

    返回数据包:AB 00 00 00 01 00 01 BA


4.30 mf_Read(0x51)

  • 命令描述:

    Mifare卡片读指定块,一块16字节。

  • 发送数据:

    DATA[0]: 指定块 S50最大63块,S70最大255块

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0-15]: 16字节块数据。

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 02 51 04 57 BA

    返回数据包:AB 00 00 00 11 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 11 BA


4.31 mf_Write(0x52)

  • 命令描述:

    Mifare卡片写指定块,一块16字节。

  • 发送数据:

    DATA[0]: 指定块 S50最大63块,S70最大255块

    DATA[1-16]: 块数据

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 12 52 04 31 32 33 34 35 36 37 38 31 32 33 34 35 36 37 38 44 BA(块4)

    返回数据包:AB 00 00 00 01 00 01 BA


4.32 mf_OSRead(0x54)

  • 命令描述:

    Mifare跨扇区读,跳过密钥块不读,必须每个扇区密钥一样才能成功。

    此命令自动寻卡、防冲突、选卡,然后根据密钥验证扇区读出数据。

  • 发送数据:

    DATA[0]: 0x60-A组密钥

    0x61-B组密钥

    DATA[1]: 开始要读的块

    DATA[2]: 一共要读的块,不包括密钥块

    DATA[3-8]: 密钥

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0-N]: 16倍数的块数据。

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 0A 54 60 04 05 FF FF FF FF FF FF 3F BA(从第0x04块开始读5块,跨扇区了,但是不读扇区的密钥块)

    返回数据包:AB 00 00 00 51 00 31 32 33 34 35 36 37 38 31 32 33 34 35 36 37 38 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 51 BA


4.33 mf_OSWrite(0x55)

  • 命令描述:

    Mifare跨扇区写,跳过密钥块不写,必须每个扇区密钥一样才能成功。

    此命令自动寻卡、防冲突、选卡,然后根据密钥验证扇区写入数据。

  • 发送数据:

    DATA[0]: 0x60-A组密钥

    0x61-B组密钥

    DATA[1]: 从哪一块开始写

    DATA[2-7]: 密钥

    DATA[8-n]: 写入数据,16个字节为一个单位,写完一块,自动切换写下一块,跳过密钥块不写。

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 39 55 60 04 FF FF FF FF FF FF 31 32 33 34 35 36 37 38 31 32 33 34 35 36 37 38 31 32 33 34 35 36 37 38 31 32 33 34 35 36 37 38 31 32 33 34 35 36 37 38 31 32 33 34 35 36 37 38 08 BA

    返回数据包:AB 00 00 00 01 00 01 BA


4.34 mf_OSInitValue(0x56)

  • 命令描述:

    Mifare卡使用钱包功能,随便指定一块作为钱包功能。

    此命令自动寻卡、防冲突、选卡,然后根据密钥验证初始化钱包值。

  • 发送数据:

    DATA[0]: 0x60-A组密钥

    0x61-B组密钥

    DATA[1]: 使用哪一块作为钱包功能

    DATA[2-7]: 密钥

    DATA[8-11]: int类型的钱包值(大端模式)

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 0D 56 60 04 FF FF FF FF FF FF 00 00 03 E8 D4 BA(钱包值为1000)

    返回数据包:AB 00 00 00 01 00 01 BA


4.35 mf_OSDecrement(0x57)

  • 命令描述:

    Mifare卡使用钱包功能,对指定块中的钱包扣款。

    此命令自动寻卡、防冲突、选卡,然后根据密钥验证扣款。

  • 发送数据:

    DATA[0]: 0x60-A组密钥

    0x61-B组密钥

    DATA[1]: 哪一块为钱包值

    DATA[2-7]: 密钥

    DATA[8-11]: int类型的值(大端模式)

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 0D 57 60 04 FF FF FF FF FF FF 00 00 03 E8 D5 BA(扣款值为1000)

    返回数据包:AB 00 00 00 01 00 01 BA


4.36 mf_OSIncrement(0x58)

  • 命令描述:

    Mifare卡使用钱包功能,对指定块中的钱包充值。

    此命令自动寻卡、防冲突、选卡,然后根据密钥验证充值。

  • 发送数据:

    DATA[0]: 0x60-A组密钥

    0x61-B组密钥

    DATA[1]: 哪一块为钱包值

    DATA[2-7]: 密钥

    DATA[8-11]: int类型的值(大端模式)

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 0D 58 60 04 FF FF FF FF FF FF 00 00 03 E8 DA BA(充值值为1000)

    返回数据包:AB 00 00 00 01 00 01 BA


4.37 mf_OSGetValue (0x59)

  • 命令描述:

    Mifare卡使用钱包功能,随便指定一块作为钱包功能。

    此命令自动寻卡、防冲突、选卡,然后根据密钥验证初始化钱包值。

  • 发送数据:

    DATA[0]: 0x60-A组密钥

    0x61-B组密钥

    DATA[1]: 使用哪一块作为钱包功能

    DATA[2-7]: 密钥

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0-3]: 4字节钱包值(大端模式)。

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 09 59 60 04 FF FF FF FF FF FF 34 BA

    返回数据包:AB 00 00 00 05 00 00 00 03 E8 EE BA


4.38 lf_ReadBlock(0x5A)

  • 命令描述:

    T5577卡读某一块数据,使用曼彻斯特编码。

  • 发送数据:

    DATA[0]: 速率。16、32、40、50、64、100、128

    DATA[1]: 哪一页。0、1

    DATA[2]: 哪一块。0、1、2、3、4、5、6、7

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

    DATA[0-3]: 4字节块数据。

  • 通信例子:

    发送数据包:AB 00 00 00 04 5A 40 00 00 1E BA (速度64,page0 block0)

    返回数据包:AB 02 00 00 05 00 00 14 80 41 D2 BA


4.39 lf_WriteBlock(0x5B)

  • 命令描述:

    T5577卡写某一块数据,使用曼彻斯特编码。

  • 发送数据:

    DATA[0]: 哪一页。0、1

    DATA[1]: 哪一块。0、1、2、3、4、5、6、7

    DATA[2]: 是否锁住。0-不锁,1-锁住

    DATA[3-4]: 4字节块数据

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 08 5B 00 01 00 31 32 33 34 56 BA

    返回数据包:AB 02 00 00 01 00 03 BA


4.40 lf_FormatIDnum(0x5C)

  • 命令描述:

    把T5577卡格式化成ID卡。

  • 发送数据:

    DATA[0-4]: 5字节ID卡号,第一个字节一般不使用

    DATA[5]: 是否锁卡。0-不锁卡,1-锁卡

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 07 5C 2E 00 6F 85 B6 00 29 BA

    返回数据包:AB 02 00 00 01 00 03 BA


4.41 lf_AnthReadBlock(0x5D)

  • 命令描述:

    T5577卡验证密码读某一块数据,使用曼彻斯特编码。

  • 发送数据:

    DATA[0]: 速率。16、32、40、50、64、100、128

    DATA[1]: 哪一页。0、1

    DATA[2]: 哪一块。0、1、2、3、4、5、6、7

    DATA[3-6]: 4个字节密码。密码存在块7.

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

    DATA[0-3]: 4字节块数据。

  • 通信例子:

    发送数据包:AB 00 00 00 08 5D 40 00 01 FF FF FF FF 14 BA (速度64,page0 block1 密码FF FF FF FF)

    返回数据包:AB 02 00 00 05 00 30 31 32 33 07 BA


4.42 lf_AnthWriteBlock(0x5E)

  • 命令描述:

    T5577卡验证密码写某一块数据,使用曼彻斯特编码。

  • 发送数据:

    DATA[0]: 哪一页。0、1

    DATA[1]: 哪一块。0、1、2、3、4、5、6、7

    DATA[2]: 是否锁住。0-不锁,1-锁住

    DATA[3-4]: 4字节密码

    DATA[5-8]: 4字节块数据

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 0C 5E 00 01 00 FF FF FF FF 31 32 33 34 57 BA

    返回数据包:AB 02 00 00 01 00 03 BA


4.43 sc_GetStatus(0x85)

  • 命令描述:

    获取卡片在位状态,0未检测到卡,1卡片在位

  • 发送数据:

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0-N]: 卡片数量为N+1,0字节固定为未非接卡,其他对应PSAM卡

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 01 85 84 BA

    返回数据包:AB 00 00 00 05 00 01 00 01 01 04 BA(非接卡在位,PSAM1卡槽没卡,PSAM2、PSAM3有卡)


4.44 sc_Rats(0x86)

  • 命令描述:

    对cpu卡和PSAM卡复位重新连接,获取应答ATR信息。

  • 发送数据:

    DATA[0]: 卡槽,0号为非接卡,其他为PSAM卡

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0]: 卡片是否在位,0-无卡,1-有卡

    DATA[1]: ATR信息长度

    DATA[2-N]: ATR信息

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 02 86 00 84 BA(对非接卡复位获取ATR信息)

    返回数据包:AB 01 00 00 13 00 01 10 10 78 80 A0 02 20 90 00 00 00 00 00 F3 71 79 0A 08 BA(非接卡在位,卡片返回ATR总长度为0x10字节,ATR信息为:10 78 80 A0 02 20 90 00 00 00 00 00 F3 71 79 0A)


4.45 sc_APDU(0x87)

  • 命令描述:

    cpu卡和PSAM卡的APDU通信通道。

  • 发送数据:

    DATA[0]: 卡槽,0号为非接卡,其他为PSAM卡

    DATA[1-N]: APDU命令。例如:0084000008

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0]: 卡槽,0号为非接卡,其他为PSAM卡

    DATA[1-N]: APDU命令返回。例如:80EA1DC777128E799000

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 07 87 01 00 84 00 00 08 0D BA(给PSAM1发送获取随机数命令)

    返回数据包:AB 01 00 00 0C 00 01 80 EA 1D C7 77 12 8E 79 90 00 BE BA(PSAM1卡槽返回随机数)


4.46 algo_INIT (0x8A)

  • 命令描述:

    初始化对称加密算法。支持AES\DES\SM1\SM4\SM7

  • 发送数据:

    DATA[0]: 算法类型。

    0:AES

    1:DES\3DES

    2:SM1

    3:SM4

    4:SM7

    DATA[1]: 加解密过程分组模式。

    0:ECB

    1:CBC

    2:CTR

    DATA[2]: 0-加密/1-解密

    DATA[3]: 密钥长度。8/16/24字节

    DATA[4-N]: 密钥

    DATA[N-M]: IV加解密初始向量。8/16字节

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 25 8A 02 00 01 10 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BC BA(使用SM1算法CBC加密)

    返回数据包:AB 01 00 00 01 00 00 BA


4.47 algo_CRYPTO (0x8B)

  • 命令描述:

    经过0x8A命令初始化之后,对数据加密或者解密操作。

  • 发送数据:

    DATA[0-N]: 原始数据,至于是要对数据加密或者解密,在8A命令中指定。DES算法数据长度为8的倍数,其他算法为16的倍数。

  • 正确返回:

    STATUS: 0x00-OK

    DATA[0-N]: 经过加密或者解密之后的数据。

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 11 8B 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08 9A BA

    返回数据包:AB 01 00 00 11 00 20 71 A9 24 61 36 F6 4B 16 6B A9 25 0F 34 DD 9B AA BA


4.48 algo_CLOSE (0x8C)

  • 命令描述:

    经过0x8A命令初始化之后,对加密算法释放。

  • 发送数据: 无

  • 正确返回:

    STATUS: 0x00-OK

  • 错误返回:

    STATUS: 错误代码,详细请看状态列表。

  • 通信例子:

    发送数据包:AB 00 00 00 01 8C 8D BA

    返回数据包:AB 01 00 00 01 00 00 BA

5. 主动上传卡号模式说明

5.1 数据包格式

不同型号产品可能略有差异,请以产品说明书为准。

数据头 长度 卡片类型 卡号数据 异或校验 数据尾
0x02 包含数据头尾 参考附录一 4-8字节 不包含数据头尾 0x03

5.2 举例说明

例如:串口工具接收到的数据为02 0A 01 2E 00 B6 D7 B5 F1 03

第一个字节0x02 表示数据开始。

第二个字节0x0A 表示整条数据长度为10个字节,包括数据开始和数据结束。

第三个字节0x01 表示该卡片类型为EM4100。

第四个字节到第八个字节(0x2E 0x00 0xB6 0xD7 0xB5)这5个字节 表示读取到的卡号,其中第四个字节0x2E为ID卡隐藏卡号。

第九个字节0xF1 表示第二个字节到第八个字节的BCC校验。

第十个字节0x03 表示数据结束。

6. 注意事项

6.1 设备工作模式

  • 监控上传模式(默认)

参考主动上传卡号模式说明

  • 命令通信模式

此模式下,设备支持的命令需要参考设备的详细说明书。通信命令可查看3.2中的命令列表。

6.2 设备通信注意事项

  • 关于设备类型

设备类型为0的时候,不管当前设备是什么类型,都可以响应命令,否则只响应符合自身设备类型的命令。

设备类型 说明
0 不过滤当前通信命令
1 模块
2 读卡器
3 发卡器
4 主板
5 控制器
6 其他
  • 关于设备地址

设备地址为0x00或者0xFF的时候,不管当前设备是什么地址,一定会响应命令,否则只响应符合自身地址的命令。

7. 附录

7.1 附录一、卡片类型

卡片类型
编码 卡片名称 卡号长度 备注
0x01 EM41XX 5 ID卡
0x02 T5577 4
0x03 HID Prox 8
0x05 EM4305 4
0x07 Hitag 4/8
0x10 TypeA-4Byte 4 Mifare1K/S50/S70
0x11 TypeA-7Byte 7
0x12 TypeA-10Byte
0x13 PBOC 8 银行卡、手机PAY,把17或者19位十进制银行卡号转为8字节十六进制
0x14 DesFire(加密信息) 7 DesFire中文件内容
0x15 FMcos(加密信息) 4 CPU卡中文件内容
0x16 Gicard 4 深圳市长城物联科技有限公司-G卡
0x17 MifareBlock 16 Mifare卡块数据
0x18 MFOEM1 不定长 CPU卡定制
0x19 TypeA-CPU 4 TypeA协议的CPU卡uid号
0x1A SM1CPU 4 国密CPU卡文件卡号
0x1B MifarePlus 7 Plus卡序列号
0x1C DesFireOEM 不定长 自定义desfire卡文件
0x20 ChinaID 8 二代证uid号
0x21 TypeB-4Byte 4
0x22 UID 4 复制卡
0x25 CPU卡 4/7 支持ISO14443-4的CPU卡
0x30 Felica 8 索尼卡
0x31 15693-8Byte 8 标签卡
0x32 iClass 8 iClass卡序列号
0x33 iClassGP 不定长 iClass卡印刷号
0x50 Qrcode 4 二维码
0xFE 防拆警报 4 0xFFFFFFFF
0xFF Keyboard 1 按键类型

(注:此表格中卡片类型为自定义,仅供参考,各个型号产品略有不同。)

7.2 附录二、Mifare卡操作流程

7.3 附录三、CPU卡操作流程

注:APDU命令用于和CPU卡通信,例如获取随机数、选中文件、外部认证、读二进制文件