Windows Mobile使用红外线传输文件

发布时间: 2009/10/16 13:27:52

在接收文件方面请仔细查看,IrDAClient().GetStream 返回Stream对象,他和TcpLister、TcpClient 的返回不一样,要特别注意。

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

特别注意:在Widows Mobile 6 VS2005)中添加 System.net.IrDA.dll 的引用,并添加命名空间 using System.Net.Sockets

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

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

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

 

发送端执行以下任务:

u       获取要发送的文件流。

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

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

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

 

接收端执行以下任务:

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

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

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

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

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

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

 

创建发送应用程序

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

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

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

 

// 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

//得到文件的大小并将其写入发送数据流 8个字节

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

    //此处得到文件长度

byte[] len = new byte[8];
 baseStream.Read(len, 0, 8);
 int64 fileSize = BitConverter.ToInt64(len, 0);

 

// 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 文件。

编译代码

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

     System

     System.Net

     System.Net.Sockets

     System.IO

     System.Windows.Forms

赞助商