Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Urządzenia IoT Plug and Play powinny postępować zgodnie z zestawem konwencji podczas wymiany komunikatów z centrum IoT Hub. Urządzenia IoT Plug and Play używają protokołu MQTT do komunikowania się z usługą IoT Hub. Usługa IoT Hub obsługuje również protokół AMQP, który jest dostępny w niektórych zestawach SDK urządzeń IoT.
Urządzenie może zawierać moduły lub zaimplementować je w module usługi IoT Edge hostowanym przez środowisko uruchomieniowe usługi IoT Edge.
Opisano dane telemetryczne, właściwości i polecenia, które urządzenie IoT Plug and Play implementuje za pomocą modelu języka DTDL (Digital Twins Definition Language). Istnieją dwa typy modelu, o których mowa w tym artykule:
- Brak składnika — model bez składników. Model deklaruje dane telemetryczne, właściwości i polecenia jako elementy najwyższego poziomu w sekcji zawartości głównego interfejsu. W narzędziu Eksplorator usługi Azure IoT ten model jest wyświetlany jako pojedynczy składnik domyślny.
- Wiele składników — model składający się z co najmniej dwóch interfejsów. Główny interfejs, który jest wyświetlany jako składnik domyślny z danymi telemetrycznymi, właściwościami i poleceniami. Co najmniej jeden interfejs zadeklarowany jako składnik z więcej danymi telemetrycznymi, właściwościami i poleceniami.
Aby uzyskać więcej informacji, zobacz Przewodnik modelowania technologii IoT Plug and Play.
Identyfikowanie modelu
Aby ogłosić model, który implementuje, urządzenie lub moduł IoT Plug and Play zawiera identyfikator modelu w pakiecie połączenia MQTT, dodając go do pola USERNAME.
Aby zidentyfikować model implementujący urządzenie lub moduł, usługa może uzyskać identyfikator modelu:
- Pole cyfrowego bliźniaka
modelIdurządzenia. - Pole cyfrowego bliźniaka
$metadata.$model. - Powiadomienie o zmianie cyfrowego bliźniaka.
Telemetria
- Dane telemetryczne wysyłane z urządzenia bez składnika nie wymagają żadnych dodatkowych metadanych. System dodaje
dt-dataschemawłaściwość . - Dane telemetryczne wysyłane z urządzenia przy użyciu składników muszą dodać nazwę składnika do komunikatu telemetrii.
- W przypadku korzystania z MQTT dodaj właściwość
$.subz nazwą składnika do tematu telemetrii, a następnie system dodaje właściwośćdt-subject. - Aby korzystać z protokołu AMQP, dodaj właściwość
dt-subjectz nazwą składnika jako adnotację wiadomości.
Uwaga
Dane telemetryczne ze składników wymagają jednego komunikatu na składnik.
Aby uzyskać więcej przykładów telemetrii, zobacz Payloads Telemetry (Dane telemetryczne ładunków > )
Właściwości tylko do odczytu
Urządzenie ustawia atrybut tylko do odczytu, który następnie zgłasza do aplikacji zaplecza.
Przykładowa właściwość tylko do odczytu bez składnika
Urządzenie lub moduł może wysyłać dowolny prawidłowy kod JSON zgodny z regułami DTDL.
DTDL definiujący właściwość w interfejsie:
{
"@context": "dtmi:dtdl:context;2",
"@id": "dtmi:example: Thermostat;1",
"@type": "Interface",
"contents": [
{
"@type": "Property",
"name": "temperature",
"schema": "double"
}
]
}
Przykładowe zgłoszone dane właściwości:
"reported" :
{
"temperature" : 21.3
}
Przykładowa właściwość tylko do odczytu dla wielu składników
Urządzenie lub moduł musi dodać {"__t": "c"} znacznik, aby wskazać, że element odwołuje się do składnika.
DTDL, który odwołuje się do składnika:
{
"@context": "dtmi:dtdl:context;2",
"@id": "dtmi:com:example:TemperatureController;1",
"@type": "Interface",
"displayName": "Temperature Controller",
"contents": [
{
"@type" : "Component",
"schema": "dtmi:com:example:Thermostat;1",
"name": "thermostat1"
}
]
}
DTDL definiujący składnik:
{
"@context": "dtmi:dtdl:context;2",
"@id": "dtmi:com:example:Thermostat;1",
"@type": "Interface",
"contents": [
{
"@type": "Property",
"name": "temperature",
"schema": "double"
}
]
}
Przykładowe zgłoszone dane właściwości:
"reported": {
"thermostat1": {
"__t": "c",
"temperature": 21.3
}
}
Aby uzyskać więcej przykładów właściwości tylko do odczytu, zobacz > ładunków.
Właściwości z możliwością zapisu
Aplikacja zaplecza ustawia właściwość zapisywalną, którą usługa IoT Hub następnie wysyła do urządzenia.
Urządzenie lub moduł powinny potwierdzić otrzymanie właściwości, wysyłając odpowiedni komunikat. Zgłoszona właściwość powinna zawierać następujące elementy:
-
value- rzeczywista wartość właściwości (zazwyczaj odebrana wartość, ale urządzenie może zdecydować się zgłosić inną wartość). -
ac— kod potwierdzenia, który używa kodu stanu HTTP. -
av— wersja potwierdzenia, która odwołuje się do$versionżądanej właściwości. W przesyłce JSON żądanej właściwości można znaleźć tę wartość. -
ad— opcjonalny opis potwierdzenia.
Odpowiedzi na potwierdzenie
Podczas raportowania właściwości zapisywalnych urządzenie powinno utworzyć komunikat potwierdzenia przy użyciu czterech pól na poprzedniej liście, aby wskazać rzeczywisty stan urządzenia zgodnie z opisem w poniższej tabeli:
| Status(ac) | Version(av) | Wartość(value) | Opis (av) |
|---|---|---|---|
| 200 | Żądana wersja | Żądana wartość | Zaakceptowano wartość pożądanej właściwości |
| 202 | Żądana wersja | Wartość zaakceptowana przez urządzenie | Zaakceptowana wartość żądanej właściwości, aktualizacja w toku (powinna zakończyć się kodem 200) |
| 203 | 0 | Wartość ustawiona przez urządzenie | Właściwość ustawiona z urządzenia, która nie odzwierciedla żadnego żądanego elementu |
| 400 | Żądana wersja | Rzeczywista wartość używana przez urządzenie | Żądana wartość właściwości nie została zaakceptowana. |
| 500 | Żądana wersja | Rzeczywista wartość używana przez urządzenie | Wyjątek podczas stosowania właściwości |
Gdy urządzenie zostanie uruchomione, powinno zażądać cyfrowego bliźniaka urządzenia i sprawdzić, czy istnieją aktualizacje zapisywalnych właściwości. Jeśli wersja właściwości zapisywalnej wzrosła, gdy urządzenie było w trybie offline, urządzenie powinno wysłać zgłoszoną odpowiedź właściwości, aby potwierdzić, że otrzymała aktualizację.
Gdy urządzenie jest uruchamiane po raz pierwszy, może wysłać początkową wartość zgłaszanej właściwości, jeśli nie otrzyma początkowej żądanej właściwości z centrum IoT. W takim przypadku urządzenie może wysłać wartość av domyślną do 0 i ac do 203. Na przykład:
"reported": {
"targetTemperature": {
"value": 20.0,
"ac": 203,
"av": 0,
"ad": "initialize"
}
}
Urządzenie może użyć zgłaszanej właściwości, aby przekazać inne informacje do centrum. Na przykład urządzenie może odpowiedzieć serią komunikatów w toku, takich jak:
"reported": {
"targetTemperature": {
"value": 35.0,
"ac": 202,
"av": 3,
"ad": "In-progress - reporting current temperature"
}
}
Gdy urządzenie osiągnie temperaturę docelową, wysyła następujący komunikat:
"reported": {
"targetTemperature": {
"value": 20.0,
"ac": 200,
"av": 4,
"ad": "Reached target temperature"
}
}
Urządzenie może zgłosić błąd, taki jak:
"reported": {
"targetTemperature": {
"value": 120.0,
"ac": 500,
"av": 3,
"ad": "Target temperature out of range. Valid range is 10 to 99."
}
}
Typ obiektu
Jeśli właściwość zapisywalna jest zdefiniowana jako obiekt, usługa musi wysłać pełny obiekt do urządzenia. Urządzenie powinno potwierdzić aktualizację, wysyłając wystarczające informacje z powrotem do usługi, aby zrozumieć, w jaki sposób urządzenie działało w ramach aktualizacji. Ta odpowiedź może obejmować:
- Cały obiekt.
- Tylko pola zaktualizowane przez urządzenie.
- Podzbiór pól.
W przypadku dużych obiektów rozważ zminimalizowanie rozmiaru obiektu uwzględnionego w potwierdzeniu.
W poniższym przykładzie przedstawiono właściwość zapisywalną zdefiniowaną jako Object, która zawiera cztery pola:
DTDL:
{
"@type": "Property",
"name": "samplingRange",
"schema": {
"@type": "Object",
"fields": [
{
"name": "startTime",
"schema": "dateTime"
},
{
"name": "lastTime",
"schema": "dateTime"
},
{
"name": "count",
"schema": "integer"
},
{
"name": "errorCount",
"schema": "integer"
}
]
},
"displayName": "Sampling range"
"writable": true
}
Aby zaktualizować tę właściwość zapisywalną, wyślij pełny obiekt z usługi, która wygląda jak w poniższym przykładzie:
{
"samplingRange": {
"startTime": "2021-08-17T12:53:00.000Z",
"lastTime": "2021-08-17T14:54:00.000Z",
"count": 100,
"errorCount": 5
}
}
Urządzenie odpowiada potwierdzeniem, które wygląda jak w poniższym przykładzie:
{
"samplingRange": {
"ac": 200,
"av": 5,
"ad": "Weighing status updated",
"value": {
"startTime": "2021-08-17T12:53:00.000Z",
"lastTime": "2021-08-17T14:54:00.000Z",
"count": 100,
"errorCount": 5
}
}
}
Przykład właściwości, której nie można zapisywać do żadnego składnika
Gdy urządzenie odbiera wiele żądanych właściwości w jednym ładunku, może wysyłać zgłoszone odpowiedzi właściwości w wielu ładunkach lub łączyć odpowiedzi w jeden ładunek.
Urządzenie lub moduł może wysyłać dowolny prawidłowy kod JSON zgodny z regułami DTDL.
DTDL:
{
"@context": "dtmi:dtdl:context;2",
"@id": "dtmi:example: Thermostat;1",
"@type": "Interface",
"contents": [
{
"@type": "Property",
"name": "targetTemperature",
"schema": "double",
"writable": true
},
{
"@type": "Property",
"name": "targetHumidity",
"schema": "double",
"writable": true
}
]
}
Przykładowy ładunek żądanej właściwości:
"desired" :
{
"targetTemperature" : 21.3,
"targetHumidity" : 80,
"$version" : 3
}
Pierwszy ładunek przykładowej zgłoszonej właściwości:
"reported": {
"targetTemperature": {
"value": 21.3,
"ac": 200,
"av": 3,
"ad": "complete"
}
}
Przykładowa zgłoszona właściwość drugiego ładunku:
"reported": {
"targetHumidity": {
"value": 80,
"ac": 200,
"av": 3,
"ad": "complete"
}
}
Uwaga
Możesz zdecydować się na połączenie tych dwóch zgłoszonych ładunków danych dotyczących właściwości w jeden ładunek.
Przykładowa właściwość zapisywalna dla wielu składników
Urządzenie lub moduł musi dodać {"__t": "c"} znacznik, aby wskazać, że element odwołuje się do składnika.
Znacznik jest wysyłany tylko dla aktualizacji właściwości zdefiniowanych w składniku. Aktualizacje właściwości zdefiniowanych w domyślnym składniku nie zawierają znacznika, zobacz Przykład właściwości niezapisywalnej składnika.
Gdy urządzenie odbiera wiele zgłoszonych właściwości w jednym ładunku, może wysyłać odpowiedzi na zgłoszone właściwości w wielu ładunkach lub łączyć odpowiedzi w jeden ładunek.
Urządzenie lub moduł powinien potwierdzić, że odebrał właściwości, wysyłając zgłoszone właściwości:
DTDL, który odwołuje się do składnika:
{
"@context": "dtmi:dtdl:context;2",
"@id": "dtmi:com:example:TemperatureController;1",
"@type": "Interface",
"displayName": "Temperature Controller",
"contents": [
{
"@type" : "Component",
"schema": "dtmi:com:example:Thermostat;1",
"name": "thermostat1"
}
]
}
DTDL definiujący składnik:
{
"@context": "dtmi:dtdl:context;2",
"@id": "dtmi:com:example:Thermostat;1",
"@type": "Interface",
"contents": [
{
"@type": "Property",
"name": "targetTemperature",
"schema": "double",
"writable": true
}
]
}
Przykładowe dane żądanej właściwości:
"desired": {
"thermostat1": {
"__t": "c",
"targetTemperature": 21.3,
"targetHumidity": 80,
"$version" : 3
}
}
Pierwszy pakiet przykładowej zgłoszonej właściwości:
"reported": {
"thermostat1": {
"__t": "c",
"targetTemperature": {
"value": 23,
"ac": 200,
"av": 3,
"ad": "complete"
}
}
}
Przykładowa zgłoszona właściwość drugiego ładunku:
"reported": {
"thermostat1": {
"__t": "c",
"targetHumidity": {
"value": 80,
"ac": 200,
"av": 3,
"ad": "complete"
}
}
}
Uwaga
Możesz połączyć te dwa zgłoszone ładunki właściwości w jeden ładunek.
Aby uzyskać więcej przykładów właściwości zapisywalnych, zobacz > ładunków.
Polecenia
Żadne interfejsy składników nie używają nazwy polecenia bez prefiksu.
Na urządzeniu lub module wiele interfejsów składników używa nazw poleceń w następującym formacie: componentName*commandName.
Aby uzyskać więcej przykładów poleceń, zobacz Payloads Commands (Polecenia ładunków>).
Napiwek
Usługa IoT Central ma własne konwencje implementowania długotrwałych poleceń i poleceń offline.
Następne kroki
Teraz, gdy znasz już konwencje IoT Plug and Play, oto kilka innych zasobów: