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  }