星期二, 九月 05, 2006

RFID开发介绍—Edge Server (2)

上篇文章中我们简单介绍了BEA Edge Server的安装、使用和简单的标签读、写过程。接下来我们介绍Edge Server中的一些其他读写方式和工作流模块,大家可以根据实际情况,在此基础上开发自己的应用。

一、关于Immediate读取方式的更多说明

1、事件周期和可靠性

有很多原因会造成读卡器不能在一个读周期内检测到标签,可能是因为RFID标签本身的不可靠特性,也有可能是在像托盘这样的大容器负载很多标签缓慢 通过读卡器时,有标签并没有产生ALE事件。通过ALE,我们配置一个事件周期包括多个读周期,这样就能提高所有的标签都被包含在结果报告中的概率。

我们可以通过下面的实验来模拟读不到某些标签的现象,并且通过配置ECSpec中的durationReadCycles来使一个事件周期包括多个读周期,以提高读卡成功率。

  1. 打开两个读卡模拟器,在上一篇文章有操作说明。在其中一个读卡模拟器中设置“可靠性”参数为50%:
  2. 图1

  3. 重复运行ImmediateSample程序,观察运行结果,会发现并不是每次都可以读到所有标签。
  4. 使 用ECSpec编辑器导入ECSpec.xml文件,并且定位到durationReadCycles参数,将当前值1修改为10。导出 ECSpec 到samplesImmediateSample 目录下,覆盖原有的文件。
  5. 图2

  6. 重新运行ImmediateSample,观察运行结果,会发现每次都可以读到所有标签。

2、复合读卡器

可以通过管理控制台定义“复合读卡器”,复合读卡器可以包含一个活着多个逻辑读卡器。使用复合读卡器而不是在ECSpec中定义多个逻辑读卡器带来 的好处是复合读卡器可以是业务上下文相关的,而不用考虑具体的读卡器,例如可以将复合读卡器命名为“DockDoor21”并且其中包含 “ConnecTerra1”, “ConnecTerra2”等一组逻辑读卡器,这样在应用程序的ECSpec中就只要按照“DockDoor21”使用就可以,而不用考虑是不是 “ConnecTerra1”, “ConnecTerra2”等等。

  1. 打开管理控制台,在设备浏览器中选择“Composite Readers”,然后在右边窗口选择“New”:
  2. 图3

  3. 配置一个如下的,包含ConnecTerra2 和ConnecTerra4的复合读卡器CompositeReader1:
  4. 图4

  5. 在第二个读卡模拟器的第二个天线的配置中,将每个EPC值增加1,例如
  6. gid-64-i.38000.171.1 应该改为gid-64-i.38000.172.1 :

    图5

  7. 使用管理控制台的测试功能进行测试:
  8. 图6

  9. 选 择读卡器为 CompositeReader1,默认在选择后测试就开始,可以选择左下角的开始、停止按钮控制测试。观察测试结果,可以看到14个标签,其中7个来自 于ConnecTerra2,7个是ConnecTerra4的,如果此时读卡模拟其中的“可靠性”参数还是设置为50%的话,可以看到某些EPC旁边有 红色的“X”,当可靠性提高的100%这些警告标志就会消失。
  10. 图7

3、不同的边界条件

ALE规范允许设置不同的边界条件来控制事件周期的开始和结束。最基本的边界条件就是指定持续时间,如我们在前面做过的实验,指定持续5000ms或者包含10个读周期。此外,事件周期也可以是被外界事件所触发的。

其中一个很有意思并且很有用的边界条件是称为“稳定集合间隔时间”,稳定集合间隔时间是用来指定一段时间,在这段时间的读周期里面再没有新的标签出现,这是事件周期就算是结束。

下 面的图可以用来说明稳定集合间隔时间的概念。该图表示一些RFID标签会通过一个假想的读卡通道,例如一个叉车的托盘中有8个贴了RFID标签的物件要通 过仓库大门。当叉车通过大门的时候,在任何读周期都可能会检测到不同的RFID标签。例如,在第一个读周期检测到了EPC #1 and EPC #2,在第三个读周期检测到了EPC #1 and EPC #5,……

在经过一段持续的读周期后,所有的8个标签就都至少被检测到一次了。这样读卡器不会再检测到新的标签出现,在这样的状态持续“稳定集合间隔时间”后,就会生成ECReport。如下图中,每个读周期的时间设为1000ms,“稳定集合间隔时间”设为4000ms。

图8

在第一个读周期,检测到EPC #1 和 EPC #2两个标签。因为这个连个新检测到的标签,所以此时Edge Server会开始一个持续时间为4000 ms的定时器,即“稳定集合间隔时间”。如果在接下来的4000 ms的定时中没有检测到新的标签,Edge Server就会产生ECReport并且返回给应用程序。

然而在第二个读周期,又有一个新的标签EPC #5被检测到。因为在“稳定集合间隔时间”内有新的标签被检测到,定时器复位,即重新开始计时4000 ms。类似的,在第四个和第六个读周期又出现了新的标签,所以定时器都被复位。

