1. 神秘的celltsp。
2. modem特性的差异
3. 无诚意的connection manager
1. 未知的celltsp。这是一个动态库,是tapi和ril之间的桥梁,比如要完成一个呼叫过程,celltsp和ril驱动是有许多的互动,奈何celltsp没有源码,只能根据手册和调试信息来猜测celltsp的行为。MSDN只有此一句:CellTSP ignores RIL_NOTIFY_CONNECT. Use RIL_NOTIFY_CALLPROGRESSINFO to indicate call state transitions.好家伙,这算嘛回事?
2. modem特性差异。AT标准是只有一份,可是各家解读不同,同一个命令,有些可能会认为处理完毕正确返回OK,有些可能会立刻返回OK。更特别的是专有命令,比如微软手册提到的CPI命令,俺家用的模块就没有,CPI是call progress information。这个差异可是会导致RIL驱动中呼叫流程变化。
3. 无诚意的connection manager。 CM功能充满诱惑力,在CE6 R3中呈现时眼前为之一亮。兴奋打包进去后才发现,没法用,或者说不会用。原来CM是需要配置的,用DMProcessConfigXML来配置一个xml脚本。好家伙,这个函数芳踪何在?这算嘛事。
【简介】
RIL是移动通讯核心(cellcore)和无线硬件设备(modem)之间通讯的控制接口,由此集成GSM, CDMA等不同Modem设备,适应不同无线网络。RIL由两部分组成:RIL proxy和RIL driver。RILproxy是一个基于CE的动态链接库(DLL) --- ril.dll,微软已经提供,它简化上层各个应用对驱动的访问。 而RIL driver即流驱动需要自己实现。RILdriver向系统提供无线服务,包括语音、 数据和SMS。RILdriver同时也通知无线状态的改变,例如服务区(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个物理串口基础上虚拟多路串口。怎么判断是否支持多路复用? modem用AT+CMUX命令来完成多路复用协议。Cellcore里面Gsm 07.10协议已经提供源码实现mux07_10.dll,默认的虚拟出2个串口COM7和COM9.典型应用中,COM7作为AT命令通道,COM9作为数据通道,这样意味着在gprs状态下语言短信业务有可能可以同时使用,不必退出data模式。如果你的modem本身就已经有2路物理串口,那么710mux驱动是不需要的。如果你的modem并不支持GSM 07.10协议,只有+++退出data模式了。
三:RIL驱动。
710mux驱动之上就是ril驱动了。MS已经抽象了大部分ril驱动的功能,通过了MDD源码,所以写一个ril驱动就是把自己modem相关的代码和MDD链接成一个流驱动rilgsm.dll。ril驱动与串口驱动的最大不同在于,ril是同时支持多个应用使用的,每次open都new一个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(什么叫ioctls)来使用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, ATCI和Assisted tapi这些。 ATCI是保留给应用一条对modem直接发AT命令的管道,但只在wm中有ce并没有包含。Assisted Tapi在ce6的文档仅仅包含tapiRequestMakeCall,按照理解,这个是提供给系统拨号软件之外的第三方软件一个请求拨号的接口,会转发到系统的拨号软件处理。至于connection manager是09年10月发布R3版本中的新增内容,如同wm中的CM模块,这对应用而言是很有吸引力的模块,具有自动完成各种网络连接,自动选择网络,自动重拨,永远在线按需使用等功能,遗憾的是根据我目前实验,因为DMProcessConfigXML在CE无实现,CM配置存在困难,如您有答案不吝赐教。