Gewusst wie: Übertragen von Dateien über eine Infrarotverbindung

Aktualisiert: November 2007

.NET Compact Framework stellt Klassen für die Infrarotkommunikation zwischen Geräten bereit. In diesem Beispiel wird veranschaulicht, wie Dateien per Infrarotkommunikation zwischen Geräten gesendet und empfangen werden. Sie benötigen zwei Pocket PCs, einen, von dem die Datei gesendet wird, um einen, der die Datei empfängt.

In diesem Beispiel wird eine Instanz von IrDAClient erstellt und die zugehörige DiscoverDevices-Methode verwendet, um Infrarotgeräte innerhalb des Bereichs zu ermitteln. Diese Methode gibt ein Array von IrDADeviceInfo-Objekten zurück, die Informationen zu den einzelnen Geräten bereitstellen.

In diesem Beispiel wird Code für das Senden und Empfangen einer Datei mithilfe der Schaltflächen Send und Receive bereitgestellt. Sie müssen mindestens eine Anwendung zum Senden für ein Gerät und eine Anwendung zum Empfangen für das andere Gerät erstellen.

Eine Datei kann über die Schaltfläche Send nur an ein Gerät gesendet werden, das für entsprechende Anforderungen empfangsbereit ist. Daher muss auf dem empfangenden Gerät auf die Schaltfläche Receive getippt werden, bevor auf dem sendenden Gerät auf die Schaltfläche Send getippt wird. Die folgenden Aufgaben sind auszuführen:

  • Rufen Sie einen Stream der zu sendenden Datei ab.

  • Erstellen Sie eine IrDAClient-Instanz mit dem Dienstnamen, der für diese Anwendung festgelegt wurde. Infrarotverbindungen werden erstellt, indem ein Dienstname angegeben wird. Dabei kann es sich um einen beliebigen Wert handeln, vorausgesetzt, alle beteiligten Geräte verweisen auf denselben Namen. Der Dienstname in diesem Beispiel lautet "IrDATest".

  • Lesen Sie den Stream der Datei in den IrDAClient-Stream, der die Datei sendet.

Die Schaltfläche Receive erstellt für die Überwachung des Geräts eine IrDAListener-Instanz mit demselben Dienstnamen, den auch die IrDAClient-Instanz des sendenden Geräts verwendet.

Die folgenden Aufgaben sind auszuführen:

  • Erstellen Sie einen Stream für das Schreiben des übertragenen Inhalts in eine empfangende Datei im Ordner Eigene Dateien.

  • Erstellen Sie eine IrDAEndPoint-Instanz mit der Geräte-ID und dem Dienstnamen für das sendende Gerät.

  • Erstellen Sie eine IrDAListener-Instanz aus der IrDAEndPoint-Instanz, und starten Sie den Überwachungsdienst.

  • Erstellen Sie mit der AcceptIrDAClient-Methode eine IrDAClient-Instanz aus der IrDAListener-Instanz.

  • Lesen Sie den zugrunde liegenden Stream der IrDAClient-Instanz, der die Daten der übertragenen Datei enthält.

  • Schreiben Sie diesen Datenstream in den Stream für die Datei Receive.txt.

