如何让ActiveSync直接支持Ethernet连接

用过ActiveSync 连接Windows CE设备和PC的同学都知道,相对于Serial、USB等连接方式,Ethernet连接是个后娘养的孩子-微软出于某种考虑,让Ethernet连接方式在能够使用之前必须先用Seiral或者USB在设备和主机之间建立partnership。
我个人一直觉得这不是一个合理的设计。比如就我们的设备而言,虽然正式的产品不支持ActiveSync,但是由于有些第三方driver只能通过ActiveSync安装,所以有的时候还不能不用。麻烦在于我们的设备只能作USB host,不能作USB device,USB连接不能用;Serial port也只有一个,已经被用作debug输出,也不能用。这种情况下,要支持ActiveSync只能用Ethernet连接。
这篇文章要介绍的是在serial和USB连接都不能用的情况下,如何直接建立Ethernet连接。这个问题其实等价于如何在设备和主机之间建立一个合法的partnership。有了partnership,设备和主机以后就可以直接通讯了。从实现上来看,partnership是一些存在设备端和主机端的注册表配置,设备端和主机端程序利用这些配置信息进行认证和同步。以下是建立partnership的一些步骤:
1,在设备端创建注册表。其中PName为你要连接的主机名,PId可以自己指定一个,和别人的不冲突就行,比如可以通过网卡的MAC地址算出一个来。
[HKEY_LOCAL_MACHINE SOFTWARE Microsoft WindowsCEServices Partners]
" PCur " = dword: 00000001
" Connectoid " = " NetworkConnection "
" AutoDisc " = dword: 00000000

[HKEY_LOCAL_MACHINE
SOFTWARE Microsoft WindowsCEServices Partners P1]
" PName " = " sting "
" PId " = dword:67454d7f

[HKEY_LOCAL_MACHINE
WindowsCEServices Synchronization Objects File]
" Store " = " cefobj.dll "

2,在主机端配置注册表。主机端partnership的大致注册表配置在网上可以找到,比如 这儿就有一份。当然那些不能直接拿来用,还必须修改一些设备特定的设置。经过简单的研究,我发现ActiveSync的主机端程序在TCP端口5679上监听,设备端发起Ethernet连接请求时会把这些设置信息在一个packet里发过来。主机端则根据这些信息对设备进行认证,通过后建立连接。packet格式经分析如下:
struct SyncInfoPacket ... {
DWORDunused;
//+00
DWORDdwPacketSize;//+04,=sizeof(packet)+4
DWORDcbSize;//+08,0x00000024
union...{
DWORDdwOSVersion;
//+0c
struct...{
BYTEbMajorVer;
BYTEbMinorVer;
WORDwBuildNumber;
}
;
}
;
DWORDdwProcessorType;
//+10,
DWORDdwFlags;//+14
DWORDPId1;//+18
DWORDPId2;//+1c
DWORDdwOffsetDevName;//+20,0x00000024
DWORDdwOffsetDevType;//+24
DWORDdwOffsetOemInfo;//+28
//WCHARpDevName[];
//WCHARpDevType[];
//WCHARpOemInfo[];
}
;

有了这个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)+ dwOffsetDevName)
$DEVICE_TYPE$ = pSyncPacket+sizeof( SyncPacket)+ dwOffsetDevType)
$OEM_INFO$ = pSyncPacket+sizeof( SyncPacket)+ dwOffsetOemInfo)
$ PROCESSOR_TYPE $= dwProcessorType
$PARTNER_PROFILE_PATH$ =Data Folder路径
[HKEY_CURRENT_USER \Software \Microsoft \WindowsCEServices]
" ConnectTypesAllowed " = dword: 00000004

[HKEY_CURRENT_USER
\Software\ Microsoft\ WindowsCEServices \Partners \$ PARTNERID $ ]
" ScheduleOption " = dword: 00000000
" DisplayName " = " $DISPLAY_NAME$ "
" DeviceType " = " $DEVICE_TYPE$ "
" Description " = ""
" DataFolder " = " $PARTNER_PROFILE_PATH$ "
" Processor " = ""
" ProcessorType " = dword: $ PROCESSOR_TYPE $
" OemInfo " = " $OEM_INFO$ "
" TotalSize " = dword: 00000000
" Version " = dword:038c0a04
" Capabilities " = dword: 00000110
" ServerMajor " = dword: 00000000
" ServerMinor " = dword: 00000000
" PimsInstalled " = dword: 00000000
[HKEY_CURRENT_USER \Software\ Microsoft\ WindowsCEServices \Partners \$ PARTNERID $ ]键下的filters设置用网上找来的默认的就可以。这样partnership就建立好了。建立ActiveSync连接的时候在设备端命令行输入:
repllog / remote

这种方法也有一些局限性。一个是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的免费软件我没找到,不想花钱的话可能需要自己写一个。

你可能感兴趣的:(windows,socket,Microsoft,WinCE)