iOS 앱 개발자는 Home API를 사용하여 스레드 보더 라우터를 관리할 수 있습니다.
GoogleBorderRouterDevice는 두 가지 기본 기기 특성인
ThreadNetworkCapabilitiesTrait 보더 라우터 기능을 검사하는 읽기 전용 속성을 제공하는
ThreadNetworkManagementTrait와 커미셔너 (ePSKc)의 임시 사전 공유 키를 사용하여 네트워크 수명 주기 명령어 및 사용자 인증 정보 공유를 처리하는
를 사용하여 구현됩니다. 구조 수준
인터넷 액세스 정책은
ThreadNetworkSettingsTrait
특성을 사용하여 관리됩니다.
기능을 사용하거나 속성을 업데이트하기 전에 항상 기기의 속성 및 명령어 지원을 확인하세요. 자세한 내용은 의 기기 제어를 참고하세요.iOS
| Home API 기기 유형 | 특성 | Swift 샘플 앱 | 사용 사례 |
|---|---|---|---|
|
보더 라우터
|
필수 특성 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)")
}
}