android - ACR122U LED控制

标签 android led apdu smartcard-reader acr122

有人知道如何在Android上通过Reader.control()方法控制ACR122U的双色LED吗? (库 acssmc-1.1.3)。

我正在阅读 API 并且不知道命令描述的含义:

例子:

byte[] command = {(byte) 0xFF, (byte) 0x00, (byte) 0x40, (byte) 0b01110111, (byte) 0x04, (byte) 20, (byte) 30, (byte) 3, (byte) 2};

我不明白的是:

  • 字节 3 (P2):我不知道如何设置它。
  • 字节 5 (T1):从字节 3 以某种方式控制的第一个周期状态持续时间?
  • 字节 6 (T2):从字节 3 以某种方式控制的第二个周期状态持续时间?
  • 字节 7(重复次数):第 1 和第 2 循环状态重复的总次数?

一些解释性的例子会很棒。

最佳答案

改变LED状态的命令是

+------+------+------+------+------+------+------+------+------+
| CLA  | INS  | P1   | P2   | Lc   | DATA                      |
+------+------+------+------+------+------+------+------+------+
| 0xFF | 0x00 | 0x40 | SC   | 0x04 | T1   | T2   | #R   | 0x00 |
+------+------+------+------+------+------+------+------+------+

其中 SC 定义了 LED 的状态(连续点亮/关闭、闪烁),T1/T2 定义了闪烁波形,#R 定义了闪烁波形的重复次数。

因此,定义 LED 应该如何闪烁以及闪烁完成后它们应该如何显示的主要参数是 SC。这是一个 8 位的字段:

  • 第 0 位:此标志定义了红色 LED 闪烁完成后的状态(另见第 2 位)。
  • 第 1 位:此标志定义闪烁完成后绿色 LED 的状态(另见第 3 位)。
  • 第 2 位:仅当此标志设置为 (1) 时,红色 LED 的状态将在闪烁完成后设置为第 0 位的值。如果此标志被清除 (0),红色 LED 将返回到您发出 LED 控制命令之前的状态。
  • 第 3 位:仅当此标志设置为 (1) 时,绿色 LED 的状态将在闪烁完成后设置为第 0 位的值。如果此标志被清除 (0),绿色 LED 将返回到您发出 LED 控制命令之前的状态。
  • 第 4 位:此标志定义红色 LED 在开始执行 LED 控制命令时应设置的状态。
  • 第 5 位:此标志定义绿色 LED 在开始执行 LED 控制命令时应设置的状态。
  • 第 6 位:此标志定义是否应使用闪烁波形切换红色 LED。
  • 第 7 位:此标志定义是否应使用闪烁波形切换绿色 LED。

因此,假设您设置了 SC 的第 4 位和第 6 位(并清除其余部分),即 SC = 0x50。此外,您设置 T1 = 5 (0x05)、T2 = 10 (0x0A) 和#R = 2 (0x02)。因此,您有以下命令:

+------+------+------+------+------+------+------+------+------+
| 0xFF | 0x00 | 0x40 | 0x50 | 0x04 | 0x05 | 0x0A | 0x02 | 0x00 |
+------+------+------+------+------+------+------+------+------+

然后绿色 LED 熄灭,红色 LED 闪烁两次,波形如下:

RED ON   ----------\                    /----------\
                   |                    |          |                    
RED OFF            \--------------------/          \-------------------- 

         \________/ \__________________/ \________/ \__________________/
         T1 = 500ms     T2 = 1000ms      T1 = 500ms     T2 = 1000ms

         \_____________________________/ \_____________________________/
                  Repetition 1                    Repetition 2

现在,假设您还想使绿色 LED 闪烁,但其初始状态设置为关闭(以便闪烁在红色和绿色之间切换,而不是红色和不亮)。因此,您还设置了 SC 的第 7 位,即 SC = 0xD0。因此,您有以下命令:

+------+------+------+------+------+------+------+------+------+
| 0xFF | 0x00 | 0x40 | 0xD0 | 0x04 | 0x05 | 0x0A | 0x02 | 0x00 |
+------+------+------+------+------+------+------+------+------+

然后红色LED和绿色LED交替闪烁两次,波形如下:

RED ON     ----------\                    /----------\
                     |                    |          |                    
RED OFF              \--------------------/          \--------------------

GREEN ON             /--------------------\          /--------------------
                     |                    |          |                    
GREEN OFF  ----------/                    \----------/

           \________/ \__________________/ \________/ \__________________/
           T1 = 500ms     T2 = 1000ms      T1 = 500ms     T2 = 1000ms

           \_____________________________/ \_____________________________/
                    Repetition 1                    Repetition 2

现在,假设在闪烁完成后,您希望红色 LED 持续亮起,绿色 LED 持续熄灭。因此,您需要设置位 2 和 3,以便能够定义两个 LED 的最终状态。 (如果您不设置这些位,那么位 0 和 1 的值将被简单地忽略。)然后您想要定义最终状态为红色打开(位 0 = 1)和绿色关闭(位 1 = 0)。因此,您会得到 SC = 0xDD。因此,您有以下命令:

+------+------+------+------+------+------+------+------+------+
| 0xFF | 0x00 | 0x40 | 0xDD | 0x04 | 0x05 | 0x0A | 0x02 | 0x00 |
+------+------+------+------+------+------+------+------+------+

然后红色LED和绿色LED交替闪烁两次,红色LED闪烁后点亮,绿色LED熄灭。您得到以下波形:

RED ON     ----------\                    /----------\                    /--------------...
                     |                    |          |                    |
RED OFF              \--------------------/          \--------------------/

GREEN ON             /--------------------\          /--------------------\
                     |                    |          |                    |
GREEN OFF  ----------/                    \----------/                    \--------------...

           \________/ \__________________/ \________/ \__________________/
           T1 = 500ms     T2 = 1000ms      T1 = 500ms     T2 = 1000ms

           \_____________________________/ \_____________________________/ \_____________...
                    Repetition 1                    Repetition 2             Final state

最后,您想要将重复次数减少到 1 (#R = 0x01),并且您想要反转闪烁波形的高低相位(T1 = 0x0A 和 T2 = 0x05)。因此,您有以下命令:

+------+------+------+------+------+------+------+------+------+
| 0xFF | 0x00 | 0x40 | 0xDD | 0x04 | 0x0A | 0x05 | 0x01 | 0x00 |
+------+------+------+------+------+------+------+------+------+

您得到以下波形:

RED ON     --------------------\          /--------------...
                               |          |
RED OFF                        \----------/

GREEN ON                       /----------\
                               |          |
GREEN OFF  --------------------/          \--------------...

           \__________________/ \________/
               T1 = 1000ms      T2 = 500ms

           \_____________________________/ \_____________...
                    Repetition 1             Final state

关于android - ACR122U LED控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38676069/

相关文章:

android - Cordova:错误:错误:未设置 ANDROID_HOME 且 "android"命令不在您的路径中。您必须至少满足以下条件之一

android - `settings.gradle` : expo modules won't be autolinked 中未设置自动链接

java - Android 将位图写入 SD 卡

java - 读写EMV卡

java - 如何使用java卡向智能卡写入数据?举例说明

android - 在非 Activity 扩展类中获取屏幕尺寸(Android)

c++ - RGB 的奇怪输出

android - 为前台 Activity/屏幕显示闪烁的 LED

android - 我可以检测 Android 设备上是否存在 'LED notification' 吗?

javacard - 全局平台 Java 卡安全通道示例