Delphi android bluetooth serial

Как работать с Bluetooth?

Ответ от evdroniy,
23 октября, 2014

Вопрос

evdroniy

evdroniy

В ХЕ7 появилась поддержка Bluetooth. Примеров как организовать работу с блютухом я не нашёл (может быть плохо искал), по этому хотелось бы узнать как с ним работать? Если кто занимался этим вопросом покажите пример кода для delphi как вывести список устройств, подключение двух (и может быть более) устройств и пример обмена данными между ними.

Ссылка на комментарий

5 ответов на этот вопрос

Рекомендуемые сообщения

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Похожий контент

Коллеги, помогите пожалуйста с поиском решения.

Есть зал 100×100 метров, 400-600 человек на борту. На их мобильные устройства (смартфоны, планшеты) нужно принимать раз в секунду различный текст

120 символов в кодировке UTF8. Можно широковещательно, или P2P.
Сейчас мы выбираем технологию передачи данных в ограниченном помещении большому количеству людей.
От выбора инфраструктуры, понятно, зависит логика мобильных приложений для этой цели.

1. Как лучше выстроить инфраструктуру?
2. Чем лучше рассылать Bluetooth или Wi-Fi (понятно, что GPRS канал в таком скоплении — не вариант, базовая станция не справятся, да и сигнала может не быть)?
3. Сколько точек доступа и каких лучше разместить?
4. На какие нюансы обратить внимание?

Сначала я обратился к технологии маячков. Но по многим параметрам маячки здесь не подходят.
Однако, не исключаю возможность широкого вещания по Bluetooth каналу.
Так же возможно использовать технологию тетеринг (tethering), раздавать сигнал через смартфоны раскинутые по залу.
Можно тоже самое организовать, раскидав точки доступа Wi-Fi.
Преимущества той или иной инфраструктуры для меня не очевидны.

Может кто-то сталкивался с подобными задачами?
Заранее благодарю за участие в обсуждении.

Возникла задача обработки телеметрии BLE маячков для построения пространственной карты.
За пару дней собрал приложение для «ловли» маячков.
Производится сбор всей телеметрии с маячков, которую обрабатывает компонент TBeacon. Данные можно передать в виде текста в другое приложение или отправить вложением по почте.

Сейчас приложение Можно скачать в Google Play.
Для платформ Windows качать здесь (SimpleBeaconTelemetry.exe.zip).

Просьба протестировать у себя на устройствах.
Код элементарный, если кому-то нужен, могу выложить сюда (SimpleBeaconTelemetry.zip).

Есть приложение (xe8, android) в котором я распечатываю чеки через блютуз принтер (JP-5802LYA).
Отправка данных на принтер идет через SocketConnection, используя ESC-команды принтера. Все работает как надо.
Проблема в том, что код получается «Заточенный» под конкретно эту модель принтера. А программа обрастает пользователями, у которые хотят использовать другие принтеры.
Есть ли какие-то компоненты, типа FastReport, которые могут с этим справится, или надо писать код под все модели принтеров?

Я хочу создать кросплатформеную апликацию использующую BLE. Зашёл в примеры и выбрал :
C:\Users\Public\Documents\Embarcadero\Studio\18.0\Samples\CPP\Multi-Device Samples\Device Sensors and Services\Bluetooth\ExploreDevicesLE
Во- первых Multi-Device оказался только Windows и OSX. И возможности добавить Андроид или ещё чего-то нет. См. картинку.
Во-вторых после запуска приложения оно ругается на отсутствие DLL.
Просьба помоь решить проблемы и/или указать на места где есть рабочие примеры и реально Multi-Device.

Источник

Delphi android bluetooth serial

едва помню эту приложуху, возможно где то есть исходники..

если первый бит будет содержать в себе количество бит за ним, то можно так

Ниже описано, как получать данные по Bluetooth( двусторонняя связь):

Пример PTyTb32 это переделанный, упрощенный варианта оригинального примера ClBluetooth(classic Bluetooth Basic App) от Embarcadero. Упрощенный вариант мне помог разобраться с тем, как это работает, из него убрано куча ненужностей оригинального варианта, за что PTyTb32 большой Спасибо!

Читайте также:  За что отвечают файлы андроида

Вообще приём данных уже заложен в пример(ы) — в потоке в процедуре TServerConnectionTH.Execute, строчка ASocket := FServerSocket.Accept(100); означает, что в течении 100 мсек происходит запрос входных данных, и в случае получения данные мы должны получать ссылку на сокет из которого 5 строчками ниже происходит чтение данных FData := ASocket.ReadData и т.д. Но в ASocket всегда nil. Не работает.