在第八个读周期中,最后一个新的标签EPC #6被检测到。在接下来的4个读周期中,不再有新的标签出现。所以事件周期结束,并且返回生成的ECReport。

下面我们来看看在BEA Edge Server中如何配置和使用这样的边界条件:

  1. 使用管理控制台重新导入samplesImmediateSample 目录下面的ECSpec。选择CompositeReader1作为逻辑读卡器,设置“Stable Set Interval”为15000 ms。
  2. 图9

  3. 接下来将ConnecTerra2和ConnecTerra4的所有标签都去除选中,其中ConnecTerra2是第一个模拟器的第二个天线,ConnecTerra4是第二个模拟器的第二个天线。
  4. 图10

  5. 开始运行ImmediateSample,每3到4秒选中一个去掉的EPC,直到将所有的14个EPC都选中。在选中所有EPC后大约15秒,事件周期会结束。
  6. 分析命令行窗口中产生的报告,注意其中的terminationCondition和totalMilliseconds值。可以参考如下ECReports:
  7. Immediate Sample, XML-based
    sending request to Edge Server...
    ...received response.
    Received the following ECReports:
    t="http://schemas.connecterra.com/EPCglobal-extensions/ale">





    urn:epc:tag:gid-64-i:38000.172.1


    …………

    urn:epc:tag:gid-64-i:38000.4971.7



    14





    Application specific data can go hereonData>


    SimReadr2
    SimReadr

    150

  8. 也可以使用ECSpec的测试功能来运行上述的测试。
  9. 图11

二、用subscribe方式读取标签信息

1、运行Subscribe示例

Subscribe示例是使用ALE的“subscribe”方式实现异步报告发布,同时也展现了一起ALE API中的其它可管理方式。

它和“Immediate”示例不同的地方是:

  • 可以定义多个ECSpecs,每个都有各自的名字
  • 使用subscribe命令,给“事件周期”添加一个或者多个“订购者”,来获取报告
  • 在定义“事件周期”和“订购者”之后,Edge Server执行“事件周期”,并且异步的给“订购者”返回报告

具体操作步骤如下:

  1. 打开读卡模拟器、Edge Sever和管理控制台
  2. 打开资源管理器,浏览目录 samples SubscribeSample.
  3. 修改run.bat
  4. set EDGEHOST=localhost

    set EDGEPORT=6060

  5. 点击run.bat,注意到命令行窗口显示的命令行参数使用方法
  6. 使用ECSpec editor导入SubscribeSample 目录内的ECSpec.xml
  7. 导入成功后,选择File->Deploy As,部署一个新的叫做“MengSpec”的ECSpec
  8. 再部署一个叫做“Meng2Spec”的ECSpec
  9. 在命令行输入如下命令:
  10. >run subscribe Meng2Spec console:test

  11. 看到输出:
  12. Target ALE Service: http://localhost:6060/axis/services/EPCglobalALEService

    ubscribing notification handler for spec Meng2Spec in Edge Server.

  13. 观察管理控制台的变化:
  14. 图12

  15. 运行以下命令可以停止发布报告:
  16. >run.bat unsubscribe Meng2Spec console:test

    由于SubscribeSample的代码相对比较冗长,限于篇幅,本文不在这里进行详细的分析。读者可以自己参看代码和相应的注释,尤其注意其中的非immediate方式的处理过程和所调用的ALE API。

2、报告和报告发送方式

BEA Edge Server 支持很多种报告发送方式,包括命令行方式、文件系统、HTTP和TCP等。前面我们已经看到使用命令行方式,下面以文件系统为例展示其它的报告发送方式。

  1. 首先创建两个临时目录:
  2. >mkdir c: emple1

    >mkdir c: emple2

  3. 执行如下命令:
  4. >run.bat subscribe MengSpec file:///c:/temp/ale1

  5. 执行如下命令:
  6. >run.bat subscribe Meng2Spec file:///c:/temp/ale2/file.txt

  7. 在运行几秒钟以后, unsubscribe 上述的ECSpecs (MengSpec and Meng2Spec).
  8. >run.bat unsubscribe MengSpec file:///c:/temp/ale1

    >run.bat unsubscribe Meng2Spec file:///c:/temp/ale2/file.txt

  9. 察看这两个临时目录下面的内容。在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/

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和管理控制台

  1. 打开资源管理器,浏览到in 目录
  2. 打开阅读器模拟器:双击RunReaderSim.bat.
  3. 图122

  4. 修改/etc/edge.props文件,修改后如下:
  5.   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来进行配置,配置过程如下:

  6. 从windows菜单选择运行Configuration Wizard 或者直接运行/common/bin/config.cmd命令:
  7. 图124

  8. Configuration Wizard打开后,首先进入欢迎页面,选择其中的下一步。
  9. 在出现的页面中配置各参数如下 :
  10. 图126

  11. 选择下一步,在确认页面中选择“创建”,最后确认。
  12. 打开Edge Server:浏览到in 目录,双击 RunEdgeServer.bat.
  13. 图128

  14. 修改/etc/admin-console.props,修改后如下:
  15.   com.connecterra.ualegui.edgeServerURLs=http://localhost:6060

  16. 打开管理控制台: 浏览到in 目录,双击 RunAdminConsole.bat.

