2009年7月21日星期二

ISMPEntity之二,PDU收发

PDU(Protocol Data Unit 协议数据单元),可以理解为传输协议数据的包,因为电信定义了ISMAP协议,必然有相应格式的包来传输协议的数据,这很好理解,每种协议有其各自的帧格 式。这个可以查看中国电信的文档,附录里有比较详细的介绍。PDU主要分消息头和消息体,消息头包括:PDU的长度,命令ID和序号。命令ID有好多种, 其中有:id_BindReq,id_EnquireLinkReq,id_AuthPriceReq等等,从这些命令ID的名字就一目了然,知道它们是 的作用是什么。

在com.qualcomm.bss.bsg.ismpentity.pdu包中,PDU的基类是BasePDU,是个抽 象类,它的作用也就是给PDU搭个框架,把PDU的公共部分都设置了,剩下和各个命令相关的部分都放到特定命令里去设置。PDU的派生类众多,不过应该都 是大同小异,例如派生类:BindResponsePDU,EnquireLinkRequestPDU等等,从名字就知道它们是构造何种PDU的。

包 com.qualcomm.bss.bsg.ismpentity.ismaphandler有点搞头,里面有些类值得关注,首先是接口 PDURequestHandlerInterface,它包含了一些方法,它们用于发送异步PDU给ISMP,这说明ISMPEntity与ISMP之 间是用异步PDU进行通信的?这个还有待证实。类PDURequestHandlerImpl实现了接口 PDURequestHandlerInterface,具体的实现没细看。

类PDUConnection,对socket进行了封装, 从它的方法:connect和disconnect就很明显,不过这个类的职责并不明晰,它不但包括了对socket的封装,而且它还会发送bind和 unbind的PDU,这一点我决定没设计好,这两个应该是不相关的。

类PDUTransmitter是用来发送PDU的,它用到了 PDUConnection,这是理所当然,它还用到了一个类:PDUWrapper,这个类我没看太明白,不知道有什么用,不过它比较简单,可以暂且放 在一边。PDUTransmitter有个方法generateSeqId产生所谓的sequence ID,我估计这个sequence ID就是电信文档里提到的“用于请求和响应间保持联系的序号”,不过这还是有待证实。在发送的时候用方法 associateSeqToPDUWrapper将sequence ID和PDUWrapper进行绑定,它们是一个键值对,每个sequence ID都对应唯一的PDUWrapper。这个键值对是有用的,在类PDUReceiver中要用到的。

类PDUReceiver和PDUTransmitter做相反的事。

PDU 这一块现在还是有点迷糊,目前看,PDU的操作其实也可以分为两层,上层包括PDURequestsHandlerInterface和 PDURequestsHandlerImpl,这两个类一个是接口一个是实现,它们是给上层用的,其中有个方法是sendPDU,这个方法用来发送 PDU。而其实待发的PDU加入到一个队列中PDUQueue,最终将某个PDU发送出去的是类PDUTransmitter实现的。

调用的大致流程:
RequestHandler::doGet->ISMPEntity::invokeService->Locator::locateDeviceHandle->Device::handleRequest->HandlerInterface::handleRequest->PDURequestHandlerInterface::sendPDU->pduQueue::addToQueue-
>PDUTransmitter->sendPDUBytesToISMP

没有评论:

发表评论