Các sự kiện là không đồng bộ và do Google Cloud Pub/Sub quản lý, trong một chủ đề duy nhất cho mỗi Project. Các sự kiện cung cấp thông tin cập nhật cho tất cả thiết bị và cấu trúc, đồng thời đảm bảo nhận được các sự kiện miễn là người dùng không thu hồi mã truy cập và thông báo sự kiện chưa hết hạn.
Bật sự kiện
Sự kiện là một tính năng không bắt buộc của SDM API. Xem phần Bật sự kiện để tìm hiểu cách bật sự kiện cho Project.
Google Cloud Pub/Sub
Hãy xem tài liệu về Google Cloud Pub/Sub để tìm hiểu thêm về cách hoạt động của Pub/Sub. Cụ thể:
- Tìm hiểu những kiến thức cơ bản về Pub/Sub thông qua Hướng dẫn cách thực hiện.
- Tìm hiểu cách hoạt động của tính năng Xác thực.
- Chọn một Thư viện ứng dụng được cung cấp hoặc tự viết và sử dụng các giao diện REST/HTTP hoặc gRPC API.
Đăng ký nhận thông báo về sự kiện
Trước tháng 1 năm 2025, nếu đã bật sự kiện cho Project, bạn sẽ nhận được một chủ đề dành riêng cho Project đó, dưới dạng:
projects/gcp-project-name/subscriptions/topic-id
Để nhận sự kiện, hãy tạo một gói thuê bao kéo hoặc đẩy cho chủ đề đó, tuỳ thuộc vào trường hợp sử dụng của bạn. Hệ thống hỗ trợ nhiều lượt đăng ký cho chủ đề SDM. Hãy xem phần Quản lý gói thuê bao để biết thêm thông tin.
Bắt đầu sự kiện
Để bắt đầu sự kiện lần đầu tiên sau khi tạo gói thuê bao Pub/Sub, hãy thực hiện lệnh gọi API
devices.list
dưới dạng một trình kích hoạt một lần. Các sự kiện cho tất cả các cấu trúc và thiết bị sẽ được xuất bản sau lệnh gọi này.
Để xem ví dụ, hãy xem trang Uỷ quyền trong Hướng dẫn bắt đầu nhanh.
Thứ tự sự kiện
Pub/Sub không đảm bảo việc phân phối các sự kiện theo thứ tự và thứ tự nhận các sự kiện có thể không tương ứng với thứ tự mà các sự kiện thực sự xảy ra. Sử dụng trường timestamp
để hỗ trợ việc đối chiếu thứ tự sự kiện. Các sự kiện cũng có thể đến riêng lẻ hoặc kết hợp thành một thông báo sự kiện duy nhất.
Để biết thêm thông tin, hãy xem phần Sắp xếp thông báo.
Mã nhận dạng người dùng
Nếu quá trình triển khai của bạn dựa trên người dùng (thay vì cấu trúc hoặc thiết bị), hãy sử dụng trường userID
trong tải trọng sự kiện để tương quan các tài nguyên và sự kiện. Trường này là một mã nhận dạng bị làm rối đại diện cho một người dùng cụ thể.
userID
cũng có trong tiêu đề phản hồi HTTP của mỗi lệnh gọi API.
Sự kiện quan hệ
Sự kiện quan hệ thể hiện một bản cập nhật quan hệ cho một tài nguyên. Ví dụ: khi một thiết bị được thêm vào một cấu trúc hoặc khi một thiết bị bị xoá khỏi một cấu trúc.
Có 3 loại sự kiện mối quan hệ:
- ĐÃ TẠO
- ĐÃ XÓA
- ĐÃ CẬP NHẬT
Tải trọng cho một sự kiện mối quan hệ như sau:
Phần tải
{ "eventId" : "81688b62-4f69-432f-bbe0-5270032f5466", "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" }
Trong một sự kiện quan hệ, object
là tài nguyên đã kích hoạt sự kiện và subject
là tài nguyên mà object
hiện có mối quan hệ. Trong ví dụ trên, user đã cấp quyền truy cập vào thiết bị cụ thể này cho developervà thiết bị được uỷ quyền của userhiện được liên kết với cấu trúc được uỷ quyền của họ, điều này sẽ kích hoạt sự kiện.
subject
chỉ có thể là một phòng hoặc một cấu trúc. Nếu a developer không có quyền xem cấu trúc của user, thì subject
sẽ luôn trống.
Trường
Trường | Mô tả | Loại dữ liệu |
---|---|---|
eventId |
Giá trị nhận dạng duy nhất của sự kiện. | string Ví dụ: "4ec221c5-4cbc-4fd5-ae2e-6eebd1311876" |
timestamp |
Thời điểm xảy ra sự kiện. | string Ví dụ: "2019-01-01T00:00:01Z" |
relationUpdate |
Một đối tượng cung cấp thông tin chi tiết về nội dung cập nhật mối quan hệ. | object |
userId |
Giá trị nhận dạng duy nhất, được làm rối đại diện cho người dùng. | string Ví dụ: "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi" |
Hãy xem phần Sự kiện để biết thêm thông tin về các loại sự kiện và cách chúng hoạt động.
Ví dụ
Tải trọng sự kiện khác nhau đối với từng loại sự kiện mối quan hệ:
ĐÃ TẠO
Đã tạo cấu trúc
"relationUpdate" : { "type" : "CREATED", "subject" : "", "object" : "enterprises/project-id/structures/structure-id" }
Đã tạo thiết bị
"relationUpdate" : { "type" : "CREATED", "subject" : "enterprises/project-id/structures/structure-id", "object" : "enterprises/project-id/devices/device-id" }
Đã tạo thiết bị
"relationUpdate" : { "type" : "CREATED", "subject" : "enterprises/project-id/structures/structure-id/rooms/room-id", "object" : "enterprises/project-id/devices/device-id" }
ĐÃ CẬP NHẬT
Thiết bị đã được di chuyển
"relationUpdate" : { "type" : "UPDATED", "subject" : "enterprises/project-id/structures/structure-id/rooms/room-id", "object" : "enterprises/project-id/devices/device-id" }
ĐÃ XÓA
Đã xoá cấu trúc
"relationUpdate" : { "type" : "DELETED", "subject" : "", "object" : "enterprises/project-id/structures/structure-id" }
Đã xoá thiết bị
"relationUpdate" : { "type" : "DELETED", "subject" : "enterprises/project-id/structures/structure-id", "object" : "enterprises/project-id/devices/device-id" }
Đã xoá thiết bị
"relationUpdate" : { "type" : "DELETED", "subject" : "enterprises/project-id/structures/structure-id/rooms/room-id", "object" : "enterprises/project-id/devices/device-id" }
Sự kiện liên quan sẽ không được gửi khi:
- Một phòng bị xoá
Sự kiện tài nguyên
Sự kiện tài nguyên thể hiện một nội dung cập nhật dành riêng cho một tài nguyên. Thông báo này có thể là phản hồi cho một thay đổi về giá trị của trường đặc điểm, chẳng hạn như thay đổi chế độ của máy điều nhiệt. Bạn cũng có thể dùng tham số này để biểu thị một thao tác trên thiết bị không thay đổi trường đặc điểm, chẳng hạn như nhấn nút trên thiết bị.
Một sự kiện được tạo để phản hồi thay đổi về giá trị của trường đặc điểm chứa một đối tượng traits
, tương tự như lệnh gọi GET của thiết bị:
Phần tải
{
"eventId" : "b5a3cb32-3ca8-4b0b-9510-c6a9e70f00f4",
"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"
]
}
Hãy sử dụng tài liệu về đặc điểm riêng lẻ để tìm hiểu định dạng tải trọng cho mọi sự kiện tài nguyên thay đổi trường đặc điểm.
Một sự kiện được tạo để phản hồi một thao tác trên thiết bị không thay đổi trường đặc điểm cũng có một tải trọng có đối tượng resourceUpdate
, nhưng có đối tượng events
thay vì đối tượng traits
:
Phần tải
{ "eventId" : "803821e5-2626-41d5-8ea2-04b6fdb88f8c",
"timestamp" : "2019-01-01T00:00:01Z",
"resourceUpdate" : { "name" : "enterprises/project-id/devices/device-id", "events" : { "sdm.devices.events.CameraMotion.Motion
" : { "eventSessionId" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF...", "eventId" : "HEQiFiTuneH7NJVZ-kHxnbZyU9...", } } } "userId" : "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi",
"eventThreadId" : "d67cd3f7-86a7-425e-8bb3-462f92ec9f59",
"eventThreadState" : "STARTED",
"resourceGroup" : [ "enterprises/project-id/devices/device-id" ] }
Các loại sự kiện tài nguyên này được xác định trong các đặc điểm cụ thể. Ví dụ: Sự kiện Chuyển động được xác định trong đặc điểm CameraMotion . Hãy xem tài liệu của từng đặc điểm để hiểu định dạng tải trọng cho các loại sự kiện tài nguyên này.
Trường
Trường | Mô tả | Loại dữ liệu |
---|---|---|
eventId |
Giá trị nhận dạng duy nhất của sự kiện. | string Ví dụ: "803821e5-2626-41d5-8ea2-04b6fdb88f8c" |
timestamp |
Thời điểm xảy ra sự kiện. | string Ví dụ: "2019-01-01T00:00:01Z" |
resourceUpdate |
Một đối tượng cung cấp thông tin chi tiết về nội dung cập nhật tài nguyên. | object |
userId |
Giá trị nhận dạng duy nhất, được làm rối đại diện cho người dùng. | string Ví dụ: "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi" |
eventThreadId |
Giá trị nhận dạng duy nhất của luồng sự kiện. | string Ví dụ: "d67cd3f7-86a7-425e-8bb3-462f92ec9f59" |
eventThreadState |
Trạng thái của luồng sự kiện. | string Giá trị: "STARTED", "UPDATED", "ENDED" |
resourceGroup |
Một đối tượng cho biết những tài nguyên có thể có nội dung cập nhật tương tự như sự kiện này. Tài nguyên của chính sự kiện (từ đối tượng resourceUpdate ) sẽ luôn có trong đối tượng này. |
object |
Hãy xem phần Sự kiện để biết thêm thông tin về các loại sự kiện và cách chúng hoạt động.
Thông báo có thể cập nhật
Bạn có thể triển khai thông báo dựa trên các sự kiện tài nguyên trong một ứng dụng, chẳng hạn như cho Android hoặc iOS. Để giảm số lượng thông báo được gửi, bạn có thể triển khai một tính năng gọi là thông báo có thể cập nhật. Theo đó, các thông báo hiện có sẽ được cập nhật thông tin mới dựa trên các sự kiện tiếp theo trong cùng một luồng sự kiện.Chọn tính năng sự kiện hỗ trợ thông báo có thể cập nhật và được gắn thẻ là
Có thể cập nhật eventThreadId
trong tải trọng của chúng. Sử dụng trường này để liên kết các sự kiện riêng lẻ với nhau nhằm mục đích cập nhật một thông báo hiện có đã xuất hiện cho người dùng.
Luồng sự kiện không giống với phiên sự kiện. Luồng sự kiện xác định trạng thái mới cho một sự kiện trước đó trong cùng một luồng. Phiên sự kiện xác định các sự kiện riêng biệt có liên quan đến nhau và có thể có nhiều luồng sự kiện cho một phiên sự kiện nhất định.
Để thông báo, các loại sự kiện khác nhau được nhóm thành các luồng khác nhau.
Logic nhóm và thời gian của luồng này do Google xử lý và có thể thay đổi bất cứ lúc nào. A developer phải cập nhật thông báo dựa trên các luồng sự kiện và phiên do SDM API cung cấp.
Trạng thái luồng
Các sự kiện hỗ trợ thông báo có thể cập nhật cũng có trường eventThreadState
cho biết trạng thái của luồng sự kiện tại thời điểm đó. Trường này có các giá trị sau:
- ĐÃ BẮT ĐẦU – Sự kiện đầu tiên trong một chuỗi sự kiện.
- ĐÃ CẬP NHẬT – Một sự kiện trong chuỗi sự kiện đang diễn ra. Có thể có 0 hoặc nhiều sự kiện có trạng thái này trong một luồng duy nhất.
- ENDED – Sự kiện cuối cùng trong một luồng sự kiện, có thể là bản sao của sự kiện UPDATED gần đây nhất, tuỳ thuộc vào loại luồng.
Bạn có thể dùng trường này để theo dõi tiến trình của một luồng sự kiện và thời điểm luồng đó kết thúc.
Lọc sự kiện
Trong một số trường hợp, các sự kiện do thiết bị phát hiện có thể bị lọc ra khỏi quá trình xuất bản vào một chủ đề SDM Pub/Sub. Hành vi này được gọi là lọc sự kiện. Mục đích của việc lọc sự kiện là tránh xuất bản quá nhiều thông báo sự kiện tương tự trong một khoảng thời gian ngắn.
Ví dụ: một thông báo có thể được xuất bản cho một chủ đề SDM cho một sự kiện Chuyển động ban đầu. Sau đó, những thông báo khác về Motion sẽ bị lọc khỏi quá trình xuất bản cho đến khi hết một khoảng thời gian nhất định. Sau khoảng thời gian đó, thông báo sự kiện cho loại sự kiện đó có thể được xuất bản lại.
Trong Ứng dụng Google Home (GHA), những sự kiện đã được lọc sẽ vẫn xuất hiện trong danh sách sự kiện đã ghi lại của user. Tuy nhiên, những sự kiện như vậy không tạo ra thông báo ứng dụng (ngay cả khi bạn đã bật loại thông báo đó).
Mỗi loại sự kiện đều có logic lọc sự kiện riêng, do Google xác định và có thể thay đổi bất cứ lúc nào. Logic lọc sự kiện này độc lập với luồng sự kiện và logic phiên.
Tài khoản dịch vụ
Bạn nên dùng tài khoản dịch vụ để quản lý gói thuê bao SDM API và thông báo sự kiện. Tài khoản dịch vụ được dùng bởi một ứng dụng hoặc máy ảo, chứ không phải một người, và có khoá tài khoản riêng biệt.
Uỷ quyền tài khoản dịch vụ cho Pub/Sub API sử dụng OAuth hai chân (2LO).
Trong quy trình uỷ quyền 2LO:
- developer yêu cầu mã truy cập bằng khoá dịch vụ.
- developer sử dụng mã truy cập với các lệnh gọi đến API.
Để tìm hiểu thêm về 2LO của Google và cách thiết lập, hãy xem bài viết Sử dụng OAuth 2.0 cho các ứng dụng từ máy chủ đến máy chủ.
Ủy quyền
Bạn nên uỷ quyền cho tài khoản dịch vụ sử dụng Pub/Sub API:
- Bật Cloud Pub/Sub API trong Google Cloud.
- Tạo tài khoản dịch vụ và khoá tài khoản dịch vụ như mô tả trong phần Tạo tài khoản dịch vụ. Bạn chỉ nên cấp cho tài khoản này vai trò Người đăng ký Pub/Sub. Đảm bảo bạn tải khoá tài khoản dịch vụ xuống máy sẽ sử dụng Pub/Sub API.
- Cung cấp thông tin xác thực (khoá tài khoản dịch vụ) cho mã ứng dụng của bạn bằng cách làm theo hướng dẫn trên trang ở bước trước hoặc lấy mã truy cập theo cách thủ công bằng cách sử dụng
oauth2l
, nếu bạn muốn nhanh chóng kiểm tra quyền truy cập API. - Sử dụng thông tin đăng nhập tài khoản dịch vụ hoặc mã truy cập với API Pub/Sub
project.subscriptions
để kéo và xác nhận các thông báo.
oauth2l
Google oauth2l
là một công cụ dòng lệnh cho OAuth được viết bằng Go. Hãy cài đặt công cụ này cho Mac hoặc Linux bằng Go.
- Nếu bạn chưa có Go trên hệ thống, hãy tải và cài đặt Go trước.
- Sau khi cài đặt Go, hãy cài đặt
oauth2l
và thêm vị trí củaoauth2l
vào biến môi trườngPATH
:go install github.com/google/oauth2l@latest
export PATH=$PATH:~/go/bin
- Sử dụng
oauth2l
để lấy mã truy cập cho API, bằng cách sử dụng(các) phạm vi OAuth thích hợp: Ví dụ: nếu khoá dịch vụ của bạn nằm tạioauth2l 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...
Hãy xem phần oauth2l
README để biết thêm thông tin về cách sử dụng.
Thư viện ứng dụng Google API
Có một số thư viện ứng dụng dành cho các API của Google sử dụng OAuth 2.0. Hãy xem Thư viện ứng dụng API của Google để biết thêm thông tin về ngôn ngữ bạn chọn.
Khi sử dụng các thư viện này với Pub/Sub API, hãy sử dụng(các) chuỗi phạm vi sau:
https://www.googleapis.com/auth/pubsub https://www.googleapis.com/auth/cloud-platform
Lỗi
(Các) mã lỗi sau đây có thể được trả về liên quan đến hướng dẫn này:
Thông báo lỗi | RPC | Khắc phục sự cố |
---|---|---|
Bạn không thể tải hình ảnh từ camera xuống nữa. | DEADLINE_EXCEEDED |
Hình ảnh sự kiện sẽ hết hạn sau 30 giây kể từ khi sự kiện được xuất bản. Nhớ tải hình ảnh xuống trước khi hết hạn. |
Mã sự kiện không thuộc về camera. | FAILED_PRECONDITION |
Sử dụng eventID chính xác do sự kiện camera trả về. |
Hãy xem Tài liệu tham khảo về mã lỗi API để biết danh sách đầy đủ các mã lỗi API.