Bluetooth Low Energy (BLE) Central Plugin для Apache Cordova
Этот плагин позволяет осуществлять коммуникацию между телефоном и периферийными устройствами Bluetooth Low Energy (BLE).
Плагин предоставляет простой JavaScript API для iOS и Android.
При сканировании периферийных устройств возвращается рекламная информация. При подключении к периферийному устройству возвращаются данные о службе, характеристике и свойстве. Весь доступ осуществляется через служебные и характеристические UUID. Плагин управляет дескрипторами внутри.
Поддерживаются одновременные подключения к нескольким периферийным устройствам.
Примеры использования этого плагина можно найти на странице https://github.com/don/cordova-plugin-ble-central/tree/master/examples.
$ cordova plugin add cordova-plugin-ble-central
$ phonegap plugin add cordova-plugin-ble-central
Отредактируйте config.xml, чтобы установить плагин для PhoneGap Build.
<gap:plugin name="cordova-plugin-ble-central" source="npm" />
<preference name="phonegap-version" value="cli-6.1.0" />
Этот плагин включён в версии приложения PhoneGap Developer App для iOS и Android.
Обратите внимание, что идентификатор этого плагина изменился с com.megster.cordova.ble
на cordova-plugin-ble-central
в рамках миграции с репозитория плагинов Cordova на npm.
Для iOS 10 приложения будут аварийно завершать работу, если они не включают описание использования для типов данных, к которым они обращаются. Для Bluetooth необходимо определить NSBluetoothPeripheralUsageDescription.
Это можно сделать при установке плагина с использованием переменной BLUETOOTH_USAGE_DESCRIPTION.
$ cordova plugin add cordova-plugin-ble-central --variable BLUETOOTH_USAGE_DESCRIPTION="Ваше описание здесь"
Сканируйте и обнаруживайте периферийные устройства BLE.
ble.scan(services, seconds, success, failure);
Функция scan
сканирует на наличие устройств BLE. Обратный вызов успеха вызывается каждый раз, когда обнаруживается периферийное устройство. Сканирование автоматически останавливается после указанного количества секунд.
{
"name": "TI SensorTag",
"id": "BD922605-1B07-4D55-8D09-B66653E51BBA",
"rssi": -79,
"advertising": /* ArrayBuffer или map */
}
Формат рекламной информации зависит от вашей платформы. Дополнительную информацию см. в разделе Рекламные данные.
ble.scan([], 5, function(device) {
console.log(JSON.stringify(device));
}, failure); **Подключение (connect)**
Подключение к периферийному устройству.
ble.connect(device_id, connectSuccess, connectFailure);
Описание
Функция connect подключает к BLE периферийному устройству. Обратный вызов выполняется длительное время. При успешном подключении вызывается функция success. Информация о службе и характеристиках будет передана в функцию обратного вызова в объекте peripheral. Функция failure вызывается при сбое подключения или позже, если периферийное устройство отключается. В функцию failure передаётся объект периферийного устройства.
Примечание: обратный вызов сбоя подключения будет вызван, если периферийное устройство отключится.
Параметры
— device_id: UUID или MAC-адрес периферийного устройства; — connectSuccess:
Сканирование (startScan)
Сканирование на наличие периферийных устройств BLE. Сканирование продолжается до тех пор, пока не будет вызвана функция stopScan.
callback is called each time a peripheral is discovered. Scanning will continue until stopScan
is called.
{
"name": "TI SensorTag",
"id": "BD922605-1B07-4D55-8D09-B66653E51BBA",
"rssi": -79,
"advertising": /* ArrayBuffer or map */
}
Advertising information format varies depending on your platform. See Advertising Data for more information.
Параметры
— services: список служб для обнаружения или [] для поиска всех устройств; — success: функция обратного вызова успеха, которая вызывается для каждого обнаруженного устройства; — failure: функция обратного вызова ошибки, вызываемая при возникновении ошибки. [Необязательно]
Быстрый пример
ble.startScan([], function(device) { console.log(JSON.stringify(device)); }, failure);
setTimeout(ble.stopScan, 5000, function() { console.log("Scan complete"); }, function() { console.log("stopScan failed"); } );
Сканируйте и обнаруживайте периферийные устройства BLE, задавая параметры сканирования.
ble.startScanWithOptions(services, options, success, failure);
Описание
Функция startScanWithOptions сканирует на наличие устройств BLE. Она работает аналогично функции startScan, но позволяет указать дополнительные параметры (например, разрешить дублирование отчётов об устройствах). Функция обратного вызова success вызывается каждый раз при обнаружении периферийного устройства. Сканирование будет продолжаться до тех пор, пока не будет вызвана функция stopScan.
{
"name": "TI SensorTag",
"id": "BD922605-1B07-4D55-8D09-B66653E51BBA",
"rssi": -79,
"advertising": /* ArrayBuffer or map */
}
Advertising information format varies depending on your platform. See Advertising Data for more information.
Параметры
— services: список служб для обнаружения или [] для поиска всех устройств; — options: объект, определяющий набор пар имя-значение. В настоящее время допустимыми параметрами являются: — reportDuplicates_: true, если следует сообщать о повторяющихся устройствах, false (по умолчанию), если устройства должны сообщаться только один раз. [Необязательно]; — success: функция обратного вызова успеха, которая вызывается для каждого обнаруженного устройства; — failure: функция обратного вызова ошибки, вызываемая при возникновении ошибки. [Необязательно].
Быстрый пример
ble.startScan([], { reportDuplicates: true } function(device) { console.log(JSON.stringify(device)); }, failure);
setTimeout(ble.stopScan, 5000, function() { console.log("Scan complete"); }, function() { console.log("stopScan failed"); } );
Остановите сканирование на наличие периферийных устройств BLE.
ble.stopScan(success, failure);
Описание
Функция stopScan останавливает сканирование на наличие устройств BLE.
Параметры
— success: функция обратного вызова успеха, вызываемая после остановки сканирования. [Необязательно]; — failure: функция обратного вызова ошибки, вызываемая при возникновении ошибки. [Необязательно].
Быстрый пример
ble.startScan([], function(device) { console.log(JSON.stringify(device)); }, failure);
setTimeout(ble.stopScan, 5000, function() { console.log("Scan complete"); }, function() { console.log("stopScan failed"); } );
/* Alternate syntax setTimeout(function() { ble.stopScan( function() { console.log("Scan complete"); }, function() { console.log("stopScan failed"); } ); }, 5000); */
Подключайтесь к периферийному устройству.
ble.connect(device_id, connectSuccess, connectFailure);
Описание
Функция connect подключается к периферийному устройству BLE. Обратный вызов является длительным. Успех будет вызван при успешном подключении. Информация о службах и характеристиках будет передаваться в функцию обратного вызова в периферийном объекте. Ошибка вызывается, если подключение не удаётся, или позже, если периферийное устройство отключается. Объект периферийного устройства передаётся в функцию сбоя.
Примечание: обратный вызов сбоя подключения будет вызываться, если периферийное устройство отключится. Функция обратного вызова при успешном подключении, которая вызывается при установлении соединения.
connectFailure: функция обратного вызова ошибки, вызываемая при возникновении ошибки или разрыве соединения.
Отключает выбранное устройство.
ble.disconnect(device_id, [success], [failure]);
Функция disconnect
отключает выбранное устройство.
Считывает значение характеристики.
ble.read(device_id, service_uuid, characteristic_uuid, success, failure);
Функция read
считывает значение характеристики.
Исходные данные передаются из нативного кода в обратный вызов как ArrayBuffer (#typed-arrays).
Записывает данные в характеристику.
ble.write(device_id, service_uuid, characteristic_uuid, data, success, failure);
Функция write
записывает данные в характеристику.
Используйте ArrayBuffer (#typed-arrays) при записи данных.
// отправляем 1 байт для включения света
var data = new Uint8Array(1);
data[0] = 1;
ble.write(device_id, "FF10", "FF11", data.buffer, success, failure);
// отправляем значение из 3 байтов с цветом RGB
var data = new Uint8Array(3);
data[0] = 0xFF; // красный
data[1] = 0x00; // зелёный
data[2] = 0xFF; // синий
ble.write(device_id, "ccc0", "ccc1", data.buffer, success, failure);
// отправляем 32-битное целое число
var data = new Uint32Array(1);
data[0] = counterInput.value;
ble.write(device_id, SERVICE, CHARACTERISTIC, data.buffer, success, failure);
Записывает данные в характеристику без подтверждения от периферийного устройства.
ble.writeWithoutResponse(device_id, service_uuid, characteristic_uuid, data, success, failure);
Функция writeWithoutResponse
записывает данные в характеристику без ответа от периферийного устройства. Вы не будете уведомлены, если запись завершится неудачно в стеке BLE. Функция обратного вызова успеха будет вызвана после успешной записи характеристики.
Регистрирует уведомления при изменении значения характеристики.
ble.startNotification(device_id, service_uuid, characteristic_uuid, success, failure);
Функция startNotification
регистрирует обратный вызов, который вызывается каждый раз, когда изменяется значение характеристики. Этот метод обрабатывает как уведомления, так и индикации. Функция обратного вызова успеха вызывается несколько раз.
Исходные данные передаются из нативного кода в успешный обратный вызов как ArrayBuffer (#typed-arrays).
См. раздел «Фоновые уведомления на iOS» (#background-notifications-on-ios).
device_id: UUID или MAC-адрес периферийного устройства. characteristic_uuid: UUID характеристики BLE.
success: функция обратного вызова Success вызывается каждый раз, когда происходит уведомление.
failure: функция обратного вызова Failure вызывается при возникновении ошибки. [необязательно]
var onData = function(buffer) {
// Декодируем ArrayBuffer в типизированный массив на основе ожидаемых данных
var data = new Uint8Array(buffer);
alert("Состояние кнопки изменилось на " + data[0]);
}
ble.startNotification(device_id, "FFE0", "FFE1", onData, failure);
Прекратить получение уведомлений при изменении значения характеристики.
ble.stopNotification(device_id, service_uuid, characteristic_uuid, success, failure);
Функция stopNotification
останавливает ранее зарегистрированный обратный вызов уведомления.
Сообщает о состоянии подключения.
ble.isConnected(device_id, success, failure);
Функция isConnected
вызывает функцию обратного вызова success, когда периферийное устройство подключено, и функцию обратного вызова failure, когда не подключено.
ble.isConnected(
'FFCA0B09-CB1D-4DC0-A1EF-31AFD3EDFB53',
function() {
console.log("Периферийное устройство подключено");
},
function() {
console.log("Периферийное устройство *не* подключено");
}
);
Сообщает, включён ли Bluetooth.
ble.isEnabled(success, failure);
Функция isEnabled
вызывает функцию обратного вызова success, если Bluetooth включён, и функцию обратного вызова failure, если Bluetooth не включён.
ble.isEnabled(
function() {
console.log("Bluetooth включён");
},
function() {
console.log("Bluetooth *не* включён");
}
);
Регистрирует уведомления об изменении состояния Bluetooth на устройстве.
ble.startStateNotifications(success, failure);
Функция startStateNotifications
вызывает функцию обратного вызова success при включении или отключении Bluetooth на устройстве.
States
ble.startStateNotifications(
function(state) {
console.log("Bluetooth находится в состоянии " + state);
}
);
Останавливает уведомления о состоянии.
ble.startStateNotifications(success, failure);
Функция stopStateNotifications
вызывает функцию обратного вызова success после остановки уведомлений о состоянии Bluetooth.
Показывает настройки Bluetooth на устройстве.
ble.showBluetoothSettings(success, failure);
Функция showBluetoothSettings
открывает настройки Bluetooth для операционных систем.
showBluetoothSettings
не поддерживается на iOS.
ble.showBluetoothSettings();
{
"name": "demo",
"id": "00:1A:7D:DA:71:13",
"advertising": ArrayBuffer,
"rssi": -37
}
Преобразуйте рекламную информацию в Uint8Array для обработки. var adData = new Uint8Array(peripheral.advertising)
Обратите внимание, что iOS использует строковое значение констант для ключей извлечения данных рекламы Advertisement Data Retrieval Keys. Вероятно, это изменится в будущем.
{
"name": "demo",
"id": "D8479A4F-7517-BCD3-91B5-3302B2F81802",
"advertising": {
"kCBAdvDataChannel": 37,
"kCBAdvDataServiceData": {
"FED8": {
"byteLength": 7 // данные не показаны
}
},
"kCBAdvDataLocalName": "demo",
"kCBAdvDataServiceUUIDs": ["FED8"],
"kCBAdvDataManufacturerData": {
"byteLength": 7 // данные не показаны
},
"kCBAdvDataTxPowerLevel": 32,
"kCBAdvDataIsConnectable": true
},
"rssi": -53
}
Этот плагин использует типизированные массивы или ArrayBuffers для отправки и получения данных.
Это означает, что вам необходимо преобразовать свои данные в ArrayBuffers перед отправкой и из ArrayBuffers при получении.
// ASCII только
function stringToBytes(string) {
var array = new Uint8Array(string.length);
for (var i = 0, l = string.length; i < l; i++) {
array[i] = string.charCodeAt(i);
}
return array.buffer;
}
// ASCII only
function bytesToString(buffer) {
return String.fromCharCode.apply(null, new Uint8Array(buffer));
}
Вы можете прочитать больше о типизированных массивах в этих статьях на MDN и HTML5 Rocks.
UUID всегда являются строками, а не числами. Некоторые 16-битные UUID, такие как '2220', выглядят как целые числа, но это не так. (Целое число 2220 равно 0x8AC в шестнадцатеричном формате.) Это не проблема с 128-битными UUID, поскольку они выглядят как строки 82b9e6e1-593a-456f-be9b-9215160ebcac. Все 16-битные UUID также должны передаваться методам в виде строк.
# Фоновое сканирование и уведомления на iOSПриложения для Android будут продолжать получать уведомления, пока приложение находится в фоновом режиме.
Приложениям для iOS требуется дополнительная настройка, чтобы разрешить работу Bluetooth в фоновом режиме.
Установите плагин cordova-custom-config.
cordova plugin add cordova-custom-config
Добавьте новый раздел в config.xml
<platform name="ios">
<config-file parent="UIBackgroundModes" target="*-Info.plist">
<array>
<string>bluetooth-central</string>
</array>
</config-file>
</platform>
См. пример проекта ble-background для получения более подробной информации.
Для тестов требуется Cordova Plugin Test Framework.
Создайте новый проект
git clone https://github.com/don/cordova-plugin-ble-central
cordova create ble-test com.example.ble.test BLETest
cd ble-test
cordova platform add android
cordova plugin add ../cordova-plugin-ble-central
cordova plugin add ../cordova-plugin-ble-central/tests
cordova plugin add cordova-plugin-test-framework
Измените стартовую страницу в config.xml
<content src="cdvtests/index.html" />
Запустите приложение на своём телефоне
cordova run android --device
Apache 2.0
Попробуйте код. Если вы обнаружите проблему или отсутствующую функцию, создайте задачу или запрос на вытягивание.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )