import { Injectable } from '@angular/core'; import { Cordova, CordovaProperty, IonicNativePlugin, Plugin } from '@ionic-native/core'; import { Observable } from 'rxjs'; /* Available status of device */ export type Status = | 'scanStarted' | 'scanStopped' | 'scanResult' | 'connected' | 'disconnected' | 'bonding' | 'bonded' | 'unbonded' | 'closed' | 'services' | 'discovered' | 'characteristics' | 'descriptors' | 'read' | 'subscribed' | 'unsubscribed' | 'subscribedResult' | 'written' | 'readDescriptor' | 'writeDescriptor' | 'rssi' | 'mtu' | 'connectionPriorityRequested' | 'enabled' | 'disabled' | 'readRequested' | 'writeRequested' | 'mtuChanged' | 'notifyReady' | 'notifySent' | 'serviceAdded' | 'serviceRemoved' | 'allServicesRemoved' | 'advertisingStarted' | 'advertisingStopped' | 'responded' | 'notified'; /** Available connection priorities */ export type ConnectionPriority = 'low' | 'balanced' | 'high'; export interface Params { /** The address/identifier provided by the scan's return object */ address: string; /** The service's ID */ service: string; } export interface InitPeripheralParams { /** Should user be prompted to enable Bluetooth */ request?: boolean; /* A unique string to identify your app. Bluetooth Central background mode is required to use this, but background mode doesn't seem to require specifying the restoreKey */ restoreKey?: string; } export interface InitParams extends InitPeripheralParams { /** Should change in Bluetooth status notifications be sent */ statusReceiver?: boolean; } export interface ScanParams { /* An array of service IDs to filter the scan or empty array / null. This parameter is not supported on Windows platform yet */ services?: string[]; /* True/false to allow duplicate advertisement packets, defaults to false (iOS)*/ allowDuplicates?: boolean; /** Defaults to Low Power. Available from API21 / API 23 (Android) */ scanMode?: BluetoothScanMode; /** Defaults to Aggressive. Available from API23 (Android) */ matchMode?: BluetoothMatchMode; /** Defaults to One Advertisement. Available from API23 (Android) */ matchNum?: BluetoothMatchNum; /** Defaults to All Matches. Available from API21 / API 23. (Android) */ callbackType?: BluetoothCallbackType; /** True/false to show only connectable devices, rather than all devices ever seen, defaults to false (Windows) */ isConnectable?: boolean; } export interface NotifyParams { /** Service's UUID */ service: string; /** Characteristic's UUID */ characteristic: string; /** Base64 encoded string, number or string */ value: string; } export interface RespondParams { /** This integer value will be incremented every read/writeRequested */ requestId: number; /** base64 string */ value: string; /** not documented */ offset?: number; } export interface ConnectionParams { /** The address/identifier provided by the scan's return object */ address: string; /** Automatically connect as soon as the remote device becomes available (Android) */ autoConnect?: boolean; /** * Transport mode. Available from API 23 (Android). * If none is specified the default behavior is TRANSPORT_AUTO * * Note: On Android 10, TRANSPORT_AUTO can lead to connection errors with Status code 133. * In this case TRANSPORT_LE can be used. */ transport?: AndroidGattTransportMode; } export enum AndroidGattTransportMode { /** * No preference of physical transport for GATT connections to remote dual-mode devices */ TRANSPORT_AUTO = 0, /** * Prefer BR/EDR transport for GATT connections to remote dual-mode devices */ TRANSPORT_BREDR = 1, /** * Prefer LE transport for GATT connections to remote dual-mode devices */ TRANSPORT_LE = 2, } export interface CharacteristicParams extends Params { /** An array of characteristic IDs to discover or empty array / null */ characteristics?: string[]; } export interface DescriptorParams extends Params { /** The characteristic's ID */ characteristic: string; } export interface OperationDescriptorParams extends DescriptorParams { /** The descriptor's ID */ descriptor: string; } export interface WriteCharacteristicParams extends DescriptorParams { /* Base64 encoded string */ value: string; /* Set to "noResponse" to enable write without response, all other values will write normally. */ type?: string; } export interface WriteDescriptorParams extends DescriptorParams { /** The descriptor's ID */ descriptor: string; /** Base64 encoded string, number or string */ value: string; } export type AdvertisingParams = AdvertisingParamsAndroid | AdvertisingParamsIOS; export type AdvertiseMode = 'balanced' | 'lowLatency' | 'lowPower'; export type TxPowerLevel = 'high' | 'low' | 'ultralow' | 'medium'; export interface AdvertisingParamsAndroid { /** Service UUID on Android */ service: string; /** not documented */ mode?: AdvertiseMode; /** not documented */ connectable?: boolean; /** not documented */ timeout?: number; /** not documented */ txPowerLevel?: TxPowerLevel; /** not documented */ manufacturerId?: number; /** not documented */ manufacturerSpecificData?: any; /** not documented */ includeDeviceName: boolean; /** not documented */ includeTxPowerLevel: boolean; } export interface AdvertisingParamsIOS { /** Array of service UUIDs on iOS */ services: string[]; /** device's name */ name?: string; } export interface CommonInfo { /** The device's display name */ name: string; /** The device's address / identifier for connecting to the object */ address: string; } export interface DeviceInfo extends CommonInfo { /** Device's status */ status: Status; } export interface RSSI extends DeviceInfo { /** signal strength */ rssi: number; } export interface MTU extends DeviceInfo { /* mtu value */ mtu: number; } export interface BondedStatus extends CommonInfo { /* Bonded status*/ isBonded: boolean; } export interface PrevConnectionStatus extends CommonInfo { /** Determine whether the device was connected */ wasConnected: boolean; } export interface CurrConnectionStatus extends CommonInfo { /** Determine whether the device is connected */ isConnected: boolean; } export interface DiscoverStatus extends CommonInfo { /** Determine whether the device's characteristics and descriptors have been discovered */ isDiscovered: boolean; } export interface ScanStatus extends DeviceInfo { /** signal strength */ rssi: number; /** * advertisement data in encoded string of bytes, use bluetoothle.encodedStringToBytes() (Android) * advertisement hash with the keys (iOS) * empty (Windows) */ advertisement: | { /** An array of service UUIDs */ serviceUuids: string[]; /** A string representing the name of the manufacturer of the device */ manufacturerData: string; /** A number containing the transmit power of a peripheral */ txPowerLevel: number; /** An array of one or more CBUUID objects, representing CBService UUIDs that were found in the “overflow” area of the advertisement data */ overflowServiceUuids: string[]; /** A boolean value that indicates whether the advertising event type is connectable */ isConnectable: boolean; /** An array of one or more CBUUID objects, representing CBService UUIDs */ solicitedServiceUuids: string[]; /* A dictionary containing service-specific advertisement data */ serviceData: any; /* A string containing the local name of a peripheral */ localName: string; } | string; } export interface Service { /** Service's uuid */ uuid: string; /** Array of characteristics */ characteristics: Characteristic[]; } export interface Characteristic { /* Array of descriptors */ descriptors?: Descriptor[]; /** Characteristic's uuid */ uuid: string; /** * Characteristic's properties * If the property is defined as a key, the characteristic has that property */ properties?: { write?: boolean; broadcast?: boolean; extendedProps?: boolean; writeWithoutResponse?: boolean; writeNoResponse?: boolean; signedWrite?: boolean; read?: boolean; notify?: boolean; indicate?: boolean; authenticatedSignedWrites?: boolean; notifyEncryptionRequired?: boolean; indicateEncryptionRequired?: boolean; }; /** * If the permission is defined as a key, the character has that permission */ permissions?: { read?: boolean; readEncrypted?: boolean; readEncryptedMITM?: boolean; write?: boolean; writeSigned?: boolean; writeSignedMITM?: boolean; writeEncryptedMITM?: boolean; readEncryptionRequired?: boolean; writeEncryptionRequired?: boolean; }; } export interface Descriptor { uuid: string; } export interface Device extends DeviceInfo { /** Device's services */ services: Service[]; } export interface Services extends DeviceInfo { /** Array of service UUIDS */ services: string[]; } export interface Descriptors extends DeviceInfo { /** Characteristic's UUID */ characteristic: string; /** Service's UUID */ service: string; /* Array of descriptor UUIDs */ descriptors: string[]; } export interface OperationResult extends DeviceInfo { /** Characteristic UUID */ characteristic: string; /** Service's UUID */ service: string; /** Base64 encoded string of bytes */ value: string; } export interface UnsubscribeResult extends DeviceInfo { /** Characteristic UUID */ characteristic: string; /** Service's UUID */ service: string; } export interface DescriptorResult extends OperationResult { descriptor: string; } export interface Characteristics extends DeviceInfo { /** Service's id */ service: string; /* Array of characteristic objects*/ characteristics: Characteristic[]; } export interface InitializeResult { /** Device's status */ status: Status; /** The address/identifier provided by the scan's return object */ address: string; /** Service's UUID */ service: string; /** Characteristic UUID */ characteristic: string; /** This integer value will be incremented every read/writeRequested */ requestId: number; /** Offset value */ offset: number; /** mtu value */ mtu: number; /** Base64 encoded string of bytes */ value: string; } export enum BluetoothScanMode { SCAN_MODE_OPPORTUNISTIC = -1, SCAN_MODE_LOW_POWER = 0, SCAN_MODE_BALANCED = 1, SCAN_MODE_LOW_LATENCY = 2, } export enum BluetoothMatchMode { MATCH_MODE_AGRESSIVE = 1, MATCH_MODE_STICKY = 2, } export enum BluetoothMatchNum { MATCH_NUM_ONE_ADVERTISEMENT = 1, MATCH_NUM_FEW_ADVERTISEMENT = 2, MATCH_NUM_MAX_ADVERTISEMENT = 3, } export enum BluetoothCallbackType { CALLBACK_TYPE_ALL_MATCHES = 1, CALLBACK_TYPE_FIRST_MATCH = 2, CALLBACK_TYPE_MATCH_LOST = 4, } export interface Error { code: number; message: string; } export interface AdapterInfo { name: string; address: string; isInitialized: boolean; isEnabled: boolean; isScanning: boolean; isDiscoverable: boolean; } /** * @name BluetoothLE * @description * This plugin has the most complete implementation for interacting with Bluetooth LE devices on Android, iOS and partially Windows. * It's a wrap around [randdusing/cordova-plugin-bluetoothle](https://github.com/randdusing/cordova-plugin-bluetoothle/blob/master/readme.md) cordova plugin for Ionic. * It supports peripheral **and** central modes and covers most of the API methods available on Android and iOS. * * @usage * ```typescript * import { BluetoothLE } from '@ionic-native/bluetooth-le/ngx'; * * * constructor(public bluetoothle: BluetoothLE, public plt: Platform) { * * this.plt.ready().then((readySource) => { * * console.log('Platform ready from', readySource); * * this.bluetoothle.initialize().then(ble => { * console.log('ble', ble.status) // logs 'enabled' * }); * * }); * } * * ``` * */ @Plugin({ pluginName: 'BluetoothLE', plugin: 'cordova-plugin-bluetoothle', // npm package name, example: cordova-plugin-camera pluginRef: 'bluetoothle', // the variable reference to call the plugin, example: navigator.geolocation repo: 'https://github.com/randdusing/cordova-plugin-bluetoothle', // the github repository URL for the plugin install: 'ionic cordova plugin add cordova-plugin-bluetoothle', // OPTIONAL install command, in case the plugin requires variables installVariables: [], // OPTIONAL the plugin requires variables platforms: ['Android', 'iOS'], // Array of platforms supported, example: ['Android', 'iOS'] }) @Injectable() export class BluetoothLE extends IonicNativePlugin { /** * @name initialize * Initialize Bluetooth on the device * @param {InitParams} [params] * @returns {(Observable<{ status: 'enabled' | 'disabled'}>)} The callback that is passed initialize status (enabled/disabled) */ @Cordova({ successIndex: 0, errorIndex: 2, observable: true }) initialize(params?: InitParams): Observable<{ status: 'enabled' | 'disabled' }> { return; } /** * @name enable (Android) * Enable Bluetooth on the device. Android support only * @returns void */ @Cordova({ callbackOrder: 'reverse', sync: true }) enable() { return; } /** * @name disable (Android) * Disable Bluetooth on the device. Android support only * @returns void */ @Cordova({ callbackOrder: 'reverse', sync: true }) disable() { return; } /** * @name getAdapterInfo (Android) * Retrieve useful information such as the address, name, and various states (initialized, enabled, scanning, discoverable). * This can be very useful when the general state of the adapter has been lost, and we would otherwise need to go through a series of callbacks to get the correct state (first initialized, then enabled, then isScanning, and so forth). * The result of this method allows us to take business logic decisions while avoiding a large part of the callback hell. * Currently the discoverable state does not have any relevance because there is no "setDiscoverable" functionality in place. That may change in the future. * @returns {Promise} */ @Cordova({ callbackOrder: 'reverse' }) getAdapterInfo(): Promise { return; } /** * @name startScan * Scan for Bluetooth LE devices. * Since scanning is expensive, stop as soon as possible. The Cordova app should use a timer to limit the scan interval. * Android API >= 23 requires ACCESS_COARSE_LOCATION permissions to find unpaired devices. * Permissions can be requested by using the hasPermission and requestPermission functions. * Android API >= 23 also requires location services to be enabled. Use isLocationEnabled to determine whether location services are enabled. * If not enabled, use requestLocation to prompt the location services settings page. * @param {ScanParams} params Scan params * @returns {(Observable< ScanStatus >)} */ @Cordova({ callbackOrder: 'reverse', observable: true }) startScan(params: ScanParams): Observable { return; } /** * @name stopScan * Stop scan for Bluetooth LE devices. Since scanning is expensive, stop as soon as possible * The app should use a timer to limit the scanning time. * @returns {Promise<{status: 'scanStopped'}>} */ @Cordova({ callbackOrder: 'reverse' }) stopScan(): Promise<{ status: 'scanStopped' }> { return; } /** * @name retrieveConnected * Retrieved paired Bluetooth LE devices. In iOS, devices that are "paired" to will not return during a normal scan. * Callback is "instant" compared to a scan. * @param {{ services: string[] }} An array of service IDs to filter the retrieval by. If no service IDs are specified, no devices will be returned. * @returns {Promise<{ devices: DeviceInfo[] }>} */ @Cordova({ callbackOrder: 'reverse' }) retrieveConnected(params?: { services?: string[] }): Promise<{ devices: DeviceInfo[] }> { return; } /** * @name bond (Android) * Bond with a device. * The device doesn't need to be connected to initiate bonding. Android support only. * @param {{ address: string }} params The address/identifier provided by the scan's return object * @returns {(Observable<{ status: DeviceInfo }>)} * success: * The first success callback should always return with status == bonding. * If the bond is created, the callback will return again with status == bonded. * If the bonding popup is canceled or the wrong code is entered, the callback will return again with status == unbonded. * error: * The callback that will be triggered when the bond operation fails */ @Cordova({ callbackOrder: 'reverse', observable: true }) bond(params: { address: string }): Observable<{ status: DeviceInfo }> { return; } /** * @name unbond (Android) * Unbond with a device. The device doesn't need to be connected to initiate bonding. Android support only. * @param {{address: string}} params The address/identifier * @returns {Promise<{ status: DeviceInfo }>} * success: The success callback should always return with status == unbonded, that is passed with device object * error: The callback that will be triggered when the unbond operation fails */ @Cordova({ callbackOrder: 'reverse' }) unbond(params: { address: string }): Promise<{ status: DeviceInfo }> { return; } /** * @name connect * Connect to a Bluetooth LE device * @param connectSuccess The success callback that is passed with device object * @param connectError The callback that will be triggered when the connect operation fails * @param params The connection params * * @param {ConnectionParams} params * @returns {(Observable<{ status: DeviceInfo }>)} * success: device object with status * error: The callback that will be triggered when the unbond operation fails */ @Cordova({ callbackOrder: 'reverse', observable: true }) connect(params: ConnectionParams): Observable { return; } /** * @name reconnect * Reconnect to a previously connected Bluetooth device * @param {{address: string}} params The address/identifier * @returns {(Observable)} */ @Cordova({ callbackOrder: 'reverse', observable: true }) reconnect(params: { address: string }): Observable { return; } /** * @name disconnect * Disconnect from a Bluetooth LE device. * Note: It's simpler to just call close(). Starting with iOS 10, disconnecting before closing seems required! * @param {{address: string}} params The address/identifier * @returns {Promise} */ @Cordova({ callbackOrder: 'reverse' }) disconnect(params: { address: string }): Promise { return; } /** * @name close * Close/dispose a Bluetooth LE device. * Prior to 2.7.0, you needed to disconnect to the device before closing, but this is no longer the case. * Starting with iOS 10, disconnecting before closing seems required! * @param {{ address: string }} params The address/identifier * @returns {Promise} */ @Cordova({ callbackOrder: 'reverse' }) close(params: { address: string }): Promise { return; } /** * @name discover * Discover all the devices services, characteristics and descriptors. * Doesn't need to be called again after disconnecting and then reconnecting. * If using iOS, you shouldn't use discover and services/characteristics/descriptors on the same device. * There seems to be an issue with calling discover on iOS8 devices, so use with caution. * On some Android versions, the discovered services may be cached for a device. * Subsequent discover events will make use of this cache. * If your device's services change, set the clearCache parameter to force Android to re-discover services. * @param {{ address: string, clearCache: boolean }} params The address/identifier * @returns {Promise} * success: device object (contains array of service objects) * error: The callback that will be triggered when the unbond operation fails */ @Cordova({ callbackOrder: 'reverse' }) discover(params: { address: string; clearCache?: boolean }): Promise { return; } /** * @name services (iOS) * Discover the device's services. * Not providing an array of services will return all services and take longer to discover. iOS support only. * @param {{address: string, services: string[]}} params * @returns {Promise} */ @Cordova({ callbackOrder: 'reverse' }) services(params: { address: string; services?: string[] }): Promise { return; } /** * @name characteristics (iOS) * Discover the service's characteristics. * Not providing an array of characteristics will return all characteristics and take longer to discover. iOS support only. * @param {CharacteristicParams} params Characteristic params * @returns {Promise<{ characteristics: Characteristics }>} The service id and an Array of characteristics */ @Cordova({ callbackOrder: 'reverse' }) characteristics(params: CharacteristicParams): Promise<{ characteristics: Characteristics }> { return; } /** * @name descriptors (iOS) * Discover the characteristic's descriptors. iOS support only. * @param {DescriptorParams} params * @returns {Promise<{ descriptors: Descriptors }>} */ @Cordova({ callbackOrder: 'reverse' }) descriptors(params: DescriptorParams): Promise<{ descriptors: Descriptors }> { return; } /** * @name read * Read a particular service's characteristic once * @param {DescriptorParams} params * @returns {Promise} */ @Cordova({ callbackOrder: 'reverse' }) read(params: DescriptorParams): Promise { return; } /** * @name subscribe * Subscribe to a particular service's characteristic. * Once a subscription is no longer needed, execute unsubscribe in a similar fashion. * The Client Configuration descriptor will automatically be written to enable notification/indication based on the characteristic's properties. * @param {DescriptorParams} params * @returns {Observable} */ @Cordova({ callbackOrder: 'reverse', observable: true }) subscribe(params: DescriptorParams): Observable { return; } /** * @name unsubscribe * Unsubscribe to a particular service's characteristic. * @param {DescriptorParams} params * @returns {Promise} */ @Cordova({ callbackOrder: 'reverse' }) unsubscribe(params: DescriptorParams): Promise { return; } /** * @name write (limitation on iOS, read below) * Write a particular service's characteristic * Note: no callback will occur on write without response on iOS. * @param {WriteCharacteristicParams} params * @returns {Promise} */ @Cordova({ callbackOrder: 'reverse' }) write(params: WriteCharacteristicParams): Promise { return; } /** * @name write (limitation on iOS, read below) * Write Quick / Queue, use this method to quickly execute write without response commands when writing more than 20 bytes at a time. * Note: no callback will occur on write without response on iOS. * @param {WriteCharacteristicParams} params * @returns {Promise} */ @Cordova({ callbackOrder: 'reverse' }) writeQ(params: WriteCharacteristicParams): Promise { return; } /** * @name readDescriptor * Read a particular characterist's descriptor * @param {OperationDescriptorParams} params * @returns {Promise} */ @Cordova({ callbackOrder: 'reverse' }) readDescriptor(params: OperationDescriptorParams): Promise { return; } /** * @name writeDescriptor * Write a particular characteristic's descriptor. Unable to write characteristic configuration directly to keep in line with iOS implementation. * Instead use subscribe/unsubscribe, which will automatically enable/disable notification. * @param {WriteDescriptorParams} params * @returns {Promise} */ @Cordova({ callbackOrder: 'reverse' }) writeDescriptor(params: WriteDescriptorParams): Promise { return; } /** * @name rssi * Read RSSI of a connected device. RSSI is also returned with scanning. * @param {{ address: string }} params * @returns {Promise< RSSI >} */ @Cordova({ callbackOrder: 'reverse' }) rssi(params: { address: string }): Promise { return; } /** * @name mtu (Android, Android 5+) * Set MTU of a connected device. Android only. * @param {{ address: string, mtu: number }} params * @returns {Promise< MTU >} */ @Cordova({ callbackOrder: 'reverse' }) mtu(params: { address: string; mtu?: number }): Promise { return; } /** * @name requestConnectionPriority (Android, Android 5+) * Request a change in the connection priority to improve throughput when transfer large amounts of data via BLE. * Android support only. iOS will return error. * @param {{ address: string, connectionPriority: ConnectionPriority }} params * @returns {Promise} */ @Cordova({ callbackOrder: 'reverse' }) requestConnectionPriority(params: { address: string; connectionPriority: ConnectionPriority }): Promise { return; } /** * @name isInitialized * Determine whether the adapter is initialized. No error callback. Returns true or false * @returns {Promise<{ isInitialized: boolean }>} */ @Cordova({ callbackOrder: 'reverse' }) isInitialized(): Promise<{ isInitialized: boolean }> { return; } /** * @name isEnabled * Determine whether the adapter is enabled. No error callback * @returns {Promise<{ isEnabled: boolean }>} */ @Cordova({ callbackOrder: 'reverse' }) isEnabled(): Promise<{ isEnabled: boolean }> { return; } /** * @name isScanning * Determine whether the adapter is scanning. No error callback. Returns true or false * @returns {Promise<{ isScanning: boolean }>} */ @Cordova({ callbackOrder: 'reverse' }) isScanning(): Promise<{ isScanning: boolean }> { return; } /** * @name isBonded (Android) * Determine whether the device is bonded or not, or error if not initialized. Android support only. * @param {{ address: string }} params * @returns {Promise} */ @Cordova({ callbackOrder: 'reverse' }) isBonded(params: { address: string }): Promise { return; } /** * @name wasConnected * Determine whether the device was connected, or error if not initialized. * @param {{ address: string }} params * @returns {Promise} */ @Cordova({ callbackOrder: 'reverse' }) wasConnected(params: { address: string }): Promise { return; } /** * @name isConnected * Determine whether the device is connected, or error if not initialized or never connected to device * @param {{ address: string }} params * @returns {Promise} */ @Cordova({ callbackOrder: 'reverse' }) isConnected(params: { address: string }): Promise { return; } /** * @name isDiscovered * Determine whether the device's characteristics and descriptors have been discovered, or error if not initialized or not connected to device. * @param {{ address: string }} params * @returns {Promise} */ @Cordova({ callbackOrder: 'reverse' }) isDiscovered(params: { address: string }): Promise { return; } /** * @name hasPermission (useful only for Android 6+ / API 23) * Determine whether coarse location privileges are granted since scanning for unpaired devices requires it in Android API 23 * @returns {Promise<{ hasPermission: boolean }>} */ @Cordova({ callbackOrder: 'reverse' }) hasPermission(): Promise<{ hasPermission: boolean }> { return; } /** * @name requestPermission (useful only for Android 6+ / API 23) * Request coarse location privileges since scanning for unpaired devices requires it in Android API 23. * Will return an error if called on iOS or Android versions prior to 6.0. * @returns {Promise<{ requestPermission: boolean }>} */ @Cordova({ callbackOrder: 'reverse' }) requestPermission(): Promise<{ requestPermission: boolean }> { return; } /** * @name isLocationEnabled (useful only for Android 6+ / API 23) * Determine if location services are enabled or not. Location Services are required to find devices in Android API 23 * @returns {Promise<{ isLocationEnabled: boolean }>} */ @Cordova({ callbackOrder: 'reverse' }) isLocationEnabled(): Promise<{ isLocationEnabled: boolean }> { return; } /** * @name requestLocation (useful only for Android 6+ / API 23) * Prompt location services settings pages. requestLocation property returns whether location services are enabled or disabled. * Location Services are required to find devices in Android API 23. * @returns {Promise<{ requestLocation: boolean }>} */ @Cordova({ callbackOrder: 'reverse' }) requestLocation(): Promise<{ requestLocation: boolean }> { return; } /** * @name initializePeripheral * Initialize Bluetooth on the device. Must be called before anything else. * Callback will continuously be used whenever Bluetooth is enabled or disabled. * @param {InitPeripheralParams} [params] * @returns {Observable} */ @Cordova({ callbackOrder: 'reverse', observable: true }) initializePeripheral(params?: InitPeripheralParams): Observable { return; } /** * @name addService * Add a service with characteristics and descriptors. If more than one service is added, add them sequentially * @param {{ service: string, characteristics: Characteristic[] }} params * @returns {Promise<{ service: string, status: Status }>} */ @Cordova({ callbackOrder: 'reverse' }) addService(params: { service: string; characteristics: Characteristic[]; }): Promise<{ service: string; status: Status }> { return; } /** * @name removeService * Remove a service * @param {{ service: string }} params * @returns {Promise<{ service: string, status: Status }>} */ @Cordova({ callbackOrder: 'reverse' }) removeService(params: { service: string }): Promise<{ service: string; status: Status }> { return; } /** * @name removeAllServices * Remove all services * @returns {Promise<{ status: Status }>} */ @Cordova({ callbackOrder: 'reverse' }) removeAllServices(): Promise<{ status: Status }> { return; } /** * @name startAdvertising (different behavior on Android/iOS, read below) * Start advertising as a BLE device. * Note: This needs to be improved so services can be used for both Android and iOS. * On iOS, the advertising devices likes to rename itself back to the name of the device, i.e. Rand' iPhone * @param {AdvertisingParams} params * @returns {Promise<{ status: Status }>} */ @Cordova({ callbackOrder: 'reverse' }) startAdvertising(params: AdvertisingParams): Promise<{ status: Status }> { return; } /** * @name stopAdvertising * Stop advertising * @returns {Promise<{ status: Status }>} */ @Cordova({ callbackOrder: 'reverse' }) stopAdvertising(): Promise<{ status: Status }> { return; } /** * @name isAdvertising * Determine if app is advertising or not. * @returns {Promise<{ status: boolean }>} */ @Cordova({ callbackOrder: 'reverse' }) isAdvertising(): Promise<{ status: boolean }> { return; } /** * @name respond * Respond to a read or write request * @param {RespondParams} params * @returns {Promise<{ status: Status }>} */ @Cordova({ callbackOrder: 'reverse' }) respond(params: RespondParams): Promise<{ status: Status }> { return; } /** * @name notify * Update a value for a subscription. Currently all subscribed devices will receive update. * Device specific updates will be added in the future. * If sent equals false in the return value, you must wait for the peripheralManagerIsReadyToUpdateSubscribers event before sending more updates. * @param {NotifyParams} params * @returns {Promise<{ status: Status, sent: boolean }>} */ @Cordova({ callbackOrder: 'reverse' }) notify(params: NotifyParams): Promise<{ status: Status; sent: boolean }> { return; } /** * @name encodedStringToBytes * Helper function to convert a base64 encoded string from a characteristic or descriptor value into a uint8Array object * @param {string} str * @returns {Uint8Array} */ @Cordova({ sync: true }) encodedStringToBytes(value: string): Uint8Array { return; } /** * @name bytesToEncodedString * Helper function to convert a unit8Array to a base64 encoded string for a characteric or descriptor write * @param {Uint8Array} bytes * @returns {string} */ @Cordova({ sync: true }) bytesToEncodedString(value: Uint8Array): string { return; } /** * @name stringToBytes * Helper function to convert a string to bytes * @param {string} value * @returns {Uint8Array} */ @Cordova({ sync: true }) stringToBytes(value: string): Uint8Array { return; } /** * @name bytesToString * Helper function to convert bytes to a string. * @param {Uint8Array} value * @returns {string} */ @Cordova({ sync: true }) bytesToString(value: Uint8Array): string { return; } @CordovaProperty() SCAN_MODE_OPPORTUNISTIC: number; @CordovaProperty() SCAN_MODE_LOW_POWER: number; @CordovaProperty() SCAN_MODE_BALANCED: number; @CordovaProperty() SCAN_MODE_LOW_LATENCY: number; @CordovaProperty() MATCH_MODE_AGGRESSIVE: number; @CordovaProperty() MATCH_MODE_STICKY: number; @CordovaProperty() MATCH_NUM_ONE_ADVERTISEMENT: number; @CordovaProperty() MATCH_NUM_FEW_ADVERTISEMENT: number; @CordovaProperty() MATCH_NUM_MAX_ADVERTISEMENT: number; @CordovaProperty() CALLBACK_TYPE_ALL_MATCHES: number; @CordovaProperty() CALLBACK_TYPE_FIRST_MATCH: number; @CordovaProperty() CALLBACK_TYPE_MATCH_LOST: number; }