图1210

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返回给应用程序的信息。

  具体操作如下:

  1. 在管理控制台里面左边的设备浏览器中,选中ECSpecs
  2. 图131

  3. 在右边选择“NEW”,这样会打开ECSpec Editor
  4. 图132

  5. 使用“>>”按钮将ConnecTerra1 和ConnecTerra2两个逻辑阅读器到选择窗口。
  6. 在“Stop”区,选中“Duration”,输入5000,这个域以毫秒为单位。配置好地ECSpec如下:
  7. 图134

  8. 在左边选择“Reports”
  9. 在右边选择“New Report”,就按默认设置创建名为“Report_0”的报告,配置后的窗口如下:
  10. 图136

  11. 在菜单中选择ToolsàTest,看到如下窗口:
  12. 图137

  13. 在管理控制台可以通过选择设备浏览器中的RFID Devices下面的SimReadr来查看设备统计信息。有两组图,每个逻辑阅读器或者天线,每个逻辑阅读器都可以看到如下信息:
  14. 读 周期时间—一个完整的读周期所用的时间,一个读周期是Edge Server和阅读器之间的最小交易单位,它被三个因素影响:(1) Edge Server和阅读器之间协议交互所用的时间,这和驱动设计和实现有关;(2)网络延迟;(3)阅读器内部读卡机制、设计等等。
  15. 读周期数-- Edge Server执行的总读周期数
  16. 标签数:Edge Server所能读到的标签数

4. 配置多个阅读器模拟器

  在本节配置完成后,我们从逻辑上将实现如下的部署图:

图14

  首先,创建第二个阅读器,并且配置Edge Server来使用它

  1. Make a copy of, and put the copy in the bin directory.
    1. 复制RunReaderSim.bat,放在bin目录下,重命名为RunReaderSim2.bat
    2. 打开RunReaderSim2.bat,将READER_PORT修改为5051,保存,关闭文件
    3. 运行新的模拟器(RunReaderSim2.bat).
    4. 在管理控制台配置Edge Server使用新的阅读器:选择设备管理器里面的RFID设备,在右边窗口选择SimReadr,并且Clone
    5. 图1414

    6. 将新阅读器的名字改为“SimReadr2”,Reader Port 改为5051.两个逻辑天线的名字修改为“ConnecTerra3” 和“ConnecTerra4”.
    7. 图1415

      • 确定后,新的配置如下:

      图1416

    8. 为了测试,需要在ECSpec中添加新的逻辑阅读器,首先导出已经存在的ECSpec,然后再导入并且添加新的逻辑阅读器。

二. 读取标签信息

1. 运行Immediate示例

  Immediate示例使用ALE“Immediate”方式来演示同步报告发布。

  1. 打开阅读器模拟器、Edge Sever和管理控制台
  2. 打开资源管理器,浏览目录 samplesImmediateSample.
  3. 修改run.bat
  4.   set EDGEHOST=localhost

      set EDGEPORT=6060

  5. 点击run.bat,观察输出,注意报告有7个标签
  6. 图214

  7. 使用管理控制台ECSpec editor导入示例的ECSpec,ECSpec文件也在该目录中
  8. 图215

      测试导入的ECSpec:

    图215

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 示例

  1. 确保只打开一个阅读器模拟器,并且只选中其中一个天线的一个标签:
  2. 图311

  3. 打开命令行窗口,浏览到samplesImmediateProgramSample
  4. 执行如下命令:
  5.   >run.bat urn:epc:tag:gid-64-i:1.4.10

  6. 运行结果应该是XML格式的PCWriteReport,表示写入TAG程序运行的结果,如下:
    •    Received the following PCWriteReport:

      "=0" totalMilliseconds="531" totalTrials="1" xmlns="http://schemas.con
      necterra.com/alepc">
      application specific data can go here
      true
      SUCCESSFUL

      SimReadr


      0
      urn:epc:tag:gid-64-i:1.4.10
      ConnecTerra1
      Press any key to continue . . .
    • 元素表示写入程序成功,元素相应的也设置为SUCCESSFUL ;如果写入出现问题, 将会提供诊断用的信息,例如CACHE_EMPTY, READER_ERROR等等
    • 元素表示那个物理阅读器参与了标签写操作,我们的操作中可以看到是SimReadr
    • 为空,表示写操作周期中没有失败的阅读器
    • 被设置为零,可以在程序中设置该值,该值也与ECSpec中的设置相关。
    • 显示写入标签的值: urn:epc:tag:gid-64-i:1.4.10
    • Finally, 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中的一些其他读写方式和工作流模块。