- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
RFID开发介绍—Edge Server (2)
上篇文章中我们简单介绍了BEA Edge Server的安装、使用和简单的标签读、写过程。接下来我们介绍Edge Server中的一些其他读写方式和工作流模块,大家可以根据实际情况,在此基础上开发自己的应用。
一、关于Immediate读取方式的更多说明
1、事件周期和可靠性
有很多原因会造成读卡器不能在一个读周期内检测到标签,可能是因为RFID标签本身的不可靠特性,也有可能是在像托盘这样的大容器负载很多标签缓慢通过读卡器时,有标签并没有产生ALE事件。通过ALE,我们配置一个事件周期包括多个读周期,这样就能提高所有的标签都被包含在结果报告中的概率。
我们可以通过下面的实验来模拟读不到某些标签的现象,并且通过配置ECSpec中的durationReadCycles来使一个事件周期包括多个读周期,以提高读卡成功率。
- 打开两个读卡模拟器,在上一篇文章有操作说明。在其中一个读卡模拟器中设置“可靠性”参数为50%:
- 重复运行ImmediateSample程序,观察运行结果,会发现并不是每次都可以读到所有标签。
- 使用ECSpec编辑器导入ECSpec.xml文件,并且定位到durationReadCycles参数,将当前值1修改为10。导出 ECSpec 到<edge_home>samplesImmediateSample 目录下,覆盖原有的文件。
- 重新运行ImmediateSample,观察运行结果,会发现每次都可以读到所有标签。
2、复合读卡器
可以通过管理控制台定义“复合读卡器”,复合读卡器可以包含一个活着多个逻辑读卡器。使用复合读卡器而不是在ECSpec中定义多个逻辑读卡器带来的好处是复合读卡器可以是业务上下文相关的,而不用考虑具体的读卡器,例如可以将复合读卡器命名为“DockDoor21”并且其中包含“ConnecTerra1”, “ConnecTerra2”等一组逻辑读卡器,这样在应用程序的ECSpec中就只要按照“DockDoor21”使用就可以,而不用考虑是不是“ConnecTerra1”, “ConnecTerra2”等等。
- 打开管理控制台,在设备浏览器中选择“Composite Readers”,然后在右边窗口选择“New”:
- 配置一个如下的,包含ConnecTerra2 和ConnecTerra4的复合读卡器CompositeReader1:
- 在第二个读卡模拟器的第二个天线的配置中,将每个EPC值增加1,例如
gid-64-i.38000.171.1 应该改为gid-64-i.38000.172.1 :
- 使用管理控制台的测试功能进行测试:
- 选择读卡器为 CompositeReader1,默认在选择后测试就开始,可以选择左下角的开始、停止按钮控制测试。观察测试结果,可以看到14个标签,其中7个来自于ConnecTerra2,7个是ConnecTerra4的,如果此时读卡模拟其中的“可靠性”参数还是设置为50%的话,可以看到某些EPC旁边有红色的“X”,当可靠性提高的100%这些警告标志就会消失。
3、不同的边界条件
ALE规范允许设置不同的边界条件来控制事件周期的开始和结束。最基本的边界条件就是指定持续时间,如我们在前面做过的实验,指定持续5000ms或者包含10个读周期。此外,事件周期也可以是被外界事件所触发的。
其中一个很有意思并且很有用的边界条件是称为“稳定集合间隔时间”,稳定集合间隔时间是用来指定一段时间,在这段时间的读周期里面再没有新的标签出现,这是事件周期就算是结束。
下面的图可以用来说明稳定集合间隔时间的概念。该图表示一些RFID标签会通过一个假想的读卡通道,例如一个叉车的托盘中有8个贴了RFID标签的物件要通过仓库大门。当叉车通过大门的时候,在任何读周期都可能会检测到不同的RFID标签。例如,在第一个读周期检测到了EPC #1 and EPC #2,在第三个读周期检测到了EPC #1 and EPC #5,……
在经过一段持续的读周期后,所有的8个标签就都至少被检测到一次了。这样读卡器不会再检测到新的标签出现,在这样的状态持续“稳定集合间隔时间”后,就会生成ECReport。如下图中,每个读周期的时间设为1000ms,“稳定集合间隔时间”设为4000ms。
在第一个读周期,检测到EPC #1 和 EPC #2两个标签。因为这个连个新检测到的标签,所以此时Edge Server会开始一个持续时间为4000 ms的定时器,即“稳定集合间隔时间”。如果在接下来的4000 ms的定时中没有检测到新的标签,Edge Server就会产生ECReport并且返回给应用程序。
然而在第二个读周期,又有一个新的标签EPC #5被检测到。因为在“稳定集合间隔时间”内有新的标签被检测到,定时器复位,即重新开始计时4000 ms。类似的,在第四个和第六个读周期又出现了新的标签,所以定时器都被复位。
在第八个读周期中,最后一个新的标签EPC #6被检测到。在接下来的4个读周期中,不再有新的标签出现。所以事件周期结束,并且返回生成的ECReport。
下面我们来看看在BEA Edge Server中如何配置和使用这样的边界条件:
- 使用管理控制台重新导入<edge_home>samplesImmediateSample 目录下面的ECSpec。选择CompositeReader1作为逻辑读卡器,设置“Stable Set Interval”为15000 ms。
- 接下来将ConnecTerra2和ConnecTerra4的所有标签都去除选中,其中ConnecTerra2是第一个模拟器的第二个天线,ConnecTerra4是第二个模拟器的第二个天线。
- 开始运行ImmediateSample,每3到4秒选中一个去掉的EPC,直到将所有的14个EPC都选中。在选中所有EPC后大约15秒,事件周期会结束。
- 分析命令行窗口中产生的报告,注意其中的terminationCondition和totalMilliseconds值。可以参考如下ECReports:
Immediate Sample, XML-based sending request to Edge Server... ...received response.Received the following ECReports:<ale:ECReports ALEID="SAVANT_ID" creationDate="2006-08-13T04:01:56.239Z" date="2006-08-13T04:01:56.239Z" schemaURL="http://schemas.connecterra.com/EPCglobal/ale-1_0.xsd" schemaVersion="1" specName="=89" terminationCondition="STABLE_SET" totalMilliseconds="40359" xmlns:ale="urn:epcglobal:ale:xsd:1" xmlns:aleext="http://schemas.connecterra.com/EPCglobal-extensions/ale"> <reports> <report reportName="ImmediateSample Report"> <group> <groupList> <member> <tag>urn:epc:tag:gid-64-i:38000.172.1</tag> </member> <member> ………… <member> <tag>urn:epc:tag:gid-64-i:38000.4971.7</tag> </member> </groupList> <groupCount> <count>14</count> </groupCount> </group> <aleext:applicationData></aleext:applicationData> </report> </reports> <aleext:applicationData>Application specific data can go here</aleext:applicationData> <aleext:failedLogicalReaders/> <aleext:physicalReaders> <aleext:physicalReader>SimReadr2</aleext:physicalReader> <aleext:physicalReader>SimReadr</aleext:physicalReader> </aleext:physicalReaders> <aleext:totalReadCycles>150</aleext:totalReadCycles></ale:ECReports>
- 也可以使用ECSpec的测试功能来运行上述的测试。
二、用subscribe方式读取标签信息
1、运行Subscribe示例
Subscribe示例是使用ALE的“subscribe”方式实现异步报告发布,同时也展现了一起ALE API中的其它可管理方式。
它和“Immediate”示例不同的地方是:
- 可以定义多个ECSpecs,每个都有各自的名字
- 使用subscribe命令,给“事件周期”添加一个或者多个“订购者”,来获取报告
- 在定义“事件周期”和“订购者”之后,Edge Server执行“事件周期”,并且异步的给“订购者”返回报告
具体操作步骤如下:
- 打开读卡模拟器、Edge Sever和管理控制台
- 打开资源管理器,浏览目录 <edge_home>samples SubscribeSample.
- 修改run.bat
set EDGEHOST=localhost
set EDGEPORT=6060
- 点击run.bat,注意到命令行窗口显示的命令行参数使用方法
- 使用ECSpec editor导入SubscribeSample 目录内的ECSpec.xml
- 导入成功后,选择File->Deploy As,部署一个新的叫做“MengSpec”的ECSpec
- 再部署一个叫做“Meng2Spec”的ECSpec
- 在命令行输入如下命令:
>run subscribe Meng2Spec console:test
- 看到输出:
Target ALE Service: http://localhost:6060/axis/services/EPCglobalALEService
ubscribing notification handler for spec Meng2Spec in Edge Server.
- 观察管理控制台的变化:
- 运行以下命令可以停止发布报告:
>run.bat unsubscribe Meng2Spec console:test
由于SubscribeSample的代码相对比较冗长,限于篇幅,本文不在这里进行详细的分析。读者可以自己参看代码和相应的注释,尤其注意其中的非immediate方式的处理过程和所调用的ALE API。
2、报告和报告发送方式
BEA Edge Server 支持很多种报告发送方式,包括命令行方式、文件系统、HTTP和TCP等。前面我们已经看到使用命令行方式,下面以文件系统为例展示其它的报告发送方式。
- 首先创建两个临时目录:
>mkdir c: emple1
>mkdir c: emple2
- 执行如下命令:
>run.bat subscribe MengSpec file:///c:/temp/ale1
- 执行如下命令:
>run.bat subscribe Meng2Spec file:///c:/temp/ale2/file.txt
- 在运行几秒钟以后, unsubscribe 上述的ECSpecs (MengSpec and Meng2Spec).
>run.bat unsubscribe MengSpec file:///c:/temp/ale1
>run.bat unsubscribe Meng2Spec file:///c:/temp/ale2/file.txt
- 察看这两个临时目录下面的内容。在ale1目录下,由于在命令行指定的是目录,所以不同的ECReports被保存在不同的文件中,而在ale2目录下,ECReports被保存在同一个在命令行指定了名称的文件中。
三、Edge Server和工作流
BEA Edge Server 提供可配置的工作流模块,使用户可以快速配置中间件来处理RFID部署环境中的通用物料运输工作流。下面我们讨论一个比较特殊的工作流—有方向工作流。
有方向工作流的思想非常简单:用户或者说是应用程序可能会需要了解一个标签移动的方向,例如一个贴有标签的商品正在从仓库移动向商场货架。有方向工作流模块记录附加了时戳的流动方向,并且可以通过配置将该数据作为一个ECReport发送给企业中央服务器。
一个有方向的工作流最少需要两个读卡器,然后由标签先通过其中一个读卡器后通过另外一个读卡器而推断出其流动方向。在实际部署中,会有很多异常情况导致方向推断过程出错,例如两个读卡器同时读到同一个标签或者在一个读卡器读到该卡后,另一个读卡器一直没有检测到该卡。
限于文章篇幅,大家可以参考下面链接的示例来建立自己的工作流:http://edocs.bea.com/rfid/edge_server/docs21/workflow_reference/config_use.html#wp424256
在这篇文章中,我们介绍了Edge Server中Immediate方式的一些更复杂得配置、一些其他读写方式和工作流模块。限于作者的水平和文章的篇幅,没有能够更多深入探讨和分析,希望能起到让大家入门和上手的效果吧。大家在实际项目中,可以根据具体的需求情况,在本文介绍的基础上开发自己的应用程序。如果需要对BEA Edge Server体系结构有更完整地认识或者需要能具体深入地了解该产品的话,可以参考BEA的文档:http://edocs.bea.com/rfid/edge_server/docs21/