方法 : 赤外線ファイル転送を行う
更新 : 2007 年 11 月
.NET Compact Framework には、デバイス間で赤外線通信を行うためのクラスが用意されています。この例では、赤外線通信を使用してデバイス間でファイルを送信および受信する方法について説明します。ファイル送信用に 1 つ、ファイル受信用に 1 つ、合計 2 つの Pocket PC が必要です。
この例では、IrDAClient のインスタンスを作成し、その DiscoverDevices メソッドを使用して、通信範囲内にある赤外線デバイスを検索しています。このメソッドは、各デバイスの情報を提供する IrDADeviceInfo の配列を返します。
この例では、ファイルを送信および受信するためのコードを示しています。このコードは、[Send] ボタンおよび [Receive] ボタンをクリックすると呼び出されます。最低でも一方のデバイス用の送信アプリケーションおよび、もう一方のデバイス用の受信アプリケーションが必要です。
[Send] ボタンでは、ファイル送信の要求を待機しているデバイスに対してだけファイルが送信されます。したがって、送信側デバイスの [Send] ボタンをタップする前に、受信側デバイスの [Receive] ボタンをタップする必要があります。以下の処理が実行されます。
送信するファイルのストリームを取得します。
このアプリケーション用の名前を付けて IrDAClient のインスタンスを作成します。赤外線通信は、サービス名を指定することによって行います。サービス名には、通信するデバイスが同じ名前を参照するならば、任意の名前を指定できます。この例のサービス名は、"IrDATest" です。
ファイルのストリームを、ファイルを送信するための IrDAClient ストリームに読み込みます。
[Receive] ボタンをクリックすると、IrDAListener インスタンスが作成され、送信側デバイスの IrDAClient インスタンスと同じ名前のサービスをデバイスが受信するのを待機します。
以下の処理が実行されます。
転送された内容を、マイ ドキュメント フォルダ内の受信ファイルに書き込むためのストリームを作成します。
送信側デバイスのデバイス ID とサービス名を指定し、IrDAEndPoint インスタンスを作成します。
IrDAEndPoint インスタンスから IrDAListener インスタンスを作成し、待機サービスを開始します。
AcceptIrDAClient メソッドを使用して、IrDAListener インスタンスから IrDAClient インスタンスを作成します。
IrDAClient インスタンスからストリームを読み込みます。このストリームには転送されたファイルのデータが格納されています。
このデータ ストリームを Receive.txt ファイルのストリームに書き込みます。
アプリケーションを作成するには
送信側デバイス用の Pocket PC アプリケーションを作成し、フォームにボタンを追加します。ボタンに Send という名前を付けます。
マイ ドキュメント フォルダに Send.txt というファイルを作成します。
[Send] ボタンの 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(); }
受信側デバイス用の Pocket PC アプリケーションを作成し、フォームにボタンを追加します。ボタンに Receive という名前を付けます。
[Receive] ボタンの 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(); }
アプリケーションを実行するには
各デバイスにアプリケーションを配置し、起動します。
デバイスの赤外線ポートを配置します。
受信側デバイスの [Receive] ボタンをタップします。
送信側デバイスの [Send] ボタンをタップします。
マイ ドキュメント フォルダに Receive.txt が作成されたかどうかを確認します。
コードのコンパイル方法
この例では、次の名前空間への参照が必要です。