用过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地址算出一个来。
如何让ActiveSync直接支持Ethernet连接[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows CE ServicesPartners]
如何让ActiveSync直接支持Ethernet连接    
"PCur"=dword:00000001
如何让ActiveSync直接支持Ethernet连接    
"Connectoid"="Network Connection"
如何让ActiveSync直接支持Ethernet连接    
"AutoDisc"=dword:00000000
如何让ActiveSync直接支持Ethernet连接
如何让ActiveSync直接支持Ethernet连接[HKEY_LOCAL_MACHINE
SOFTWAREMicrosoftWindows CE ServicesPartnersP1]
如何让ActiveSync直接支持Ethernet连接    
"PName"="sting"
如何让ActiveSync直接支持Ethernet连接    
"PId"=dword:67454d7f
如何让ActiveSync直接支持Ethernet连接
如何让ActiveSync直接支持Ethernet连接[HKEY_LOCAL_MACHINE
Windows CE ServicesSynchronizationObjectsFile]
如何让ActiveSync直接支持Ethernet连接    
"Store"="cefobj.dll"

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直接支持Ethernet连接[HKEY_CURRENT_USER"Software"Microsoft"Windows CE Services]
如何让ActiveSync直接支持Ethernet连接
"ConnectTypesAllowed"=dword:00000004
如何让ActiveSync直接支持Ethernet连接
如何让ActiveSync直接支持Ethernet连接[HKEY_CURRENT_USER
"Software"Microsoft"Windows CE Services"Partners"$PARTNERID$]
如何让ActiveSync直接支持Ethernet连接
"Schedule Option"=dword:00000000
如何让ActiveSync直接支持Ethernet连接
"DisplayName"="$DISPLAY_NAME$"
如何让ActiveSync直接支持Ethernet连接
"DeviceType"="$DEVICE_TYPE$"
如何让ActiveSync直接支持Ethernet连接
"Description"=""
如何让ActiveSync直接支持Ethernet连接
"DataFolder"="$PARTNER_PROFILE_PATH$"
如何让ActiveSync直接支持Ethernet连接
"Processor"=""
如何让ActiveSync直接支持Ethernet连接
"ProcessorType"=dword:$PROCESSOR_TYPE$
如何让ActiveSync直接支持Ethernet连接
"OemInfo"="$OEM_INFO$"
如何让ActiveSync直接支持Ethernet连接
"TotalSize"=dword:00000000
如何让ActiveSync直接支持Ethernet连接
"Version"=dword:038c0a04
如何让ActiveSync直接支持Ethernet连接
"Capabilities"=dword:00000110
如何让ActiveSync直接支持Ethernet连接
"ServerMajor"=dword:00000000
如何让ActiveSync直接支持Ethernet连接
"ServerMinor"=dword:00000000
如何让ActiveSync直接支持Ethernet连接
"PimsInstalled"=dword:00000000
[HKEY_CURRENT_USER"Software"Microsoft"Windows CE Services"Partners"$PARTNERID$]键下的filters设置用网上找来的默认的就可以。这样partnership就建立好了。建立ActiveSync连接的时候在设备端命令行输入:
如何让ActiveSync直接支持Ethernet连接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的免费软件我没找到,不想花钱的话可能需要自己写一个。

相关文章:

  • 2021-09-08
  • 2022-02-01
  • 2021-04-20
  • 2021-07-14
  • 2021-07-07
  • 2021-09-01
  • 2021-07-02
  • 2021-04-08
猜你喜欢
  • 2021-05-20
  • 2021-05-31
  • 2022-12-23
  • 2018-10-18
  • 2021-10-31
  • 2022-02-04
  • 2021-09-08
相关资源
相似解决方案