Работа с Bluetooth в Delphi

Часть 1

© 2006 Петриченко Михаил,
Soft Service Company

Вступление

Этой статьей хочу начать серию по работе с 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) найденного устройства.
Возвращаемые значения:

BluetoothFindNextRadio - находит следующий установленный радиомодуль Bluetooth.

Объявление функции:

function BluetoothFindNextRadio(
    hFind : HBLUETOOTH_RADIO_FIND;
    var phRadio : THandle): BOOL; stdcall;
Параметры:
hFindОписатель, который вернула функция BluetoothFindFirstRadio
phRadioСюда будет помещен описатель следующего найденного радиомодуля
Возвращаемые значения:

BluetoothFindRadioClose - закрывает описатель перечисления радиомодулей Bluetooth.

Объявление функции:

function BluetoothFindRadioClose(
    hFind : HBLUETOOTH_RADIO_FIND): BOOL; stdcall;
Параметры:
hFindОписатель, который вернула функция BluetoothFindFirstRadio
Возвращаемые значения:

Теперь у нас достаточно знаний, чтобы получить список установленных радиомодулей 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 должен быть равен размеру структуры
Возвращаемые значения: Структура 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;

Заключение

Вот пока и все. В следующей статье рассмотрим, как получить список присоединенных устройств и опросить сервисы, которые они представляют.

Готовый рабочий пример использования указанных функций вы можете найти здесь.

Внимание! Запрещается перепечатка данной статьи или ее части без согласования с автором. Если вы хотите разместить эту статью на своем сайте или издать в печатном виде, свяжитесь с автором.

Copyright© 2006 Петриченко Михаил, Soft Service Company
Специально для Delphi Plus


Пожалуйста, оцените статью
Отлично
Хорошо
Средне
Плохо
Очень плохо

Практика программирования USB