创建Java应用
接下来创建一个Java应用试试,选择文件打开新建项目,选择默认的java类别创建Java应用程序项目,点击下一步。并命名为HelloWorld,并选择好项目路径。创建好后可以在// TODO code application logic here下面新建一行输入如下代码:System.out.println("你好啊,树莓派"); 点击绿色箭头运行项目,将会在本地javaSE里快速执行,在下面的输出窗口可以看到代码运行没有出现毛病。
现在的程序编译没有问题了,而且在本地上运行一切正常,最终的目的是在Raspberry上运行它。在运行远程Java平台时,需要确保网络等相关设置已经按照前面所说执行了。
打开文件,选择属性,在“运行”中修改当前的运行时平台,将项目平台替换成Raspberry Pi,NetBeans会自动提醒你取一个新的配置名。点击确定保存。这样我们就创建了一个新的配置,将平台设置成了远程JavaSE,接下来就会在在这个平台运行。
再次点击绿色箭头。系统会为我们执行下列的操作(方便、快捷):
(1)代码编译
(2)创建一个Jar文件
(3)复制Jar文件
(4)初始化SSH连接
(5)远程运行项目
通过IDE使得整个运行过程高效便捷,省去了亲自动手编译和复制Jar文件带来的多次步骤。在输出窗口可以看到,IDE为我们完成了不少工作,节省了不少时间。 下面我们接着完成Java项目吧。
使用Java智能读卡
研究JavaSmartcardio包
官网关于这个包的描述篇幅较多,我花了两天时间大致研究了其中所使用的类和方法,收获还是不少的。 下面是我从官网摘抄的smartcardio包描述文件(很重要,对于开发者而言认真研读是保障项目正确开发的重要因素):
Package javax.smartcardio Description Java™ Smart Card I/O API This specification describes the Java Smart Card I/O API defined by JSR 268. It defines a Java API for communication with Smart Cards using ISO/IEC 7816-4 APDUs. It thereby allows Java applications to interact with applications running on the Smart Card, to store and retrieve data on the card, etc.
我把这几句话大致意思分析一下:这一规范被称为JSR286(Java Specification Requests)或者Java Smart Card I/O API(Java智能卡输入/输出接口)。使用ISO/IEC7816-4协议定义了与智能卡通信的Java应用程序编程接口,这样用户就可以通过Java应用程序与智能卡进行交互(存储和数据操作等)了。 在查阅了相关资料后发现,这短短的几句描述中出现的很多关键词很重要。 JSR是Java规范提案的意思,任何人都可以向Java平台贡献智慧,添加新的应用程序接口( API)和服务,JSR逐渐成为一个重要标准。
包中的类提供了接触API的可能(每种都提供了一定的参考用法,超友好为了方便了解,我增加了连接提供通向官网的通道),有以下这些:
| ATR | 智能卡的应答-复位字节 |
| Card | 已建立连接的智能卡 |
| CardChannel | 与智能卡的逻辑通道连接 |
| CardPermission | 智能卡操作权限 |
| CardTerminal | 智能卡终端,有时被称为智能卡读卡器 |
| CardTerminals | 终端工厂支持的一组终端 |
| CommandAPDU | 遵循ISO/IEC 7816-4中定义的结构的APDU命令 |
| ResponseAPDU | ISO/IEC 7816-4中定义的响应APDU |
| TerminalFactory | 卡终端对象的工厂 |
| TerminalFactorySpi | TerminalFactorySpi类定义服务提供程序接口 |
下面我把一个Java应用程序编程接口案例截取了下来:
// show the list of available terminals
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);
// get the first terminal
CardTerminal terminal = terminals.get(0);
// establish a connection with the card
Card card = terminal.connect("T=0");
System.out.println("card: " + card);
CardChannel channel = card.getBasicChannel();
ResponseAPDU r = channel.transmit(new CommandAPDU(c1));
System.out.println("response: " + toString(r.getBytes()));
// disconnect
card.disconnect(false);