Моё решение:
1. Открываем оригинальный пример ClBluetooth.dproj
2. меняем

Товарищ divdiv, ваш вариант рабочий, спасибо. Но работает коряво и с фризами жуткими. Фризы по секунд 10, наверное. я не уверен, что правильно понял про строчку ASocket := FServerSocket.Accept(100); но если правильно, то тут замечание: FServerSocket.Accept(100); задаёт таймаут в миллисекундах на получение сокета, к входным данным отношения не имеет.

Очень большой интервал таймера. Вы предлагаете до 3 секунд. Это слишком много, да и фризит на чтении из буфера ещё дольше.
В поток запихнуть чтение входных данных не получилось у меня. либо виснет, либо вообще никак не реагирует. И вообще, судя по другим форумам, не только у меня не получилось.

Источник

Using Bluetooth

The RTL provides classes to implement Bluetooth support in your applications. When your application is running on a Bluetooth-enabled device, your application can use the Bluetooth capabilities of the device to connect to applications in remote devices and exchange data with those remote applications.

Contents

Platform Support

*Windows Server does not support Bluetooth (see: General Bluetooth Support in Windows).

For macOS and iOS, BluetoothLE is only supported on the following hardware:

  • macOS:
    • Mac Mini
    • Mac Air: mid2011+
    • MacBook Pro: mid2012+
  • iOS:
    • iPhone 4S+
    • iPad 3+ (Retina)
    • iPod Touch 5th Gen.+

Classic Bluetooth on iOS

RTL does not support Classic Bluetooth on iOS. The reason is that only hardware manufacturers are given access to the SDK for Classic Bluetooth. For more information, see Apple Developers: MFi Program.

Источник

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

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

Platform Classic Bluetooth Bluetooth Low Energy
Client Server
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 в Delphi. Часть 4. Передача данных через Bluetooth.

Наконец, после долгого перерыва я добрался и до заключительной, как я надеюсь, части статьи о Bluetooth.

Здесь я постараюсь изложить, как все-таки передавать данные через Bluetooth. Я не буду приводить здесь каких-либо готовых примеров приложений. Дам только теорию. К практике, я думаю, вы перейдете сами.

Как вы помните из предыдущих статей, мы используем исключительно Windows API для работы с Bluetooth. Сразу хочу оговориться, что описанные здесь способы не будут работать с драйверами BlueSoliel и VIDCOMM. В конце статьи я расскажу, как установить драйверы от Microsoft, если вы этого еще не сделали.

Итак, приступаем.Что вы должны знать

Прежде, чем начать излагать основной материал, я хочу сформулировать требования к вашим знаниям.

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

Вы также должны более или менее разбираться в технологии Winsock.Bluetooth и Winsock

Как ни странно это звучит, но Microsoft решила реализовать всю функциональность по передаче данных посредством Windows Socket Model. Тем, кто писал что-либо для IrDA это должно показаться знакомым.

На мой взгляд — правильное решение. Зачем огород городить, когда уже есть проверенные средства.

Я не буду описывать здесь все правила применения функций WinSock к работе с Bluetooth. Остановлюсь лишь на практической стороне вопроса. А именно — передача данных.

В статье мы сделаем простенький Bluetooth-клиент, который будет подсоединяться к удаленному устройству как к модему и позволит вам выполнять AT-команды. Весьма полезная вещь. Учтите, что данный клиент будет требовать авторизации устройств, и не будет требовать наличия в системе каких-либо виртуальных COM-портов.Сервисы и профили

Сервисы и профили. Это два краеугольных понятия Bluetooth. В некотором смысле — они идентичны.

Сервис — приложение-сервер, которое регистрирует определенным образом параметры в стеке протоколов Bluetooth. Наименование (GUID) всех сервисов строго определены Bluetooth.org.

Профиль — соглашения и стандарты работы сервиса. Понятнее объяснить не смогу.Начало

Итак, прежде чем можно будет использовать библиотеку WinSock, ее необходимо инициализировать. Делается это вызовом функции WSAStartup. Так она выглядит: function WSAStartup( wVersionRequired: Word; var lpWSAData: WSAData): Integer; stdcall;

Не буду описывать все параметры, так как они есть в любой справочной системе (MSDN, Delphi). Скажу только, что для использования WinSock с Bluetooth необходимо указать в качестве параметра wVersionRequired номер версии $0202.

Так выглядит вызов этой функции: var Data: WSADATA; begin if WSAStartUp($0202, Data) <> 0 then raise Exception.Create(‘Winsock Initialization Failed.’);

