我个人一直觉得这不是一个合理的设计。比如就我 们的设备而言,虽然正式的产品不支持ActiveSync,但是由于有些第三方driver只能通过ActiveSync安装,所以有的时候还不能不用。 麻烦在于我们的设备只能作USB host,不能作USB device,USB连接不能用;Serial port也只有一个,已经被用作debug输出,也不能用。这种情况下,要支持ActiveSync只能用Ethernet连接。
这篇文章要介绍 的是在serial和USB连接都不能用的情况下,如何直接建立Ethernet连接。这个问题其实等价于如何在设备和主机之间建立一个合法的 partnership。有了partnership,设备和主机以后就可以直接通讯了。从实现上来看,partnership是一些存在设备端和主机端 的注册表配置,设备端和主机端程序利用这些配置信息进行认证和同步。以下是建立partnership的一些步骤:
1,在设备端创建注册表。其中PName为你要连接的主机名,PId可以自己指定一个,和别人的不冲突就行,比如可以通过网卡的MAC地址算出一个来。
2,在主机端配置注册表。主机端partnership的大致注册表配置在网上可以找到,比如这儿就 有一份。当然那些不能直接拿来用,还必须修改一些设备特定的设置。经过简单的研究,我发现ActiveSync的主机端程序在TCP端口5679上监听, 设备端发起Ethernet连接请求时会把这些设置信息在一个packet里发过来。主机端则根据这些信息对设备进行认证,通过后建立连接。packet 格式经分析如下:
有了这个packet的数据,我们就可以在主机端建立partnership了。首先要在主机端手工建立一个Data Folder,比如我的主机名为sting,设备名为MoonNight,则Data Folder为:
C:"Documents and Settings"sting"Application Data"Microsoft"ActiveSync"Profiles"MoonNight
要配置的注册表大约有这么几项:
$PARTNERID$ =PId1
$DISPLAY_NAME$ = pSyncPacket+sizeof(SyncPacket)+=Data Folder路径
这种方法也有一些局限性。一个是ActiveSync在4.0版本以后就不再支持Ethernet连接了,因此要用这种方法只能装 ActiveSync 3.7或3.8。还有一个,如果你打了Windows CE 5.0的2005 Q2 patch,Ethernet也不能正常工作。原因是这个patch改了一些ActiveSycn的bug的同时又导入了一个愚蠢的bug-repllog.exe在调用socket API前没有用WSAStartup进行初始化!真是令人FT。微软的同志们看到这篇文章的赶紧叫你们的WinCE Team改BUG啊。
鉴 于ActiveSync现在已经不再直接支持Ethernet,这个问题比较理想的解决方案其实是利用虚拟串口-在设备端和主机端各虚拟出一个串 口,ActiveSync程序连接到虚拟串口,虚拟串口再通过网络和另外一端进行通信。PC上的虚拟串口转Ethernet的软件很多,这儿就有一个免费的。CE上的虚拟串口转Ethernet的免费软件我没找到,不想花钱的话可能需要自己写一个。