Udostępnij za pośrednictwem


Omówienie schematów komunikatów

Rejestr schematów, funkcja udostępniona przez usługę Azure Device Registry w wersji zapoznawczej, to zsynchronizowane repozytorium w chmurze i na brzegu sieci. Rejestr schematów przechowuje definicje komunikatów pochodzących z zasobów brzegowych, a następnie uwidacznia interfejs API w celu uzyskania dostępu do tych schematów na brzegu sieci.

Łącznik OPC UA może tworzyć schematy komunikatów i dodawać je do rejestru schematów lub klienci mogą przekazywać schematy do internetowego interfejsu użytkownika środowiska operacji lub przy użyciu szablonów ARM/Bicep.

Usługi brzegowe używają schematów komunikatów do filtrowania i przekształcania komunikatów w miarę ich kierowania w scenariuszu na brzegu przemysłowym.

Schematy to dokumenty opisujące format komunikatu i jego zawartości w celu umożliwienia przetwarzania i kontekstyzacji.

Definicje schematu komunikatów

Rejestr schematów oczekuje następujących wymaganych pól w schemacie komunikatu:

Pole wymagane Definicja
$schema http://json-schema.org/draft-07/schema# lub Delta/1.0. W przepływach danych schematy JSON są używane dla źródłowych punktów końcowych, a schematy różnicowe są używane dla docelowych punktów końcowych.
type Object
properties Definicja komunikatu.

Przykładowe schematy

Poniższe przykładowe schematy zawierają przykłady definiowania schematów komunikatów w każdym formacie.

JSON:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "name": "foobarbaz",
  "description": "A representation of an event",
  "type": "object",
  "required": [ "dtstart", "summary" ],
  "properties": {
    "summary": {
      "type": "string"
    },
    "location": {
      "type": "string"
    },
    "url": {
      "type": "string"
    },
    "duration": {
      "type": "string",
      "description": "Event duration"
    }
  }
}

Delta:

{
  "$schema": "Delta/1.0",
  "type": "object",
  "properties": {
    "type": "struct",
    "fields": [
      { "name": "asset_id", "type": "string", "nullable": false, "metadata": {} },
      { "name": "asset_name", "type": "string", "nullable": false, "metadata": {} },
      { "name": "location", "type": "string", "nullable": false, "metadata": {} },
      { "name": "manufacturer", "type": "string", "nullable": false, "metadata": {} },
      { "name": "production_date", "type": "string", "nullable": false, "metadata": {} },
      { "name": "serial_number", "type": "string", "nullable": false, "metadata": {} },
      { "name": "temperature", "type": "double", "nullable": false, "metadata": {} }
    ]
  }
}

Jak przepływy danych używają schematów komunikatów

Schematy komunikatów są używane we wszystkich trzech fazach przepływu danych: definiowanie danych wejściowych źródła, stosowanie przekształceń danych i tworzenie docelowych danych wyjściowych.

Schemat wejściowy

Każde źródło przepływu danych może opcjonalnie określić schemat komunikatu. Jeśli schemat jest zdefiniowany dla źródła przepływu danych, wszystkie komunikaty przychodzące, które nie są zgodne ze schematem, zostaną porzucone.

Źródła zasobów mają wstępnie zdefiniowany schemat komunikatu, który został utworzony przez łącznik dla OPC UA.

Schematy można przekazywać dla źródeł MQTT. Obecnie operacje usługi Azure IoT obsługują kod JSON dla schematów źródłowych, nazywanych również schematami wejściowymi. W środowisku operacji można wybrać istniejący schemat lub przekazać go podczas definiowania źródła MQTT:

Zrzut ekranu przedstawiający przekazywanie schematu komunikatu w portalu środowiska operacji.

Przekształcenie

Środowisko operacji używa schematu wejściowego jako punktu wyjścia dla danych, co ułatwia wybieranie przekształceń w oparciu o znany format komunikatu wejściowego.

Schemat danych wyjściowych

Schematy wyjściowe są skojarzone z miejscami docelowymi przepływu danych są używane tylko w przypadku przepływów danych, które wybierają magazyn lokalny, sieć szkieletową, usługę Azure Storage (ADLS Gen2) lub usługę Azure Data Explorer jako docelowy punkt końcowy. Obecnie środowisko operacji usługi Azure IoT obsługuje tylko dane wyjściowe Parquet dla schematów wyjściowych.

Uwaga: Format schematu różnicowego jest używany zarówno dla danych wyjściowych Parquet, jak i Delta.

W przypadku tych przepływów danych środowisko operacji stosuje wszelkie przekształcenia do schematu wejściowego, a następnie tworzy nowy schemat w formacie delta. Po utworzeniu zasobu niestandardowego przepływu danych (CR) zawiera wartość wskazującą schemaRef wygenerowany schemat przechowywany w rejestrze schematów.

Aby przekazać schemat wyjściowy, zobacz Przekazywanie schematu.

Przekazywanie schematu

Schemat wejściowy można przekazać w portalu środowiska operacji zgodnie z opisem w sekcji Schemat danych wejściowych w tym artykule. Schemat można również przekazać przy użyciu interfejsu wiersza polecenia platformy Azure lub szablonu Bicep.

