Connection Manager in Window Mobile(1)

(给我们家还没出生的虎宝,祝他健健康康,平平安安的来到这个新世界)

欢迎转载,但请标明出处~~谢谢。

 

      最近因为工作需要,整理了一下WM下的ConnMgr的相关资料。觉得应该要详细的写下来,主要目的是给自己以后复习用,如果对大家有帮助的话,也是最好。

 

      Windows Mobile很早就有ConnMgr这个东西了,大家在“设置”里面一定也见过这个名为"连接"的东西,但是估计不是很理解,这里面的配置到底是什么意思…呵呵,我也一样,很长时间都没有搞清楚…

 

     其实整个WM平台来讲,已经有很多的组件在使用ConnMgr了:比如电话组件就是使用ConnMgr拨出语音电话的(Phone->ConnMgr->cspvoice->TAPI->TSP->RIL);再比如ActiveSync也会使用这个ConnMgr;还有最典型的就是我们的IE了,大家如果用我们的WM上网的话,打开IE,输入个地址栏,可以看到系统自动就去拨号了…

 

好吧,在深入讲解之前,先来澄清几个概念:

clip_image002[1]

我们先定义几个个名字:

1. connection,大家可以看看上边这张图,"My Connection”就是一个connection。这个链接一看就知道是使用CMNET拨号上网的…呵呵。

clip_image004[1]

2. 再来定义一个名字叫做meta network,呵呵,这个名字是MS的人自己说的,也不是我发明的。就是上面大家看到的My ISP和My Work Network。

 

     MS的将一组相同特征网络称之为Meta Network。比较难以理解是把,其实就是说不管你有多少个网络,也不管这个网络是干啥的,总是要么比如说是链接到internet的,要么比如说是链接到公司内网的,要么比如说是链接到wap网络。所以无论什么connection最终都是链接到某一个meta network的…

 

     MS自己也定义了四个标准的meta Network,分别是internet, work, wap, secure wap四个。所有的meta network都是由一个GUID唯一区别的。

等等,那上面的那个My ISP和My Work Network跑到哪里去了呢? 呵呵,这两个其实不但是个meta network,同时还是个NULL Proxy。

哈多了个新概念嘛,啥是NULL Proxy呢?具体来讲,就是定了两个网络,比如网络1和网络2,然后我说网络1和网络2是一样的网络,网络2是网络1的马甲啦~~。看一眼下面的XML你就理解了:

<wap-provisioningdoc>

<characteristic type="CM_ProxyEntries" recursive="true">

<characteristic type="null-corp-{18AD9FBD-F716-ACB6-FD8A-1965DB95B814}">

<parm name="SrcId" value="{18AD9FBD-F716-ACB6-FD8A-1965DB95B814}"/>

<parm name="DestId" value="{A1182988-0D73-439E-87AD-2A5B369F808B}"/>

<parm name="Proxy" value=""/>

<parm name="Override" value=""/>

<parm name="Enable" value="1"/>

<parm name="Type" value="0"/>

<parm name="Username" value=""/>

<parm name="Password" value=""/>

<parm name="ExtraInfo" value=""/>

</characteristic>

<characteristic type="HTTP-{ADB0B001-10B5-3F39-27C6-9742E785FCD4}">

<parm name="SrcId" value="{ADB0B001-10B5-3F39-27C6-9742E785FCD4}"/>

<parm name="DestId" value="{436EF144-B4FB-4863-A041-8F905A62C572}"/>

<parm name="Proxy" value=""/>

<parm name="Override" value=""/>

<parm name="Enable" value="1"/>

<parm name="Type" value="0"/>

<parm name="Username" value=""/>

<parm name="Password" value=""/>

<parm name="ExtraInfo" value=""/>

</characteristic>

</characteristic>

</wap-provisioningdoc>

