LLRP读写器的接口解析.docx
- 文档编号:28711436
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:13
- 大小:751.81KB
LLRP读写器的接口解析.docx
《LLRP读写器的接口解析.docx》由会员分享,可在线阅读,更多相关《LLRP读写器的接口解析.docx(13页珍藏版)》请在冰豆网上搜索。
LLRP读写器的接口解析
LLRP读写器接收底层读写器信息的接口解析
一、读写器管理模块
1.简介
FosstrakLogicalReader抽象出访问底层读写器的通用接口,将对读写器的调用与具体底层读写器实现分离,使得用户可以透明的访问读写器,而无需考虑底层读写器的具体类型。
Fosstrak读写器模块设计,在结构上使用了组合模式和适配器模式,在行为上使用了观察者模式。
组合模式可以让用户以使用统一API操作组合对象与子对象,适配器模式将不同底层读写器的API转换为Fosstrak通用LogicalReaderAPI,观察者模式则用来处理标签数据报告异步响应,实现了消息的订阅/发布功能。
LogicalReader的结构如下:
2.LogicalReader
如上图所示,LogicalReader是继承Observable对象的一个抽象类.它定义了访问底层读写器的通用接口。
由于LogicalReader继承Observable对象,因此LogicalReader是一个可被观察的对象,通过addObserver(Observer)方法注册观察者对象和通过notifyObservers()方法通知观察者们每个。
每个LogicalReader都持有一个LRSpec对象和一个LRProperty列表,这些对象包含了该LogicalReader的配置信息。
每个LogicalReader还持有一个创建他们的LogicalReaderManager接口。
LogicalReader中最重要的方法之一是initialize(String,LRSpec),因为LogicalReaderManager在通过org.fosstrak.ale.server.readers.LogicalReaderFactory对象创建LogicalReader对象时,LogicalReaderFactory会调用LogicalReader的initialize(String,LRSpec)方法,子类经常复写的方法来实现特性化初始化过程。
目前LogicalReader中定义子类必须实现的抽象方法有:
●start():
启动读写器,开始数据读取
●stop():
停止读写器,结束数据读取
●update(LRSpec):
更行LRSpec读写器配置
3.BaseReader
BaseReader也是一个抽象类,它只是实现了读写器都应该实现的一些通用方法,一般具体读写器对象都应该从BaseReader继承,这样就不用从零实现一个读写器逻辑,而是在BaseReader的基础上进一步实现。
BaseReader又定了四个抽象方法,要求子类实现,他们是:
●addTag(Tag):
添加标签
●addTags(List
添加标签列表
●connectReader():
设置一个读写器
●disconnectReader():
销毁一个读写器
基本所有的适配器都是从BaseReader集成而来,而不会直接集成LogicalReader,所以说明了LogicalReader只是一个接口标准,主要用来规范读写器的操作API而没有具体实现细节。
目前系统中已实现的适配器有4种,分别是LLRPAdaptor,HALAdaptor,RPAdaptor以及TestAdaptor。
下面只研究LLRPAdaptor。
二、LLRP适配器解析
1.概述
Fosstrakfc-server读写器功能的实现都是委托其他底层读写器能模块实现的,然而底层读写器的API不统一,五花八门。
因此需要有一个适配层将各种底层读写器API适配成Fosstrak中规定的LogicalReaderAPI,这样Fosstrak其他模块及客户端应用只用针对LogicalReaderAPI编程,无需关心底层读写器实现。
在Fosstrakfc-server模型里面,LLRPAdaptor是专门针对支持LLRP协议读写器的实现。
运作结构如下图所示:
LLRPAdaptor内部运行图
在这里,黄色部分属于fc-server组件,蓝色接口属于llrp-adaptor组件,绿色接口属于JavaSDK包。
由上图可知:
LLAPAdaptor的功能实现实际上都是委托llrp-adaptor组件实现的。
而这些组件,就是llrp读写器接收底层读写器的接口以及实现类。
下面,我们一一对这些接口和类进行解析。
2.LLRPAdaptor生命周期
LLRPAdaptor对象的生命周期如下图所示:
LLRPAdaptor主流程图
总体运行机制:
客户端应用或其他模块使用LogicalReaderManager定义一个LLRPAdaptor时,系统将马上初始化LLRPAdaptor。
初始化成功的LLRPAdaptor将等待底层读写器的传递数据。
一旦接收到标签数据,LLRPAdaptor将对这些二进制标签数据包装成Tag对象,然后用这些Tag对象通知自己的观察者们。
直到客户端应用或其他模块使用LogicalReaderManager注销掉LLRPAdaptor。
3.LLRPAdaptor初始化
比较重要的一个工作是llrpadptor的初始化工作,因为底层数据传输的成功必须依赖于它。
当通过LogicalReaderManger定义一个LogicalReader时,会立即对该LogicalReader进行初始化。
LLRPAdaptor初始化流程如下图所示:
LLRPAdaptor初始化流程
由上图可知:
物理LLRP读写器读写器永远都只会定义一个(根据physicalReaderName来区别),而且一直处于物理连接状态,但可以被多个逻辑读写器关联。
LLRPAdaptor的connectReader方法实现的逻辑连接而已(物理连接自系统启动时就一直连接着),connectReader只是给底层读写器设置一个回调类而已,这样LLRPAdaptor又可以重新获取标签数据了。
同理disconnectReader方法实现的逻辑断开连接,而不是真正的与底层读写器断开连接。
其方法内部只是注销了回调类,这样LLRPAdaptor就不再收到底层读写器的数据了。
4.LLRPAdaptor包装标签数据
LLRPAdaptor在初始化时就向底层读写器Reader注册了一个回调类Callback,Callback实现AsynchronousNotifiable接口,因此在底层读写器读取到数据时可以回调Callback的notify(byte[],String)方法,将读取的数据传递给Callback。
Callback回调类又持有一个LLRPAdaptor的引用,因此Callback又可以回调LLRPAdaptor的notify(byte[],String)方法。
由于底层读写器读取的都是二进制数据,因此需要将二进制数据包装成一个Tag对象,方便后续处理。
LLRPAdaptor的notify(byte[],String)方法就是专门完成这项工作的。
其流程图如下所示:
Tag包装流程图
LLRPAdaptor将二进制标签数据包装成Tag对象后,就会通知LLRPAdaptor对象的观察者们。
5.接口和实现类的展示
LLRPAdaptor的接口和实现类,在fosstrak-llrp项目中的位置,如下图所示:
数据传输接口和实现类
在LLRPAdaptor组件里面,有三个接口实现与底层读卡器的数据交流。
分别是Adaptor、Reader、RsynchronousNotifiable。
它们通过RMI调用,提供远程服务。
5.1Adaptor
该接口提供了一个进入一系列LLRPreaders的普通接口通道。
接口展示:
接口方法展示:
voiddefine(StringreaderName,
StringreaderAddress,
booleanclientInitiatedConnection,
booleanconnectImmediately)throwsRemoteException,LLRPRuntimeException;
voiddefine(StringreaderName,
StringreaderAddress,
intport,
booleanclientInitiatedConnection,
booleanconnectImmediately)throwsRemoteException,LLRPRuntimeException;
voidundefine(StringreaderName)throwsRemoteException,LLRPRuntimeException;
voidundefineAll()throwsRemoteException,LLRPRuntimeException;
voiddisconnectAll()throwsRemoteException,LLRPRuntimeException;
booleancontainsReader(StringreaderName)throwsRemoteException;
List
ReadergetReader(StringreaderName)throwsRemoteException;
StringgetAdaptorName()throwsRemoteException;
voidsetAdaptorName(StringadaptorName)throwsRemoteException;
voidsendLLRPMessage(StringreaderName,byte[]message)throwsRemoteException,LLRPRuntimeException;
voidsendLLRPMessageToAllReaders(byte[]message)throwsRemoteException,LLRPRuntimeException;
voidregisterForAsynchronous(AsynchronousNotifiablereceiver)throwsRemoteException;
voidderegisterFromAsynchronous(AsynchronousNotifiablereceiver)throwsRemoteException;
voidmessageReceivedCallback(byte[]message,StringreaderName)throwsRemoteException;
voiderrorCallback(LLRPRuntimeExceptione,StringreaderName)throwsRemoteException;
5.2Reader
Thisclassmodelsalogicalentityofaphysicalreader.itmaintains
theconnectivitytothephysicalreader.
接口方法:
voidconnect(booleanclientInitiatedConnection)throwsLLRPRuntimeException,RemoteException;
voiddisconnect()throwsRemoteException;
voidreconnect()throwsLLRPRuntimeException,RemoteException;
voidsend(byte[]message)throwsRemoteException;
booleanisConnected()throwsRemoteException;
StringgetReaderAddress()throwsRemoteException;
StringgetReaderName()throwsRemoteException;
intgetPort()throwsRemoteException;
booleanisClientInitiated()throwsRemoteException;
voidsetClientInitiated(booleanclientInitiated)throwsRemoteException;
booleanisConnectImmediate()throwsRemoteException;
voidsetConnectImmediate(booleanvalue)throwsRemoteException;
voidregisterForAsynchronous(AsynchronousNotifiablereceiver)throwsRemoteException;
voidderegisterFromAsynchronous(AsynchronousNotifiablereceiver)throwsRemoteException;
voidsetKeepAlivePeriod(intkeepAlivePeriod,inttimes,booleanreport,booleanthrowException)throwsRemoteException;
intgetKeepAlivePeriod()throwsRemoteException;
voidsetReportKeepAlive(booleanreport)throwsRemoteException;
booleanisReportKeepAlive()throwsRemoteException;
ReaderMetaDatagetMetaData()throwsRemoteException;
5.3RsynchronousNotifiable
ifyouwanttoreceiveasynchronousmessagenotificationsyoucanimplementthisinterface.
5.4AdaptorImpl
AdaptorImpl负责管理ReaderImpl集合。
提供了管理ReaderImpl集合的接口。
AdaptorImpl实现了Adaptor远程接口,因此可以通过RMI调用,提供远程服务。
AdaptorImpl将实现Adaptor接口所有的方法。
方法的具体含义还有待读解。
5.5ReaderImpl
ReaderImpl负责与底层llrp读写器交互。
一个llrp读写器对应一个ReaderImpl。
ReaderImpl实现了Reader远程接口,因此ReaderImpl可以通过RMI调用,提供远程服务。
ReaderImpl将实现Reader接口所有的方法。
方法的具体含义还有待读解。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LLRP 读写 接口 解析
![提示](https://static.bdocx.com/images/bang_tan.gif)