So erstellen Sie die Anwendungen

  1. Erstellen Sie eine Pocket PC-Anwendung für das sendende Gerät, und fügen Sie dem Formular eine Schaltfläche hinzu. Nennen Sie die Schaltfläche Send.

  2. Erstellen Sie im Ordner Eigene Dateien eine Datei mit dem Namen Send.txt.

  3. Fügen Sie dem Click-Ereignis der Schaltfläche Send folgenden Code hinzu.

    ' Align the infrared ports of the devices.
    ' Click the Receive button first, then click Send.
    Private Sub SendButton_Click(sender As Object, e As System.EventArgs) _
        Handles SendButton.Click
    
        Dim irClient As New IrDAClient()
        Dim irServiceName As String = "IrDATest"
        Dim irDevices() As IrDADeviceInfo
        Dim buffersize As Integer = 256
    
        ' Create a collection of devices to discover.
        irDevices = irClient.DiscoverDevices(2)
    
        ' Show the name of the first device found.
        If irDevices.Length = 0 Then
            MessageBox.Show("No remote infrared devices found.")
            Return
        End If
    
        Try
            Dim irEndP As New IrDAEndPoint(irDevices(0).DeviceID, _
                irServiceName)
            Dim irListen As New IrDAListener(irEndP)
            irListen.Start()
            irClient = irListen.AcceptIrDAClient()
            MessageBox.Show("Connected!")
    
        Catch exSoc As SocketException
             MessageBox.Show("Couldn't listen on service " & irServiceName & ": " _
                & exSoc.ErrorCode)
        End Try
    
        ' Open a file to send and get its stream.
        Dim fs As Stream
        Try
            fs = New FileStream(".\My Documents\send.txt", FileMode.Open)
        Catch exFile As Exception
            MessageBox.Show("Cannot open " & exFile.ToString())
            Return
        End Try
    
        ' Get the underlying stream of the client.
        Dim baseStream As Stream = irClient.GetStream()
    
        ' Get the size of the file to send
        ' and write its size to the stream.
        Dim length As Byte() = BitConverter.GetBytes(fs.Length)
        baseStream.Write(length, 0, length.Length)
    
        ' Create a buffer for reading the file.
        Dim buffer(buffersize) As Byte
    
        Dim fileLength As Integer = CInt(fs.Length)
    
        Try
            ' Read the file stream into the base stream.
            While fileLength > 0
                Dim numRead As Int64 = fs.Read(buffer, 0, buffer.Length)
                baseStream.Write(buffer, 0, numRead)
                fileLength -= numRead
            End While
            MessageBox.Show("File sent")
        Catch exSend As Exception
            MessageBox.Show(exSend.Message)
        End Try
    
        fs.Close()
        baseStream.Close()
        irClient.Close()
    End Sub
    
    // Align the infrared ports of the devices.
    // Click the Receive button first, then click Send.
    private void SendButton_Click(object sender, System.EventArgs e)
    {
        IrDAClient irClient = new IrDAClient();
        string irServiceName = "IrDATest";
        IrDADeviceInfo[] irDevices;
        int buffersize = 256;
    
        // Create a collection of devices to discover.
        irDevices = irClient.DiscoverDevices(2);
    
        // Show the name of the first device found.
        if ((irDevices.Length == 0)) 
        {
            MessageBox.Show("No remote infrared devices found.");
            return;
        }
        try 
        {
            IrDAEndPoint irEndP = 
                new IrDAEndPoint(irDevices[0].DeviceID, irServiceName);
            IrDAListener irListen = new IrDAListener(irEndP);
            irListen.Start();
            irClient = irListen.AcceptIrDAClient();
            MessageBox.Show("Connected!");
        }
        catch (SocketException exSoc) 
        {
            MessageBox.Show(("Couldn\'t listen on service "
                            + (irServiceName + (": " + exSoc.ErrorCode))));
        }
    
        // Open a file to send and get its stream.
        Stream fs;
        try 
        {
            fs = new FileStream(".\\My Documents\\send.txt", FileMode.Open);
        }
        catch (Exception exFile) 
        {
            MessageBox.Show(("Cannot open " + exFile.ToString()));
            return;
        }
    
        // Get the underlying stream of the client.
        Stream baseStream = irClient.GetStream();
    
        // Get the size of the file to send
        // and write its size to the stream.
        byte[] length = BitConverter.GetBytes(fs.Length);
        baseStream.Write(length, 0, length.Length);
    
        // Create a buffer for reading the file.
        byte[] buffer = new byte[buffersize];
        int fileLength = (int) fs.Length;
        try 
        {
            // Read the file stream into the base stream.
            while ((fileLength > 0)) 
            {
                Int64 numRead = fs.Read(buffer, 0, buffer.Length);
                baseStream.Write(buffer, 0, Convert.ToInt32(numRead));
                fileLength = (fileLength - Convert.ToInt32(numRead));
            }
            MessageBox.Show("File sent");
        }
        catch (Exception exSend) 
        {
            MessageBox.Show(exSend.Message);
        }
        fs.Close();
        baseStream.Close();
        irClient.Close();
    }
    
    
  4. Erstellen Sie eine Pocket PC-Anwendung für das empfangende Gerät, und fügen Sie dem Formular eine Schaltfläche hinzu. Nennen Sie die Schaltfläche Receive.

  5. Fügen Sie dem Click-Ereignis der Schaltfläche Receive folgenden Code hinzu.

    ' Align the infrared ports of the devices.
    ' Click the Receive button first, then click Send.
    Private Sub ReceiveButton_Click(sender As Object, e As System.EventArgs) _
        Handles ReceiveButton.Click
    
        Dim irDevices() As IrDADeviceInfo
        Dim irClient As New IrDAClient()
        Dim irServiceName As String = "IrDATest"
    
        Dim buffersize As Integer = 256
    
        ' Create a collection for discovering up to
        ' three devices, although only one is needed.
        irDevices = irClient.DiscoverDevices(2)
    
        ' Cancel if no devices are found.
        If irDevices.Length = 0 Then
            MessageBox.Show("No remote infrared devices found.")
            Return
        End If
    
        ' Connect to the first IrDA device
        Dim irEndP As New IrDAEndPoint(irDevices(0).DeviceID, irServiceName)
        irClient.Connect(irEndP)
    
        ' Create a stream for writing a Pocket Word file.
        Dim writeStream As Stream
        Try
            writeStream = New FileStream(".\My Documents\receive.txt", _
                FileMode.OpenOrCreate)
        Catch
            MessageBox.Show("Cannot open file for writing.")
            Return
        End Try
    
        ' Get the underlying stream of the client.
        Dim baseStream As Stream = irClient.GetStream()
    
        ' Create a buffer for reading the file.
        Dim buffer(buffersize) As Byte
    
        Dim numToRead, numRead As Int64
    
        ' Read the file into a stream 8 bytes at a time.
        ' Because the stream does not support seek operations,
        ' its length cannot be determined.
        numToRead = 8
    
        Try    
            While numToRead > 0
                numRead = baseStream.Read(buffer, 0, numToRead)
                numToRead -= numRead
            End While
        Catch exReadIn As Exception
            MessageBox.Show("Read in: " & exReadIn.Message)
        End Try
    
        ' Get the size of the buffer to show
        ' the number of bytes to write to the file.
        numToRead = BitConverter.ToInt64(buffer, 0)
    
        Try
            ' Write the stream to the file until
            ' there are no more bytes to read.
            While numToRead > 0
                numRead = baseStream.Read(buffer, 0, buffer.Length)
                numToRead -= numRead
                writeStream.Write(buffer, 0, numRead)
            End While
            writeStream.Close()
            MessageBox.Show("File received.")
        Catch exWriteOut As Exception
            MessageBox.Show("Write out: " & exWriteOut.Message)
        End Try
    
         baseStream.Close()
         irClient.Close()
    End Sub
    
    // Align the infrared ports of the devices.
    // Click the Receive button first, then click Send.
    private void ReceiveButton_Click(object sender, System.EventArgs e)
    {
        IrDADeviceInfo[] irDevices;
        IrDAClient irClient = new IrDAClient();
        string irServiceName = "IrDATest";
        int buffersize = 256;
    
        // Create a collection for discovering up to
        // three devices, although only one is needed.
        irDevices = irClient.DiscoverDevices(2);
    
        // Cancel if no devices are found.
        if ((irDevices.Length == 0)) 
        {
            MessageBox.Show("No remote infrared devices found.");
            return;
        }
    
        // Connect to the first IrDA device
        IrDAEndPoint irEndP = 
            new IrDAEndPoint(irDevices[0].DeviceID, irServiceName);
        irClient.Connect(irEndP);
    
        // Create a stream for writing a Pocket Word file.
        Stream writeStream;
        try 
        {
            writeStream = new FileStream(".\\My Documents\\receive.txt", 
                FileMode.OpenOrCreate);
        }
        catch (Exception Ex)
        {
            MessageBox.Show("Cannot open file for writing. " + Ex.Message);
            return;
        }
    
        // Get the underlying stream of the client.
        Stream baseStream = irClient.GetStream();
    
        // Create a buffer for reading the file.
        byte[] buffer = new byte[buffersize];
        Int64 numToRead;
        Int64 numRead;
    
        // Read the file into a stream 8 bytes at a time.
        // Because the stream does not support seek operations, its
        // length cannot be determined.
        numToRead = 8;
        try 
        {
            while ((numToRead > 0)) 
            {
                numRead = baseStream.Read(buffer, 0, 
                    Convert.ToInt32(numToRead));
                numToRead = (numToRead - numRead);
            }
        }
        catch (Exception exReadIn) {
            MessageBox.Show(("Read in: " + exReadIn.Message));
        }
    
        // Get the size of the buffer to show
        // the number of bytes to write to the file.
        numToRead = BitConverter.ToInt64(buffer, 0);
        try 
        {
            // Write the stream to the file until
            // there are no more bytes to read.
            while ((numToRead > 0)) {
                numRead = baseStream.Read(buffer, 0, buffer.Length);
                numToRead = (numToRead - numRead);
                writeStream.Write(buffer, 0, Convert.ToInt32(numRead));
            }
            writeStream.Close();
            MessageBox.Show("File received.");
        }
        catch (Exception exWriteOut) 
        {
            MessageBox.Show(("Write out: " + exWriteOut.Message));
        }
        baseStream.Close();
        irClient.Close();
    }
    

So führen Sie die Anwendungen aus

  1. Stellen Sie die Anwendungen auf den Geräten bereit, und starten Sie sie.

  2. Richten Sie die Infrarotanschlüsse der Geräte aus.

  3. Tippen Sie auf dem empfangenden Gerät auf die Schaltfläche Receive.

  4. Tippen Sie auf dem sendenden Gerät auf die Schaltfläche Send.

  5. Prüfen Sie, ob Receive.txt im Ordner Eigene Dateien erstellt worden ist.

Kompilieren des Codes

Für dieses Beispiel sind Verweise auf die folgenden Namespaces erforderlich:

Siehe auch

Konzepte

Infrarotverbindungen

Gewusst-wie-Themen für .NET Compact Framework