इवेंट

इवेंट एसिंक्रोनस होते हैं और Google Cloud Pub/Sub की मदद से, हर एक विषय के हिसाब से उन्हें मैनेज किया जाता है Project. इवेंट सभी डिवाइसों और स्ट्रक्चर के लिए अपडेट देते हैं और इवेंट की रसीद जब तक उपयोगकर्ता ऐक्सेस टोकन को रद्द नहीं करता और इवेंट मैसेज को समयसीमा खत्म हो गई है.

इवेंट सक्षम करें

इवेंट, एसडीएम एपीआई की एक वैकल्पिक सुविधा है. यहां जाएं: इवेंट चालू करना आपके लिए इसे चालू करने का तरीका जानने के लिए Project.

Google Cloud Pub/Sub

जानने के लिए, Google Cloud Pub/Sub का दस्तावेज़ देखें Pub/Sub के काम करने के तरीके के बारे में ज़्यादा जानकारी. खास तौर पर:

इवेंट की सदस्यता

जब आपके Projectके लिए इवेंट चालू किए जाएंगे, तो आपको उससे जुड़ा एक विषय असाइन किया जाएगा Project आईडी:

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

इवेंट पाने के लिए, pull बनाएं या उस विषय की सदस्यता push करें. यह सदस्यता आपकी ज़रूरतों पर निर्भर करती है इस्तेमाल का उदाहरण. एसडीएम विषय की एक से ज़्यादा सदस्यताएं ली जा सकती हैं. यहां जाएं: ज़्यादा के लिए सदस्यताएं मैनेज करना जानकारी.

इवेंट शुरू करना

Pub/Sub सदस्यता बनाने के बाद, पहली बार इवेंट शुरू करने के लिए, devices.list एपीआई कॉल को एक बार वाले ट्रिगर के तौर पर चुनें. सभी स्ट्रक्चर और डिवाइस के इवेंट, इसके बाद पब्लिश किए जाएंगे कॉल.

उदाहरण के लिए, देखें कि क्विक स्टार्ट में पेज को अनुमति दें गाइड.

इवेंट का क्रम

Pub/Sub, ऑर्डर किए गए इवेंट डिलीवर करने की गारंटी नहीं देता. साथ ही, इवेंट के रसीद का ऑर्डर शायद इवेंट असल में जिस क्रम में हुए हैं. timestamp का इस्तेमाल करना फ़ील्ड का इस्तेमाल करके इवेंट के क्रम के हिसाब से समाधान में मदद मिलती है. इवेंट अलग-अलग या एक साथ भी दिखाए जा सकते हैं किसी एक इवेंट संदेश में भेज सकते हैं.

ज़्यादा जानकारी के लिए, यह देखें मैसेज का क्रम तय करना.

यूज़र आईडी

अगर आपको लागू करने की प्रोसेस उपयोगकर्ताओं (स्ट्रक्चर या डिवाइस के बजाय) पर आधारित है, तो संसाधनों और इवेंट को जोड़ने के लिए, इवेंट पेलोड से userID फ़ील्ड. यह फ़ील्ड उपयोगकर्ता को दिखाने वाला अस्पष्ट आईडी.

userID, हर एपीआई कॉल के एचटीटीपी रिस्पॉन्स हेडर में भी उपलब्ध होता है.

संबंध इवेंट

रिलेशन इवेंट, संसाधन के रिलेशनल अपडेट को दिखाते हैं. उदाहरण के लिए, जब कोई डिवाइस को किसी स्ट्रक्चर में जोड़ा गया हो या जब किसी डिवाइस को स्ट्रक्चर से मिटा दिया गया हो.

रिलेशन इवेंट तीन तरह के होते हैं:

  • हटा दिया गया
  • अपडेट कर दिया गया है

रिलेशन इवेंट का पेलोड इस तरह है:

पेलोड

{
  "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"
}

रिलेशन इवेंट में, object वह संसाधन होता है जो इवेंट को ट्रिगर करता है और subject एक ऐसा संसाधन है जिससे object अब जुड़ा हुआ है. इस उदाहरण के लिए, user ने इस डिवाइस को developerऔर userका अधिकृत डिवाइस अब उसकी अनुमति वाले डिवाइस से जुड़ा हुआ है स्ट्रक्चर, जो इवेंट को ट्रिगर करता है.

subject सिर्फ़ कोई कमरा या स्ट्रक्चर हो सकता है. अगर a developer नहीं है userका स्ट्रक्चर देखने की अनुमति देते हैं, subject हमेशा खाली.

फ़ील्ड

