UNPKG

munim-bluetooth-peripheral

Version:

A React Native library for creating Bluetooth Low Energy (BLE) peripheral devices with comprehensive advertising data support and Expo support

323 lines (243 loc) 8.83 kB
# React Native Bluetooth Peripheral - Usage Examples This document provides comprehensive examples of how to use the supported BLE advertising data types in the React Native Bluetooth Peripheral library. **Note:** This library only supports advertising data types that are properly supported by both Android and iOS platforms. Advanced features like mesh networking, LE Audio, indoor positioning, etc., are not supported due to platform limitations. ## Basic Usage ```typescript import { startAdvertising, stopAdvertising, setServices, updateAdvertisingData, getAdvertisingData, type AdvertisingDataTypes, } from 'react-native-bluetooth-peripheral'; // Start basic advertising startAdvertising({ serviceUUIDs: ['180D', '180F'], localName: 'My Device', manufacturerData: '0102030405', }); // Stop advertising stopAdvertising(); ``` ## Supported Advertising Data Types ### Fully Supported Types These advertising data types work reliably on both Android and iOS: - **Service UUIDs** (0x02-0x07): 16-bit, 32-bit, and 128-bit service UUIDs - **Local Name** (0x08-0x09): Device name (shortened and complete) - **Tx Power Level** (0x0A): Transmission power level - **Service Solicitation UUIDs** (0x14-0x15, 0x1F): Services the device is seeking - **Service Data** (0x16, 0x20, 0x21): Data associated with specific services - **Manufacturer Specific Data** (0xFF): Custom vendor-specific data ### Partially Supported Types These work with limitations: - **Flags** (0x01): Basic device capabilities (limited platform support) - **Appearance** (0x19): Device appearance category (workaround implementation) ## Advanced Usage Examples ### Example 1: Health Device (Heart Rate Monitor) ```typescript const healthDeviceExample = () => { const advertisingData: AdvertisingDataTypes = { // 0x01 - Flags: LE General Discoverable Mode, BR/EDR Not Supported flags: 0x06, // 0x02-0x07 - Service UUIDs: Heart Rate and Battery services completeServiceUUIDs16: ['180D', '180F'], // 0x08-0x09 - Local Name: Device name completeLocalName: 'Health Monitor Pro', shortenedLocalName: 'HealthPro', // 0x0A - Tx Power Level: -8 dBm txPowerLevel: -8, // 0x19 - Appearance: Generic Heart Rate Sensor appearance: 0x0341, // 0x16 - Service Data: Heart rate and battery level serviceData16: [ { uuid: '180D', data: '6400' }, // Heart rate: 100 bpm { uuid: '180F', data: '64' }, // Battery: 100% ], // 0xFF - Manufacturer Specific Data: Custom health metrics manufacturerData: '0102030405060708', }; startAdvertising({ serviceUUIDs: ['180D', '180F'], advertisingData, }); }; ``` ### Example 2: Smart Home Device (Temperature Sensor) ```typescript const temperatureSensorExample = () => { const advertisingData: AdvertisingDataTypes = { // 0x01 - Flags: LE General Discoverable Mode flags: 0x06, // 0x02-0x07 - Service UUIDs: Environmental Sensing completeServiceUUIDs16: ['181A'], // 0x08-0x09 - Local Name completeLocalName: 'Temperature Sensor', shortenedLocalName: 'TempSensor', // 0x0A - Tx Power Level: 0 dBm txPowerLevel: 0, // 0x19 - Appearance: Generic Thermometer appearance: 0x0300, // 0x16 - Service Data: Current temperature serviceData16: [ { uuid: '181A', data: '1A0C' }, // Temperature: 22.5°C (encoded) ], // 0xFF - Manufacturer Specific Data: Device info manufacturerData: '4C000215', }; startAdvertising({ serviceUUIDs: ['181A'], advertisingData, }); }; ``` ### Example 3: Gaming Controller ```typescript const gamingControllerExample = () => { const advertisingData: AdvertisingDataTypes = { // 0x01 - Flags: LE General Discoverable Mode flags: 0x06, // 0x02-0x07 - Service UUIDs: HID over GATT completeServiceUUIDs16: ['1812'], // 0x08-0x09 - Local Name completeLocalName: 'Gaming Controller', // 0x0A - Tx Power Level: 4 dBm txPowerLevel: 4, // 0x19 - Appearance: HID Gamepad appearance: 0x03c4, // 0x14 - Service Solicitation: Looking for gaming services serviceSolicitationUUIDs16: ['1234'], // 0xFF - Manufacturer Specific Data: Controller capabilities manufacturerData: '09ff0001020304', }; startAdvertising({ serviceUUIDs: ['1812'], advertisingData, }); }; ``` ### Example 4: Beacon Device ```typescript const beaconExample = () => { const advertisingData: AdvertisingDataTypes = { // 0x01 - Flags: LE General Discoverable Mode, BR/EDR Not Supported flags: 0x06, // 0x08-0x09 - Local Name completeLocalName: 'MyBeacon', // 0x0A - Tx Power Level: -4 dBm txPowerLevel: -4, // 0xFF - Manufacturer Specific Data: iBeacon format // Apple Company ID (0x004C) + iBeacon data manufacturerData: '4C000215' + 'FDA50693A4E24FB1AFCFC6EB07647825' + // UUID '0001' + // Major '0001' + // Minor 'C5', // TX Power }; startAdvertising({ serviceUUIDs: [], advertisingData, }); }; ``` ### Example 5: Multiple Service Data ```typescript const multiServiceExample = () => { const advertisingData: AdvertisingDataTypes = { // 0x01 - Flags flags: 0x06, // Multiple service UUIDs completeServiceUUIDs16: ['180D', '180F', '181A'], completeServiceUUIDs128: ['12345678-1234-1234-1234-123456789abc'], // Local name completeLocalName: 'Multi-Service Device', // Multiple service data entries serviceData16: [ { uuid: '180D', data: '6400' }, // Heart rate data { uuid: '180F', data: '64' }, // Battery level { uuid: '181A', data: '1A0C' }, // Temperature data ], serviceData128: [ { uuid: '12345678-1234-1234-1234-123456789abc', data: '010203040506', }, ], // Service solicitation serviceSolicitationUUIDs16: ['1234', '5678'], // Manufacturer data manufacturerData: 'FFFF01020304050607080910', }; startAdvertising({ serviceUUIDs: ['180D', '180F', '181A'], advertisingData, }); }; ``` ## Dynamic Advertising Data Updates ```typescript const dynamicUpdatesExample = () => { // Start with initial advertising data const initialData: AdvertisingDataTypes = { flags: 0x06, completeServiceUUIDs16: ['180F'], completeLocalName: 'Battery Monitor', serviceData16: [ { uuid: '180F', data: '64' }, // 100% battery ], }; startAdvertising({ serviceUUIDs: ['180F'], advertisingData: initialData, }); // Update battery level every 10 seconds const updateBatteryLevel = (level: number) => { const updatedData: AdvertisingDataTypes = { serviceData16: [ { uuid: '180F', data: level.toString(16).padStart(2, '0') }, ], }; updateAdvertisingData(updatedData); }; // Simulate battery drain let batteryLevel = 100; const interval = setInterval(() => { batteryLevel -= 5; if (batteryLevel <= 0) { clearInterval(interval); stopAdvertising(); return; } updateBatteryLevel(batteryLevel); }, 10000); }; ``` ## Platform-Specific Considerations ### Android - Service UUIDs are fully supported - Local name is handled automatically (no distinction between shortened/complete) - Tx Power Level is controlled via advertising settings - Appearance data is encoded as service data with Generic Access service UUID ### iOS - All supported features work natively through Core Bluetooth - Service data is fully supported - Manufacturer data works with proper formatting - Appearance data is stored as custom service data ## Best Practices 1. **Keep advertising data small**: BLE advertising packets have size limitations (31 bytes for legacy advertising) 2. **Use appropriate service UUIDs**: Use standard Bluetooth SIG assigned UUIDs when possible 3. **Update data efficiently**: Use `updateAdvertisingData()` for frequent updates rather than stopping/starting advertising 4. **Handle platform differences**: Test on both Android and iOS as behavior may vary slightly 5. **Proper manufacturer data format**: Include company identifier in manufacturer data 6. **Battery optimization**: Consider advertising intervals for battery-powered devices ## Troubleshooting ### Common Issues 1. **Advertising not visible**: Check that flags include discoverable mode (0x04 or 0x06) 2. **Service data not appearing**: Ensure service UUIDs are properly formatted 3. **Manufacturer data issues**: Verify proper hex string formatting 4. **Platform differences**: Some features may work differently on Android vs iOS ### Testing Tools - **nRF Connect** (Android/iOS): Excellent for viewing advertising data - **LightBlue** (iOS): Good for testing connections and services - **Bluetooth Scanner** (Android/iOS): Simple advertising packet viewer