Gelişmiş bir cihaz modeli oluşturma

Bu nasıl yapılır kılavuzunda özel cihaz modelini tanımlayan JSON ve JavaScript dosyaları açıklanmaktadır. Makale bazı örnek cihaz modeli tanım dosyalarını içerir ve bunları Cihaz Benzetimi örneğine nasıl yükleyebileceğinizi gösterir. Testinizde daha gerçekçi cihaz davranışlarının benzetimini yapmak için gelişmiş cihaz modelleri oluşturabilirsiniz.

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Önkoşullar

Bu nasıl yapılır kılavuzundaki adımları izlemek için Azure aboneliğinizde dağıtılmış bir Cihaz Benzetimi örneğine ihtiyacınız vardır.

Cihaz Benzetimi'ni henüz dağıtmadıysanız bkz. GitHub'da Cihaz Benzetimi dağıtımı .

Cihaz Benzetimini açma

Cihaz Benzetimi'ni henüz dağıtmadıysanız bkz. GitHub'da Cihaz Benzetimi dağıtımı .

Cihaz modelleri

Her simülasyon cihazı, simülasyon davranışını tanımlayan belirli bir cihaz modeline aittir. Bu davranış telemetri gönderme sıklıklarını, gönderilecek ileti türlerini ve desteklenen yöntemleri içerir.

Bir JSON cihaz tanım dosyası ve javaScript dosyaları kümesi kullanarak bir cihaz modeli tanımlarsınız. Bu JavaScript dosyaları, rastgele telemetri ve yöntem mantığı gibi simülasyon davranışını tanımlar.

Tipik bir cihaz modelinde:

  • Her cihaz modeli için bir JSON dosyası (örneğin, elevator.json).
  • Her cihaz modeli için bir JavaScript davranış betiği dosyası (örneğin, elevator-state.js)
  • Her cihaz yöntemi için bir JavaScript yöntemi betik dosyası (örneğin, elevator-go-down.js)

Not

Tüm cihaz modelleri yöntemleri tanımlamaz. Bu nedenle bir cihaz modelinde yöntem betikleri olabilir veya olmayabilir. Ancak, tüm cihaz modellerinin bir davranış betiği olmalıdır.

Cihaz tanım dosyası

Her cihaz tanım dosyası, aşağıdaki bilgiler de dahil olmak üzere simülasyon cihazı modelinin ayrıntılarını içerir:

  • Cihaz modeli adı: dize.
  • Protokol: AMQP | MQTT | HTTP.
  • İlk cihaz durumu.
  • Cihaz durumunu yenileme sıklığı.
  • Cihaz durumunu yenilemek için hangi JavaScript dosyasının kullanılacağı.
  • Her biri belirli bir sıklıkta gönderilecek telemetri iletilerinin listesi.
  • Alınan telemetriyi ayrıştırmak için arka uç uygulaması tarafından kullanılan telemetri iletilerinin şeması.
  • Desteklenen yöntemlerin listesi ve her yöntemin benzetimini yapmak için kullanılacak JavaScript dosyası.

Dosya şeması

Şema sürümü her zaman "1.0.0" şeklindedir ve bu dosyanın biçimine özgüdür:

"SchemaVersion": "1.0.0"

Cihaz modeli açıklaması

Aşağıdaki özellikler cihaz modelini açıklar. Her türün benzersiz bir tanımlayıcısı, anlamsal sürümü, adı ve açıklaması vardır:

"Id": "chiller-01",
"Version": "0.0.1",
"Name": "Chiller",
"Description": "Chiller with external temperature and humidity sensors."

IoT Protokolü

IoT cihazları farklı protokoller kullanarak bağlanabilir. Benzetim AMQP, MQTT veya HTTP kullanmanıza olanak tanır:

"Protocol": "AMQP"

Simülasyon cihazı durumu

Her simülasyon cihazının tanımlanması gereken bir iç durumu vardır. Durum ayrıca telemetride bildirilebilen özellikleri de tanımlar. Örneğin, bir soğutucu aşağıdaki gibi bir ilk duruma sahip olabilir:

"InitialState": {
    "temperature": 50,
    "humidity": 40
},

Çeşitli algılayıcılara sahip hareketli bir cihazın daha fazla özelliği olabilir, örneğin:

"InitialState": {
    "latitude": 47.445301,
    "longitude": -122.296307,
    "speed": 30.0,
    "speed_unit": "mph",
    "cargotemperature": 38.0,
    "cargotemperature_unit": "F"
}

