如何:使用红外线传输文件

更新:2007 年 11 月

.NET Compact Framework 为设备之间的红外线通信提供类。此示例演示了如何使用红外线通信在设备之间发送和接收文件。您需要两台 Pocket PC,分别用于发送和接收文件。

此示例创建一个 IrDAClient 实例,并使用其 DiscoverDevices 方法来搜索范围内的红外线设备。此方法返回一个 IrDADeviceInfo 对象数组,用于提供每台设备的信息。

此示例提供了文件发送和接收代码,这些代码可以通过“发送”和“接收”按钮进行演示。您至少应为一台设备创建“发送”应用程序,为另一台设备创建“接收”应用程序。

“发送”按钮只会将文件发送到侦听文件发送请求的设备。因此,在发送设备上点击“发送”按钮之前,必须先在接收设备上点击“接收”按钮。执行以下任务:

  • 获取要发送的文件流。

  • 使用为此应用程序确定的服务名创建一个 IrDAClient 实例。通过指定服务名来建立红外线连接,只要参与设备引用相同的名称,则服务名可以为任何值。在此示例中,服务名为“IrDATest”。

  • 将文件流读入发送该文件的 IrDAClient 流。

“接收”按钮将创建一个 IrDAListener 实例,以侦听服务名与发送设备中的 IrDAClient 实例相同的设备。

执行以下任务:

  • 创建将传输内容写入“我的文档”文件夹中的接收文件的流。

  • 使用发送设备的设备 ID 和服务名创建 IrDAEndPoint 实例。

  • 基于 IrDAEndPoint 实例创建一个 IrDAListener 实例并启动侦听服务。

  • 使用 AcceptIrDAClient 方法基于 IrDAListener 实例创建一个 IrDAClient 实例。

  • 读取 IrDAClient 实例的基础流,其中包含传输文件的数据。

  • 将该数据流写入 Receive.txt 文件的流。

创建应用程序

  1. 为发送设备创建 Pocket PC 应用程序,并向窗体添加按钮。将该按钮命名为“发送”。

  2. 在“我的文档”文件夹中创建名为 Send.txt 的文件。

  3. 在“发送”按钮的 Click 事件中添加以下代码。

    ' 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. 为接收设备创建 Pocket PC 应用程序,并向窗体添加按钮。将该按钮命名为“接收”。

  5. 在“接收”按钮的 Click 事件中添加以下代码。

    ' 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();
    }
    

运行应用程序

  1. 将应用程序部署到设备并启动这些应用程序。

  2. 对齐设备的红外端口。

  3. 点击接收设备上的“接收”按钮。

  4. 点击发送设备上的“发送”按钮。

  5. 检查是否已在“我的文档”文件夹中创建 Receive.txt 文件。

编译代码

此示例需要引用下面的命名空间:

请参见

概念

红外连接

.NET Compact Framework 帮助主题