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

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

Внимание! Запрещается перепечатка данной статьи или ее части без согласования с автором. Если вы хотите разместить эту статью на своем сайте или издать в печатном виде, свяжитесь с автором.
Теги:
Bluetooth
Добавлено: 18 Июля 2018 07:46:11 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...