Cihaz durumu simülasyon hizmeti tarafından bellekte tutulur ve JavaScript işlevine giriş olarak sağlanır. JavaScript işlevi aşağıdakilere karar verebilir:

  • Durumu yoksaymak ve rastgele veriler oluşturmak için.
  • Belirli bir senaryo için cihaz durumunu gerçekçi bir şekilde güncelleştirmek için.

Durumu oluşturan işlev de giriş olarak alır:

  • Cihaz kimliği.
  • Cihaz modeli.
  • Geçerli saat. Bu değer, cihaza ve zamana göre farklı veriler oluşturmayı mümkün kılar.

Telemetri iletileri oluşturma

Simülasyon hizmeti her cihaz için birkaç telemetri türü gönderebilir. Telemetri genellikle cihaz durumundaki verileri içerir. Örneğin, sanal bir oda her 10 saniyede bir sıcaklık ve nem hakkında bilgi gönderebilir. Cihaz durumundaki değerlerle otomatik olarak değiştirilen aşağıdaki kod parçacığındaki yer tutuculara dikkat edin:

"Telemetry": [
    {
        "Interval": "00:00:10",
        "MessageTemplate":
            "{\"temperature\":${temperature},\"temperature_unit\":\"${temperature_unit}\",\"humidity\":\"${humidity}\"}",
        "MessageSchema": {
            "Name": "RoomComfort;v1",
            "Format": "JSON",
            "Fields": {
                "temperature": "double",
                "temperature_unit": "text",
                "humidity": "integer"
            }
        }
    }
],

Yer tutucular $ {NAME} özel bir söz dizimi kullanır. Burada AD , JavaScript ana işlevi tarafından döndürülen cihaz durumu nesnesinden alınan bir anahtardır. Dizeler tırnak içine alınmalıdır ancak sayılar alıntılanmamalıdır.

İleti şeması

Her ileti türünün iyi tanımlanmış bir şeması olmalıdır. arka uç uygulamalarının gelen telemetriyi yorumlamak için bilgileri yeniden kullanabilmesi için ileti şeması da IoT Hub yayımlanır.

Şema, çeşitli sistem ve hizmetlerde kolay ayrıştırma, dönüştürme ve analiz olanağı sağlayan JSON biçimini destekler.

Şemada listelenen alanlar aşağıdaki türlerden olabilir:

  • Nesne - JSON kullanılarak seri hale getirilmiş
  • İkili - base64 kullanılarak seri hale getirilmiş
  • Metin
  • Boole
  • Tamsayı
  • Çift
  • DateTime

Desteklenen yöntemler

Simülasyon cihazları yöntem çağrılarına da tepki verebilir ve bu durumda bir mantık yürütür ve bazı yanıtlar sağlar. Simülasyona benzer şekilde, yöntem mantığı bir JavaScript dosyasında depolanır ve cihaz durumuyla etkileşime geçebilir. Örnek:

"CloudToDeviceMethods": {
    "Start": {
        "Type": "JavaScript",
        "Path": "release-pressure.js"
    }
}

Cihaz tanım dosyası oluşturma

Bu nasıl yapılır kılavuzunda insansız hava aracı için cihaz modeli oluşturmayı göreceksiniz. İnsansız hava aracı, konum ve rakımı değiştiren ilk koordinat kümesinin etrafında rastgele uçacak.

Aşağıdaki JSON dosyasını bir metin düzenleyicisine kopyalayın ve drone.json olarak kaydedin.

Cihaz tanımı JSON örneği

{
  "SchemaVersion": "1.0.0",
  "Id": "drone",
  "Version": "0.0.1",
  "Name": "Drone",
  "Description": "Simple drone.",
  "Protocol": "AMQP",
  "Simulation": {
    "InitialState": {
      "velocity": 0.0,
      "velocity_unit": "mm/sec",
      "acceleration": 0.0,
      "acceleration_unit": "mm/sec^2",
      "latitude": 47.476075,
      "longitude": -122.192026,
      "altitude": 0.0
    },
    "Interval": "00:00:05",
    "Scripts": [{
      "Type": "JavaScript",
      "Path": "drone-state.js"
    }]
  },
  "Properties": {
    "Type": "Drone",
    "Firmware": "1.0",
    "Model": "P-96"
  },
  "Tags": {
    "Owner": "Contoso"
  },
  "Telemetry": [{
      "Interval": "00:00:05",
      "MessageTemplate": "{\"velocity\":\"${velocity}\",\"acceleration\":\"${acceleration}\",\"position\":\"${latitude}|${longitude}|${altitude}\"}",
      "MessageSchema": {
        "Name": "drone-event-sensor;v1",
        "Format": "JSON",
        "Fields": {
          "velocity": "double",
          "velocity_unit": "text",
          "acceleration": "double",
          "acceleration_unit": "text",
          "latitude": "double",
          "longitude": "double",
          "altitude": "double"
        }
      }
    }
  ],
    "CloudToDeviceMethods": {
        "RecallDrone": {
            "Type": "JavaScript",
            "Path": "droneRecall-method.js"
        }
    }
}

