Etkinlikler

Etkinlikler eşzamansız olup Google Cloud Pub/Sub tarafından her zaman tek bir konuda yönetilir ProjectEtkinlikler tüm cihazlar ve yapılar için güncelleme sağlar ve etkinliklerin alımı erişim jetonu kullanıcı tarafından iptal edilmediği ve etkinlik mesajları kullanıcı tarafından iptal edilmediği sürece süresi doldu.

Etkinlikleri etkinleştir

Etkinlikler, SDM API'nin isteğe bağlı bir özelliğidir. Görüntüleyin . Etkinlikleri etkinleştirme bunu nasıl etkinleştireceğinizi öğrenin Project.

Google Cloud Pub/Sub

Öğrenmek için Google Cloud Pub/Sub belgelerine bakın daha fazla bilgi edineceksiniz. Özellikle:

Etkinlik aboneliği

Projectcihazınız için etkinlikler etkinleştirildiğinde buna özel bir konu sağlanır Project Kimlik:

projects/sdm-prod/topics/enterprise-project-id

Etkinlikleri almak için bir pull veya bağlı olarak, söz konusu konuya push ne kadar iyi karşıladığını görebileceksiniz. SDM konusu için birden fazla abonelik desteklenir. Görüntüleyin Daha fazlası için abonelikleri yönetin ekleyebilirsiniz.

Etkinlik başlatma

Pub/Sub aboneliği oluşturulduktan sonra etkinlikleri ilk kez başlatmak için devices.list Tek seferlik bir tetikleyici olarak API çağrısı. Tüm yapı ve cihazlarla ilgili etkinlikler bu tarihten sonra yayınlanacak arayın.

Örnek için Hızlı Başlangıç'taki Yetkilendir sayfası Rehber.

Etkinlik sırası

Pub/Sub, etkinliklerin siparişle teslim edileceğini garanti etmez ve etkinliklerin makbuz sırası, etkinliklerin gerçekleştiği sıraya karşılık gelir. timestamp kullanın alanının belirlenmesine yardımcı olur. Etkinlikler ayrı ayrı veya birlikte de gelebilir tek bir etkinlik iletisine dönüştürmenizi sağlar.

Daha fazla bilgi için bkz. Mesajları sıralama.

User ID'ler

Uygulamanız (yapı veya cihaz yerine) kullanıcıları temel alıyorsa userID alanını etkinlik yükünden kaldırın. Bu alan belirli bir kullanıcıyı temsil eden kod karartılmış bir kimlik.

userID, her API çağrısının HTTP yanıt başlığında da bulunur.

İlişki etkinlikleri

İlişki etkinlikleri, bir kaynak için yapılan ilişkisel güncellemeyi temsil eder. Örneğin, bir cihaz cihaz bir yapıya eklendiğinde veya cihaz bir yapıdan silindiğinde.

Üç tür ilişki etkinliği vardır:

  • OLUŞTURULMA ZAMANI:
  • SİLİNDİ
  • GÜNCELLENDİ

Bu ilişki etkinliğinin yükü aşağıdaki gibidir:

Yük

{
  "eventId" : "f90aac0b-3637-4681-aac0-18f3be6f0892",
  "timestamp" : "2019-01-01T00:00:01Z",
  "relationUpdate" : {
    "type" : "CREATED",
    "subject" : "enterprises/project-id/structures/structure-id",
    "object" : "enterprises/project-id/devices/device-id"
  },
  "userId": "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi"
}

Bir ilişki etkinliğinde object, etkinliği tetikleyen kaynak ve subject, object öğesinin şu anda ilişkili olduğu kaynaktır. Yukarıdaki örnekte, user bir kullanıcıya bu cihaza erişim izni vermiştir developerve useradlı kullanıcının yetkili cihazı artık kendi yetkilisiyle ilişkili yapısı hakkında bilgi edindiniz.

subject yalnızca bir oda veya yapı olabilir. a developer useryapısını görüntüleme izni olmadan, subject her zaman boştur.

Alanlar

Alan Açıklama Veri Türü
eventId Etkinliğin benzersiz tanımlayıcısıdır. string
Örnek: "ed4cd8c3-eb6c-41bb-81be-30379cc713a5"
timestamp Etkinliğin gerçekleştiği zaman. string
Örnek: "2019-01-01T00:00:01Z"
relationUpdate İlişki güncellemesiyle ilgili bilgileri ayrıntılandıran bir nesne. object
userId Kullanıcıyı temsil eden benzersiz ve kodu karartılmış bir tanımlayıcı. string
Örnek: "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi"

