Работа с Bluetooth в Delphi - Часть 1
Вступление
Этой статьей хочу начать серию по работе с Bluetooth в Delphi под Microsoft
Windows XP. Так как тема весьма сложная, прошу внимательно читать. Повторяться
не буду.
Все программы написаны на Delphi 6 и тестировались со стандартным стеком
Bluetooth от Microsoft под Windows XP + SP2.
Все необходимые библиотеки прилагаются. Так что дополнительно ничего качать не
нужно. При разработке использовал только API функции с JEDI.
Описание функций будут даны в стиле Object Pascal. Сионистов просьба обращаться
к MSDN и Microsoft Platform SDK.
Получение списка установленных радиомодулей Bluetooth
Итак, для начала попробуем получить список установленных на компьютере
радиомодулей Bluetooth.
BluetoothFindFirstRadio
Начинает перечисление локальных радиомодулей Bluetooth.
Объявление функции:
function BluetoothFindFirstRadio(
const pbtfrp : PBlueToothFindRadioParams;
var phRadio : THandle): HBLUETOOTH_RADIO_FIND; stdcall;
Параметры:
pbtfrp | Указатель на структуру BLUETOOTH_FIND_RADIO_PARAMS. Член dwSize этой структуры должен содержать размер структуры (устанавливается посредством SizeOf(BLUETOOTH_FIND_RADIO_PARAMS)). |
phRadio | Описатель (Handle) найденного устройства. |
Возвращаемые значения:
В случае успешного выполнения функция вернет корректный описатель в phRadio и
корректный описатель в качестве результата.
В случае ошибки будет возвращен 0. Для получения кода ошибки используйте функцию
GetLastError.
BluetoothFindNextRadio
Находит следующий установленный радиомодуль Bluetooth.
Объявление функции:
function BluetoothFindNextRadio(
hFind : HBLUETOOTH_RADIO_FIND;
var phRadio : THandle): BOOL; stdcall;
Параметры:
hFind | Описатель, который вернула функция BluetoothFindFirstRadio. |
phRadio | Сюда будет помещен описатель следующего найденного радиомодуля. |
Возвращаемые значения:
Вернет TRUE, если устройство найдено. В phRadio корректный описатель на
найденный радиомодуль.
Вернет FALSE в случае отсутствия устройства. phRadio содержит некорректный
описатель. Используйте GetLastError для получения кода ошибки.
BluetoothFindRadioClose
Закрывает описатель перечисления радиомодулей Bluetooth.
Объявление функции:
function BluetoothFindRadioClose(
hFind : HBLUETOOTH_RADIO_FIND): BOOL; stdcall;
Параметры:
hFind | Описатель, который вернула функция BluetoothFindFirstRadio. |
Возвращаемые значения:
Вернет TRUE если описатель успешно закрыт.
Вернет FALSE в случае ошибки. Для получения кода ошибки используйте GetLastError.
Теперь у нас достаточно знаний, чтобы получить список установленных радиомодулей
Bluetooth.
Напишем вот такую процедуру.
procedure EnumRadio; var hRadio: THandle; BFRP: BLUETOOTH_FIND_RADIO_PARAMS; hFind: HBLUETOOTH_RADIO_FIND; begin // Инициализация структуры BLUETOOTH_FIND_RADIO_PARAMS BFRP.dwSize := SizeOf(BFRP); // Начинаем поиск hFind := BluetoothFindFirstRadio(@BFRP, hRadio); if (hFind <> 0) then begin repeat // Что-то сделать с полученным описателем // Закрыть описатель устройства CloseHandle(hRadio); // Находим следующее устройство until (not BluetoothFindNextRadio(hFind, hRadio)); // Закрываем поиск BluetoothFindRadioClose(hFind); end; end; |
Это, конечно, все здорово, но в принципе бесполезно. Давайте что-нибудь сделаем
еще. Например, получим информацию о радиомодуле Bluetooth.
Получение информации о радиомодуле Bluetooth
Для получения информации о радиомодуле Bluetooth используется функция
BluetoothGetRadioInfo
Возвращает информацию о радиомодуле, который представлен описателем.
Объявление функции:
function BluetoothGetRadioInfo(
hRadio : THandle;
var pRadioInfo : BLUETOOTH_RADIO_INFO): DWORD; stdcall;
Параметры:
hRadio | Описатель локального радиомодуля, который получен функцией BluetoothFindRadioFirst или BluetoothFindRadioNext. |
pRadioInfo | Структура, в которую записывается информация об указанном радиомодуле. Член dwSize должен быть равен размеру структуры. |
Возвращаемые значения:
Вернет ERROR_SUCCESS если информация получена, в противном случае код ошибки.
Структура BLUETOOTH_RADIO_INFO выгляди вот так:
_BLUETOOTH_RADIO_INFO = record
dwSize : dword;
address : BLUETOOTH_ADDRESS;
szName : array [0..BLUETOOTH_MAX_NAME_SIZE - 1] of widechar;
ulClassofDevice : ulong;
lmpSubversion : word;
manufacturer : word;
end;
dwSize | Размер структуры в байтах. |
address | Адрес локального радиомодуля. |
szName | Имя радиомодуля. |
ulClassofDevice | Класс устройства. |
lmpSubversion | Устанавливается производителем. |
manufacturer | Код производителя (константы BTH_MFG_Xxx). Для получения новых кодов обратитесь к сайту спецификаций Bluetooth. |
Это уже что-то. Воспользуемся этой информацией и напишем вот такую процедуру.
procedure GetRadioInfo(hRadio: THandle); var RadioInfo: BLUETOOTH_RADIO_INFO; begin // Инициализация структуры BLUETOOTH_RADIO_INFO FillChar(RadioInfo, 0, SizeOf(RadioInfo)); RadioInfo.dwSize := SizeOf(RadioInfo); // Получаем информацию if (BluetoothGetRadioInfo(hRadio, RadioInfo) = ERROR_SUCCESS) then begin // Используем полученную информацию end; end; |
Заключение
Вот пока и все. В следующей статье рассмотрим, как получить список
присоединенных устройств и опросить сервисы, которые они представляют.
Готовый рабочий пример использования указанных функций вы можете найти
здесь (791 Кб).
Дата: 26.07.2007,
Автор:
Петриченко
Михаил.
Оригинал статьи:
http://mobileservicesoft.narod.ru/stat.html