Davranış betiği dosyaları

Davranış betiği dosyasındaki kod, insansız hava aracını taşır. Betik, cihazın bellek durumundaki durumunu değiştirerek insansız hava aracının yükseltilmesini ve konumunu değiştirir.

JavaScript dosyalarının iki parametre kabul eden bir ana işlevi olmalıdır:

  • Üç özellik içeren bir bağlam nesnesi:
    • yyyy-MM-dd'T'HH:mm:sszzz biçiminde bir dize olarak currentTime.
    • deviceId. Örneğin, Simulated.Elevator.123.
    • deviceModel. Örneğin Asansör.
  • Önceki çağrıda işlev tarafından döndürülen değer olan bir durum nesnesi. Bu cihaz durumu simülasyon hizmeti tarafından korunur ve telemetri iletileri oluşturmak için kullanılır.

Ana işlev yeni cihaz durumunu döndürür. Örnek:

function main(context, state) {

    // Use context if the simulation depends on
    // time or device details.
    // Execute some logic, updating 'state'

    return state;
}

Davranış betiği dosyası oluşturma

Aşağıdaki JavaScript'i bir metin düzenleyicisine kopyalayın ve drone-state.jsolarak kaydedin.

Cihaz modeli JavaScript benzetimi örneği

"use strict";

// Position control
const DefaultLatitude = 47.476075;
const DefaultLongitude = -122.192026;
const DistanceVariation = 10;

// Altitude control
const DefaultAltitude = 0.0;
const AverageAltitude = 499.99;
const AltitudeVariation = 5;

// Velocity control
const AverageVelocity = 60.00;
const MinVelocity = 20.00;
const MaxVelocity = 120.00;
const VelocityVariation = 5;

// Acceleration control
const AverageAcceleration = 2.50;
const MinAcceleration = 0.01;
const MaxAcceleration = 9.99;
const AccelerationVariation = 1;

// Display control for position and other attributes
const GeoSpatialPrecision = 6;
const DecimalPrecision = 2;

// Default state
var state = {
    velocity: 0.0,
    velocity_unit: "mm/sec",
    acceleration: 0.0,
    acceleration_unit: "mm/sec^2",
    latitude: DefaultLatitude,
    longitude: DefaultLongitude,
    altitude: DefaultAltitude
};

// Default device properties
var properties = {};

/**
 * Restore the global state using data from the previous iteration.
 *
 * @param previousState device state from the previous iteration
 * @param previousProperties device properties from the previous iteration
 */
function restoreSimulation(previousState, previousProperties) {
    // If the previous state is null, force a default state
    if (previousState) {
        state = previousState;
    } else {
        log("Using default state");
    }

    if (previousProperties) {
        properties = previousProperties;
    } else {
        log("Using default properties");
    }
}

/**
 * Simple formula generating a random value around the average
 * in between min and max
 */
function vary(avg, percentage, min, max) {
    var value = avg * (1 + ((percentage / 100) * (2 * Math.random() - 1)));
    value = Math.max(value, min);
    value = Math.min(value, max);
    return value;
}

/**
 * Entry point function called by the simulation engine.
 * Returns updated simulation state.
 * Device property updates must call updateProperties() to persist.
 *
 * @param context             The context contains current time, device model and id
 * @param previousState       The device state since the last iteration
 * @param previousProperties  The device properties since the last iteration
 */
/*jslint unparam: true*/
function main(context, previousState, previousProperties) {

    // Restore the global state before generating the new telemetry, so that
    // the telemetry can apply changes using the previous function state.
    restoreSimulation(previousState, previousProperties);

    state.acceleration = vary(AverageAcceleration, AccelerationVariation, MinAcceleration, MaxAcceleration).toFixed(DecimalPrecision);
    state.velocity = vary(AverageVelocity, VelocityVariation, MinVelocity, MaxVelocity).toFixed(DecimalPrecision);

    // Use the last coordinates to calculate the next set with a given variation
    var coords = varylocation(Number(state.latitude), Number(state.longitude), DistanceVariation);
    state.latitude = Number(coords.latitude).toFixed(GeoSpatialPrecision);
    state.longitude = Number(coords.longitude).toFixed(GeoSpatialPrecision);

    // Fluctuate altitude between given variation constant by more or less
    state.altitude = vary(AverageAltitude, AltitudeVariation, AverageAltitude - AltitudeVariation, AverageAltitude + AltitudeVariation).toFixed(DecimalPrecision);

    return state;
}