Daha fazla bilgi için Etkinlikler'e ve bunların işleyiş şekline bakacağız.

Örnekler

Etkinlik yükleri her ilişki etkinliği türü için farklılık gösterir:

OLUŞTURULMA ZAMANI:

Yapı oluşturuldu

"relationUpdate" : {
  "type" : "CREATED",
  "subject" : "",
  "object" : "enterprises/project-id/structures/structure-id"
}

Cihaz oluşturuldu

"relationUpdate" : {
  "type" : "CREATED",
  "subject" : "enterprises/project-id/structures/structure-id",
  "object" : "enterprises/project-id/devices/device-id"
}

Cihaz oluşturuldu

"relationUpdate" : {
  "type" : "CREATED",
  "subject" : "enterprises/project-id/structures/structure-id/rooms/room-id",
  "object" : "enterprises/project-id/devices/device-id"
}

GÜNCELLENDİ

Cihaz taşındı

"relationUpdate" : {
  "type" : "UPDATED",
  "subject" : "enterprises/project-id/structures/structure-id/rooms/room-id",
  "object" : "enterprises/project-id/devices/device-id"
}

SİLİNDİ

Yapı silindi

"relationUpdate" : {
  "type" : "DELETED",
  "subject" : "",
  "object" : "enterprises/project-id/structures/structure-id"
}

Cihaz silindi

"relationUpdate" : {
  "type" : "DELETED",
  "subject" : "enterprises/project-id/structures/structure-id",
  "object" : "enterprises/project-id/devices/device-id"
}

Cihaz silindi

"relationUpdate" : {
  "type" : "DELETED",
  "subject" : "enterprises/project-id/structures/structure-id/rooms/room-id",
  "object" : "enterprises/project-id/devices/device-id"
}

Şu durumlarda ilişki etkinlikleri gönderilmez:

  • Bir oda silindi

Kaynak etkinlikleri

Kaynak etkinliği, bir kaynağa özel güncellemeyi temsil eder. Bir değişikliğe göre olabilir özellik alanının değerini değiştirin (ör. termostatın modunu değiştirmek). Ayrıca, gerçekleşebilecek bir cihaz işlemini özellik alanını değiştirmez (ör. cihazın düğmesine basma).

Özellik alanının değerinde yapılan bir değişikliğe yanıt olarak oluşturulan etkinlik, Cihaz GET çağrısına benzer traits nesnesi:

Yük

{
  "eventId" : "840d511c-bc6f-429f-8e81-36ec258ab0c0",
  "timestamp" : "2019-01-01T00:00:01Z",
  "resourceUpdate" : {
    "name" : "enterprises/project-id/devices/device-id",
    "traits" : {
      "sdm.devices.traits.ThermostatMode" : {
        "mode" : "COOL"
      }
    }
  },
  "userId": "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi",
  "resourceGroup" : [
    "enterprises/project-id/devices/device-id"
  ]
}

Şunu kullanın: bireysel özellik alanı değişiklik kaynaklarının yük biçimini anlamayı sağlayan özellik dokümanları unutmayın.

Özellik alanını değiştirmeyen bir cihaz işlemine yanıt olarak oluşturulan etkinliğin ayrıca resourceUpdate nesnesi olan ancak events nesnesine sahip yük yerine traits nesnesini çağırın:

Yük

