Программирование КПК и смартфонов на .NET Compact Framework - Александр Климов
Шрифт:
Интервал:
Закладка:
Версия игры, использующая спрайты, располагается в папке BouncerSprite, которая входит в состав материалов для книги, расположенных на сайте издательства «Питер».
Другие игры
Как уже говорилось ранее, в документации MSDN имеется множество примеров различных игр. Если вы проявите настойчивость, то самостоятельно найдете эти примеры и сможете разобрать их. Также стоит посетить сайт CodeProject, где по адресу www.codeproject.com/netcf/#Games расположился специальный подраздел, посвященный играм для .NET Compact Framework (рис. 11.10).
Рис. 11.10. Сайт CodeProject, посвященный играм для .NET Compact Framework
Глава 12
Связь
Инфракрасное соединение
Несмотря на растущую популярность Wi-Fi, Bluetooth и других беспроводных технологий, по-прежнему не сдает своих позиций и передача данных через инфракрасный порт. Например, все мы каждый день применяем инфракрасный порт при использовании дистанционного пульта телевизора! Вы можете использовать этот способ работы в своих приложениях для передачи разных типов данных.
Так как в этой технологии для передачи данных используется свет, то необходимо прямое соединение устройств, чтобы между ними не было препятствий. Несмотря на подобное ограничение, соединение через инфракрасный порт по-прежнему широко используется в цифровых камерах, КПК и ноутбуках. В этой главе будет показано, как использовать инфракрасный порт при помощи класса IrDAClient, входящего в библиотеку классов .NET Compact Framework.
История и теория
Основанная в 1993 году как некоммерческая организация, Ассоциация инфракрасной передачи данных (Infrared Data Association, или сокращенно IrDA) является международной ассоциацией (www.irda.org), создающей и продвигающей стандарты инфракрасной связи, позволяющие пользователям соединять устройства для передачи данных. Стандарты Infrared Data Association поддерживают огромное число устройств. На данный момент существует несколько версий технологии IrDA, которые различаются скоростью передачи данных.
Протокол IrDA позволяет соединяться с другим устройством без проводов при помощи ИК-излучения. Порт IrDA позволяет устанавливать связь на расстоянии до 1-2 метров. Интерфейс IrDA предполагает малую мощность потребления, что позволяет создавать недорогую продукцию.
Класс IrDAClient
Практически все устройства под управлением Windows Mobile имеют встроенные инфракрасные порты. Библиотека .NET Compact Framework имеет в своем составе классы, позволяющие работать с инфракрасной связью.
Инфракрасная связь осуществляется между двумя устройствами по принципу «сервер-клиент». Устройство, работающее как сервер, предлагает другому компьютеру установить связь для передачи данных через инфракрасный порт. Для осуществления передачи необходимо передать идентификатор устройства и имя устройства. Клиент ждет вызова необходимой службы и откликается на ее запрос. В результате между двумя компьютерами устанавливается связь
За инфракрасное соединение отвечает специальный класс IrDAClient, который может выступать и в роли сервера, и в роли клиента. Данный класс входит в библиотеку System.Net.IrDA.dll. Таким образом, при использовании класса IrDAClient необходимо добавить в проект ссылку на указанную библиотеку.
Для чтения и передачи данных используется метод GetStream, работающий с основным потоком данных. Компьютер-клиент должен знать имя устройства, с которым нужно установить связь. Программа может поочередно опросить все доступные устройства и выбрать нужное устройство для связи. Алгоритм подключения устройства к инфракрасному порту другого устройства приведен далее.
1. Создать новый экземпляр класса IrDAClient.
2. Получить список доступных устройств с помощью метода IrDAClient.DiscoverDevices. Можно ограничить количество опрашиваемых устройств при помощи параметра maxDevices. Метод DiscoverDevices возвращает массив объектов IrDADeviceInfo.
3. Нужно исследовать каждый объект IrDADeviceInfo из полученного массива, чтобы найти необходимое устройство для связи.
4. Если подобное устройство найдено, то при помощи метода IrDAClient.Connect производится соединение. При этом необходимо указать имя службы
Создание программы для работы с ИК-связью
В этом разделе будет создано приложение, которое будет соединяться с другим устройством и пересылать ему текстовый файл. Прежде всего нужно создать новый проект IrDA_CS. На форме надо разместить три кнопки, список и строку состояния.
Кнопка butFindDevs предназначена для поиска устройств, кнопка butSend — для отправки текстового сообщения, а кнопка butReceive служит для приема сообщения. В списке listBox1 будет отображаться информация об обнаруженных устройствах, а в строке состояния будут отображаться сообщения о производимых операциях. Для передачи данных и работы с файлами нам необходимо импортировать несколько пространств имен, как это показано в листинге 12.1.
Листинг 12.1Imports System.Net
Imports System.IO
Imports System.Net.Sockets
Для работы с инфракрасной связью необходимо подключить к проекту класс IrDAClient. Для этого выполним команду меню Project►Add Reference и в диалоговом окне выберем пункт System.Net.IrDa.
Теперь нужно объявить переменные на уровне класса, как показано в листинге 12.2
Листинг 12.2private IrDAListener irListen;
private IrDAClient irClient;
private IrDAEndPoint irEndP;
private IrDADeviceInfo[] irDevices;
string fileSend;
string fileReceive;
string irServiceName;
int buffersize;
В конструкторе формы надо создать экземпляр класса IrDAClient, задать имена файлов для приема и отправки сообщения, указать имя службы, установить размер буфера для передаваемого файла и также временно сделать недоступными кнопки для отправки и посылки сообщения. Соответствующий код приведен в листинге 12.3.
Листинг 12.3public Form1() {
InitializeComponent();
irClient = new IrDAClient();
// Файлы, предназначенные для отправки и приема
fileSend = ".\My Documents\send.txt";
fileReceive = ".\My Documents\receive.txt";
// Задаем имя для службы IrDA
// Это может быть любое слово
// Другие устройства для примера должны использовать это же
// слово
irServiceName = "IrDAFtp";
// Устанавливаем максимальный размер буфера для передаваемого
// файла
buffersize = 256;
// Делаем недоступными кнопки отправки и посылки сообщений
// до тех пор, пока не будут обнаружены устройства
butSend.Enabled = false;
butReceive.Enabled = false;
}
Обнаружение устройств
Теперь надо написать код для кнопки butFindDevs, предназначенной для обнаружения устройств. При тестировании примера необходимо направить инфракрасные порты устройств друг на друга. Код, ответственный за выполнение этой задачи, приведен в листинге 12.4.
Листинг 12.4private void butFindDevs_Click(object sender, EventArgs e) {
// Ищем доступные устройства с инфракрасной связью
// и помещаем их в список
// Поиск не более трех доступных устройств
irDevices = irClient.DiscoverDevices(2);
// Если устройства не найдены, то выводим сообщение
if (irDevices.Length == 0) {
MessageBox.Show("Устройства с ИК-портами не обнаружены!");
return;
}
// Перечисляем массив IrDADeviceInfo
// и выводим информацию о каждом устройстве в список
string device;
int ID;
listBox1.Items.Clear();
foreach (IrDADeviceInfo irDevice in irDevices) {
ID = BitConverter.ToInt32(irDevice.DeviceID, 0);
device =
ID.ToString() + " " + irDevice.DeviceName + " " + irDevice.CharacterSet +
" " + irDevice.Hints;
listBox1.Items.Add(device);
}
listBox1.SelectedIndex = 0;
if (irDevices.Length > 0)
statusBar1.Text = irDevices.Length.ToString() + " устройств(а)";
// Делаем доступными кнопки для отправки и посылки сообщения
butSend.Enabled = true;
butReceive.Enabled = true;
}
Передача данных
Код для отправки и посылки файлов приведен в листинге 12.5.
Листинг 12.5private void butSend_Click(object sender, EventArgs e) {
// Открываем файл для отправки и получаем его поток
Stream fileStream;
try {
fileStream = new FileStream(fileSend, FileMode.Open);
} catch (Exception exFile) {