RIL我有话说

来源:互联网 发布:淘宝网怎么买春药 编辑:程序博客网 时间:2024/04/28 06:26

【三大困扰,两宗罪】

1.     神秘的celltsp

2.     modem特性的差异

3.     无诚意的connection manager

 

 

1. 未知的celltsp。这是一个动态库,是tapiril之间的桥梁,比如要完成一个呼叫过程,celltspril驱动是有许多的互动,奈何celltsp没有源码,只能根据手册和调试信息来猜测celltsp的行为。MSDN只有此一句:CellTSP ignores RIL_NOTIFY_CONNECT. Use RIL_NOTIFY_CALLPROGRESSINFO to indicate call state transitions.好家伙,这算嘛回事?

 

2. modem特性差异。AT标准是只有一份,可是各家解读不同,同一个命令,有些可能会认为处理完毕正确返回OK,有些可能会立刻返回OK。更特别的是专有命令,比如微软手册提到的CPI命令,俺家用的模块就没有,CPIcall progress information。这个差异可是会导致RIL驱动中呼叫流程变化。

 

3. 无诚意的connection manager CM功能充满诱惑力,在CE6 R3中呈现时眼前为之一亮。兴奋打包进去后才发现,没法用,或者说不会用。原来CM是需要配置的,用DMProcessConfigXML来配置一个xml脚本。好家伙,这个函数芳踪何在?这算嘛事。

 

 

 

【简介】

RIL是移动通讯核心(cellcore)和无线硬件设备(modem)之间通讯的控制接口,由此集成GSM, CDMA等不同Modem设备,适应不同无线网络。RIL由两部分组成:RIL proxyRIL driverRILproxy是一个基于CE的动态链接库(DLL)  --- ril.dll,微软已经提供,它简化上层各个应用对驱动的访问。 RIL driver即流驱动需要自己实现。RILdriver向系统提供无线服务,包括语音、 数据和SMSRILdriver同时也通知无线状态的改变,例如服务区(coverage)、信息强度和来电等。 RIL模型类同音频模型,ril proxy好比waveapi ril driver好比wave流驱动。

 

 

1.

 

RIL结构和接口】

 

一:串口驱动。

最下层是串口硬件和串口驱动。Modem串口连接最普遍的说法是需要用到9pin的全功能串口,我的看法,在RIL驱动中对DCD配置的修改,使用3线串口也是可以的,但是在完整的产品还是要通过3线之外的其他io来辅助,不然会牺牲掉硬件流控以及唤醒,通知等功能。

 

二:可选的mux驱动。

考虑到modem不仅有at控制通道,还有数据传输通道,而串口是无协议的接口,所以从软件实现和性能考虑,最好的方式当然是2个串口分别提供。但实际中常见的都是1个串口的,支持gsm0710协议的modem能够实现在1个物理串口基础上虚拟多路串口。怎么判断是否支持多路复用? modemAT+CMUX命令来完成多路复用协议。Cellcore里面Gsm 07.10协议已经提供源码实现mux07_10.dll,默认的虚拟出2个串口COM7COM9.典型应用中,COM7作为AT命令通道,COM9作为数据通道,这样意味着在gprs状态下语言短信业务有可能可以同时使用,不必退出data模式。如果你的modem本身就已经有2路物理串口,那么710mux驱动是不需要的。如果你的modem并不支持GSM 07.10协议,只有+++退出data模式了。   

 

三:RIL驱动。

710mux驱动之上就是ril驱动了。MS已经抽象了大部分ril驱动的功能,通过了MDD源码,所以写一个ril驱动就是把自己modem相关的代码和MDD链接成一个流驱动rilgsm.dllril驱动与串口驱动的最大不同在于,ril是同时支持多个应用使用的,每次opennew一个Instance对应。

DWORD RIL_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)

{

    pDevice = (CRilHandle)dwData;

    pHandle = new CRilInstanceHandle;

    pHandle->Init(pDevice);

    pDevice->AddToList(pHandle);

    return (DWORD)pHandle;

}

上层应用打开RIL之后就可以使用RIL流驱动的IOCTL来使用RIL驱动。

 

四:RIL代理层

直接使用ril驱动显得不方便,所以MS继续封装了一个RIL  Proxy的层,由它来和驱动打交道,这个RIL  Proxy的实体是ril.dll,函数形式都是RIL_XXX(),函数声明在ril.h文件。基本上所有的应用都是使用代理层来实现。

 

五:应用层

RIL Proxy的上层是TAPI/ExTAPI SIM管理程序,SMS管理程序,电话,以及是基于gprs的网络应用程序。如图1,这些顶层的应用也许并没有直接和RIL驱动打交道,中间还有一些代理层,如下面列出的celltsp.dll, sms.dll等。

tapi-> tsp(celltsp.dll)  -> ril代理(ril.dll) –> rilgsm.dll

 

Sim -> sim api(cellcore.lib) -> ril.dll ->rilgsm.dll

 

Sms -> sms api(sms.dll) -> sms provider(sms_provider.dll) -> smsdrv.dll -> ril.dll -> rilgsm.dll

再往上,还有connection manager(CE6 R3包含)连接管理器api ATCIAssisted tapi这些。 ATCI是保留给应用一条对modem直接发AT命令的管道,但只在wm中有ce并没有包含。Assisted Tapice6的文档仅仅包含tapiRequestMakeCall,按照理解,这个是提供给系统拨号软件之外的第三方软件一个请求拨号的接口,会转发到系统的拨号软件处理。至于connection manager0910月发布R3版本中的新增内容,如同wm中的CM模块,这对应用而言是很有吸引力的模块,具有自动完成各种网络连接,自动选择网络,自动重拨,永远在线按需使用等功能,遗憾的是根据我目前实验,因为DMProcessConfigXMLCE无实现,CM配置存在困难,如您有答案不吝赐教。

原创粉丝点击