फ़ील्ड ब्यौरा डेटा टाइप
eventId इवेंट के लिए यूनीक आइडेंटिफ़ायर. string
जैसे: "ed4cd8c3-eb6c-41bb-81be-30379cc713a5"
timestamp इवेंट होने का समय. string
जैसे: "2019-01-01T00:00:01Z"
relationUpdate रिलेशन के अपडेट के बारे में जानकारी देने वाला ऑब्जेक्ट. object
userId एक यूनीक और अस्पष्ट आइडेंटिफ़ायर, जो उपयोगकर्ता के बारे में बताता है. string
उदाहरण के लिए: "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi"

अलग-अलग इवेंट के बारे में ज़्यादा जानने के लिए, इवेंट देखें इवेंट और उनके काम करने के तरीक़े की जानकारी मिलती है.

उदाहरण

हर तरह के रिलेशन इवेंट के लिए इवेंट पेलोड अलग-अलग होते हैं:

बनाया गया

स्ट्रक्चर बनाया गया

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

डिवाइस बनाया गया

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

डिवाइस बनाया गया

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

अपडेट कर दिया गया है

डिवाइस को स्थानांतरित किया गया

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

हटा दिया गया

स्ट्रक्चर मिटा दिया गया

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

डिवाइस मिटाया गया

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

डिवाइस मिटाया गया

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

संबंध इवेंट तब नहीं भेजे जाते, जब:

  • एक कमरा मिटा दिया गया है

संसाधन इवेंट

संसाधन इवेंट किसी संसाधन का अपडेट दिखाता है. यह किसी बदलाव की वजह से हो सकता है जैसे, थर्मोस्टैट का मोड बदलना. यह डिवाइस के लिए एक ऐसी कार्रवाई भी दिखा सकता है जो Trait फ़ील्ड में बदलाव नहीं करता. जैसे, डिवाइस का बटन दबाने से.

Trait फ़ील्ड की वैल्यू में बदलाव होने पर जनरेट होने वाले इवेंट में, traits ऑब्जेक्ट, डिवाइस के GET कॉल से मिलता-जुलता है:

पेलोड

{
  "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"
  ]
}

इसका इस्तेमाल करें व्यक्तिगत Trait से जुड़े दस्तावेज़, ताकि किसी Trait फ़ील्ड में बदलाव करने वाले संसाधन के पेलोड फ़ॉर्मैट को समझा जा सके इवेंट.

डिवाइस की कार्रवाई के जवाब में जनरेट हुए इवेंट में, Trait फ़ील्ड में बदलाव नहीं किया जाता है पेलोड, resourceUpdate ऑब्जेक्ट के साथ, लेकिन events ऑब्जेक्ट के साथ किसी traits ऑब्जेक्ट के बजाय:

पेलोड

{
  "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" ] }

इस तरह के संसाधन इवेंट को किसी खास विशेषता के ज़रिए बताया जाता है. उदाहरण के लिए, मोशन इवेंट को इसमें बताया गया है CameraMotion Trait. हर विशेषता के दस्तावेज़ देखें ताकि इस तरह के रिसॉर्स इवेंट के पेलोड फ़ॉर्मैट को समझा जा सके.

फ़ील्ड

फ़ील्ड ब्यौरा डेटा टाइप
eventId इवेंट के लिए यूनीक आइडेंटिफ़ायर. string
जैसे: "ed21b6b0-791f-46ab-bac1-868c78020b5f"
timestamp इवेंट होने का समय. string
जैसे: "2019-01-01T00:00:01Z"
resourceUpdate एक ऑब्जेक्ट जो संसाधन के अपडेट के बारे में जानकारी देता है. object
userId एक यूनीक और अस्पष्ट आइडेंटिफ़ायर, जो उपयोगकर्ता के बारे में बताता है. string
उदाहरण के लिए: "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi"
eventThreadId इवेंट थ्रेड के लिए यूनीक आइडेंटिफ़ायर. string
जैसे: "d67cd3f7-86a7-425e-8bb3-462f92ec9f59"
eventThreadState इवेंट थ्रेड की स्थिति. string
वैल्यू: "STARTED", "UPDATED", "ENDED"
resourceGroup एक ऑब्जेक्ट जो ऐसे संसाधनों के बारे में बताता है जिनमें इस इवेंट से मिलते-जुलते अपडेट हो सकते हैं. इस ऑब्जेक्ट में, इवेंट का संसाधन (resourceUpdate ऑब्जेक्ट से) हमेशा मौजूद रहेगा. object

अलग-अलग इवेंट के बारे में ज़्यादा जानने के लिए, इवेंट देखें इवेंट और उनके काम करने के तरीक़े की जानकारी मिलती है.

अपडेट होने वाली सूचनाएं

संसाधन इवेंट के आधार पर सूचनाएं, किसी ऐप्लिकेशन में लागू की जा सकती हैं, जैसे Android या iOS. भेजी जाने वाली सूचनाओं की संख्या कम करने के लिए, अपडेट की जा सकने वाली सूचनाएं लागू की जा सकती हैं, जिनमें पहले से मौजूद सूचनाएं उसी इवेंट में बाद के इवेंट के आधार पर नई जानकारी के साथ अपडेट किए जाते हैं थ्रेड.

