Matter Protocol Integration for IoT Devices into Mobile App
Matter 1.x — not a replacement for Bluetooth or Wi-Fi, but unified application-level protocol over IP. Device can connect via Thread, Wi-Fi, or Ethernet — Matter works the same. Meaning for mobile developer simple: one SDK, devices from different manufacturers controlled via single API. But path from "one SDK" to working production code longer than it seems at start.
Zoo of Ecosystems and Single Standard
Before Matter each manufacturer made proprietary protocol. IKEA TRÅDFRI spoke CoAP/DTLS, Philips Hue — Zigbee + REST, Tuya — cloud MQTT with proprietary encryption. Integrating each required separate adapter. Matter solves this at standard level: Device Type Dictionary defines Clusters — atomic functionality units. Light bulb — OnOff Cluster + Level Control Cluster + Color Control Cluster. Thermostat — Thermostat Cluster. Lock — Door Lock Cluster.
Mobile app reads and writes cluster attributes, subscribes to events — knows nothing about hardware behind them.
iOS: Matter via HomeKit API
Apple implements Matter through HomeKit extension. Commission new device:
import HomeKit
import MatterSupport
// Launch commissioning via MatterAddDeviceRequest
let topology = MatterAddDeviceRequest.Topology(
ecosystemName: "MyApp",
homes: [MatterAddDeviceRequest.Topology.Home(displayName: "My home")]
)
let request = MatterAddDeviceRequest(topology: topology)
do {
try await request.perform()
} catch {
// MatterAddDeviceError.userCancelled, .alreadyOnNetwork etc.
}
After commissioning device available via HMHomeManager. Control specific cluster — via HMCharacteristic. But HomeKit abstracts Matter Clusters to its model, creating limitations: non-standard clusters (Vendor-specific) unavailable via HomeKit.
Full Matter API access on iOS requires entitlement com.apple.developer.matter.allow-setup-payload — request via Developer Portal.
Android: Matter via Google Home SDK
Google distributes Matter support via Play Services and Home SDK:
// build.gradle.kts
implementation("com.google.android.gms:play-services-home:16.0.0")
Commissioning:
val commissioningClient = HomeManager.getCommissioningClient(context)
val request = CommissioningRequest.builder()
.setCommissioningService(ComponentName(context, MyCommissioningService::class.java))
.build()
commissioningClient.commissionDevice(request)
.addOnSuccessListener { result ->
val deviceId = result.commissionedDeviceId
}
.addOnFailureListener { exception ->
// CommissioningException with error code
}
MyCommissioningService extends CommissioningService and receives onCommissioningRequested() callback — add device to own backend here.
Direct Control via Matter SDK
For cases needing direct cluster access without ecosystem wrapper, use Matter Open Source SDK via JNI or Kotlin wrappers:
// Read attribute from OnOff Cluster
val devicePtr = ChipDeviceController.openPairingWindowWithPin(deviceId, 300, 0, pinCode)
chipClient.getDeviceController().readAttributePath(
object : ReportCallback {
override fun onReport(nodeState: NodeState) {
val onOffState = nodeState
.getEndpoint(1)
?.getCluster(OnOffCluster.CLUSTER_ID)
?.getAttribute(OnOffCluster.ATTRIBUTE_ID_ON_OFF)
}
},
devicePtr,
listOf(AttributePath(endpointId = 1, clusterId = OnOffCluster.CLUSTER_ID,
attributeId = OnOffCluster.ATTRIBUTE_ID_ON_OFF))
)
Direct SDK harder, requires understanding Interaction Model (Read/Write/Subscribe/Invoke), but gives vendor-specific cluster access and works without Google Play Services dependency.
Fabric and Multi-admin
Important architecture detail: device can simultaneously belong to multiple Fabrics. Fabric — cryptographic domain with key pair. Google Home app, Apple Home app, and your app can control one device independently. Called Multi-admin.
For implementation, pass Open Commissioning Window (OCW) to device so second controller can commission into its Fabric:
// iOS: open commissioning window for additional controller
let accessory = homeManager.primaryHome?.accessories.first { $0.name == "Smart Lock" }
// Via HMAccessoryControl or direct Matter API
Critical for products wanting to work in ecosystems simultaneously.
Common Integration Mistakes
In practice most time lost on following:
- Matter SDK versioning — Matter 1.0 and 1.3 incompatible at some cluster level. Fix SDK version in dependencies and test on specific device firmwares.
- BLE Commissioning on Android — if phone lacks BLE connection with device at commissioning moment, Google Play Services requests permissions again and resets process.
- Fabric conflicts — if device already in other Fabric, re-commissioning requires factory reset. Add UX check.
Work Estimate
Matter integration into existing mobile app with Matter-compatible devices for testing: iOS — 3-4 weeks, Android — 3-5 weeks, Flutter with native channels — 5-7 weeks. Development from scratch including device management architecture and state sync — from 2 months. Cost calculated individually after analyzing requirements and device lineup.







