diff --git a/Labs/Lab2/source/images/UID10PCD.png b/Labs/Lab2/source/images/UID10PCD.png new file mode 100644 index 0000000..020670c Binary files /dev/null and b/Labs/Lab2/source/images/UID10PCD.png differ diff --git a/Labs/Lab2/source/images/UID10PICC.png b/Labs/Lab2/source/images/UID10PICC.png new file mode 100644 index 0000000..ca9a12d Binary files /dev/null and b/Labs/Lab2/source/images/UID10PICC.png differ diff --git a/Labs/Lab2/source/images/UID4.png b/Labs/Lab2/source/images/UID4.png new file mode 100644 index 0000000..5c57fca Binary files /dev/null and b/Labs/Lab2/source/images/UID4.png differ diff --git a/Labs/Lab2/source/images/UID7PCD.png b/Labs/Lab2/source/images/UID7PCD.png new file mode 100644 index 0000000..5825860 Binary files /dev/null and b/Labs/Lab2/source/images/UID7PCD.png differ diff --git a/Labs/Lab2/source/images/UID7PICC.png b/Labs/Lab2/source/images/UID7PICC.png new file mode 100644 index 0000000..1a120e1 Binary files /dev/null and b/Labs/Lab2/source/images/UID7PICC.png differ diff --git a/Labs/Lab2/source/实验2_21281280_柯劲帆.md b/Labs/Lab2/source/实验2_21281280_柯劲帆.md index c314ab5..57d8c94 100644 --- a/Labs/Lab2/source/实验2_21281280_柯劲帆.md +++ b/Labs/Lab2/source/实验2_21281280_柯劲帆.md @@ -7,10 +7,9 @@
姓名:柯劲帆
班级:物联网2101班
指导老师:赵帅锋
-
日期:2024年6月8日
+
日期:2024年6月9日
- --- [TOC] @@ -60,7 +59,7 @@ UID 的标准长度为 4 字节、7 字节或 10 字节,分别对应于单级 | 行为方 | 发送内容 | | | | | | :----: | ---------- | ---- | ---- | ---- | ---- | | PCD | SEL = '93' | | | | | -| PICC | CT | uid0 | uid1 | uid2 | BCC | +| PICC | CT = '88' | uid0 | uid1 | uid2 | BCC | | PCD | SEL = '95' | | | | | | PICC | uid3 | uid4 | uid5 | uid6 | BCC | @@ -69,9 +68,9 @@ UID 的标准长度为 4 字节、7 字节或 10 字节,分别对应于单级 | 行为方 | 发送内容 | | | | | | :----: | ---------- | ---- | ---- | ---- | ---- | | PCD | SEL = '93' | | | | | -| PICC | CT | uid0 | uid1 | uid2 | BCC | +| PICC | CT = '88' | uid0 | uid1 | uid2 | BCC | | PCD | SEL = '95' | | | | | -| PICC | CT | uid3 | uid4 | uid5 | BCC | +| PICC | CT = '88' | uid3 | uid4 | uid5 | BCC | | PCD | SEL = '97' | | | | | | PICC | uid6 | uid7 | uid8 | uid9 | BCC | @@ -147,19 +146,188 @@ ATQA 应答由两个字节(16位)组成,其结构如下: ### 2.3.4. ANTICOLLISION 命令 +ANTICOLLISION 命令用于解决射频场中多张卡片同时响应的问题,通过逐步发送卡片的 UID 部分,读写器可以唯一识别每张卡片。该命令在不同的级联级别(Cascade Level)使用不同的标识符 `'93'`, `'95'`, `'97'`,分别表示第一级、第二区和第三级的防冲突级别。 +ANTICOLLISION 命令的帧结构如下: -### 2.3.5. SELECT命令 +| SOF | SEL | NVB | EOF | +| ---- | ------------------------------------------------------------ | ------ | ---- | +| | `0x93`(Cascade Level 1)或 `0x95`(Cascade Level 2)或 `0x97`(Cascade Level 3) | `0x20` | | +**交互流程**: +1. **发送 ANTICOLLISION 命令**:读写器向射频场中的卡片发送 ANTICOLLISION 命令,要求卡片发送其 UID 部分。 +2. **卡片响应**:卡片根据级联级别,返回部分 UID 和 BCC。 +3. **检测冲突**:读写器检测是否存在冲突。如果存在冲突,读写器通过选择特定位进行防冲突处理,直到只剩下一个唯一的 UID。 + +如果有冲突: + +| SOF | SEL(8 bits) | NVB(8 bits) | 指定的 UID 比特 | EOF | +| ---- | -------------------------- | ---------------- | --------------- | ---- | +| | `0x93` 或 `0x95` 或 `0x97` | PCD 指定的比特数 | | | + +**交互流程**: + +1. **发送 SELECT 命令**:读写器向射频场中的卡片发送 ANTICOLLISION 命令,包含卡片的部分 UID。 +2. **卡片确认**:卡片收到命令后,若指定 UID 与自身相符,返回自身 UID 余下部分。 +3. **进一步通信**:选中的卡片现在可以接收读写器发送的其他命令,如读写操作命令。 + +### 2.3.5. SELECT 命令 + +SELECT 命令用于选择和激活在防冲突过程中唯一识别的卡片,使其进入选中状态,准备接受进一步的命令。SELECT 命令也分为不同的级联级别,使用与 ANTICOLLISION 命令相同的标识符。 + +SELECT 命令的帧结构如下: + +| SOF | SEL(8 bits) | NVB(8 bits) | UID | BCC | EOF | +| ---- | -------------------------- | -------------------------- | ---- | ---- | ---- | +| | `0x93` 或 `0x95` 或 `0x97` | UID 比特长度 + 16 比特长度 | | | | + +**交互流程**: + +1. **发送 SELECT 命令**:读写器向射频场中的卡片发送 SELECT 命令,包含完整 UID 和 BCC 。 +2. **卡片确认**:卡片收到命令后,若指定 UID 与自身相符,将会回复 SAK 。 +3. **进一步通信**:选中的卡片现在可以接收读写器发送的其他命令,如读写操作命令。 ### 2.3.6. SAK应答 +SAK(Select Acknowledge)应答是卡片(PICC)在接收到 SELECT 命令后返回给读写器(PCD)的应答码,用于确认卡片是否已被选中,并提供一些附加信息。 +SAK 应答的帧结构如下: + +| SOF | b6 | b5 - b4 | b3 | b2 - b0 | CRC_A(16 bits) | EOF | +| :--: | :--------------------------------------: | ------- | :----------------------------------------------------: | :-----: | :--------------: | :--: | +| | `1`:支持 ISO/IEC 14443-4;`0`:不支持。 | RFU | `1`:表示 UID 不完整,继续防冲突;`0`:表示 UID 完整。 | RFU | | | + +**交互流程**: + +1. **发送 SELECT 命令**:读写器向射频场中的卡片发送 SELECT 命令,包含卡片的部分 UID 和 BCC。 +2. **卡片确认**:卡片收到命令后,返回 SAK 码,表示其已被选中并进入选中状态。 +3. **进一步通信**:选中的卡片现在可以接收读写器发送的其他命令,如读写操作命令。 ### 2.3.7. HALT命令 +HALT(休眠)命令用于使卡片(PICC)进入休眠状态,停止与读写器(PCD)的通信。这个命令用于结束当前卡片的会话,直到卡片被重新唤醒(通过 WUPA 命令)。 + +HALT 命令的帧结构如下: + +| SOF | 命令码第一字节 | 命令码第二字节 | CRC_A(16 bits) | EOF | +| :--: | :------------: | :------------: | :--------------: | :--: | +| | `0x50` | `0x00` | | | + +**交互流程**: + +1. **发送 HALT 命令**:PCD 向射频场中的目标卡片发送 HALT 命令。 +2. **卡片进入休眠状态**:接收到 HALT 命令的 PICC 将停止响应读写器的进一步命令,进入休眠状态。 +3. **重新唤醒**:要重新与该卡片通信,PCD 需要发送 WUPA 命令将其唤醒。 + # 3. 实验过程 +IP 和端口保持默认不变。设置 PICC ID 。 + +## 3.1. PICC ID 为 4 字节 + +![UID4](images\UID4.png) + +**过程分析**: + +1. **PCD** :发送 REQA ,激活在读写器射频场中的卡片; +2. **PICC** :回复 ATQA ,bit 8 到 bit 7 为 `00` ,说明 UID 长度为 4 字节;bit 5 到 bit 1 含有 `1` ,说明采用比特帧防冲突方式; +3. **PCD** :发送 ANTICOLLISION ,指定查询第 1 级 UID ; +4. **PICC** :回复 ANTICOLLISION ,回复自己的 UID = `0x80122821` 和 BCC = `0x9b` ; +5. **PCD** :发现收到的 UID 中,第 2 字节的第 2 比特发生了碰撞。处理碰撞: + 1. **PCD** :发送 ANTICOLLISION 命令,指定 `0x93` 第 1 级 UID ;指定 NVB = `32` ,即会指定 UID 的前 1 字节和第 2 字节的前 2 比特;指定 UID 前 1 字节为 `80`,第 2 字节的前 2 比特为 `00` ; + 2. **PICC** :发现自身 UID 第 2 字节的第 2 比特为 `1` ,与收到的 ANTICOLLISION 命令不匹配,不回复; + 3. **PCD** :发送 ANTICOLLISION 命令,指定 `0x93` 第 1 级 UID ;指定 NVB = `32` ,即会指定 UID 的前 1 字节和第 2 字节的前 2 比特;指定 UID 前 1 字节为 `80`,第 2 字节的前 2 比特为 `10` ; + 4. **PICC** :发现自身 UID 第 2 字节的第 2 比特为 `1` ,与收到的 ANTICOLLISION 命令匹配,回复剩下的 UID :第 2 字节的剩下比特为 `000100` ,剩下字节为 `2821`; +6. **PCD** :发现收到的 UID 中,第 3 字节的第 4 比特发生了碰撞。处理碰撞: + 1. **PCD** :发送 ANTICOLLISION 命令,指定 `0x93` 第 1 级 UID ;指定 NVB = `44` ,即会指定 UID 的前 2 字节和第 3 字节的前 4 比特;指定 UID 前 2 字节为 `8012`,第 3 字节的前 4 比特为 `0000` ; + 2. **PICC** :发现自身 UID 第 3 字节的第 4 比特为 `1` ,与收到的 ANTICOLLISION 命令不匹配,不回复; + 3. **PCD** :发送 ANTICOLLISION 命令,指定 `0x93` 第 1 级 UID ;指定 NVB = `32` ,即会指定 UID 的前 2 字节和第 3 字节的前 4 比特;指定 UID 前 3 字节为 `8012`,第 3 字节的前 4 比特为 `1000` ; + 4. **PICC** :发现自身 UID 第 3 字节的第 4 比特为 `1` ,与收到的 ANTICOLLISION 命令匹配,回复剩下的 UID :第 3 字节的剩下比特为 `0010` ,剩下字节为 `21`; +7. **PCD** :发现收到的 UID 中,第 4 字节的第 7 比特发生了碰撞。处理碰撞: + 1. **PCD** :发送 ANTICOLLISION 命令,指定 `0x93` 第 1 级 UID ;指定 NVB = `57` ,即会指定 UID 的前 3 字节和第 4 字节的前 7 比特;指定 UID 前 3 字节为 `801228`,第 4 字节的前 7 比特为 `0100001` ; + 2. **PICC** :发现自身 UID 第 4 字节的第 7 比特为 `0` ,与收到的 ANTICOLLISION 命令匹配,回复剩下的 UID :第 4 字节的剩下比特为 `0` ,无剩下字节; +8. **PCD** :发送 SELECT 命令,指定 `0x93` 第 1 级 UID ;指定 NVB = `70` ;指定 UID = `80122821` ,BCC = `9b` ; +9. **PICC** :回复 SAK = `00` ,表示不支持 ISO/IEC 14443-4 ,UID 已完整; +10. **PCD** :发送 HALT 命令,使得被选中的卡片进入睡眠状态。 + +## 3.2. PICC ID 为 7 字节 + +![UID7PCD](images\UID7PCD.png) + +![UID7PICC](images\UID7PICC.png) + +**过程分析**: + +1. **PCD** :发送 REQA ,激活在读写器射频场中的卡片; +2. **PICC** :回复 ATQA ,bit 8 到 bit 7 为 `01` ,说明 UID 长度为 7 字节;bit 5 到 bit 1 含有 `1` ,说明采用比特帧防冲突方式; +3. **PCD** :发送 ANTICOLLISION ,指定查询第 1 级 UID ; +4. **PICC** :回复 ANTICOLLISION ,回复第 1 级UID = `0x88801228` 和 BCC = `0x32` ; +5. **PCD** :发现收到的 UID 中,第 2 字节的第 2 比特发生了碰撞。处理碰撞: + 1. **PCD** :发送 ANTICOLLISION 命令,指定 `0x93` 第 1 级 UID ;指定 NVB = `32` ,即会指定 UID 的前 1 字节和第 2 字节的前 2 比特;指定 UID 前 1 字节为 `88`,第 2 字节的前 2 比特为 `00` ; + 2. **PICC** :发现自身 UID 第 2 字节的第 2 比特为 `0` ,与收到的 ANTICOLLISION 命令匹配,回复剩下的 UID :第 2 字节的剩下比特为 `100000` ,剩下字节为 `1228`; +6. **PCD** :发现收到的 UID 中,第 3 字节的第 4 比特发生了碰撞。处理碰撞: + 1. **PCD** :发送 ANTICOLLISION 命令,指定 `0x93` 第 1 级 UID ;指定 NVB = `44` ,即会指定 UID 的前 2 字节和第 3 字节的前 4 比特;指定 UID 前 2 字节为 `8880`,第 3 字节的前 4 比特为 `0010` ; + 2. **PICC** :发现自身 UID 第 3 字节的第 4 比特为 `0` ,与收到的 ANTICOLLISION 命令匹配,回复剩下的 UID :第 3 字节的剩下比特为 `0001` ,剩下字节为 `28`; +7. **PCD** :发现收到的 UID 中,第 4 字节的第 7 比特发生了碰撞。处理碰撞: + 1. **PCD** :发送 ANTICOLLISION 命令,指定 `0x93` 第 1 级 UID ;指定 NVB = `57` ,即会指定 UID 的前 3 字节和第 4 字节的前 7 比特;指定 UID 前 3 字节为 `888012`,第 4 字节的前 7 比特为 `0101000` ; + 2. **PICC** :发现自身 UID 第 4 字节的第 7 比特为 `0` ,与收到的 ANTICOLLISION 命令匹配,回复剩下的 UID :第 4 字节的剩下比特为 `0` ,无剩下字节; +8. **PCD** :发送 SELECT 命令,指定 `0x93` 第 1 级 UID ;指定 NVB = `70` ;指定 UID = `88801228` ,BCC = `32` ; +9. **PICC** :回复 SAK = `04` ,表示不支持 ISO/IEC 14443-4 ,UID 未完整; +10. **PCD** :发送 ANTICOLLISION ,指定查询第 2 级 UID ; +11. **PICC** :回复 ANTICOLLISION ,回复第 2 级UID = `0x21441020` 和 BCC = `0x55` ; +12. **PCD** :发现收到的 UID 中,第 1 字节的第 5 比特发生了碰撞。处理碰撞: + 1. **PCD** :发送 ANTICOLLISION 命令,指定 `0x95` 第 2 级 UID ;指定 NVB = `25` ,即会指定 UID 的第 1 字节的前 5 比特为 `00001` ; + 2. **PICC** :发现自身 UID 第 2 字节的第 2 比特为 `0` ,与收到的 ANTICOLLISION 命令匹配,回复剩下的 UID :第 2 字节的剩下比特为 `001` ,剩下字节为 `441020`; +13. **PCD** :发送 SELECT 命令,指定 `0x95` 第 2 级 UID ;指定 NVB = `70` ;指定 UID = `21441020` ,BCC = `55` ; +14. **PICC** :回复 SAK = `00` ,表示不支持 ISO/IEC 14443-4 ,UID 已完整; +15. **PCD** :发送 HALT 命令,使得被选中的卡片进入睡眠状态。 + +## 3.3. PICC ID 为 10 字节 + +![UID10PCD](images\UID10PCD.png) + +![UID10PICC](images\UID10PICC.png) + +**过程分析**: + +1. **PCD** :发送 REQA ,激活在读写器射频场中的卡片; +2. **PICC** :回复 ATQA ,bit 8 到 bit 7 为 `10` ,说明 UID 长度为 10 字节;bit 5 到 bit 1 含有 `1` ,说明采用比特帧防冲突方式; +3. **PCD** :发送 ANTICOLLISION ,指定查询第 1 级 UID ; +4. **PICC** :回复 ANTICOLLISION ,回复第 1 级UID = `0x88563412` 和 BCC = `0xf8` ; +5. **PCD** :发现收到的 UID 中,第 2 字节的第 2 比特发生了碰撞。处理碰撞: + 1. **PCD** :发送 ANTICOLLISION 命令,指定 `0x93` 第 1 级 UID ;指定 NVB = `32` ,即会指定 UID 的前 1 字节和第 2 字节的前 2 比特;指定 UID 前 1 字节为 `88`,第 2 字节的前 2 比特为 `00` ; + 2. **PICC** :发现自身 UID 第 2 字节的第 2 比特为 `1` ,与收到的 ANTICOLLISION 命令不匹配,不回复; + 3. **PCD** :发送 ANTICOLLISION 命令,指定 `0x93` 第 1 级 UID ;指定 NVB = `32` ,即会指定 UID 的前 1 字节和第 2 字节的前 2 比特;指定 UID 前 1 字节为 `88`,第 2 字节的前 2 比特为 `10` ; + 4. **PICC** :发现自身 UID 第 2 字节的第 2 比特为 `0` ,与收到的 ANTICOLLISION 命令匹配,回复剩下的 UID :第 2 字节的剩下比特为 `0101001` ,剩下字节为 `3412`; +6. **PCD** :发现收到的 UID 中,第 3 字节的第 4 比特发生了碰撞。处理碰撞: + 1. **PCD** :发送 ANTICOLLISION 命令,指定 `0x93` 第 1 级 UID ;指定 NVB = `44` ,即会指定 UID 的前 2 字节和第 3 字节的前 4 比特;指定 UID 前 2 字节为 `8856`,第 3 字节的前 4 比特为 `0100` ; + 2. **PICC** :发现自身 UID 第 3 字节的第 4 比特为 `0` ,与收到的 ANTICOLLISION 命令匹配,回复剩下的 UID :第 3 字节的剩下比特为 `0011` ,剩下字节为 `12`; +7. **PCD** :发现收到的 UID 中,第 4 字节的第 7 比特发生了碰撞。处理碰撞: + 1. **PCD** :发送 ANTICOLLISION 命令,指定 `0x93` 第 1 级 UID ;指定 NVB = `57` ,即会指定 UID 的前 3 字节和第 4 字节的前 7 比特;指定 UID 前 3 字节为 `885634`,第 4 字节的前 7 比特为 `0010010` ; + 2. **PICC** :发现自身 UID 第 4 字节的第 7 比特为 `0` ,与收到的 ANTICOLLISION 命令匹配,回复剩下的 UID :第 4 字节的剩下比特为 `0` ,无剩下字节; +8. **PCD** :发送 SELECT 命令,指定 `0x93` 第 1 级 UID ;指定 NVB = `70` ;指定 UID = `88563412` ,BCC = `f8` ; +9. **PICC** :回复 SAK = `04` ,表示不支持 ISO/IEC 14443-4 ,UID 未完整; +10. **PCD** :发送 ANTICOLLISION ,指定查询第 2 级 UID ; +11. **PICC** :回复 ANTICOLLISION ,回复第 2 级UID = `0x88801228` 和 BCC = `0x32` ; +12. **PCD** :发现收到的 UID 中,第 2 字节的第 5 比特发生了碰撞。处理碰撞: + 1. **PCD** :发送 ANTICOLLISION 命令,指定 `0x95` 第 2 级 UID ;指定 NVB = `25` ,即会指定 UID 的第 1 字节的前 5 比特为 `01000` ; + 2. **PICC** :发现自身 UID 第 2 字节的第 2 比特为 `0` ,与收到的 ANTICOLLISION 命令匹配,回复剩下的 UID :第 2 字节的剩下比特为 `100` ,剩下字节为 `801228`; +13. **PCD** :发送 SELECT 命令,指定 `0x95` 第 2 级 UID ;指定 NVB = `70` ;指定 UID = `88801228` ,BCC = `32` ; +14. **PICC** :回复 SAK = `04` ,表示不支持 ISO/IEC 14443-4 ,UID 未完整; +15. **PCD** :发送 ANTICOLLISION ,指定查询第 3 级 UID ; +16. **PICC** :回复 ANTICOLLISION ,回复第 3 级UID = `0x21440010` 和 BCC = `0x75` ; +17. **PCD** :发现收到的 UID 中,第 2 字节的第 5 比特发生了碰撞。处理碰撞: + 1. **PCD** :发送 ANTICOLLISION 命令,指定 `0x97` 第 3 级 UID ;指定 NVB = `35` ,即会指定 UID 的前 1 字节和第 2 字节的前 5 比特;指定 UID 前 1 字节为 `21`,第 2 字节的前 5 比特为 `00100` ; + 2. **PICC** :发现自身 UID 第 2 字节的第 5 比特为 `0` ,与收到的 ANTICOLLISION 命令匹配,回复剩下的 UID :第 2 字节的剩下比特为 `010` ,剩下字节为 `0010`; +18. **PCD** :发现收到的 UID 中,第 2 字节的第 8 比特发生了碰撞。处理碰撞: + 1. **PCD** :发送 ANTICOLLISION 命令,指定 `0x97` 第 3 级 UID ;指定 NVB = `40` ,即会指定 UID 的前 3 字节为 `2144` ; + 2. **PICC** :发现自身 UID 第 2 字节的第 8 比特为 `0` ,与收到的 ANTICOLLISION 命令匹配,回复 UID 剩下字节为 `0010`; +19. **PCD** :发现收到的 UID 中,第 4 字节的第 7 比特发生了碰撞。处理碰撞: + 1. **PCD** :发送 ANTICOLLISION 命令,指定 `0x97` 第 3 级 UID ;指定 NVB = `57` ,即会指定 UID 的前 3 字节和第 4 字节的前 7 比特;指定 UID 前 3 字节为 `214400`,第 4 字节的前 7 比特为 `0010000` ; + 2. **PICC** :发现自身 UID 第 4 字节的第 7 比特为 `0` ,与收到的 ANTICOLLISION 命令匹配,回复剩下的 UID :第 4 字节的剩下比特为 `0` ,无剩下字节; +20. **PCD** :发送 SELECT 命令,指定 `0x97` 第 3 级 UID ;指定 NVB = `70` ;指定 UID = `21440010` ,BCC = `75` ; +21. **PICC** :回复 SAK = `00` ,表示不支持 ISO/IEC 14443-4 ,UID 已完整; +22. **PCD** :发送 HALT 命令,使得被选中的卡片进入睡眠状态。 diff --git a/Labs/Lab2/tmp/pcd.exe b/Labs/Lab2/tmp/pcd.exe deleted file mode 100644 index edf73a5..0000000 Binary files a/Labs/Lab2/tmp/pcd.exe and /dev/null differ diff --git a/Labs/Lab2/tmp/picc.exe b/Labs/Lab2/tmp/picc.exe deleted file mode 100644 index 5142381..0000000 Binary files a/Labs/Lab2/tmp/picc.exe and /dev/null differ diff --git a/Labs/Lab2/实验2_21281280_柯劲帆.pdf b/Labs/Lab2/实验2_21281280_柯劲帆.pdf new file mode 100644 index 0000000..6b0800c Binary files /dev/null and b/Labs/Lab2/实验2_21281280_柯劲帆.pdf differ