iOS için kamera cihaz kılavuzu

Kamera cihaz türü iki özellik kullanılarak uygulanır: PushAvStreamTransportTrait, anlık iletmeye dayalı protokoller kullanılarak ses ve video akışı aktarımını işler ve WebRtcLiveViewTrait, canlı yayınları ve talkback'i kontrol etme olanağı sağlar. Kamera özelliklerine sahip uygulamalarda, kapı zili cihaz türü de bu özellikleri kullanır.

Home API'leri Cihaz Türü Özellikler Swift Örnek Uygulaması Kullanım Örneği

Kamera

GoogleCameraDeviceType

home.matter.6006.types.0158

Sabit görüntü veya video çeken bir cihaz. Kameralarda erişilebilir canlı yayınlar, iki yönlü konuşma veya algılama etkinlikleri bulunabilir.

Zorunlu Özellikler
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

Kamera

Kapı zili

GoogleDoorbellDeviceType

home.matter.6006.types.0113

Kapının dışındaki bir düğmeyle etkinleştirilen, kapının diğer tarafında bulunan bir kişinin dikkatini çekmek için kullanılan sesli ve/veya görsel sinyal veren cihaz. Kapı zillerinde erişilebilir canlı yayınlar, iki yönlü konuşma veya algılama etkinlikleri yer alabilir.

Zorunlu Özellikler
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

Kapı zili

Canlı yayın başlatma

Canlı yayın başlatmak için Oturum Açıklama Protokolü (SDP) dizesini WebRtcLiveViewTrait özelliğinin startLiveView(offerSdp:) yöntemine gönderin. Bu yöntem üç değer döndürür:

  • Oturumun SDP'si.
  • Oturum süresi (saniye cinsinden).
  • Oturumu uzatmak veya sonlandırmak için kullanılabilecek oturum kimliği.
public func sendOffer(offerSdp: String) async throws 
-> (answerSdp: String, mediaSessionId: String, liveViewDuration: TimeInterval) 
{
  do {
    Logger.info("Sending StartLiveView command...")
    let response = try await liveViewTrait.startLiveView(
      offerSdp: offerSdp
    )
    Logger.info("Received StartLiveView response: \(response)")
    return (
      answerSdp: response.answerSdp,
      mediaSessionId: response.mediaSessionId,
      liveViewDuration: TimeInterval(response.liveSessionDurationSeconds)
    )
  } catch {
    Logger.error("Failed to send StartLiveView command: \(error)")
    throw error
  }
}

Canlı yayını uzatma

Canlı yayınların önceden belirlenmiş bir süresi vardır ve bu süre sonunda sona erer. Etkin bir akışın süresini uzatmak için extendLiveView(mediaSessionId:optionalArgsProvider:) yöntemini kullanarak uzatma isteğinde bulunun:

public func extendLiveView(mediaSessionId: String) async throws {
  do {
    Logger.info("Extending live view...")
    let extendedDuration = try await liveViewTrait.extendLiveView(mediaSessionId: mediaSessionId)
    Logger.info("Extended live view for \(extendedDuration.liveSessionDurationSeconds) seconds.")
  } catch {
    Logger.error("Failed to extend live view: \(error)")
    throw error
  }
}

Kayıt özelliğini etkinleştirme ve devre dışı bırakma

Kameranın kayıt özelliğini etkinleştirmek için TransportStatusEnum.Active öğesini PushAvStreamTransportTrait özelliğinin setTransportStatus(transportStatus:optionalArgsProvider:) yöntemine iletin. Kayıt özelliğini devre dışı bırakmak için TransportStatusEnum.Inactive simgesini geçin. Aşağıdaki örnekte, bu aramaları, kayıt özelliğini etkinleştirmek veya devre dışı bırakmak için Boolean kullanan tek bir aramada sarmalıyoruz:

public func toggleIsRecording(isOn: Bool) {
  self.uiState = .loading

  guard let pushAvStreamTransportTrait else {
    Logger.error("PushAvStreamTransportTrait not found.")
    return
  }
  Task {
    do {
      Logger.debug("Toggling onOff to \(isOn ? "ON" : "OFF")...")
      try await pushAvStreamTransportTrait.setTransportStatus(
        transportStatus: isOn ? .active : .inactive)
      if isOn {
        do {
          self.player = try self.createWebRtcPlayer()
        } catch {
          Logger.error("Failed to initialize WebRtcPlayer: \(error)")
          self.uiState = .disconnected
          return
        }
        await self.player?.initialize()
        self.uiState = .live
      } else {
        self.player = nil
        self.uiState = .off
      }
    } catch {
      Logger.error("Failed to toggle onOff: \(error)")
    }
  }
}

Kayıt özelliğinin etkin olup olmadığını kontrol etme

Bir kameranın kayıt özelliğinin etkin olup olmadığını belirlemek için herhangi bir bağlantının etkin olup olmadığını kontrol edin. Aşağıdaki örnekte bu işlemi gerçekleştirmek için iki işlev tanımlanmaktadır:

public func isDeviceRecording() -> Bool {
  guard let pushAvStreamTransportTrait else {
    Logger.error("PushAvStreamTransportTrait not found.")
    return false
  }
  guard
    let hasActiveConnection =
      pushAvStreamTransportTrait
      .attributes
      .currentConnections?
      .contains(where: { $0.transportStatus == .active })
  else {
    return false
  }
  return hasActiveConnection
}

TalkBack'i başlatma ve durdurma

TalkBack'i başlatmak için WebRtcLiveViewTrait özelliğinin startTalkback(mediaSessionId:optionalArgsProvider:) yöntemini çağırın. Durdurmak için stopTalkback(mediaSessionId:) simgesini kullanın.

public func toggleTwoWayTalk(isOn: Bool, mediaSessionId: String) async throws {
  do {
    Logger.info("Toggling twoWayTalk to \(isOn ? "ON" : "OFF")...")
    if isOn {
      try await liveViewTrait.startTalkback(mediaSessionId: mediaSessionId)
    } else {
      try await liveViewTrait.stopTalkback(mediaSessionId: mediaSessionId)
    }
  } catch {
    throw HomeError.commandFailed("Failed to toggle twoWayTalk: \(error)")
  }
}