演练:在台式机应用程序与设备应用程序之间交换数据

更新:2007 年 11 月

在本演练中,您将在数据存储中创建一个设备代理应用程序、一个台式机应用程序以及一个加载项包。台式机应用程序将根据加载项包中的信息部署并启动设备代理。随后,台式机应用程序将与设备代理应用程序交换数据包数据,并在交换完毕后终止。您将完成下列任务:

  • 创建一个托管设备代理应用程序。

  • 为设备代理应用程序创建一个加载项包。

  • 创建一个启动包并与设备代理进行通信的台式机应用程序。

说明:

对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您使用的 Visual Studio 版本及设置。有关更多信息,请参见Visual Studio 设置

创建设备代理应用程序

创建设备代理应用程序

  1. 启动 Visual Studio。

  2. 在“文件”菜单上,指向“新建”,然后单击“项目”。

    将出现“新建项目”对话框。

  3. (Visual C#) 展开“Visual C#”,然后单击“智能设备”。将项目命名为 DeviceAgent 并将解决方案命名为 DataExchange。单击“确定”。

    (Visual Basic) 展开“Visual Basic”,然后单击“智能设备”。将项目命名为 DeviceAgent 并将解决方案命名为 DataExchange。单击“确定”。

    将出现“添加新智能设备项目”对话框。

  4. 选择“Windows Mobile 5.0 Smartphone SDK”作为目标平台,接着在“模板”窗格中单击“控制台应用程序”,然后单击“确定”。

    新的 DeviceAgent 项目随即会显示在“解决方案资源管理器”中。

  5. (Visual C#) 在“解决方案资源管理器”中右击“引用”,再单击“添加引用”。

    (Visual Basic) 在“解决方案资源管理器”中右击“DeviceAgent”,再单击“添加引用”。

    随即出现“添加引用”对话框。

  6. 单击“浏览”选项卡并定位至 驱动器:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Target\Lib。单击 Microsoft.Smartdevice.DeviceAgentTransport.dll,再单击“确定”。

    随即会向项目中添加对 Microsoft.Smartdevice.DeviceAgentTransport 的引用。

  7. 如果 Program.cs (C#) 或 Module1.vb (Visual Basic) 尚未打开,请在“解决方案资源管理器”中双击该文件,以便在代码编辑器中将其打开。

  8. 将光标定位到文件开头。

  9. 插入下列代码:

    using Microsoft.SmartDevice.DeviceAgentTransport;
    
    Imports Microsoft.SmartDevice.DeviceAgentTransport
    
  10. 将光标定位到 Main 方法内部。

  11. 插入下列代码:

    string[] serviceids = {"A92866CA-AE83-4848-9438-501D8DB3CF25"};
    
    IDeviceAgentTransport transport = DeviceAgentTransportFactory.GetAgentTransport();
    
    // Don't keep it waiting.
    transport.AcknowledgeLaunch(1, serviceids);
    
    IDevicePacketStream packetstream;
    
    transport.AcceptConnectionEx(serviceids[0], out packetstream);
    IPacket packet;
    packet = PacketFactory.GetNewPacket();
    packet.WriteInt32(Environment.Version.Major);
    packet.WriteInt32(Environment.Version.Minor);
    packet.WriteInt32(Environment.Version.Build);
    packet.WriteInt32(Environment.Version.Revision);
    packetstream.Write(packet);
    
    Dim serviceids(0 To 0) As String
    serviceids(0) = "A92866CA-AE83-4848-9438-501D8DB3CF25"
    
    Dim transport As IDeviceAgentTransport = DeviceAgentTransportFactory.GetAgentTransport()
    
    ' Don't keep it waiting.
    transport.AcknowledgeLaunch(1, serviceids)
    
    Dim packetstream As IDevicePacketStream
    
    transport.AcceptConnectionEx(serviceids(0), packetstream)
    Dim packet As IPacket
    packet = PacketFactory.GetNewPacket()
    packet.WriteInt32(Environment.Version.Major)
    packet.WriteInt32(Environment.Version.Minor)
    packet.WriteInt32(Environment.Version.Build)
    packet.WriteInt32(Environment.Version.Revision)
    packetstream.Write(packet)
    

    上述代码将创建一个 IDeviceAgentTransport 对象,然后接受来自台式计算机的连接。该程序会向台式计算机发送一个包含 .NET Compact Framework 版本信息的数据包。

  12. 在“生成”菜单上单击“生成解决方案”。

    现在便得到了一个名为 DeviceAgent 的智能设备应用程序。稍后您要将此应用程序部署到设备中。

在数据存储中创建一个加载项包。

在数据存储中创建加载项包

  1. 启动记事本。

  2. 将下面的代码复制到记事本文件中:

    <?xml version="1.0" standalone="no"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:template match="/">
        <ADDONCONTAINER>
          <ADDON>
            <PACKAGECONTAINER>
              <PACKAGE ID="" NAME="DeviceAgent">
                <PROPERTYCONTAINER />
                <PACKAGETYPECONTAINER>
                  <PACKAGETYPE Name="ARMV4I" ID="ARMV4I" Protected="True">
                    <PROPERTYCONTAINER>
                      <PROPERTY ID="RemotePath" Protected="True">%CSIDL_PROGRAM_FILES%\DeviceAgent</PROPERTY>
                      <PROPERTY ID="RootPath" Protected="True">C:\DataExchange\DeviceAgent\bin\Debug</PROPERTY>
                      <PROPERTY ID="CPU" Protected="True">ARMV4I</PROPERTY>
                      <PROPERTY ID="Host" Protected="True">DeviceAgent</PROPERTY>
                    </PROPERTYCONTAINER>
                    <FILECONTAINER>
                      <FILE ID="DeviceAgent.exe" />
                      <FILE ID="Microsoft.Smartdevice.DeviceAgentTransport.dll" />
                      <FILE ID="DeviceAgentTransport.dll" />
                    </FILECONTAINER>
                  </PACKAGETYPE>
                </PACKAGETYPECONTAINER>
              </PACKAGE>
            </PACKAGECONTAINER>
          </ADDON>
        </ADDONCONTAINER>
      </xsl:template>
    </xsl:stylesheet>
    
  3. 在 Visual Studio 中的“工具”菜单上单击“创建 GUID”。

    将出现“创建 GUID”对话框。

  4. 选择“注册表格式”,单击“复制”,再单击“退出”。

  5. 将 GUID 粘贴到记事本内包标记的 ID 属性中,同时移除括在 GUID 两侧的大括号。

    例如,<Package ID="9C50B38D-4259-40b3-AE9F-C5887DD898FF" Name="DeviceAgent">。

  6. 将 <PROPERTY ID="RootPath" Protected="True"> 标记的值更改为 DeviceAgent.exe 所在的文件夹。

    例如,<PROPERTY ID="RootPath" Protected="True">c:\DataExchange\DeviceAgent\bin\debug</PROPERTY>。

    说明:

    若要确定 DeviceAgent.exe 的位置,请在“解决方案资源管理器”中右击“DeviceAgent”项目,再单击“属性”。单击“生成”选项卡,然后单击“输出路径”旁边的“浏览”。

  7. 将 驱动器:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Target\wce400\armv4i\DeviceAgentTransport.dll 库复制到根路径下指定的路径下。

    说明:

    此步骤十分重要,原因是 Microsoft.Smartdevice.DeviceAgentTransport.dll 程序集要使用 DeviceAgentTransport.dll 库。这两个文件必须随我们的应用程序一起部署。

  8. 在记事本中,保存文件。

    \ProgramData\Microsoft\corecon\1.0\addons\package.xsl (Windows Vista)

    \Documents and Settings\All Users\Application Data\Microsoft\corecon\1.0\addons\package.xsl(其他)

    说明:

    如果文件名 package.xsl 已在使用中,请使用其他名称。文件名并不重要,因为该文件夹中的所有文件都将被作为加载项包处理。

  9. 退出并重新启动 Visual Studio。

    Visual Studio 在启动时将加载该加载项包文件夹。如果 Visual Studio 能正常启动,则说明该包没有语法错误。

    数据存储现在包含一个名为 DeviceAgent 的加载项包以及一个由 Visual Studio 唯一生成的 ID。部署该包时,智能设备连接 API 会将三个文件从 DeviceAgent 项目的输出文件夹复制到设备的 驱动器:\Program File\DeviceAgent 目录下,然后在设备上执行 DeviceAgent.exe。

创建部署包并与设备代理进行通信的台式机应用程序

创建部署包并与设备代理进行通信的台式机应用程序

  1. 在 Visual Studio 中的“文件”菜单上,指向“打开”,然后单击“项目/解决方案”。

    将出现“打开项目”对话框。

  2. 定位至 DataExchange.sln 解决方案,单击它,再单击“打开”。

    将出现“解决方案资源管理器”,其中会显示 DeviceAgent 应用程序。

  3. 在“文件”菜单上指向“添加”,然后单击“新建项目”。

    将出现“新建项目”对话框。

  4. (Visual C#) 展开“Visual C#”,然后单击“Windows”。

    (Visual Basic) 展开“Visual Basic”,然后单击“Windows”。

  5. 在“模板”窗格中单击“控制台应用程序”。

  6. 将项目命名为 DesktopSide,然后单击“确定”。

    “解决方案资源管理器”现在包含两个项目:DeviceAgent 和 DesktopSide。

  7. 在“解决方案资源管理器”中右击“DesktopSide”项目,再单击“设为启动项目”。

  8. (Visual C#) 在“解决方案资源管理器”中的 DesktopSide 项目中右击“引用”,再单击“添加引用”。

    (Visual Basic) 在“解决方案资源管理器”中右击“DesktopSide”,再单击“添加引用”。

    随即出现“添加引用”对话框。

  9. 单击“浏览”选项卡,定位至 驱动器:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Bin,单击 Microsoft.Smartdevice.Connectivity.dll,再单击“确定”。

    随即会向 DesktopSide 项目中添加对 Microsoft.Smartdevice.Connectivity 的引用。

  10. 如果 Program.cs (C#) 或 Module1.vb (Visual Basic) 尚未打开,请在“解决方案资源管理器”中的“DesktopSide”项目中双击该文件,以便在代码编辑器中将其打开。

  11. 将光标定位到文件开头。

  12. 插入下列代码:

    using Microsoft.SmartDevice.Connectivity;
    using System.Collections.ObjectModel;
    
    Imports Microsoft.SmartDevice.Connectivity
    Imports System.Collections.ObjectModel
    
  13. 将光标定位到 Main 方法内部。

  14. 插入下列代码:

    // Change the locale ID to correspond to your installation of Visual Studio.
    DatastoreManager dsmgr = new DatastoreManager(1033);
    Platform platform = GetPlatformByName("Windows Mobile 5.0 Smartphone SDK", dsmgr);
    Device emulator = platform.GetDevice(platform.GetDefaultDeviceId());
    emulator.Connect();
    // Add the GUID of your package below.
    RemoteAgent ra = emulator.GetRemoteAgent(new ObjectId(""));
    ra.Start("command line argument");
    DevicePacketStream ps = ra.CreatePacketStream(new ObjectId("A92866CA-AE83-4848-9438-501D8DB3CF25"));
    Packet packet;
    packet = new Packet();
    while (ps.IsConnected())
    {
        if (ps.IsPacketAvailable())
        {
            packet = ps.Read();
            while (!packet.IsEndOfPacket())
            {
                switch (packet.ReadDataType())
                {
                    case DataType.Int32Type:
                        Console.WriteLine("Int32Type:  " + packet.ReadInt32().ToString());
                        break;
                    case DataType.StringType:
                        Console.WriteLine("String:  " + packet.ReadString());
                        break;
                    default:
                        break;
                }
            }
            break;
        }
    }
    Console.Read();
    
    ' Change the locale ID to correspond to your installation of Visual Studio.
    Dim dsmgr As New DatastoreManager(1033)
    Dim platform As Platform = GetPlatformByName("Windows Mobile 5.0 Smartphone SDK", dsmgr)
    Dim emulator As Device = platform.GetDevice(platform.GetDefaultDeviceId())
    emulator.Connect()
    ' Add the GUID of your package below.
    Dim ra As RemoteAgent = emulator.GetRemoteAgent(New ObjectId(""))
    ra.Start("command line argument")
    Dim ps As DevicePacketStream = ra.CreatePacketStream(New ObjectId("A92866CA-AE83-4848-9438-501D8DB3CF25"))
    Dim packet As Packet
    packet = New Packet()
    While ps.IsConnected()
        If ps.IsPacketAvailable() Then
            packet = ps.Read()
            While Not packet.IsEndOfPacket()
                Select Case packet.ReadDataType()
                    Case DataType.Int32Type
                        Console.WriteLine("Int32Type:  " + packet.ReadInt32().ToString())
                    Case DataType.StringType
                        Console.WriteLine("String:  " + packet.ReadString())
                    Case Else
                End Select
            End While
            Exit While
        End If
    End While
    Console.Read()
    

    上述代码将连接至 Windows Mobile 5.0 仿真程序,并将远程代理部署到设备中。随后,它将建立与设备间的连接并读取数据包数据。从设备中读取的信息将显示在控制台中。

  15. 将包 ID 添加到 emulator.GetRemoteAgent(new ObjectId("")) 中。

    例如,emulator.GetRemoteAgent(new ObjectId("F85E57BA-5AE9-4FF7-8433-6AB7D991D034"))

  16. 将下面的帮助器方法粘贴在 Main 方法之下:

    // Return a platform if the supplied name can be found in the datastore.  
    // Return null pointer if platform cannot be found.
    private static Platform GetPlatformByName(string p, DatastoreManager dsmgr)
    {
        // Get all platforms in the datastore.
        Collection<Platform> platforms = dsmgr.GetPlatforms();
    
        // Find the platform whose name matches the parameter.
        foreach (Platform platform in platforms)
        {
            if (platform.Name == p) return platform;
        }
        return null;
    }
    
    ' Return a platform if the supplied name can be found in the datastore.  
    ' Return null pointer if platform cannot be found.
    Private Function GetPlatformByName(ByVal p As String, ByVal dsmgr As DatastoreManager) As Platform 
        ' Get all platforms in the datastore.
        Dim platforms As Collection(Of Platform) = dsmgr.GetPlatforms()
    
        ' Find the platform whose name matches the parameter.
        Dim platform As Platform
        For Each platform In  platforms
            If platform.Name = p Then
                Return platform
            End If
        Next platform
        Return Nothing
    
    End Function 'GetPlatformByName
    
  17. 按 F5 调试 DesktopSide 项目。

    DesktopSide 将连接仿真程序,如果仿真程序尚未启动,则将其启动。接下来,它将部署包并启动 DeviceAgent 应用程序。随后,DesktopSide 和 DeviceAgent 将交换数据包信息,并将信息显示给用户。

请参见

概念

通过智能设备连接 API 控制设备

加载项包概述

其他资源

智能设备连接 API 参考

Smart Device Connectivity API Samples(智能设备连接 API 示例)