RFID开发介绍—Edge Server(1)
本文章介绍如何安装、配置和部署BEA的RFID产品,包括BEA Edge Server, BEA Enterprise Server和 BEA Compliance Express。默认的,每个步骤都是接下来步骤的基础。并且该配置是基于WebLogic Server 9.1的,本篇首先介绍BEA Edge Server。
一. 安装及使用
1. 产品安装(以windows为例)
- 从以下网址下载或者拷贝rfid_edge210_win32.exe http://commerce.bea.com/showproduct.jsp?family=RFIDEDGE&major=2.1&minor=0
- 双击该文件,运行安装程序
- 看到介绍面板后,点击“下一步”
- 看到许可面板后,接受许可,点击“下一步”
- 看到安装目录选择面板,选择路径或者默认,点击“下一步”
- 看到安装类型面板,选择“快速”,点击“下一步”
- 接下来的配置都按照默认值,点击“下一步”
- 浏览安装信息摘要,点击“安装”
- 选择“完成”结束安装
2. 打开阅读器模拟器、Edge Server和管理控制台
- 打开资源管理器,浏览到<edge_home>in 目录
- 打开阅读器模拟器:双击RunReaderSim.bat.
- 修改<edge_home>/etc/edge.props文件,修改后如下:
com.connecterra.ale.servicePort = 6060
com.connecterra.ale.savantID = SAVANT_ID
com.connecterra.ale.siteID = SITE_ID
com.connecterra.ale.telemetryPeriod = 5000
或者可以使用Edge Server Configuration Wizard来进行配置,配置过程如下:
- 从windows菜单选择运行Configuration Wizard 或者直接运行<edge_home>/common/bin/config.cmd命令:
- Configuration Wizard打开后,首先进入欢迎页面,选择其中的下一步。
- 在出现的页面中配置各参数如下 :
- 选择下一步,在确认页面中选择“创建”,最后确认。
- 打开Edge Server:浏览到<edge_home>in 目录,双击 RunEdgeServer.bat.
- 修改<edge_home>/etc/admin-console.props,修改后如下:
com.connecterra.ualegui.edgeServerURLs=http://localhost:6060
- 打开管理控制台: 浏览到<edge_home>in 目录,双击 RunAdminConsole.bat.
3. 使用管理控制台和ECSpecs来验证操作
安装BEA Edge Server是相对比较容易的,但是需要验证它的工作是否正确就需要我们进一步学习了。使用管理控制台和阅读器模拟器,我们可以快速的配置一个“事件周期”(“Event Cycle Specification”, or “ECSpec”)来模拟读取标签。下面就是创建一个简单的ECSpec并且使用管理控制台的测试特性。
在开始配置前,首先需要理解的一点是RFID应用程序其实就是BEA Edge Server的一个客户端。BEA Edge Server实现了ALE(Application Level Events)规范,ALE客户端需要定义一个ECSpec,然后提交给ALE接口(即Edge Server)。Edge Server使用ECSpec的内容来控制阅读器的限制条件、使用哪个逻辑阅读器、报告返回等等。其中限制条件可能是例如何时开始读卡、何时停止读卡;一个逻辑阅读器是一个任意的RFID阅读点,通常是具有统一命名的一组天线;报告指Edge Server返回给应用程序的信息。
具体操作如下:
- 在管理控制台里面左边的设备浏览器中,选中ECSpecs
- 在右边选择“NEW”,这样会打开ECSpec Editor
- 使用“>>”按钮将ConnecTerra1 和ConnecTerra2两个逻辑阅读器到选择窗口。
- 在“Stop”区,选中“Duration”,输入5000,这个域以毫秒为单位。配置好地ECSpec如下:
- 在左边选择“Reports”
- 在右边选择“New Report”,就按默认设置创建名为“Report_0”的报告,配置后的窗口如下:
- 在菜单中选择ToolsàTest,看到如下窗口:
- 在管理控制台可以通过选择设备浏览器中的RFID Devices下面的SimReadr来查看设备统计信息。有两组图,每个逻辑阅读器或者天线,每个逻辑阅读器都可以看到如下信息:
- 读周期时间—一个完整的读周期所用的时间,一个读周期是Edge Server和阅读器之间的最小交易单位,它被三个因素影响:(1) Edge Server和阅读器之间协议交互所用的时间,这和驱动设计和实现有关;(2)网络延迟;(3)阅读器内部读卡机制、设计等等。
- 读周期数-- Edge Server执行的总读周期数
- 标签数:Edge Server所能读到的标签数
4. 配置多个阅读器模拟器
在本节配置完成后,我们从逻辑上将实现如下的部署图:
首先,创建第二个阅读器,并且配置Edge Server来使用它
- Make a copy of, and put the copy in the bin directory.
- 复制RunReaderSim.bat,放在bin目录下,重命名为RunReaderSim2.bat
- 打开RunReaderSim2.bat,将READER_PORT修改为5051,保存,关闭文件
- 运行新的模拟器(RunReaderSim2.bat).
- 在管理控制台配置Edge Server使用新的阅读器:选择设备管理器里面的RFID设备,在右边窗口选择SimReadr,并且Clone
- 将新阅读器的名字改为“SimReadr2”,Reader Port 改为5051.两个逻辑天线的名字修改为“ConnecTerra3” 和“ConnecTerra4”.
- 确定后,新的配置如下:
- 为了测试,需要在ECSpec中添加新的逻辑阅读器,首先导出已经存在的ECSpec,然后再导入并且添加新的逻辑阅读器。
二. 读取标签信息
1. 运行Immediate示例
Immediate示例使用ALE“Immediate”方式来演示同步报告发布。
- 打开阅读器模拟器、Edge Sever和管理控制台
- 打开资源管理器,浏览目录 <edge_home>samplesImmediateSample.
- 修改run.bat
set EDGEHOST=localhost
set EDGEPORT=6060
- 点击run.bat,观察输出,注意报告有7个标签
- 使用管理控制台ECSpec editor导入示例的ECSpec,ECSpec文件也在该目录中
测试导入的ECSpec:
2. 程序分析
/** * ImmediateSample 是使用ALE api 从指定的逻辑读卡器读取一个EPC 列表的小 * 程序 * ECSpec 将从一个XML文件中读取,周期报告也将以XML格式打印出来 */ public class ImmediateSample { //程序的使用说明,其中的命令行参数ecSpecFilename 应该是ECSpec.xml,//aleServiceURL 形如:http://localhost:6060/axis/services/EPCglobalALEService。 private static void usage() { System.out.println( "usage: ImmediateSample"); System.exit(1); } public static void main(String[] args) { System.out.println( "Immediate Sample, XML-based" ); //分析命名行参数 if ( args.length != 2 ) usage(); String aleServiceURL = args[0]; String ecSpecFilename = args[1]; try { // 创建一个ALE客户端实例 ALE aleClient = new SOAPALEClient(new URL(aleServiceURL)); // 从XML文件读取ECSpec (Event Cycle Specification) // ECSpec 包括定义事件周期的所有参数,也可以在程序中指定 ECSpec myECSpec = readECSpec(ecSpecFilename); // 使用 ALE.immediate()方法,发出事件请求 // immediate() 在一个事件周期完成后会阻塞,并且返回报告 System.out.println( " sending request to Edge Server..."); ECReports myECReports = aleClient.immediate(myECSpec); System.out.println( " ...received response. "); printECReports(myECReports); } catch (Exception e) { e.printStackTrace(); } } /** * 从XML文件读取ECSpec的辅助方法 */ private static ECSpec readECSpec(String ecSpecFilename) throws IOException, XMLDeserializerException { // ECSpec 和ECReports等对象可以转换为XML 表现形式 // XMLSerializationFactory是一个单态的工厂,从中可以通过转换完成XML // 的序列化和反序列化 // 下面,使用XML反序列化将XML 中的内容转换为一个ECSpec 对象实例 XMLSerializationFactory factory = XMLSerializationFactory.getInstance( XMLSerializationSyntax.EPCGLOBAL_ALE_1_0); XMLDeserializer deserializer = factory.createDeserializer(); FileReader fileReader = new FileReader(ecSpecFilename); ECSpec ecSpec = deserializer.deserializeECSpec(fileReader); return ecSpec; } /** * 将XML形式的ECReports输出到控制台 */ private static void printECReports(ECReports ecReports) throws XMLSerializerException, IOException { System.out.println("Received the following ECReports: "); // XMLSerializationFactory是一个单态的工厂,获取实例 XMLSerializationFactory factory = XMLSerializationFactory.getInstance( XMLSerializationSyntax.EPCGLOBAL_ALE_1_0); XMLSerializer serializer = factory.createSerializer(); //使用XML序列化将ecReports对象实例转化为XML形式,并输出. Writer w = new OutputStreamWriter(System.out); serializer.serialize(ecReports, w, true); w.flush(); } }
三. 写入标签信息
1. 运行 ImmediateProgram 示例
- 确保只打开一个阅读器模拟器,并且只选中其中一个天线的一个标签:
- 打开命令行窗口,浏览到<edge_home>samplesImmediateProgramSample
- 执行如下命令:
>run.bat urn:epc:tag:gid-64-i:1.4.10
- 运行结果应该是XML格式的PCWriteReport,表示写入TAG程序运行的结果,如下:
Received the following PCWriteReport: <PCWriteReport date="2005-12-16T16:10:44.265Z" savantID="EdgeServerID" specName= "=0" totalMilliseconds="531" totalTrials="1" xmlns="http://schemas.con necterra.com/alepc"> <applicationData>application specific data can go here</applicationData> <wasSuccessful>true</wasSuccessful> <status>SUCCESSFUL</status> <physicalReaders> <physicalReader>SimReadr</physicalReader> </physicalReaders> <failedLogicalReaders/> <cacheSize>0</cacheSize> <epc>urn:epc:tag:gid-64-i:1.4.10</epc> <successfulLogicalReader>ConnecTerra1</successfulLogicalReader> </PCWriteReport>Press any key to continue . . .
- <wasSuccessful> 元素表示写入程序成功,<status>元素相应的也设置为SUCCESSFUL ;如果写入出现问题,<status> 将会提供诊断用的信息,例如CACHE_EMPTY, READER_ERROR等等
- <physicalReaders> 元素表示那个物理阅读器参与了标签写操作,我们的操作中可以看到是SimReadr
- <failedLogicalReaders> 为空,表示写操作周期中没有失败的阅读器
- <cacheSize> 被设置为零,可以在程序中设置该值,该值也与ECSpec中的设置相关。
- <epc> 显示写入标签的值: urn:epc:tag:gid-64-i:1.4.10
- Finally, <successfulLogicalReader> indicates that the logical reader ConnecTerra1 was the logical reader that wrote this tag.
程序分析
/** * ImmediateProgramSample 是使用ALEPC api来通过逻辑读卡器将EPC值写入标 * 签的一个简单程序 */ public class ImmediateProgramSample { //程序使用说明 private static void usage() { System.out.println("usage: ImmediateProgramSample"); System.exit(1); } public static void main(String[] args) { System.out.println( "Immediate Program Sample, XML-based" ); //分析命名行参数 if ( args.length != 3 ) usage(); //程序的使用说明,其中的命令行参数pcSpecFilename 应该是PCSpec.xml,//aleServiceURL 形如:http://localhost:6060/axis/services/EPCglobalALEService。 // epcVal是EPC值 String aleServiceURL = args[0]; String pcSpecFilename = args[1]; String epcVal = args[2]; try { // 创建一个ALEPC客户端实例. ALEPC aleClient = new AxisALEPCClient(new URL(aleServiceURL)); // 从XML文件读取PCSpec (Programming Cycle Specification) // PCSpec包括定义写入周期的所有参数,也可以在程序中指定 PCSpec pcSpec = readPCSpec(pcSpecFilename); // 使用ALEPC.immediate()方法,发出事件请求 // immediate() 在一个事件周期完成后会阻塞,并且返回报告 System.out.println( " sending request to Edge Server..."); PCWriteReport writeReport = aleClient.immediate(pcSpec, new URI(epcVal)); System.out.println( " ...received response. "); printWriteReport(writeReport); } catch (Exception e) { e.printStackTrace(); } } /** *从XML文件读取PCSpec的辅助方法 */ private static PCSpec readPCSpec(String pcSpecFilename) throws IOException, PCXMLDeserializerException { // PCSpec和PCWriteReport等对象可以转换为XML 表现形式 // PCXMLSerializationFactory是单态工厂类,从中可以通过转换完成XML // 的序列化和反序列化 // 下面,使用XML反序列化将XML 中的内容转换为一个PCSpec对象实例 PCXMLSerializationFactory factory = PCXMLSerializationFactory.getInstance(); PCXMLDeserializer deserializer = factory.createDeserializer(); FileReader fileReader = new FileReader(pcSpecFilename); PCSpec pcSpec = deserializer.deserializePCSpec(fileReader); return pcSpec; } /** * 将XML形式的PCWriteReport输出到控制台 */ private static void printWriteReport(PCWriteReport writeReport) throws PCXMLSerializerException, IOException { System.out.println("Received the following PCWriteReport: "); //获取PCXMLSerializationFactory的实例,序列化PCWriteReport PCXMLSerializationFactory factory = PCXMLSerializationFactory.getInstance(); PCXMLSerializer serializer = factory.createSerializer(); //使用XML序列化将writeReport对象实例转化为XML形式,并输出 Writer w = new OutputStreamWriter(System.out); serializer.serialize(writeReport, w, true); w.flush(); } }
本篇我们简单介绍了BEA Edge Server的安装、使用和简单的标签读、写过程,大家可以根据实际情况,在此基础上开发自己的应用。后面我们还会介绍Edge Server中的一些其他读写方式和工作流模块。