Работа с 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


Пожалуйста, оцените статью

Отлично
Хорошо
Средне
Плохо
Очень плохо

2011123456789101112
2010123456789101112
2009123456789101112
2008123456789101112
2007123456789101112
2006123456789101112
2005123456789101112
2004123456789101112
2003123456789101112
2002123456789101112
2001123456789101112
2000123456789101112
1999123456789101112

Последние статьи
Литература