Практическое руководство. Перенос файлов с помощью инфракрасного соединения
Обновлен: Ноябрь 2007
.NET Compact Framework предоставляет классы для инфракрасного соединения между устройствами. В этом примере показано, как отправлять и получать файлы между устройствами с помощью инфракрасных подключений. Требуются два карманных ПК — один для отправки файла и другой для его получения.
В этом примере создается экземпляр класса IrDAClient и используется его метод DiscoverDevices для обнаружения инфракрасных устройств в зоне видимости. Этот метод возвращает массив объектов IrDADeviceInfo, предоставляющих сведения о каждом устройстве.
В этом примере содержится код для отправки и получения файла, который можно продемонстрировать с помощью кнопки "Отправить" и "Получить". Как минимум, требуется создать приложение "Отправить" для одного устройства и приложение "Получить" — для другого.
Кнопка "Отправить" отправляет файл только на устройство, которое указано в списке запросов, отправляющих файл. Поэтому кнопка "Получить" должна быть нажата на принимающем устройстве до нажатия кнопки "Отправить" на отправляющем устройстве. Выполняются следующие задачи:
Получение потока отправляемого файла.
Создание экземпляра IrDAClient, использующего имя службы, определенной для этого приложения. Инфракрасные соединения устанавливаются посредством указания имени службы, которое может быть любым значением, обеспечивающим ссылку участвующих устройств на то же имя. В данном примере, имя службы "IrDATest".
Считывание файлового потока в поток IrDAClient, который отправляет файл.
Кнопка "Получить" создает экземпляр класса IrDAListener для прослушивания устройства с тем же именем службы, как у экземпляра IrDAClient на отправляющем устройстве.
Выполняются следующие задачи:
Создание потока для записи переданного содержимого в файл получения в папке Мои документы.
Создание экземпляра IrDAEndPoint с идентификатором устройства и именем службы для отправляющего устройства.
Создание экземпляра IrDAListener из экземпляра IrDAEndPoint и запуск службы прослушивания.
Создание экземпляра IrDAClient из экземпляра IrDAListener с помощью метода AcceptIrDAClient.
Считывание основного потока экземпляра IrDAClient, который содержит данные передаваемого файла.
Запись этого потока данных в поток для файла Receive.txt.
Чтобы создать приложение
Создайте приложение карманного ПК для отправляющего устройства и добавьте кнопку в форму. Назовите кнопку "Отправить".
Создайте файл с именем Send.txt в папке Мои документы.
Добавьте следующий код для события 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(); }
Создайте приложение карманного ПК для получающего и добавьте кнопку в форму. Назовите кнопку "Получить".
Добавьте следующий код для события 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.txt.
Компиляция кода
Для этого примера требуются ссылки на следующие пространства имен: