iOS용 보더 라우터 기기 가이드

iOS 앱 개발자는 Home API를 사용하여 스레드 보더 라우터를 관리할 수 있습니다.

GoogleBorderRouterDevice는 두 가지 기본 기기 특성인 ThreadNetworkCapabilitiesTrait 보더 라우터 기능을 검사하는 읽기 전용 속성을 제공하는 ThreadNetworkManagementTrait와 커미셔너 (ePSKc)의 임시 사전 공유 키를 사용하여 네트워크 수명 주기 명령어 및 사용자 인증 정보 공유를 처리하는 를 사용하여 구현됩니다. 구조 수준 인터넷 액세스 정책은 ThreadNetworkSettingsTrait 특성을 사용하여 관리됩니다.

기능을 사용하거나 속성을 업데이트하기 전에 항상 기기의 속성 및 명령어 지원을 확인하세요. 자세한 내용은 의 기기 제어를 참고하세요.iOS

Home API 기기 유형 특성 Swift 샘플 앱 사용 사례

보더 라우터

GoogleBorderRouterDeviceType

home.matter.6006.types.0161

필수 특성
     google ThreadNetworkCapabilitiesTrait
     google ThreadNetworkManagementTrait

보더 라우터

기기에 관한 기본 정보 가져오기

BasicInformation 특성에는 기기의 공급업체 이름, 공급업체 ID, 제품 ID, 제품 이름 (모델 정보 포함), 소프트웨어 버전과 같은 정보가 포함됩니다.

let vendorName = basicInfoTrait.attributes.vendorName!
let vendorID = basicInfoTrait.attributes.vendorID!
let productID = basicInfoTrait.attributes.productID!
let productName = basicInfoTrait.attributes.productName!
let softwareVersion = basicInfoTrait.attributes.softwareVersion!

보더 라우터 기능 검사

ThreadNetworkCapabilitiesTrait 특성을 사용하여 보더 라우터의 읽기 전용 기능 (예: ePSKc 지원 및 인터넷 액세스 설정 구성)을 검사할 수 있습니다.

func checkBorderRouterCapabilities(device: HomeDevice) async {
    // Filter for GoogleBorderRouterDevice device type
    guard let gtbrDevice = device.type(Google.GoogleBorderRouterDevice.self) else {
        print("Device is not a Google border router.")
        return
    }

    // Retrieve the ThreadNetworkCapabilitiesTrait
    guard let capabilitiesTrait = gtbrDevice.traits(Google.ThreadNetworkCapabilitiesTrait.self) else {
        print("ThreadNetworkCapabilitiesTrait not found on device.")
        return
    }

    do {
        let isEpskcSupported = try await capabilitiesTrait.epskcSupported.read()
        let internetAccessOption = try await capabilitiesTrait.internetAccessOption.read()
        let isIasSupported = internetAccessOption != .none

        print("ePSKc Supported: \(isEpskcSupported)")
        print("Internet Access Setting Supported: \(isIasSupported)")
    } catch {
        print("Failed to read capabilities: \(error)")
    }
}

스레드 사용자 인증 정보 공유 (ePSKc) 관리

스레드 사용자 인증 정보 공유는 커미셔너 (ePSKc)의 임시 사전 공유 키를 사용하여 이루어집니다. ePSKc 모드는 외부 기기 또는 커미셔너가 스레드 네트워크 데이터 세트를 안전하게 가져오는 데 사용할 수 있는 임시 보안 패스키를 생성합니다.

ePSKc 모드 활성화

func startEpskcSession(device: HomeDevice, durationSeconds: Int16) async -> Google.ThreadNetworkManagementTrait.ActivateEpskcModeResponse? {
    guard let gtbrDevice = device.type(Google.GoogleBorderRouterDevice.self),
          let mgmtTrait = gtbrDevice.traits(Google.ThreadNetworkManagementTrait.self) else {
        print("ThreadNetworkManagementTrait not found.")
        return nil
    }

    do {
        var request = Google.ThreadNetworkManagementTrait.ActivateEpskcModeRequest()
        request.requestedDurationSeconds = durationSeconds

        let response = try await mgmtTrait.activateEpskcMode(request)

        print("ePSKc Session Activated!")
        print("Status: \(response.status)")
        print("Ephemeral PSKc: \(response.epskc)")
        print("Valid Duration (s): \(response.validDurationSeconds)")

        return response
    } catch {
        print("Failed to activate ePSKc mode: \(error)")
        return nil
    }
}

ePSKc 모드 비활성화

func stopEpskcSession(device: HomeDevice) async {
    guard let gtbrDevice = device.type(Google.GoogleBorderRouterDevice.self),
          let mgmtTrait = gtbrDevice.traits(Google.ThreadNetworkManagementTrait.self) else {
        return
    }

    do {
        try await mgmtTrait.deactivateEpskcMode(Google.ThreadNetworkManagementTrait.DeactivateEpskcModeRequest())
        print("ePSKc mode deactivated.")
    } catch {
        print("Failed to deactivate ePSKc mode: \(error)")
    }
}

ePSKc 비활성화 이벤트 관찰

스레드 보더 라우터는 ePSKc 세션이 종료될 때 (예: 키가 사용되었거나 세션이 만료되었거나 수동으로 취소된 경우) 이벤트를 내보냅니다.

func observeEpskcEvents(device: HomeDevice) async {
    guard let gtbrDevice = device.type(Google.GoogleBorderRouterDevice.self),
          let mgmtTrait = gtbrDevice.traits(Google.ThreadNetworkManagementTrait.self) else {
        return
    }

    do {
        for try await event in mgmtTrait.epskcModeDeactivatedEvent.stream() {
            print("ePSKc Session Ended. Reason: \(event.reason)")
            switch event.reason {
            case .keyUsed:
                print("Key was successfully used to commission a device.")
            case .expired:
                print("Session timed out before the key was used.")
            case .cancelled:
                print("Session was manually cancelled.")
            @unknown default:
                print("Unknown deactivation reason.")
            }
        }
    } catch {
        print("Error streaming ePSKc events: \(error)")
    }
}

스레드 네트워크 멤버십 관리

활성 운영 데이터 세트 TLV를 제공하여 스레드 보더 라우터에 새 스레드 네트워크에 조인하도록 명령하거나 현재 네트워크에서 나가도록 명령할 수 있습니다.

func joinNetwork(device: HomeDevice, datasetTlvs: Data) async {
    guard let gtbrDevice = device.type(Google.GoogleBorderRouterDevice.self),
          let mgmtTrait = gtbrDevice.traits(Google.ThreadNetworkManagementTrait.self) else {
        return
    }

    do {
        var request = Google.ThreadNetworkManagementTrait.JoinNetworkRequest()
        request.operationalDatasetTlvs = datasetTlvs

        let response = try await mgmtTrait.joinNetwork(request)
        print("Join network command sent. Status: \(response.status)")
    } catch {
        print("Join network failed: \(error)")
    }
}

func leaveNetwork(device: HomeDevice) async {
    guard let gtbrDevice = device.type(Google.GoogleBorderRouterDevice.self),
          let mgmtTrait = gtbrDevice.traits(Google.ThreadNetworkManagementTrait.self) else {
        return
    }

    do {
        try await mgmtTrait.leaveNetwork(Google.ThreadNetworkManagementTrait.LeaveNetworkRequest())
        print("Leave network command sent successfully.")
    } catch {
        print("Leave network failed: \(error)")
    }
}

구조 수준 인터넷 액세스 구성

ThreadNetworkSettings 특성은 Structure (주택 또는 건물을 나타냄)에 연결된 업데이트 가능한 특성입니다. 이를 통해 개발자는 스레드 보더 라우터의 구조 전체 인터넷 액세스 정책을 구성할 수 있습니다.

func updateStructureInternetAccess(structure: Structure, enableInternetAccess: Bool) async {
    guard let settingsTrait = structure.traits(Google.ThreadNetworkSettingsTrait.self) else {
        print("ThreadNetworkSettingsTrait not found on structure.")
        return
    }

    let option: Google.ThreadNetworkSettingsTrait.InternetAccessOption = enableInternetAccess ? .internetAccessOptionAll : .internetAccessOptionNone

    do {
        try await settingsTrait.update { mutator in
            mutator.internetAccessOption = option
        }
        print("Successfully updated Thread internet access policy.")
    } catch {
        print("Failed to update Thread internet access policy: \(error)")
    }
}