अपडेट की जा सकने वाली सूचनाओं के लिए, इवेंट की सुविधा उपलब्ध कराने का विकल्प चुनें. साथ ही, इन्हें इस तौर पर टैग किया गया हो अपडेट किया जा सकता है  दस्तावेज़ में. ये इवेंट उनके पेलोड में eventThreadId नाम का एक अतिरिक्त फ़ील्ड होता है. इसका इस्तेमाल करें पहले से मौजूद इवेंट को अपडेट करने के लिए, अलग-अलग इवेंट को एक साथ लिंक करने के लिए फ़ील्ड एक ऐसी सूचना है जो किसी उपयोगकर्ता को दिखती है.

इवेंट थ्रेड और इवेंट सेशन अलग-अलग होते हैं. इवेंट की थ्रेड उसी थ्रेड में, पिछले इवेंट के अपडेट किए गए स्टेटस की पहचान करता है. कॉन्टेंट बनाने इवेंट सेशन एक-दूसरे से जुड़े अलग-अलग इवेंट की पहचान करता है और किसी इवेंट सेशन में एक से ज़्यादा इवेंट थ्रेड हो सकते हैं.

सूचना के मकसद से, अलग-अलग तरह के इवेंट को अलग-अलग ग्रुप में रखा जाता है थ्रेड.

इस थ्रेड को ग्रुप में बांटने और टाइमिंग लॉजिक को Google मैनेज करता है. यह इन पर निर्भर करता है बदल सकते हैं. developer को इन बातों के आधार पर सूचनाएं अपडेट करनी चाहिए एसडीएम एपीआई से मिले इवेंट के थ्रेड और सेशन.

थ्रेड की स्थिति

जिन इवेंट में अपडेट की जा सकने वाली सूचनाएं काम करती हैं उनमें एक eventThreadState भी होती है ऐसा फ़ील्ड है जो उस समय इवेंट थ्रेड की स्थिति को दिखाता है. यह फ़ील्ड में ये वैल्यू होती हैं:

  • शुरू किया गया — किसी इवेंट थ्रेड में पहला इवेंट.
  • अपडेट किया गया — किसी मौजूदा इवेंट थ्रेड में कोई इवेंट. किसी एक थ्रेड में इस स्थिति से, शून्य या उससे ज़्यादा इवेंट हो सकते हैं.
  • खत्म हो गया — इवेंट थ्रेड में आखिरी इवेंट, जो थ्रेड टाइप के आधार पर, अपडेट किए गए पिछले इवेंट का डुप्लीकेट हो सकता है.

इस फ़ील्ड का इस्तेमाल इवेंट थ्रेड की प्रोग्रेस को ट्रैक करने के लिए किया जा सकता है. साथ ही, यह तब भी देखा जा सकता है, जब इसमें खत्म हो गया.

इवेंट फ़िल्टर करना

कुछ मामलों में, डिवाइस से पहचाने गए इवेंट को पब्लिश करने से बाहर रखा जा सकता है को एसडीएम Pub/Sub विषय से जोड़ना होगा. यह व्यवहार इसे इवेंट फ़िल्टर करना कहा जाता है. इवेंट को फ़िल्टर करने का मकसद, लोगों को बहुत कम समय में बहुत सारे समान इवेंट संदेश प्रकाशित करना.

उदाहरण के लिए, कोई मैसेज एसडीएम के विषय पर पब्लिश हो सकता है शुरुआती मोशन इवेंट के लिए. किसी और तरीके से इसके बाद, मोशन वाले मैसेज एक तय समय बीतने तक फ़िल्टर करके उसे पब्लिश करने की प्रोसेस से हटाया जा सकता है. इस अवधि के एक बार कुछ समय बीतने के बाद, उस इवेंट टाइप के लिए इवेंट का मैसेज फिर से पब्लिश किया जा सकता है.

Google Home ऐप्लिकेशन (जीएचए) में, ऐसे इवेंट जो फ़िल्टर किया गया डेटा userके इवेंट इतिहास में अब भी दिखेगा. हालांकि, ऐसे इवेंट की वजह से ऐप्लिकेशन की कोई सूचना नहीं जनरेट होती (भले ही वह सूचना इस टाइप की हो सक्षम किया गया है).

हर तरह के इवेंट का अपना इवेंट फ़िल्टर करने का लॉजिक होता है, जो Google. इसमें किसी भी समय बदलाव किया जा सकता है. इवेंट को फ़िल्टर करने का यह लॉजिक है और सेशन लॉजिक, इवेंट थ्रेड और सेशन लॉजिक से अलग है.