По окончании работы с WinSock библиотеку необходимо освободить. Для этого существует функция WSACleanup. function WSACleanup: Integer; stdcall;

Вызывается она просто, без всяких параметров. Возвращаемое значение, в принципе, можно не проверять: begin WSACleanup; Создание клиента

После того, как библиотека инициализирована, мы можем вызывать функции WinSock. Давайте создадим простой сокет, для работы с Bluetooth устройствами. Для этого необходимо вызвать функцию socket. function socket(af, type_, protocol: Integer): TSocket; stdcall;

Так это делается: var ASocket: TSocket; begin ASocket := socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM); if ASocket = INVALID_SOCKET then RaiseLastOsError;

Функция вернет корректный описатель сокета, либо INVALID_SOCKET в случае ошибки. Запомните, что Bluetooth поддерживает только потоковые сокеты (SOCK_STREAM).

Далее нам необходимо заполнить структуру SOCKADDR_BTH. В эту структуру записывается информация о сервере, к которому нам нужно подключиться (адрес, сервис и т.п.). Делается это следующим образом: var Addr: SOCKADDR_BTH; AddrSize: DWORD; begin AddrSize := SizeOf(SOCKADDR_BTH); FillChar(Addr, AddrSize, 0); with Addr do begin addressFamily := AF_BTH; btAddr := ADeviceAddress; serviceClassId := SerialPortServiceClass_UUID; port := DWORD(BT_PORT_ANY); end;

Здесь в переменной ADeviceAddress должен быть адрес устройства (Int64), присоединяемся к любому порту (BT_PORT_ANY) сервиса SerialPortServiceClass.

Далее вызываем функцию connect, которая имеет вид: function connect(s: TSocket; name: PSockAddr; namelen: Integer): Integer; stdcall;

Делается это так: begin if connect(ASocket, @Addr, AddrSize) <> 0 then RaiseLastOsError;

Если функция выполнится успешно, вернет 0, в противном случае отличное от нуля значение.

После того, как соединение установлено, можно передавать и принимать данные через сокет функциями send и recv. function send(s: TSocket; var buf; len, flags: Integer): Integer; stdcall; function recv(s: TSocket; var buf; len, flags: Integer): Integer; stdcall;

Функции возвращают количество переданных или принятых байт в случае успеха и отрицательное число в случае ошибки. Количество переданных или принятых байт может быть меньше, чем указанная в параметре len длина буфера. Тогда вам нужно повторить передачу/прием оставшихся байт.

Закрытие сокета осуществляется вызовом функции closesocket: function closesocket(s: TSocket): Integer; stdcall;

Возвращаемое значение можно проигнорировать (если вы знаете, что делаете).

Вышеуказанный материал не представляет ничего нового для тех, кто хоть раз программировал под WinSock. Единственное, на что следует обратить внимание, это новые константы AF_BTH и BTHPROTO_RFCOMM.Создание сервера

Как и создание клиента, создание сервера ничем не отличается от создания сервера для любой службы WinSock.

Итак, начнем. Сокет создается также как и в приведенном выше примере для клиента. Точно также заполняем структуру Addt: SOCKADDR_BTH. Только в качестве адреса устройства указываем 0. Далее, необходимо привязать сокет к адресу. Делается это функцией bind: function bind(s: TSocket; name: PSockAddr; namelen: Integer): Integer; stdcall;

Которая вызывается следующим образом: begin if Bind(ASocket, @Addr, AddrSize) <> 0 then RaiseLastOsError;

Далее вызываем функцию listen, для того чтобы сервер начал прослушивать сокет на предмет подключения клиентов и функцию accept для приема входящего подключения: function listen(s: TSocket; backlog: Integer): Integer; stdcall; function accept(s: TSocket; addr: PSockAddr; addrlen: PINT): TSocket; stdcall;

Делается это так: var AClientSocket: TSocket; begin if listen(ASocket, 10) <> 0 then RaiseLastOSError; AClientSocket = accept(ASocket, nil, nil);

После подключения клиента можно работать с AClientSocket — передавать и принимать данные.

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

Как и обещал, я коротко описал процедуры, необходимые для построения простого клиента и сервера, которые будут работать с Bluetooth через WinSock.

Однако здесь я не рассматривал вопросы регистрации сервисов и протоколы верхнего уровня.

Приведенной здесь информации достаточно для того, чтобы вы могли создать приложение клиент, которое соединится с вашим телефоном по Bluetooth и сможет выполнять AT-команды.

Источник

Читайте также:  Safari ios для android
Оцените статью