(这些XML从哪里来的?我简单说一下,是从DMProcessXML查询来的,那么DMProcessXML是啥啊,呵呵,这个嘛,可以自己查一下文档嘛…)

    大家可以看到了吧,这里有一个叫SrcId,一个叫DestId,然后呢SrcId其实是指偶们的My ISP和My Work Network的GUID,然后DestId其实就是MS定义的Internet和Work的meta Network的GUID。所以说My ISP是Internet的马甲,My Work Network是work的马甲罗。

哎呀,MS变态伐,这样设计把人搞晕了,到底为啥要这么设计呢…以下是本人猜想,不负任何责任。

 

     我能想到的一个还算有点用的场景就是: 比如你在中国用的是中国移动啦,然后中国移动有两个APN,一个是CMNET,一个是CMWAP,好吧,你在My ISP里面建立了两个connection,一个链接CMNET,一个链接CMWAP。然后你出国了,到了伟大的美利坚合众国,你只能漫游了嘛,假设你相当的有钱,准备在美利坚合众国上网浏览,这个时候,比如说T-MOBILE会说,你的CMNET和CMWAP都不能用了嘛,T-MOBILE有三个APN,比如说叫:TT1,TT2,TT3,然后三个APN的价钱各不相同,速度也不一样,这个时候,你就可以新建一个Network,叫My ISP2,然后在里面建三个connection,各连不同的APN,然后再上面那张图那里,把原来的My ISP换成My ISP2,接着当应用程序要拨号的时候,你就可以发现,应用程序竟然不去拨cmwap和cmnet了,它们竟然能够拨TT1,TT2,TT3了。又比如说你发现T-MOBILE的信号那是相当的差,比中国移动至少要差,经常没信号,没信号的时候你的手机自动漫游到了AT&T上去了,AT&T和T-MOBILE的APN又不一样的,真麻烦啊,现在你需要建立一个新的网络,比如叫做My ISP3,然后为AT&T再建立两个connection,好吧,在T-MOBILE没信号的地方,我就用My ISP3,不然我就用My ISP2,回国我就用My ISP,整个世界清净了…当然你也可以把My ISP这样丑陋的名字换掉,比如叫CMCC;T-MOBILE;AT&T,多一目了然…高级吧~~~当然前提是你理解了这种思维方式…呵呵。

 

     好吧,介绍完上面两个概念之后,我们需要来看一下ConnMgr的构成了,MS提供了一组ConnMgr的API函数用来做相关的操作,这组API本身是由CellCore.dll导出的,但是ConnMgr的实体其实是叫ConnMgr.exe,大家如果用Remote Process查看一下的话,就能够发现这是个进程了,狡猾狡猾的…

     ConnMgr本身会去加载很多CSP,这里所谓的CSP(Connection Serivce Provider)其实在我看来就是个中介,比如如果ConnMgr发现现在是一个语音请求的话,会调用cspvoice.dll,这个dll会再去调用TAPI的接口函数,又比如如果现在是一个PPP拨号的请求的话,我们会走cspras.dll,这个dll会再去调用ppp的相关函数了。

     除了这些中介公司之外,还有一个智能逻辑在ConnMgr里面,这个就是Connection Planner这个模组了,这个模组负责基于某些策略选择目前应用程序最需要的一个connection,连接到我们的Dest Meta Network上面去。后面我们会讲到应用程序提供一个需要链接的URL,而这个Connection Planner就会找出一个GUID给我们的应用程序。

     最后一个ConnMgr的模组是我们的AutoBind LSP,这玩意是干嘛的呢,简单来讲就是帮助应用程序的socket自动绑定到目前应用程序的数据链接的IP上去的。(汗,这句话很拗口啊,回头我们会详细解释这句很拗口的话de…)

 

好,现在来复习一下,目前为止,我们讲了些啥东西:

1. 你应该知道了有ConnMgr的存在

2. 你应该知道了connection和meta network各是个啥东东(可能还不是特别理解)

3. 你应该知道了ConnMgr的组成部分:

                            API接口; ConnMgr.exe; CSP中介(一大堆); Connection Planner; AutoBind LSP

嗯,good,后面我们就会来看看app怎么来调用ConnMgr,以及为啥我要调用ConnMgr,而不是直接调用更底层的api呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值