✨ Features
-
Provisioning
Supports both BLE commissioning and on-network commissioning.
On Android, you can also provide your own GATT implementation to send Matter commissioning data. -
Thread network support
Pass a Thread Active Operational Dataset using:NetworkCredentials.thread(ThreadCredentials(...)) -
ICD (Intermittently Connected Devices)
Full support for Matter 1.2+ ICD commissioning via:CompletionListener.onICDRegistrationComplete -
Attribute read
Read any attribute from any cluster. -
Attribute write
Write any attribute to any cluster. -
Attribute / event subscribe
Subscribe with optionalDataVersionFilterfor efficient change-only updates. -
Invoke
Send commands to any cluster endpoint. -
Unpair
Remove a device from the fabric with:unPairDevice(nodeId) -
TLV
Full TLV read/write stack for advanced low-level control. -
Cluster helpers
Convenience wrappers for:BasicInformationClusterDescriptorCluster
🚀 Getting Started
Android
Make sure the following permissions are added to your AndroidManifest.xml:
<!-- Tell Google Play Store that your app uses Bluetooth LE -->
<!-- Set android:required="true" if Bluetooth is required -->
<uses-feature
android:name="android.hardware.bluetooth_le"
android:required="false" />
<!-- Android 12+ Bluetooth permissions -->
<uses-permission
android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- Android 11 and lower -->
<uses-permission
android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission
android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"
android:maxSdkVersion="30" />
<!-- Android 9 and lower -->
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"
android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
iOS
1. Add the required keys to Info.plist
<key>NSBluetoothAlwaysUsageDescription</key>
<string>This app uses Bluetooth to connect to nearby devices for communication.</string>
<key>NSBonjourServices</key>
<array>
<string>_meshcop._udp</string>
<string>_matter._tcp</string>
<string>_matterc._udp</string>
<string>_matterd._udp</string>
</array>
<key>NSCameraUsageDescription</key>
<string>This app needs camera access to scan QR codes.</string>
<key>NSLocalNetworkUsageDescription</key>
<string>Required to discover local network devices.</string>
2. Add a Matter Extension to your project
3. Add capabilities to both targets
In both the main app target and the Matter Extension target, add:
- App Groups
- Matter Allow Setup Payload
Make sure both targets use the same App Group.
4. Add AppGroupId to both targets
In the Info section of both the main app target and the Matter Extension target, add:
- Key:
AppGroupId - Value: the same App Group value selected in step 3
This allows data sharing between the two targets.
5. Copy the request handler code
Copy the contents of:
example/ios/MatterExt/RequestHandler.swift
into your Matter Extension’s:
RequestHandler.swift
▶️ Run the Example
iOS
Open the following workspace in Xcode:
example/ios/Runner.xcworkspace
Then:
- Fill in your signing information
- Complete the iOS setup steps above
Android
No additional setup is required.
Start the example
cd example
flutter pub get
flutter run
📌 Notes
- Images are displayed using fixed widths to keep them clean and prevent stretching.
- Centered screenshots and demo media usually make plugin documentation look much better.
- This README keeps the setup simple while still looking polished and professional.
🤝 Contributing
Contributions, issues, and feature requests are welcome.
If you find this plugin useful, consider giving it a star.