Etkinlikler eşzamansız olup Google Cloud Pub/Sub tarafından yönetilir. Her Projectiçin tek bir konu kullanılır. Etkinlikler tüm cihazlar ve yapılar için güncellemeler sağlar. Erişim jetonu kullanıcı tarafından iptal edilmediği ve etkinlik mesajlarının süresi dolmadığı sürece etkinliklerin alınması sağlanır.
Etkinlikleri etkinleştir
Etkinlikler, SDM API'sinin isteğe bağlı bir özelliğidir. Bu etkinlikleri Etkinlikleri etkinleştirme bölümünden Projectiçin nasıl etkinleştireceğinizi öğrenebilirsiniz.
Google Cloud Pub/Sub
Pub/Sub'ın işleyiş şekli hakkında daha fazla bilgi edinmek için Google Cloud Pub/Sub belgelerine bakın. Özellikle:
- Nasıl yapılır? kılavuzlarını inceleyerek Pub/Sub hakkındaki temel bilgileri edinin.
- Kimlik doğrulamanın işleyiş şeklini anlayın.
- Sağlanan bir istemci kitaplığını seçin veya kendi kitaplığınızı yazıp REST/HTTP veya gRPC API yüzeylerini kullanın.
Etkinlik aboneliği
Projectiçin etkinlikler etkinleştirildiğinde, Project kimliğine özel bir konu sağlanır. Bu konu şu şekilde görünür:
projects/sdm-prod/topics/enterprise-project-id
Etkinlik almak için kullanım alanınıza bağlı olarak söz konusu konuyla ilgili bir pull veya push aboneliği oluşturun. SDM konusuna birden fazla abonelik desteklenir. Daha fazla bilgi için Abonelikleri yönetme başlıklı makaleyi inceleyin.
Etkinlik başlatma
Pub/Sub aboneliği oluşturulduktan sonra etkinlikleri ilk kez başlatmak için tek seferlik bir tetikleyici olarak
devices.list
API çağrısı yapın. Tüm yapı ve cihazlara ait etkinlikler bu görüşmeden sonra yayınlanır.
Örneğin, Hızlı Başlangıç Kılavuzu'ndaki Yetkilendirme sayfasına bakın.
Etkinlik sırası
Pub/Sub, etkinliklerin sıralı olarak teslim edilmesini garanti etmez ve etkinliklerin alınması sırası, etkinliklerin gerçekte gerçekleştiği sıraya karşılık gelmeyebilir. Etkinlik sırasının uyumlaştırılmasına yardımcı olmak için timestamp
alanını kullanın. Etkinlikler tek tek veya tek bir etkinlik mesajında birleştirilerek de gönderilebilir.
Daha fazla bilgi için Mesajları sıralama bölümüne bakın.
User ID'ler
Uygulamanız yapı veya cihaz yerine kullanıcılara dayanıyorsa kaynakları ve etkinlikleri ilişkilendirmek için etkinlik yükündeki userID
alanını kullanın. Bu alan, belirli bir kullanıcıyı temsil eden karartılmış bir kimliktir.
userID
, her API çağrısının HTTP yanıt üst bilgisinde de kullanılabilir.
İlişki etkinlikleri
İlişki etkinlikleri, bir kaynak için ilişkisel bir güncellemeyi temsil eder. Örneğin, bir cihaz bir yapıya eklendiğinde veya bir yapıdan silindiğinde.
Üç tür ilişki etkinliği vardır:
- CREATED
- SİLİNDİ
- GÜNCELLENDİ
İlişki etkinliğinin yük verisi aşağıdaki gibidir:
Yük
{ "eventId" : "c9b38fba-3f5a-4513-bd2b-128cf7ac523c", "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" }
İlişki etkinliğinde object
, etkinliği tetikleyen kaynaktır ve subject
, object
'ün artık ilişkili olduğu kaynaktır. Yukarıdaki örnekte, bir user , belirli bir cihaza erişim izni vermiş bir developer'e erişim izni vermiştir ve user'nin yetkili cihazı artık yetkili yapısıyla ilişkilidir. Bu da etkinliği tetikler.
subject
yalnızca bir oda veya yapı olabilir. a developer , user'un yapısını görüntüleme iznine sahip değilse subject
her zaman boş olur.
Alanlar
Alan | Açıklama | Veri Türü |
---|---|---|
eventId |
Etkinliğin benzersiz tanımlayıcısı. | string Örnek: "bc55abb5-4ef1-49ae-b8f7-77caa8f8eb14" |
timestamp |
Etkinliğin gerçekleştiği zaman. | string Örnek: "2019-01-01T00:00:01Z" |
relationUpdate |
İlişki güncellemesiyle ilgili bilgileri ayrıntılı olarak içeren bir nesne. | object |
userId |
Kullanıcıyı temsil eden benzersiz, karartılmış bir tanımlayıcı. | string Örnek: "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi" |
Farklı etkinlik türleri ve bunların işleyiş şekli hakkında daha fazla bilgi için Etkinlikler başlıklı makaleyi inceleyin.
Örnekler
Etkinlik yükü, her ilişki etkinliği türü için farklıdır:
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" }
İlişki etkinlikleri şu durumlarda gönderilmez:
- Bir oda silindiğinde
Kaynak etkinlikleri
Kaynak etkinlikleri, bir kaynağa özgü güncellemeleri temsil eder. Bu, bir özellik alanının değerinde yapılan bir değişikliğe (ör. termostatın modunun değiştirilmesi) yanıt olarak gönderilebilir. Ayrıca, cihaz düğmesine basma gibi bir özellik alanını değiştirmeyen bir cihaz işlemini de temsil edebilir.
Özellik alanının değerinde yapılan bir değişikliğe yanıt olarak oluşturulan bir etkinlik, cihaz GET çağrısına benzer şekilde bir traits
nesnesi içerir:
Yük
{
"eventId" : "7132ce22-0821-4521-9211-e5d67bc13b5e",
"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"
]
}
Herhangi bir özellik alanı değişikliği kaynak etkinliğinin yükü biçimini anlamak için özellikle ilgili dokümanları kullanın.
Bir özellik alanını değiştirmeyen cihaz işlemine yanıt olarak oluşturulan bir etkinlikte de resourceUpdate
nesnesi içeren bir yük verisi bulunur ancak bu yük verisinde traits
nesnesi yerine events
nesnesi bulunur:
Yük
{ "eventId" : "13b98b0a-7008-4e94-b849-5f264180a82a",
"timestamp" : "2019-01-01T00:00:01Z",
"resourceUpdate" : { "name" : "enterprises/project-id/devices/device-id", "events" : { "sdm.devices.events.CameraMotion.Motion
" : { "eventSessionId" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF...", "eventId" : "AU2789A8Mzlns0gw96UuXGoqA9...", } } } "userId" : "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi",
"eventThreadId" : "d67cd3f7-86a7-425e-8bb3-462f92ec9f59",
"eventThreadState" : "STARTED",
"resourceGroup" : [ "enterprises/project-id/devices/device-id" ] }
Bu tür kaynak etkinlikleri belirli özelliklerde tanımlanır. Örneğin, Hareket etkinliği CameraMotion özelliğinde tanımlanır. Bu tür kaynak etkinliklerinin yükü biçimini anlamak için her özelliğin belgelerine bakın.
Alanlar
Alan | Açıklama | Veri Türü |
---|---|---|
eventId |
Etkinliğin benzersiz tanımlayıcısı. | string Örnek: "13b98b0a-7008-4e94-b849-5f264180a82a" |
timestamp |
Etkinliğin gerçekleştiği zaman. | string Örnek: "2019-01-01T00:00:01Z" |
resourceUpdate |
Kaynak güncellemesiyle ilgili bilgileri ayrıntılı olarak içeren bir nesne. | object |
userId |
Kullanıcıyı temsil eden benzersiz, karartılmış bir tanımlayıcı. | string Örnek: "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi" |
eventThreadId |
Etkinlik mesaj dizisinin benzersiz tanımlayıcısı. | string Örnek: "d67cd3f7-86a7-425e-8bb3-462f92ec9f59" |
eventThreadState |
Etkinlik mesaj dizisinin durumu. | string Değerler: "STARTED", "UPDATED", "ENDED" |
resourceGroup |
Bu etkinlikle benzer güncellemelere sahip olabilecek kaynakları belirten bir nesne. Etkinliğin kaynağı (resourceUpdate nesnesinden) her zaman bu nesnede bulunur. |
object |
Farklı etkinlik türleri ve bunların işleyiş şekli hakkında daha fazla bilgi için Etkinlikler başlıklı makaleyi inceleyin.
Güncellenebilecek bildirimler
Kaynak etkinliklerine dayalı bildirimler, Android veya iOS gibi bir uygulamada uygulanabilir. Gönderilen bildirim sayısını azaltmak için güncellenebilir bildirimler adlı bir özellik uygulanabilir. Bu özellikte, mevcut bildirimler aynı etkinlik mesaj dizisindeki sonraki etkinliklere göre yeni bilgilerle güncellenir.Belirli etkinlikler, güncellenebilir bildirimler için destek sunar ve belgelerde Güncellenebilir eventThreadId
adlı ek bir alan bulunur. Bir kullanıcıya gösterilen mevcut bir bildirimi güncellemek amacıyla ayrı etkinlikleri birbirine bağlamak için bu alanı kullanın.
Etkinlik mesaj dizisi, etkinlik oturumuyla aynı değildir. Etkinlik mesaj dizisi, aynı mesaj dizisindeki önceki bir etkinliğin güncellenmiş durumunu tanımlar. Etkinlik oturumu, birbiriyle ilişkili ayrı etkinlikleri tanımlar ve belirli bir etkinlik oturumu için birden fazla etkinlik mesaj dizisi olabilir.
Bildirim amacıyla farklı etkinlik türleri farklı ileti dizileri halinde gruplandırılır.
Bu mesaj dizisi gruplandırma ve zamanlama mantığı Google tarafından yönetilir ve herhangi bir zamanda değiştirilebilir. A developer , bildirimleri SDM API tarafından sağlanan etkinlik mesaj dizilerine ve oturumlara göre güncellemelidir.
Mesaj dizisi durumu
Güncellenebilir bildirimleri destekleyen etkinliklerde, etkinlik ileti dizisinin o andaki durumunu belirten bir eventThreadState
alanı da bulunur. Bu alanın değerleri şunlardır:
- BAŞLADI: Bir etkinlik ileti dizisindeki ilk etkinlik.
- GÜNCELLENDİ: Devam eden bir etkinlik ileti dizisindeki etkinlik. Tek bir iş akışında bu duruma sahip sıfır veya daha fazla etkinlik olabilir.
- SONLANDI: Bir etkinlik mesaj dizisindeki son etkinliktir. Mesaj dizisi türüne bağlı olarak son GÜNCELLENDİ etkinliğinin kopyası olabilir.
Bu alan, bir etkinlik ileti dizisinin ilerleme durumunu ve ne zaman sona erdiğini izlemek için kullanılabilir.
Etkinlik filtreleme
Bazı durumlarda, bir cihaz tarafından algılanan etkinlikler SDM Pub/Sub konusuna yayınlanmadan filtrelenebilir. Bu davranışa etkinlik filtreleme adı verilir. Etkinlik filtrelemenin amacı, kısa süre içinde çok fazla benzer etkinlik mesajı yayınlanmasını önlemektir.
Örneğin, ilk hareket etkinliği için bir SDM konusuna mesaj yayınlanabilir. Bu tarihten sonra Motion için gönderilen diğer mesajlar, belirli bir süre geçene kadar yayınlanmaz. Bu süre geçtikten sonra, söz konusu etkinlik türü için bir etkinlik mesajı tekrar yayınlanabilir.
Google Home uygulamasında (GHA), filtrelenen etkinlikler user'ın etkinlik geçmişinde gösterilmeye devam eder. Ancak bu tür etkinlikler, bildirim türü etkin olsa bile uygulama bildirimi oluşturmaz.
Her etkinlik türünün, Google tarafından tanımlanan ve herhangi bir zamanda değiştirilebilen kendi etkinlik filtreleme mantığı vardır. Bu etkinlik filtreleme mantığı, etkinlik mesaj dizisi ve oturum mantığından bağımsızdır.
Hizmet hesapları
SDM API aboneliklerini ve etkinlik mesajlarını yönetmek için hizmet hesapları önerilir. Hizmet hesabı, bir kişi tarafından değil, bir uygulama veya sanal makine tarafından kullanılır ve kendine özgü bir hesap anahtarına sahiptir.
Pub/Sub API için hizmet hesabı yetkilendirmesinde iki aşamalı OAuth (2LO) kullanılır.
2LO yetkilendirme akışında:
- developer , hizmet anahtarı kullanarak erişim jetonu ister.
- developer , erişim jetonunu API çağrılarında kullanır.
Google 2LO ve kurulum hakkında daha fazla bilgi edinmek için Sunucudan Sunucuya Uygulamalar için OAuth 2.0'ı Kullanma başlıklı makaleyi inceleyin.
Yetkilendirme
Hizmet hesabı, Pub/Sub API ile kullanılmak üzere yetkilendirilmiş olmalıdır:
- Google Cloud'da Cloud Pub/Sub API'yi etkinleştirin.
- Hizmet hesabı oluşturma bölümünde açıklandığı gibi bir hizmet hesabı ve hizmet hesabı anahtarı oluşturun. Bu kullanıcıya yalnızca Pub/Sub Abonesi rolünü atamanız önerilir. Hizmet hesabı anahtarını, Pub/Sub API'yi kullanacak makineye indirdiğinizden emin olun.
- Önceki adımdaki sayfada yer alan talimatları uygulayarak kimlik doğrulama kimlik bilgilerinizi (hizmet hesabı anahtarı) uygulama kodunuza ekleyin veya API erişimini hızlıca test etmek istiyorsanız
oauth2l
kullanarak manuel olarak erişim jetonu alın. - Mesajları almak ve onaylamak için hizmet hesabı kimlik bilgilerini veya erişim jetonunu Pub/Sub
project.subscriptions
API ile kullanın.
oauth2l
Google oauth2l
, Go ile yazılmış bir OAuth komut satırı aracıdır. Go'yu kullanarak Mac veya Linux için yükleyin.
- Sisteminizde Go yoksa önce Go'yu indirip yükleyin.
- Go yüklendikten sonra
oauth2l
'ü yükleyin ve konumunuPATH
ortam değişkeninize ekleyin:go install github.com/google/oauth2l@latest
export PATH=$PATH:~/go/bin
- Uygun OAuth kapsamlarını kullanarak API için erişim jetonu almak üzere
oauth2l
'ü kullanın: Örneğin, hizmet anahtarınızoauth2l fetch --credentials path-to-service-key.json --scope https://www.googleapis.com/auth/pubsub https://www.googleapis.com/auth/cloud-platform
~/myServiceKey-eb0a5f900ee3.json
adresindeyse: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 bilgisi için oauth2l
README dosyasını inceleyin.
Google API İstemci Kitaplıkları
OAuth 2.0 kullanan Google API'leri için çeşitli istemci kitaplıkları mevcuttur. Tercih ettiğiniz dil hakkında daha fazla bilgi için Google API İstemci Kitaplıkları'na bakın.
Bu kitaplıkları Pub/Sub APIile kullanırken aşağıdaki kapsam dizelerini kullanın:
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örüntüsü artık indirilemez. | DEADLINE_EXCEEDED |
Etkinlik resimlerinin süresi, etkinlik yayınlandıktan 30 saniye sonra dolar. Süre dolmadan önce resmi indirin. |
Etkinlik kimliği kameraya ait değil. | FAILED_PRECONDITION |
Kamera etkinliği tarafından döndürülen doğru eventID değerini kullanın. |
API hata kodlarının tam listesi için API Hata Kodu Referansı'na bakın.