ble.dart
1 import 'package:pigeon/pigeon.dart'; 2 3 // dart run pigeon --input pigeons/ble.dart 4 @ConfigurePigeon( 5 PigeonOptions( 6 dartPackageName: 'ble_peripheral', 7 dartOut: 'lib/src/generated/ble_peripheral.g.dart', 8 dartOptions: DartOptions(), 9 kotlinOut: 10 'android/src/main/kotlin/com/rohit/ble_peripheral/BlePeripheral.g.kt', 11 swiftOut: 'darwin/Classes/BlePeripheral.g.swift', 12 cppOptions: CppOptions(namespace: 'ble_peripheral'), 13 kotlinOptions: KotlinOptions(package: 'com.rohit.ble_peripheral'), 14 swiftOptions: SwiftOptions(), 15 cppHeaderOut: 'windows/BlePeripheral.g.h', 16 cppSourceOut: 'windows/BlePeripheral.g.cpp', 17 ), 18 ) 19 20 /// Enums 21 enum BondState { bonding, bonded, none } 22 23 /// Models 24 class BleService { 25 String uuid; 26 bool primary; 27 List<BleCharacteristic> characteristics; 28 BleService(this.uuid, this.primary, this.characteristics); 29 } 30 31 // Use enums instead of int after fixing: https://github.com/flutter/flutter/issues/133728 32 class BleCharacteristic { 33 String uuid; 34 List<int> properties; 35 List<int> permissions; 36 List<BleDescriptor>? descriptors; 37 Uint8List? value; 38 39 BleCharacteristic( 40 this.uuid, 41 this.value, 42 this.descriptors, 43 this.properties, 44 this.permissions, 45 ); 46 } 47 48 class BleDescriptor { 49 String uuid; 50 Uint8List? value; 51 List<int>? permissions; 52 BleDescriptor(this.uuid, this.value, this.permissions); 53 } 54 55 class ReadRequestResult { 56 Uint8List value; 57 int? offset; 58 int? status; 59 ReadRequestResult({required this.value, this.offset}); 60 } 61 62 class WriteRequestResult { 63 Uint8List? value; 64 int? offset; 65 int? status; 66 WriteRequestResult({this.value, this.offset, this.status}); 67 } 68 69 class ManufacturerData { 70 int manufacturerId; 71 Uint8List data; 72 ManufacturerData({required this.manufacturerId, required this.data}); 73 } 74 75 /// Flutter -> Native 76 @HostApi() 77 abstract class BlePeripheralChannel { 78 void initialize(); 79 80 bool? isAdvertising(); 81 82 bool isSupported(); 83 84 void stopAdvertising(); 85 86 bool askBlePermission(); 87 88 void addService(BleService service); 89 90 void removeService(String serviceId); 91 92 void clearServices(); 93 94 List<String> getServices(); 95 96 void startAdvertising( 97 List<String> services, 98 String? localName, 99 int? timeout, 100 ManufacturerData? manufacturerData, 101 bool addManufacturerDataInScanResponse, 102 ); 103 104 void updateCharacteristic( 105 String characteristicId, 106 Uint8List value, 107 String? deviceId, 108 ); 109 } 110 111 /// Native -> Flutter 112 @FlutterApi() 113 abstract class BleCallback { 114 ReadRequestResult? onReadRequest( 115 String deviceId, 116 String characteristicId, 117 int offset, 118 Uint8List? value, 119 ); 120 121 WriteRequestResult? onWriteRequest( 122 String deviceId, 123 String characteristicId, 124 int offset, 125 Uint8List? value, 126 ); 127 128 void onCharacteristicSubscriptionChange( 129 String deviceId, 130 String characteristicId, 131 bool isSubscribed, 132 String? name, 133 ); 134 135 void onAdvertisingStatusUpdate(bool advertising, String? error); 136 137 void onBleStateChange(bool state); 138 139 void onServiceAdded(String serviceId, String? error); 140 141 void onMtuChange(String deviceId, int mtu); 142 143 // Android only 144 void onConnectionStateChange(String deviceId, bool connected); 145 146 void onBondStateChange(String deviceId, BondState bondState); 147 }