RFID開發(fā)介紹—Edge Server(1)
本文章介紹如何安裝、配置和部署B(yǎng)EA的RFID產(chǎn)品,包括BEA Edge Server, BEA Enterprise Server和 BEA Compliance Express。默認(rèn)的,每個(gè)步驟都是接下來步驟的基礎(chǔ)。并且該配置是基于WebLogic Server 9.1的,本篇首先介紹BEA Edge Server。
一. 安裝及使用
1. 產(chǎn)品安裝(以windows為例)
- 從以下網(wǎng)址下載或者拷貝rfid_edge210_win32.exe http://commerce.bea.com/showproduct.jsp?family=RFIDEDGE&major=2.1&minor=0
- 雙擊該文件,運(yùn)行安裝程序
- 看到介紹面板后,點(diǎn)擊“下一步”
- 看到許可面板后,接受許可,點(diǎn)擊“下一步”
- 看到安裝目錄選擇面板,選擇路徑或者默認(rèn),點(diǎn)擊“下一步”
- 看到安裝類型面板,選擇“快速”,點(diǎn)擊“下一步”
- 接下來的配置都按照默認(rèn)值,點(diǎn)擊“下一步”
- 瀏覽安裝信息摘要,點(diǎn)擊“安裝”
- 選擇“完成”結(jié)束安裝
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來進(jìn)行配置,配置過程如下:
- 從windows菜單選擇運(yùn)行Configuration Wizard 或者直接運(yùn)行<edge_home>/common/bin/config.cmd命令:
- Configuration Wizard打開后,首先進(jìn)入歡迎頁面,選擇其中的下一步。
- 在出現(xiàn)的頁面中配置各參數(shù)如下 :
- 選擇下一步,在確認(rèn)頁面中選擇“創(chuàng)建”,最后確認(rèn)。
- 打開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來驗(yàn)證操作
安裝BEA Edge Server是相對比較容易的,但是需要驗(yàn)證它的工作是否正確就需要我們進(jìn)一步學(xué)習(xí)了。使用管理控制臺和閱讀器模擬器,我們可以快速的配置一個(gè)“事件周期”(“Event Cycle Specification”, or “ECSpec”)來模擬讀取標(biāo)簽。下面就是創(chuàng)建一個(gè)簡單的ECSpec并且使用管理控制臺的測試特性。
在開始配置前,首先需要理解的一點(diǎn)是RFID應(yīng)用程序其實(shí)就是BEA Edge Server的一個(gè)客戶端。BEA Edge Server實(shí)現(xiàn)了ALE(Application Level Events)規(guī)范,ALE客戶端需要定義一個(gè)ECSpec,然后提交給ALE接口(即Edge Server)。Edge Server使用ECSpec的內(nèi)容來控制閱讀器的限制條件、使用哪個(gè)邏輯閱讀器、報(bào)告返回等等。其中限制條件可能是例如何時(shí)開始讀卡、何時(shí)停止讀卡;一個(gè)邏輯閱讀器是一個(gè)任意的RFID閱讀點(diǎn),通常是具有統(tǒng)一命名的一組天線;報(bào)告指Edge Server返回給應(yīng)用程序的信息。
具體操作如下:
- 在管理控制臺里面左邊的設(shè)備瀏覽器中,選中ECSpecs
- 在右邊選擇“NEW”,這樣會打開ECSpec Editor
- 使用“>>”按鈕將ConnecTerra1 和ConnecTerra2兩個(gè)邏輯閱讀器到選擇窗口。
- 在“Stop”區(qū),選中“Duration”,輸入5000,這個(gè)域以毫秒為單位。配置好地ECSpec如下:
- 在左邊選擇“Reports”
- 在右邊選擇“New Report”,就按默認(rèn)設(shè)置創(chuàng)建名為“Report_0”的報(bào)告,配置后的窗口如下:
- 在菜單中選擇ToolsàTest,看到如下窗口:
- 在管理控制臺可以通過選擇設(shè)備瀏覽器中的RFID Devices下面的SimReadr來查看設(shè)備統(tǒng)計(jì)信息。有兩組圖,每個(gè)邏輯閱讀器或者天線,每個(gè)邏輯閱讀器都可以看到如下信息:
- 讀周期時(shí)間—一個(gè)完整的讀周期所用的時(shí)間,一個(gè)讀周期是Edge Server和閱讀器之間的最小交易單位,它被三個(gè)因素影響:(1) Edge Server和閱讀器之間協(xié)議交互所用的時(shí)間,這和驅(qū)動設(shè)計(jì)和實(shí)現(xiàn)有關(guān);(2)網(wǎng)絡(luò)延遲;(3)閱讀器內(nèi)部讀卡機(jī)制、設(shè)計(jì)等等。
- 讀周期數(shù)-- Edge Server執(zhí)行的總讀周期數(shù)
- 標(biāo)簽數(shù):Edge Server所能讀到的標(biāo)簽數(shù)
4. 配置多個(gè)閱讀器模擬器
在本節(jié)配置完成后,我們從邏輯上將實(shí)現(xiàn)如下的部署圖:
首先,創(chuàng)建第二個(gè)閱讀器,并且配置Edge Server來使用它
- Make a copy of, and put the copy in the bin directory.
- 復(fù)制RunReaderSim.bat,放在bin目錄下,重命名為RunReaderSim2.bat
- 打開RunReaderSim2.bat,將READER_PORT修改為5051,保存,關(guān)閉文件
- 運(yùn)行新的模擬器(RunReaderSim2.bat).
- 在管理控制臺配置Edge Server使用新的閱讀器:選擇設(shè)備管理器里面的RFID設(shè)備,在右邊窗口選擇SimReadr,并且Clone
- 將新閱讀器的名字改為“SimReadr2”,Reader Port 改為5051.兩個(gè)邏輯天線的名字修改為“ConnecTerra3” 和“ConnecTerra4”.
- 確定后,新的配置如下:
- 為了測試,需要在ECSpec中添加新的邏輯閱讀器,首先導(dǎo)出已經(jīng)存在的ECSpec,然后再導(dǎo)入并且添加新的邏輯閱讀器。
二. 讀取標(biāo)簽信息
1. 運(yùn)行Immediate示例
Immediate示例使用ALE“Immediate”方式來演示同步報(bào)告發(fā)布。
- 打開閱讀器模擬器、Edge Sever和管理控制臺
- 打開資源管理器,瀏覽目錄 <edge_home>samplesImmediateSample.
- 修改run.bat
set EDGEHOST=localhost
set EDGEPORT=6060
- 點(diǎn)擊run.bat,觀察輸出,注意報(bào)告有7個(gè)標(biāo)簽
- 使用管理控制臺ECSpec editor導(dǎo)入示例的ECSpec,ECSpec文件也在該目錄中
測試導(dǎo)入的ECSpec:
2. 程序分析
/** * ImmediateSample 是使用ALE api 從指定的邏輯讀卡器讀取一個(gè)EPC 列表的小 * 程序 * ECSpec 將從一個(gè)XML文件中讀取,周期報(bào)告也將以XML格式打印出來 */ public class ImmediateSample { //程序的使用說明,其中的命令行參數(shù)ecSpecFilename 應(yīng)該是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" ); //分析命名行參數(shù) if ( args.length != 2 ) usage(); String aleServiceURL = args[0]; String ecSpecFilename = args[1]; try { // 創(chuàng)建一個(gè)ALE客戶端實(shí)例 ALE aleClient = new SOAPALEClient(new URL(aleServiceURL)); // 從XML文件讀取ECSpec (Event Cycle Specification) // ECSpec 包括定義事件周期的所有參數(shù),也可以在程序中指定 ECSpec myECSpec = readECSpec(ecSpecFilename); // 使用 ALE.immediate()方法,發(fā)出事件請求 // immediate() 在一個(gè)事件周期完成后會阻塞,并且返回報(bào)告 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等對象可以轉(zhuǎn)換為XML 表現(xiàn)形式 // XMLSerializationFactory是一個(gè)單態(tài)的工廠,從中可以通過轉(zhuǎn)換完成XML // 的序列化和反序列化 // 下面,使用XML反序列化將XML 中的內(nèi)容轉(zhuǎn)換為一個(gè)ECSpec 對象實(shí)例 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是一個(gè)單態(tài)的工廠,獲取實(shí)例 XMLSerializationFactory factory = XMLSerializationFactory.getInstance( XMLSerializationSyntax.EPCGLOBAL_ALE_1_0); XMLSerializer serializer = factory.createSerializer(); //使用XML序列化將ecReports對象實(shí)例轉(zhuǎn)化為XML形式,并輸出. Writer w = new OutputStreamWriter(System.out); serializer.serialize(ecReports, w, true); w.flush(); } }
三. 寫入標(biāo)簽信息
1. 運(yùn)行 ImmediateProgram 示例
- 確保只打開一個(gè)閱讀器模擬器,并且只選中其中一個(gè)天線的一個(gè)標(biāo)簽:
- 打開命令行窗口,瀏覽到<edge_home>samplesImmediateProgramSample
- 執(zhí)行如下命令:
>run.bat urn:epc:tag:gid-64-i:1.4.10
- 運(yùn)行結(jié)果應(yīng)該是XML格式的PCWriteReport,表示寫入TAG程序運(yùn)行的結(jié)果,如下:
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>元素相應(yīng)的也設(shè)置為SUCCESSFUL ;如果寫入出現(xiàn)問題,<status> 將會提供診斷用的信息,例如CACHE_EMPTY, READER_ERROR等等
- <physicalReaders> 元素表示那個(gè)物理閱讀器參與了標(biāo)簽寫操作,我們的操作中可以看到是SimReadr
- <failedLogicalReaders> 為空,表示寫操作周期中沒有失敗的閱讀器
- <cacheSize> 被設(shè)置為零,可以在程序中設(shè)置該值,該值也與ECSpec中的設(shè)置相關(guān)。
- <epc> 顯示寫入標(biāo)簽的值: 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值寫入標(biāo) * 簽的一個(gè)簡單程序 */ 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" ); //分析命名行參數(shù) if ( args.length != 3 ) usage(); //程序的使用說明,其中的命令行參數(shù)pcSpecFilename 應(yīng)該是PCSpec.xml,//aleServiceURL 形如:http://localhost:6060/axis/services/EPCglobalALEService。 // epcVal是EPC值 String aleServiceURL = args[0]; String pcSpecFilename = args[1]; String epcVal = args[2]; try { // 創(chuàng)建一個(gè)ALEPC客戶端實(shí)例. ALEPC aleClient = new AxisALEPCClient(new URL(aleServiceURL)); // 從XML文件讀取PCSpec (Programming Cycle Specification) // PCSpec包括定義寫入周期的所有參數(shù),也可以在程序中指定 PCSpec pcSpec = readPCSpec(pcSpecFilename); // 使用ALEPC.immediate()方法,發(fā)出事件請求 // immediate() 在一個(gè)事件周期完成后會阻塞,并且返回報(bào)告 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等對象可以轉(zhuǎn)換為XML 表現(xiàn)形式 // PCXMLSerializationFactory是單態(tài)工廠類,從中可以通過轉(zhuǎn)換完成XML // 的序列化和反序列化 // 下面,使用XML反序列化將XML 中的內(nèi)容轉(zhuǎn)換為一個(gè)PCSpec對象實(shí)例 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的實(shí)例,序列化PCWriteReport PCXMLSerializationFactory factory = PCXMLSerializationFactory.getInstance(); PCXMLSerializer serializer = factory.createSerializer(); //使用XML序列化將writeReport對象實(shí)例轉(zhuǎn)化為XML形式,并輸出 Writer w = new OutputStreamWriter(System.out); serializer.serialize(writeReport, w, true); w.flush(); } }
本篇我們簡單介紹了BEA Edge Server的安裝、使用和簡單的標(biāo)簽讀、寫過程,大家可以根據(jù)實(shí)際情況,在此基礎(chǔ)上開發(fā)自己的應(yīng)用。后面我們還會介紹Edge Server中的一些其他讀寫方式和工作流模塊。