/**
 * Generate a random geolocation at some distance (in miles)
 * from a given location
 */
function varylocation(latitude, longitude, distance) {
    // Convert to meters, use Earth radius, convert to radians
    var radians = (distance * 1609.344 / 6378137) * (180 / Math.PI);
    return {
        latitude: latitude + radians,
        longitude: longitude + radians / Math.cos(latitude * Math.PI / 180)
    };
}

Yöntem betik dosyası oluşturma

Yöntem betikleri davranış betiklerine benzer. Belirli bir buluttan cihaza yöntemi çağrıldığında cihaz davranışını tanımlar.

İnsansız hava aracı geri çağırma betiği, insansız hava aracının koordinatlarını sabit bir noktaya ayarlar.

Aşağıdaki JavaScript'i bir metin düzenleyicisine kopyalayın ve droneRecall-method.jsolarak kaydedin.

Cihaz modeli JavaScript benzetimi örneği

"use strict";

// Default state
var state = {
    velocity: 0.0,
    velocity_unit: "mm/sec",
    acceleration: 0.0,
    acceleration_unit: "mm/sec^2",
    latitude: 0.0,
    longitude: 0.0,
    altitude: 0.0
};

// Default device properties
var properties = {};

/**
 * Restore the global state using data from the previous iteration.
 *
 * @param previousState device state from the previous iteration
 * @param previousProperties device properties from the previous iteration
 */
function restoreSimulation(previousState, previousProperties) {
    // If the previous state is null, force a default state
    if (previousState) {
        state = previousState;
    } else {
        log("Using default state");
    }

    if (previousProperties) {
        properties = previousProperties;
    } else {
        log("Using default properties");
    }
}

/**
 * Entry point function called by the simulation engine.
 *
 * @param context        The context contains current time, device model and id, not used
 * @param previousState  The device state since the last iteration, not used
 * @param previousProperties  The device properties since the last iteration
 */
/*jslint unparam: true*/
function main(context, previousState, previousProperties) {

    // Restore the global device properties and the global state before
    // generating the new telemetry, so that the telemetry can apply changes
    // using the previous function state.
    restoreSimulation(previousState, previousProperties);

    //simulate the behavior of a drone when recalled
  state.latitude = 47.476075;
  state.longitude = -122.192026;
  return state;
}

Betik dosyalarında hata ayıklama

Çalışan bir davranış dosyasına hata ayıklayıcı ekleyemeseniz de, günlük işlevini kullanarak hizmet günlüğüne bilgi yazabilirsiniz. Söz dizimi hataları için yorumlayıcı başarısız olur ve özel durum hakkındaki bilgileri günlüğe yazar.

Günlüğe kaydetme örneği:

function main(context, state) {

    log("This message will appear in the service logs.");

    log(context.deviceId);

    if (typeof(state) !== "undefined" && state !== null) {
        log("Previous value: " + state.temperature);
    }

    // ...

    return updateState;
}

Gelişmiş cihaz modeli dağıtma

Gelişmiş cihaz modelinizi dağıtmak için Cihaz Benzetimi örneğinizdeki dosyaları karşıya yüklersiniz:

Menü çubuğunda Cihaz modelleri'ni seçin. Cihaz modelleri sayfasında bu Cihaz Benzetimi örneğinde bulunan cihaz modelleri listelenir:

Cihaz modelleri

Sayfanın sağ üst köşesindeki + Cihaz Modeli Ekle'ye tıklayın:

Cihaz modeli ekleme

Gelişmiş cihaz modeli sekmesini açmak için Gelişmiş'e tıklayın:

Gelişmiş Sekme

Gözat'a tıklayın ve oluşturduğunuz JSON ve JavaScript dosyalarını seçin. Üç dosyayı da seçtiğinizden emin olun. Bir dosya eksikse doğrulama başarısız olur:

Dosyalara Gözat

Dosyalarınız doğrulamayı geçerse Kaydet'e tıklayın; cihaz modeliniz simülasyonda kullanılmaya hazır olur. Aksi takdirde, hataları düzeltin ve dosyaları yeniden yükleyin:

Kaydet

Sonraki adımlar

Bu nasıl yapılır kılavuzunda, Cihaz Benzetimi'nde kullanılan cihaz modeli dosyaları ve gelişmiş bir cihaz modeli oluşturmayı öğrendiniz. Ardından , Cihaz Benzetimi çözüm hızlandırıcısından gönderilen telemetriyi görselleştirmek için Time Series Insights'ın nasıl kullanılacağını keşfetmek isteyebilirsiniz.