Вступление
Этой статьей хочу начать серию по работе с 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; |
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; Заключение
Пока все. В следующей статье рассмотрим, как получить список присоединенных устройств и опросить сервисы, которые они представляют.
Готовый рабочий пример использования указанных функций вы можете найти здесь.