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

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

functionBluetoothFindFirstRadio(
constpbtfrp : PBlueToothFindRadioParams;
varphRadio : THandle): HBLUETOOTH_RADIO_FIND; stdcall;

Параметры:

  • pbtfrp - указатель на структуру BLUETOOTH_FIND_RADIO_PARAMS. Член dwSize этой структуры должен содержать размер структуры (устанавливается посредством SizeOf(BLUETOOTH_FIND_RADIO_PARAMS)).
  • phRadio - описатель (Handle) найденного устройства.

Возвращаемые значения:

  • В случае успешного выполнения функция вернет корректный описатель в phRadio и корректный описатель в качестве результата.
  • В случае ошибки будет возвращен 0. Для получения кода ошибки используйте функцию GetLastError.

BluetoothFindNextRadio

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

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

functionBluetoothFindNextRadio(
 hFind : HBLUETOOTH_RADIO_FIND;
varphRadio : THandle): BOOL; stdcall;

Параметры:

  • hFind - Описатель, который вернула функция BluetoothFindFirstRadio.
  • phRadio - Сюда будет помещен описатель следующего найденного радиомодуля.

Возвращаемые значения:

  • Вернет TRUE, если устройство найдено. В phRadio корректный описатель на найденный радиомодуль.
  • Вернет FALSE в случае отсутствия устройства. phRadio содержит некорректный описатель. Используйте GetLastError для получения кода ошибки.

BluetoothFindRadioClose

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

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

functionBluetoothFindRadioClose(
 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

Возвращает информацию о радиомодуле, который представлен описателем.

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

functionBluetoothGetRadioInfo(
 hRadio : THandle;
varpRadioInfo : 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; Заключение

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

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

19 июля 2006 Г.

Bluetooth Delphi

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;

. , , .

.