// Показываем прослушивание выбранного устройства
statusBar1.Text = 'Прослушка ' + listBox1.SelectedItem.ToString();
// Создаем соединение
// для службы, обнаруженной прослушкой
IrDAClient irClient;
try {
irClient = irListen.AcceptIrDAClient();
} catch (SocketException exp) {
MessageBox.Show('Не могу принять сокет '+ exp.ErrorCode);
return;
}
// Показываем, идет ли передача файла
if (irListen.Pending() == true)
statusBar1.Text = 'Передача из ' + irClient.RemoteMachineName;
else
statusBar1.Text = 'Нет передачи из ' + irClient.RemoteMachineName;
// Получим поток из клиента
Stream baseStream = irClient.GetStream();
int numToRead;
// Создаем буфер для чтения файла
byte[] buffer = new byte[buffersize];
// Читаем поток данных, который содержит
// данные из передающего устройства
numToRead = 4;
while (numToRead > 0) {
int numRead = baseStream.Read(buffer, 0, numToRead);
numToRead -= numRead;
}
// Получим размер буфера для показа
// числа байт для записи в файл
numToRead = BitConverter.ToInt32(buffer, 0);
statusBar1.Text = 'Записываем '+ numToRead + ' байт';
// Записываем поток в файл до тех пор,
// пока не будут прочитаны все байты
while (numToRead > 0) {
int numRead = baseStream.Read(buffer, 0, buffer.Length);
numToRead -= numRead;
writeStream.Write(buffer, 0, numRead);
}
// Сообщаем, что файл получен
statusBar1.Text = 'Файл получен';
baseStream.Close();
writeStream.Close();
irListen.Stop();
irClient.Close();
}
Итак, можно запустить приложение на двух устройствах и попробовать отправить и принять файл. Перед тестированием программы нужно создать текстовый документ send.txt
с любым содержанием. Затем нужно повернуть друг к другу инфракрасные датчики двух устройств и на первом устройстве нажать кнопку Искать
. Если поиск завершился успешно, то в списке отобразится имя второго устройства.
Затем на втором устройстве надо нажать кнопку Принять
, а на первом устройстве нажать кнопку Отправить
. В результате ваших действий текст сообщения из файла send.txt
должен быть передан на другое устройство и сохранен в файле receive.txt
.
К сожалению, данный пример нельзя тестировать на эмуляторе. Для проведения эксперимента вам необходимо иметь два настоящих устройства. Так как у меня нет второго КПК, я решил воспользоваться в качестве второго устройства своим смартфоном под управлением Windows Mobile 2005. Поскольку графический интерфейс программ для смартфонов не поддерживает кнопки, мне пришлось добавить в решение новый проект IrDA_Smartphone_CS
и частично переписать код программы.
Вместо кнопок использовалось меню, а вместо элемента управления ListBox
— элемент ComboBox
. Но можно было обойтись и без создания текстовых файлов, а просто считывать данные из потока. В этом случае наша программа приобрела бы черты чата. Также можно написать какую-нибудь игру, в которой участвуют два игрока. С помощью инфракрасной связи вы можете передавать информацию, например, о сделанном ходе в шахматах.
Технология Bluetooth
Несмотря на свою дешевизну и простоту, инфракрасное соединение имеет несколько существенных недостатков. К ним относятся маленький радиус действия и возможность связи в пределах прямой видимости. Этих недостатков лишено Bluetooth-соединение.
Но и тут не обошлось без ложки дегтя в бочке меда. Во-первых, существует два различных подхода к реализации Bluetooth-соединений, которые не совместимы друг с другом. Во-вторых, пока не существует поддержки этой технологии в управляемом коде .NET Compact Framework. Примеры с Bluetooth-связью мы будем приводить для устройств под управлением Windows Mobile 5.0, так как они гарантированно используют одну и ту же реализацию Bluetooth-технологии. Так как библиотека .NET Compact Framework не имеет в своем составе классов, работающих с Bluetooth, то придется воспользоваться вызовами функций Windows API, как показано в листинге 12.6.
public enum RadioMode {
Off = 0,
Connectable = 1,
Discoverable = 2
}
/// <summary>
/// Получает текущий статус bluetooth
/// </summary>
/// <param name='dwMode'>флаги</param>
/// <returns></returns>