सेवा खाते

एसडीएम एपीआई को मैनेज करने के लिए, सेवा खातों का सुझाव दिया जाता है सदस्यताएँ और इवेंट मैसेज. सेवा खाते का इस्तेमाल किसी ऐप्लिकेशन या कोई व्यक्ति नहीं, बल्कि वर्चुअल मशीन के पास इसकी अपनी यूनीक खाता कुंजी होती है.

Pub/Sub API के लिए, सेवा खाते की अनुमति का इस्तेमाल करना दो पैरों वाला OAuth (2LO).

2LO की पुष्टि करने वाले फ़्लो में:

  • developer , सेवा कुंजी का इस्तेमाल करके ऐक्सेस टोकन का अनुरोध करता है.
  • developer , एपीआई को कॉल करने के साथ ऐक्सेस टोकन का इस्तेमाल करता है.

Google 2LO और इसे सेट अप करने के तरीके के बारे में ज़्यादा जानने के लिए, यहां जाएं सर्वर से सर्वर के लिए OAuth 2.0 का इस्तेमाल करना ऐप्लिकेशन.

अनुमति देना

सेवा खाते को, Pub/Sub एपीआई:

  1. क्लाउड Pub/Sub चालू करना API को भी ऐक्सेस किया जा सकता है.
  2. यहां बताए गए तरीके से, सेवा खाता और सेवा खाता कुंजी बनाना सेवा खाता बनाना. हमारा सुझाव है कि इसे सिर्फ़ Pub/Sub के सदस्य की भूमिका दें. पक्का करें कि सेवा खाता कुंजी को उस मशीन पर डाउनलोड करें जो Pub/Sub एपीआई.
  3. अपने आवेदन करने के लिए पिछले पेज पर दिए गए निर्देशों का पालन करें या oauth2l का इस्तेमाल करके मैन्युअल तरीके से ऐक्सेस टोकन पाएं. एपीआई ऐक्सेस की फटाफट जांच करनी हो.
  4. सेवा खाते के क्रेडेंशियल या ऐक्सेस टोकन का इस्तेमाल Pub/Sub project.subscriptions API का इस्तेमाल करने के लिए किया जा सकता है.

ओऑथ2एल

Google oauth2l, Go में लिखे गए OAuth के लिए एक कमांड-लाइन टूल है. इसे इसके लिए इंस्टॉल करें Mac या Linux में Go का इस्तेमाल किया जा रहा है.

  1. अगर आपके सिस्टम पर Go ऐप्लिकेशन नहीं है, तो पहले उसे डाउनलोड करके इंस्टॉल करें.
  2. Go इंस्टॉल हो जाने के बाद, oauth2l इंस्टॉल करें और इसकी जगह की जानकारी अपने PATH में जोड़ें एनवायरमेंट वैरिएबल:
    go install github.com/google/oauth2l@latest
    export PATH=$PATH:~/go/bin
  3. एपीआई का ऐक्सेस टोकन पाने के लिए, oauth2l का इस्तेमाल करें. इसके लिए, सही तरीके का इस्तेमाल करें OAuth के दायरे:
    oauth2l fetch --credentials path-to-service-key.json --scope https://www.googleapis.com/auth/pubsub
    https://www.googleapis.com/auth/cloud-platform
    उदाहरण के लिए, अगर आपकी सेवा कुंजी ~/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...

ज़्यादा इस्तेमाल के बारे में जानने के लिए, oauth2l README देखें जानकारी.

Google API क्लाइंट लाइब्रेरी

Google API के लिए ऐसी कई क्लाइंट लाइब्रेरी उपलब्ध हैं जो OAuth का इस्तेमाल करती है 2.0. इस बारे में ज़्यादा जानकारी के लिए, Google API क्लाइंट लाइब्रेरी देखें आपकी पसंद की भाषा में हो.

जब इन लाइब्रेरी को Pub/Sub APIके साथ इस्तेमाल किया जाता है, तो इनका इस्तेमाल करें: ये स्कोप स्ट्रिंग:

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

गड़बड़ियां

इस गाइड से जुड़े ये गड़बड़ी कोड दिख सकते हैं:

गड़बड़ी संदेश RPC समस्या का हल
कैमरा इमेज अब डाउनलोड नहीं की जा सकती. DEADLINE_EXCEEDED इवेंट के पब्लिश होने के 30 सेकंड बाद, उसकी इमेज दिखना बंद हो जाती हैं. समयसीमा खत्म होने से पहले, इमेज को डाउनलोड कर लें.
इवेंट आईडी कैमरे से नहीं जुड़ा है. FAILED_PRECONDITION कैमरा इवेंट से मिले सही eventID का इस्तेमाल करें.

इसके लिए एपीआई गड़बड़ी कोड संदर्भ देखें में देखें.