Postup odeslání dat snímače prostředí místnosti v reálném čase v Azure RTOS do IoT Central

Dokončeno

Upgradovaný senzor teploty, tlaku a vlhkosti v mikrobiologické laboratoři v jádru Azure Sphere v reálném čase funguje dobře. Zákazník je spokojený a může provádět své experimenty. Zákazník by také chtěl vzdáleně monitorovat podmínky laboratorního prostředí.

V této lekci se naučíte číst data z upgradovaného senzoru v laboratoři a odesílat data do služby IoT Central tak, aby bylo možné je monitorovat.

Architektura řešení

Následující část popisuje, jak aplikace vysoké úrovně v Azure Sphere načítá data z upgradovaného senzoru v laboratoři, který běží na jednom z jader Azure Sphere v reálném čase. Aplikace vysoké úrovně pak bude tato data bezpečně odesílat do IoT Central.

Inter-core communications architecture.

Pojďme zrekapitulovat architekturu řešení implementovanou v laboratoři Azure RTOS.

  1. Vlákno senzoru prostředí Azure RTOS v reálném čase se spouští každé 2 sekundy. Vlákno ukládá do paměti data o nejnovější teplotě, vlhkosti a tlaku prostředí.
  2. Streamovací aplikace telemetrických dat vysoké úrovně požaduje od jádra v reálném čase nejnovější data prostředí.
  3. Vlákno služby prostředí Azure RTOS v reálném čase odpovídá nejnovějšími daty prostředí.
  4. Aplikace vysoké úrovně serializuje data prostředí jako JSON a pošle je jako zprávu telemetrie do IoT Hubu.
  5. Azure IoT Central odebírá zprávy telemetrie odeslané do IoT Hubu zařízením a zobrazuje data uživateli.
  6. Uživatel služby IoT Central může také nastavit požadovanou teplotu pro místnost nastavením vlastnosti. Tato vlastnost se nastavuje na zařízení prostřednictvím zprávy dvojčete zařízení IoT Hubu.
  7. Azure Sphere pak nastaví režim provozu TVK tak, aby splňoval požadovanou teplotu.

Kontrakt pro zprávy mezi jádry

Musí existovat kontrakt, který popisuje tvar dat předávaných mezi jádry. Následující struktura deklaruje kontrakt mezi jádry použitý v této lekci. Tento kontrakt najdete v adresáři IntercoreContract.

typedef enum
{
    LP_IC_UNKNOWN,
    LP_IC_HEARTBEAT,
    LP_IC_ENVIRONMENT_SENSOR,
    LP_IC_SAMPLE_RATE
} LP_INTER_CORE_CMD;

typedef struct
{
    LP_INTER_CORE_CMD cmd;
    float temperature;
    float pressure;
    float humidity;
    int sample_rate;
} LP_INTER_CORE_BLOCK;

Zabezpečení mezi jádry

Aby bylo možné komunikovat, musí mít aplikace běžící v různých jádrech nakonfigurovaná odpovídající ID komponent.

ID komponenty pro aplikaci v reálném čase se nachází v souboru app_manifest.json.

{
  "SchemaVersion": 1,
  "Name": "AzureSphereIoTCentral",
  "ComponentId": "25025d2c-66da-4448-bae1-ac26fcdd3627",
  ...
}

Možnosti použití v různých jádrech vysoké úrovně

Vlastnost AllowedApplicationConnections v souboru app_manifest.json vysoké úrovně je nastavená na ID komponenty aplikace Azure RTOS v reálném čase.

{
    ...
    "AllowedApplicationConnections": [ "6583cf17-d321-4d72-8283-0b7c5b56442b" ]
    ...
}

Inicializace komunikace mezi jádry

Ve funkci InitPeripheralAndHandlers proběhne volání lp_interCoreCommunicationsEnable, které předá ID komponenty funkce zpětného volání v reálném čase a mezi jádry.

Tato funkce zpětného volání mezi jádry bude volána při přijetí zprávy z jádra v reálném čase.

lp_interCoreCommunicationsEnable(REAL_TIME_COMPONENT_ID, InterCoreHandler);  // Initialize Inter Core Communications

Odeslání žádosti do aplikace jádra v reálném čase

Pokud si chcete vyžádat data prostředí z jádra v reálném čase, postupujte takto:

  1. Nastavte řídicí blok příkazu pro použití mezi jádry na LP_IC_ENVIRONMENT_SENSOR.
  2. Odešlete zprávu požadavku zavoláním lp_interCoreSendMessage a předáním řídicího bloku pro použití mezi jádry.
/// <summary>
/// Read sensor and send to Azure IoT
/// </summary>
static void MeasureSensorHandler(EventLoopTimer* eventLoopTimer)
{
    if (ConsumeEventLoopTimerEvent(eventLoopTimer) != 0)
    {
        lp_terminate(ExitCode_ConsumeEventLoopTimeEvent);
    }
    else {
        // send request to Real-Time core app to read temperature, pressure, and humidity
        ic_control_block.cmd = LP_IC_ENVIRONMENT_SENSOR;
        lp_interCoreSendMessage(&ic_control_block, sizeof(ic_control_block));
    }
}

Příjem zpráv mezi jádry

Když aplikace vysoké úrovně obdrží zprávu, zavolá se funkce zpětného volání mezi jádry, která předá odkaz na řídicí blok pro použití mezi jádry obsahující data prostředí. Aplikace serializuje data jako JSON, pošle zprávu telemetrie do IoT Hubu a dioda LED stavu TVK se aktualizuje. Azure IoT Central odebírá zprávy telemetrie odeslané do IoT Hubu zařízením a zobrazuje data uživateli.

/// <summary>
/// Callback handler for Inter-Core Messaging - Does Device Twin Update, and Event Message
/// </summary>
static void InterCoreHandler(LP_INTER_CORE_BLOCK* ic_message_block)
{
    static int msgId = 0;

    switch (ic_message_block->cmd)
    {
    case LP_IC_ENVIRONMENT_SENSOR:
        if (snprintf(msgBuffer, JSON_MESSAGE_BYTES, msgTemplate, ic_message_block->temperature,
            ic_message_block->humidity, ic_message_block->pressure, msgId++) > 0) {

            Log_Debug("%s\n", msgBuffer);
            lp_azureMsgSendWithProperties(msgBuffer, telemetryMessageProperties, NELEMS(telemetryMessageProperties));

            SetHvacStatusColour((int)ic_message_block->temperature);

            // If the previous temperature not equal to the new temperature then update ReportedTemperature device twin
            if (previous_temperature != (int)ic_message_block->temperature) {
                lp_deviceTwinReportState(&dt_reportedTemperature, &ic_message_block->temperature);
                previous_temperature = (int)ic_message_block->temperature;
            }
        }
        break;
    default:
        break;
    }
}