Przekazywanie schematu za pomocą interfejsu wiersza polecenia

Grupa poleceń az iot ops schema zawiera polecenia służące do tworzenia, wyświetlania schematów i zarządzania nimi w rejestrze schematów.

Schemat można przekazać, odwołując się do pliku JSON lub dołączając schemat jako zawartość śródliniową.

W poniższym przykładzie użyto minimalnych danych wejściowych do utworzenia schematu wywoływanego myschema z pliku. Jeśli nie określono numeru wersji, wersja schematu to 1.

az iot ops schema create -n myschema -g myresourcegroup --registry myregistry --format json --type message --version-content myschema.json

Poniższy przykład tworzy schemat wywoływany myschema z zawartości wbudowanej i przypisuje numer wersji.

az iot ops schema create -n myschema -g myresourcegroup --registry myregistry --format delta --type message --version-content '{\"hello\": \"world\"}' --ver 14 

Po zakończeniu create wykonywania polecenia w kontenerze konta magazynu powinien zostać wyświetlony obiekt blob z zawartością schematu. Nazwa obiektu blob ma format schema-namespace/schema/version.

Więcej opcji można wyświetlić za pomocą polecenia az iot ops schema -hpomocnika .

Przekazywanie schematu przy użyciu szablonu Bicep

Utwórz plik Bicep .bicep i dodaj do niego zawartość schematu u góry jako zmienną. Ten przykład jest schematem różnicowym odpowiadającym danym OPC UA z przewodnika Szybki start.

// Delta schema content matching OPC UA data from quickstart
// For ADLS Gen2, ADX, and Fabric destinations
var opcuaSchemaContent = '''
{
  "$schema": "Delta/1.0",
  "type": "object",
  "properties": {
    "type": "struct",
    "fields": [
      {
        "name": "temperature",
        "type": {
          "type": "struct",
          "fields": [
            {
              "name": "SourceTimestamp",
              "type": "string",
              "nullable": true,
              "metadata": {}
            },
            {
              "name": "Value",
              "type": "integer",
              "nullable": true,
              "metadata": {}
            },
            {
              "name": "StatusCode",
              "type": {
                "type": "struct",
                "fields": [
                  {
                    "name": "Code",
                    "type": "integer",
                    "nullable": true,
                    "metadata": {}
                  },
                  {
                    "name": "Symbol",
                    "type": "string",
                    "nullable": true,
                    "metadata": {}
                  }
                ]
              },
              "nullable": true,
              "metadata": {}
            }
          ]
        },
        "nullable": true,
        "metadata": {}
      },
      {
        "name": "Tag 10",
        "type": {
          "type": "struct",
          "fields": [
            {
              "name": "SourceTimestamp",
              "type": "string",
              "nullable": true,
              "metadata": {}
            },
            {
              "name": "Value",
              "type": "integer",
              "nullable": true,
              "metadata": {}
            },
            {
              "name": "StatusCode",
              "type": {
                "type": "struct",
                "fields": [
                  {
                    "name": "Code",
                    "type": "integer",
                    "nullable": true,
                    "metadata": {}
                  },
                  {
                    "name": "Symbol",
                    "type": "string",
                    "nullable": true,
                    "metadata": {}
                  }
                ]
              },
              "nullable": true,
              "metadata": {}
            }
          ]
        },
        "nullable": true,
        "metadata": {}
      }
    ]
  }
}
'''

Następnie w tym samym pliku tuż pod schematem zdefiniuj zasób schematu wraz ze wskaźnikami do istniejącego zasobu rejestru schematów, który pochodzi z wdrażania operacji usługi Azure IoT.

// Replace placeholder values with your actual resource names
param schemaRegistryName string = '<SCHEMA_REGISTRY_NAME>'

// Pointers to existing resources from AIO deployment
resource schemaRegistry 'Microsoft.DeviceRegistry/schemaRegistries@2024-09-01-preview' existing = {
  name: schemaRegistryName
}

// Name and version of the schema
param opcuaSchemaName string = 'opcua-output-delta'
param opcuaSchemaVer string = '1'

// Define the schema resource to be created and instantiate a version
resource opcSchema 'Microsoft.DeviceRegistry/schemaRegistries/schemas@2024-09-01-preview' = {
  parent: schemaRegistry
  name: opcuaSchemaName
  properties: {
    displayName: 'OPC UA Delta Schema'
    description: 'This is a OPC UA delta Schema'
    format: 'Delta/1.0'
    schemaType: 'MessageSchema'
  }
}
resource opcuaSchemaVersion 'Microsoft.DeviceRegistry/schemaRegistries/schemas/schemaVersions@2024-09-01-preview' = {
  parent: opcSchema
  name: opcuaSchemaVer
  properties: {
    description: 'Schema version'
    schemaContent: opcuaSchemaContent
  }
}

Po zdefiniowaniu zawartości schematu i zasobów można wdrożyć szablon Bicep, aby utworzyć schemat w rejestrze schematów.

az deployment group create --resource-group <RESOURCE_GROUP> --template-file <FILE>.bicep

Następne kroki