Share via


연습: 데스크톱 및 장치 응용 프로그램 사이에서 데이터 교환

업데이트: 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. 찾아보기 탭을 클릭하고 drive:\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를 메모장에서 Package 태그의 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. drive:\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 프로젝트의 출력 폴더에서 장치의 drive:\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. 찾아보기 탭을 클릭하고 drive:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Bin, click Microsoft.Smartdevice.Connectivity.dll로 이동한 다음 확인을 클릭합니다.

    Microsoft.Smartdevice.Connectivity에 대한 참조가 DesktopSide 프로젝트에 추가됩니다.

  10. 아직 열려 있지 않은 경우 솔루션 탐색기에서 DesktopSide 프로젝트의 Program.cs(C#) 또는 Module1.vb(Visual Basic)를 두 번 클릭하여 코드 편집기에서 파일을 엽니다.

  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 참조

스마트 장치 연결 API 샘플