用过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
Windows CE Services
Partners]
"
PCur
"
=
dword:
00000001
"
Connectoid
"
=
"
Network Connection
"
"
AutoDisc
"
=
dword:
00000000

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

[HKEY_LOCAL_MACHINE
Windows CE Services
Synchronization
Objects
File]
"
Store
"
=
"
cefobj.dll
"
2,在主机端配置注册表。主机端partnership的大致注册表配置在网上可以找到,比如 这儿就有一份。当然那些不能直接拿来用,还必须修改一些设备特定的设置。经过简单的研究,我发现ActiveSync的主机端程序在TCP端口5679上监听,设备端发起Ethernet连接请求时会把这些设置信息在一个packet里发过来。主机端则根据这些信息对设备进行认证,通过后建立连接。packet格式经分析如下:
struct
SyncInfoPacket
{
DWORD unused; // +00
DWORD dwPacketSize; // +04, =sizeof(packet)+4
DWORD cbSize; // +08, 0x00000024
union {
DWORD dwOSVersion; // +0c
struct {
BYTE bMajorVer;
BYTE bMinorVer;
WORD wBuildNumber;
};
};
DWORD dwProcessorType; // +10,
DWORD dwFlags; // +14
DWORD PId1; // +18
DWORD PId2; // +1c
DWORD dwOffsetDevName; // +20, 0x00000024
DWORD dwOffsetDevType; // +24
DWORD dwOffsetOemInfo; // +28
// WCHAR pDevName[];
// WCHAR pDevType[];
// WCHAR pOemInfo[];
}
;
有了这个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
/Windows CE Services]
"
ConnectTypesAllowed
"
=
dword:
00000004

[HKEY_CURRENT_USER
/Software/
Microsoft/
Windows CE Services
/Partners
/$
PARTNERID
$
]
"
Schedule Option
"
=
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/
Windows CE Services
/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的免费软件我没找到,不想花钱的话可能需要自己写一个。
我个人一直觉得这不是一个合理的设计。比如就我们的设备而言,虽然正式的产品不支持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)+ dwOffsetDevName)
$DEVICE_TYPE$ = pSyncPacket+sizeof( SyncPacket)+ dwOffsetDevType)
$OEM_INFO$ = pSyncPacket+sizeof( SyncPacket)+ dwOffsetOemInfo)
$ PROCESSOR_TYPE $= dwProcessorType
$PARTNER_PROFILE_PATH$ =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的免费软件我没找到,不想花钱的话可能需要自己写一个。