{
  "eventId" : "ed21b6b0-791f-46ab-bac1-868c78020b5f",
"timestamp" : "2019-01-01T00:00:01Z",
"resourceUpdate" : { "name" : "enterprises/project-id/devices/device-id", "events" : { "sdm.devices.events.CameraMotion.Motion" : { "eventSessionId" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF...", "eventId" : "SERtdqmTk0FDDDP_M9NE-H-bY9...", } } } "userId" : "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi",
"eventThreadId" : "d67cd3f7-86a7-425e-8bb3-462f92ec9f59",
"eventThreadState" : "STARTED",
"resourceGroup" : [ "enterprises/project-id/devices/device-id" ] }

Bu kaynak etkinliği türleri belirli özelliklerle tanımlanır. Örneğin, Hareket etkinliği KameraMotion özelliğinin kullanıldığı bir özelliktir. Her özellikle ilgili belgeleri göster .

Alanlar

Alan Açıklama Veri Türü
eventId Etkinliğin benzersiz tanımlayıcısıdır. string
Örnek: "ed21b6b0-791f-46ab-bac1-868c78020b5f"
timestamp Etkinliğin gerçekleştiği zaman. string
Örnek: "2019-01-01T00:00:01Z"
resourceUpdate Kaynak güncellemesiyle ilgili bilgileri ayrıntılandıran bir nesne. object
userId Kullanıcıyı temsil eden benzersiz ve kodu karartılmış bir tanımlayıcı. string
Örnek: "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi"
eventThreadId Etkinlik ileti dizisinin benzersiz tanımlayıcısı. string
Örnek: "d67cd3f7-86a7-425e-8bb3-462f92ec9f59"
eventThreadState Etkinlik ileti dizisinin durumu. string
Değerler: "STARTED", "UPDATED", "ENDED"
resourceGroup Bu etkinliğe benzer güncellemelere sahip olabilecek kaynakları gösteren nesne. Etkinliğin kaynağı (resourceUpdate nesnesinden) her zaman bu nesnede bulunur. object

Daha fazla bilgi için Etkinlikler'e ve bunların işleyiş şekline bakacağız.

Güncellenebilir bildirimler

Kaynak etkinliklerine dayalı bildirimler, bir uygulamaya uygulanabilir. Örneğin: Android veya iOS. Gönderilen bildirim sayısını azaltmak için Mevcut bildirimlerle birlikte güncellenebilir bildirimler de uygulanabilir. Aynı etkinlikte sonraki etkinliklere dayalı yeni bilgilerle güncellenir ileti dizisi.

Güncellenebilir bildirimler için belirli etkinlikler özelliği desteği ve şu şekilde etiketlenir: Güncellenebilir  inceleyebilirsiniz. Bu etkinlikler yüklerinde eventThreadId adlı ek bir alan bulunur. Bunu kullan Mevcut bir etkinliği güncellemek amacıyla tek tek etkinlikleri birbirine bağlamak için kullanıcıya gösterilen bildirimdir.

Etkinlik ileti dizisi, etkinlik oturumundan farklıdır. Etkinlik ileti dizisi aynı ileti dizisinde önceki bir etkinliğin güncel durumunu tanımlar. İlgili içeriği oluşturmak için kullanılan etkinlik oturumu, birbiriyle ilişkili ayrı etkinlikleri tanımlar ve belirli bir etkinlik oturumu için birden fazla etkinlik ileti dizisi olabilir.

Bildirim amacıyla, farklı etkinlik türleri farklı gruplar halinde gruplandırılır. ileti dizileri.

Bu ileti dizisi gruplaması ve zamanlama mantığı, Google tarafından işlenir ve şunlara tabidir: istediğiniz zaman değiştirebilirsiniz. developer , bildirimleri SDM API tarafından sağlanan etkinlik ileti dizileri ve oturumlar.

İleti dizisi durumu

Güncellenebilir bildirimleri destekleyen etkinliklerde de eventThreadState bulunur alanı, etkinlik ileti dizisinin o anki durumunu belirtir. Bu alanı aşağıdaki değerlere sahiptir:

  • BAŞLATILDI: Bir etkinlik ileti dizisindeki ilk etkinlik.
  • GÜNCELLENDİ: Devam eden bir ileti dizisindeki etkinlik. Tek bir ileti dizisinde bu duruma sahip sıfır veya daha fazla etkinlik olabilir.
  • SONA ERDİ: Bir etkinlik ileti dizisindeki son etkinlik. İleti dizisi türüne bağlı olarak, son GÜNCELLENEN etkinliğin kopyası olabilir.

Bu alan, bir etkinlik ileti dizisinin ilerlemesini izlemek için kullanılabilir. sona erdi.

Etkinlik filtreleme

Bazı durumlarda, bir cihaz tarafından algılanan etkinlikler filtrelenerek yayınlanmayabilir konusundan bahsetmek istiyorum. Bu davranış etkinlik filtreleme adı verilir. Etkinlik filtrelemenin amacı, kısa süre içinde çok sayıda benzer etkinlik mesajı yayınlamaktan kaçının.

Örneğin, bir mesaj bir SDM konusunda yayınlanabilir. etkinliği oluşturun. Diğer Ardından Hareket için mesajlar otomatik olarak Belirli bir süre boyunca filtrelenerek yayından çıkarılır. Bu dönemden söz konusu etkinlik türü için bir etkinlik mesajı tekrar yayınlanabilir.

Google Home uygulamasında (GHA), geçmişte filtrelenenler useröğesinin etkinlik geçmişinde gösterilmeye devam edecek. Ancak, etkinlikler uygulama bildirimi oluşturmaz (bu bildirim türü etkin).

Her etkinlik türünün, aşağıdaki ölçütlere göre tanımlanan ve kendine özgü etkinlik filtreleme mantığı vardır: Google'a aittir ve herhangi bir zamanda değiştirilebilir. Bu etkinlik filtreleme mantığı ve oturum mantığından bağımsızdır.

Hizmet hesapları

SDM API'yi yönetmek için hizmet hesapları önerilir ve etkinlik mesajları gösterilebilir. Hizmet hesabı, bir uygulama veya kendi benzersiz hesap anahtarı vardır. Bunun yerine gerçek bir sanal makine kullanılır.

Pub/Sub API kullanımları için hizmet hesabı yetkilendirmesi İki aşamalı OAuth (2LO).

2LO yetkilendirme akışında:

  • developer , hizmet anahtarı kullanarak erişim jetonu ister.
  • developer , erişim jetonunu API'ye yapılan çağrılarda kullanır.

Google 2LO ve nasıl kurulacağı hakkında daha fazla bilgi edinmek için Sunucudan sunucuya OAuth 2.0 kullanma Uygulamalar.

Yetkilendirme

Hizmet hesabına Pub/Sub API'si:

  1. Cloud Pub/Sub'ı etkinleştirme API Cloud'da geliştiricilerin karşılaştığı yaygın sorunları çözmenize ve kullanım alanlarını öğrenmenize yardımcı olacak teknik belgeleri ve videoları keşfedin.
  2. Şu sayfada açıklandığı gibi bir hizmet hesabı ve hizmet hesabı anahtarı oluşturun: Hizmet hesabı oluşturma. Sadece Pub/Sub Abonesi rolü vermenizi öneririz. Şunları yaptığınızdan emin olun: hizmet hesabı anahtarını Pub/Sub API'ye gidin.
  3. Kimlik doğrulama kimlik bilgilerinizi (hizmet hesabı anahtarı) aşağıdaki adımları izleyin: adımına geçin veya oauth2l kullanarak manuel olarak bir erişim jetonu alın. API erişimini hızlı bir şekilde test etmek istediğinizi varsayalım.
  4. Hizmet hesabı kimlik bilgilerini veya erişim jetonunu Pub/Sub project.subscriptions API kullanabilirsiniz.

oauth2l

Google oauth2l, Go'da yazılan OAuth için bir komut satırı aracıdır. Şunun için yükleyin: Mac veya Linux'ta Go.

  1. Sisteminizde Go uygulaması yoksa önce uygulamayı indirip yükleyin.
  2. Go yüklendikten sonra oauth2l uygulamasını yükleyin ve konumunu PATH cihazınıza ekleyin ortam değişkeni:
    go install github.com/google/oauth2l@latest
    export PATH=$PATH:~/go/bin
  3. oauth2l öğesini kullanarak API için erişim jetonu almak üzere OAuth kapsamları:
    oauth2l fetch --credentials path-to-service-key.json --scope https://www.googleapis.com/auth/pubsub
    https://www.googleapis.com/auth/cloud-platform
    Örneğin, hizmet anahtarınız ~/myServiceKey-eb0a5f900ee3.json:
    oauth2l fetch --credentials ~/myServiceKey-eb0a5f900ee3.json --scope https://www.googleapis.com/auth/pubsub
    https://www.googleapis.com/auth/cloud-platform
    ya29.c.Elo4BmHXK5...

Daha fazla kullanım için oauth2l BENİ OKU'yu inceleyin ekleyebilirsiniz.

Google API İstemci Kitaplıkları

Google API'leri için OAuth kullanan çeşitli istemci kitaplıkları mevcuttur 2.0. Şu konuda daha fazla bilgi için Google API İstemci Kitaplıkları'na bakın: dili seçin.

Bu kitaplıkları Pub/Sub APIile kullanırken aşağıdaki kapsam dizeleri:

https://www.googleapis.com/auth/pubsub
https://www.googleapis.com/auth/cloud-platform

Hatalar

Bu kılavuzla ilgili olarak aşağıdaki hata kodları döndürülebilir:

Hata Mesajı TBG Sorun giderme
Kamera görseli artık indirilemiyor. DEADLINE_EXCEEDED Etkinlik resimlerinin süresi, etkinlik yayınlandıktan 30 saniye sonra dolar. Resmi, süresi dolmadan önce indirmeyi unutmayın.
Etkinlik kimliği kameraya ait değil. FAILED_PRECONDITION Kamera etkinliğinin döndürdüğü doğru eventID değerini kullanın.

Aşağıdakiler için API Hata Kodu Referansı'na bakın: API hata kodlarının tam listesini inceleyin.