Under the hood

互联网上新生活
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

如何让ActiveSync直接支持Ethernet连接

Posted on 2008-10-16 11:06  sting feng  阅读(917)  评论(0编辑  收藏  举报
用过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_MACHINESOFTWAREMicrosoftWindows CE ServicesPartners]
    
"PCur"=dword:00000001
    
"Connectoid"="Network Connection"
    
"AutoDisc"=dword:00000000

[HKEY_LOCAL_MACHINE
SOFTWAREMicrosoftWindows CE ServicesPartnersP1]
    
"PName"="sting"
    
"PId"=dword:67454d7f

[HKEY_LOCAL_MACHINE
Windows CE ServicesSynchronizationObjectsFile]
    
"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的免费软件我没找到,不想花钱的话可能需要自己写一个。