Öğretici: Bir arka uç hizmetinden cihazlarınızı yapılandırma

Cihaz yaşam döngüsünün bir parçası olarak IoT cihazlarınızı arka uç hizmetinizden yapılandırmanız gerekebilir. Cihazlarınıza istediğiniz yapılandırmayı gönderdiğinizde, bu cihazlardan durum ve uyumluluk güncelleştirmelerini de almak istersiniz. Örneğin, bir cihaz için hedef çalışma sıcaklığı aralığı ayarlayabilir veya cihazlarınızdan üretici yazılımı sürüm bilgileri toplayabilirsiniz.

Bir cihaz ile IoT hub arasında durum bilgilerini eşitlemek için cihaz ikizlerini kullanırsınız. Cihaz ikizi, belirli bir cihazla ilişkili olan ve IoT Hub tarafından bunları sorgulayabileceğiniz bulutta depolanan bir JSON belgesidir. Bir cihaz ikizi istenen özellikleri, bildirilen özellikleri ve etiketleri içerir.

  • İstenen özellik bir arka uç uygulaması tarafından ayarlanır ve bir cihaz tarafından okunur.
  • Bildirilen özellik bir cihaz tarafından ayarlanır ve arka uç uygulaması tarafından okunur.
  • Etiket bir arka uç uygulaması tarafından ayarlanır ve hiçbir zaman bir cihaza gönderilmez. Cihazlarınızı düzenlemek için etiketleri kullanırsınız.

Bu öğreticide, durum bilgilerini eşitlemek için istenen ve bildirilen özelliklerin nasıl kullanılacağı gösterilmektedir.

Diagram of device twins on the device and in the cloud.

Bu öğreticide, aşağıdaki görevleri gerçekleştireceksiniz:

  • Bir IoT hub oluşturun ve kimlik kayıt defterine bir test cihazı ekleyin.
  • Durum bilgilerini simülasyon cihazınıza göndermek için istenen özellikleri kullanın.
  • Simülasyon cihazınızdan toplanan durum bilgilerini almak için bildirilen özellikleri kullanın.

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

Önkoşullar

  • Bu öğreticide bulut kaynakları oluşturmak için Azure CLI kullanılır. Kayıtlı bir cihaz içeren bir IoT hub'ına zaten sahipseniz bu adımları atlayabilirsiniz. CLI komutlarını çalıştırmanın iki yolu vardır:

  • Bu öğreticide çalıştırdığınız iki örnek uygulama Node.js kullanılarak yazılır. Geliştirme makinenizde v10.x.x veya üzerini Node.js gerekir.

    • nodejs.org adresinden birden fazla platform için Node.js’yi indirebilirsiniz.

    • Aşağıdaki komutu kullanarak geliştirme makinenizde geçerli Node.js sürümünü doğrulayabilirsiniz:

      node --version
      
  • Node.js için Azure IoT örneklerinden örnek Node.js projesini kopyalayın veya indirin.

  • Güvenlik duvarınızda 8883 numaralı bağlantı noktasının açık olduğundan emin olun. Bu öğreticideki cihaz örneği, 8883 numaralı bağlantı noktası üzerinden iletişim kuran MQTT protokollerini kullanır. Bu bağlantı noktası bazı kurumsal ve eğitim ağı ortamlarında engellenebilir. Bu sorunu çözmenin daha fazla bilgi ve yolları için bkz. IoT Hub'a (MQTT) Bağlan.

Azure kaynakları ayarlama

Bu öğreticiyi tamamlayabilmeniz için Azure aboneliğinizin cihaz kimliği kayıt defterine cihaz eklenmiş bir IOT hub içermesi gerekir. Cihaz kimliği kayıt defterindeki giriş, bu öğreticide çalıştırdığınız simülasyon cihazının hub’ınıza bağlanmasına imkan tanır.

Aboneliğinizde önceden ayarlanmış bir IoT hub'ınız yoksa aşağıdaki CLI betiğiyle bir tane ayarlayabilirsiniz. Bu betik, IoT hub adı için rastgele bir sayı eklenmiş tutorial-iot-hub adını kullanır. Bu adı çalıştırdığınızda kendi genel benzersiz adınızla değiştirebilirsiniz. Betik, kaynak grubunu ve hub’ı Orta ABD bölgesinde oluşturur ve bunu size daha yakın bir konum olacak şekilde değiştirebilirsiniz. Betik, IoT hub hizmetinizin arka uç örneğinde IoT hub’ınıza bağlanmak için kullanacağınız bağlantı dizesini döndürür:

let "randomIdentifier=$RANDOM*$RANDOM"  
hubname="tutorial-iot-hub-$randomIdentifier"
location=centralus

# Install the IoT extension if it's not already installed:
az extension add --name azure-iot

# Create a resource group:
az group create --name tutorial-iot-hub-rg --location $location

# Create your free-tier IoT hub. You can only have one free IoT hub per subscription.
# Change the sku to S1 to create a standard-tier hub if necessary.
az iot hub create --name $hubname --location $location --resource-group tutorial-iot-hub-rg --partition-count 2 --sku F1

# Make a note of the service connection string, you need it later:
az iot hub connection-string show --hub-name $hubname --policy-name service -o table

Bu öğreticide MyTwinDevice adlı bir simülasyon cihazı kullanılır. Aşağıdaki betik bu cihazı kimlik kayıt defterinize ekler ve bunun bağlantı dizesini alır:

# Create the device in the identity registry:
az iot hub device-identity create --device-id MyTwinDevice --hub-name $hubname --resource-group tutorial-iot-hub-rg

# Retrieve the device connection string, you need this later:
az iot hub device-identity connection-string show --device-id MyTwinDevice --hub-name $hubname --resource-group tutorial-iot-hub-rg -o table

Bir cihaza durum bilgileri gönderme

Bir arka uç uygulamasından bir cihaza durum bilgilerini göndermek için istenen özellikleri kullanırsınız. Bu bölümde şunları nasıl yapabileceğinizi öğrenirsiniz:

  • İstenen özellikleri almak ve işlemek için bir cihaz yapılandırın.
  • Bir arka uç uygulamasından istenen özellikleri bir cihaza gönderin.

Örnek istenen özellikler

İstenen özelliklerinizi uygulamanız için uygun olacak şekilde dilediğiniz gibi yapılandırabilirsiniz. Bu örnekte fanOn adlı bir üst düzey özellik kullanılır ve geriye kalan özellikler ayrı components (bileşenler) olarak gruplandırılır. Aşağıdaki JSON parçacığı, bu öğreticinin kullandığı istenen özelliklerin yapısını gösterir. JSON, desired.json dosyasındadır.

{
  "fanOn": "true",
  "components": {
    "system": {
      "id": "17",
      "units": "farenheit",
      "firmwareVersion": "9.75"
    },
    "wifi" : { 
      "channel" : "6",
      "ssid": "my_network"
    },
    "climate" : {
      "minTemperature": "68",
      "maxTemperature": "76"
    }
  }
}

Bir cihaz uygulamasında istenen özellikleri alma

İstenen özellikleri alan simülasyon cihazı örnek kodunu görüntülemek için indirdiğiniz örnek Node.js projesinde iot-hub/Tutorials/DeviceTwins klasörüne gidin. Sonra SimulatedDevice.js dosyasını bir metin düzenleyicide açın.

Aşağıdaki bölümlerde, sanal cihazda çalıştırılan ve arka uç uygulamasından gönderilen istenen özellik değişikliklerine yanıt veren kod açıklanmaktadır.

Cihaz ikizi nesnesini alma

Cihazınızı IoT hub'ına kaydettiğinizde çıkış olarak bir cihaz bağlantı dizesi. Cihaz bağlantı dizesi, cihaz tarafından bulutta kayıtlı kimliğiyle kimlik doğrulaması yapmak için kullanılır. Aşağıdaki kod bir cihaz bağlantı dizesi kullanarak IoT hub’ınıza bağlanır:

// Get the device connection string from a command line argument
var connectionString = process.argv[2];

Aşağıdaki kod istemci nesnesinden bir ikiz alır:

// Get the device twin
client.getTwin(function(err, twin) {
  if (err) {
    console.error(chalk.red('Could not get device twin'));
  } else {
    console.log(chalk.green('Device twin created'));

İşleyiciler oluşturma

İstenen özellik güncelleştirmeleri için JSON hiyerarşisinin farklı düzeylerindeki güncelleştirmelere yanıt veren işleyiciler oluşturabilirsiniz. Örneğin, bu işleyici bir arka uç uygulamasından cihaza gönderilen tüm özellik değişikliklerini algılar. Delta değişkeni, çözüm arka ucundan gönderilen istenen özellikleri içerir:

// Handle all desired property updates
twin.on('properties.desired', function(delta) {
    console.log(chalk.yellow('\nNew desired properties received in patch:'));

Aşağıdaki işleyici yalnızca fanOn istenen özelliğinde yapılan değişikliklere tepki verir:

// Handle changes to the fanOn desired property
twin.on('properties.desired.fanOn', function(fanOn) {
    console.log(chalk.green('\nSetting fan state to ' + fanOn));

    // Update the reported property after processing the desired property
    reportedPropertiesPatch.fanOn = fanOn ? fanOn : '{unknown}';
});

Birden çok özelliğe yönelik işleyiciler

Bu öğretici için örnek istenen JSON özelliklerinde, bileşenlerin altındaki iklim düğümü minTemperature ve maxTemperature adlı iki özellik içerir.

Bir cihazın yerel ikiz nesnesi istenen ve bildirilen özelliklerin eksiksiz bir kümesini depolar. Arka uçtan gönderilen delta, istenen özelliklerin yalnızca bir alt kümesini güncelleştirebilir. Aşağıdaki kod parçacığında, simülasyon cihazı minTemperature ve maxTemperature özelliklerinden yalnızca biri için güncelleştirme alırsa cihazı yapılandırmak üzere diğer değer için yerel ikizdeki değeri kullanır:

// Handle desired properties updates to the climate component
twin.on('properties.desired.components.climate', function(delta) {
    if (delta.minTemperature || delta.maxTemperature) {
      console.log(chalk.green('\nUpdating desired tempertures in climate component:'));
      console.log('Configuring minimum temperature: ' + twin.properties.desired.components.climate.minTemperature);
      console.log('Configuring maximum temperture: ' + twin.properties.desired.components.climate.maxTemperature);

      // Update the reported properties and send them to the hub
      reportedPropertiesPatch.minTemperature = twin.properties.desired.components.climate.minTemperature;
      reportedPropertiesPatch.maxTemperature = twin.properties.desired.components.climate.maxTemperature;
      sendReportedProperties();
    }
});

Ekleme, güncelleştirme ve silme işlemlerini işleme

Arka uçtan gönderilen istenen özellikler belirli bir istenen özellik üzerinde hangi işlemin gerçekleştirildiğini göstermez. Kodunuzun işlemi yerel olarak depolanan güncel istenen özellikler kümesinden ve hub’dan gönderilen değişikliklerden çıkarsaması gerekir.

Aşağıdaki kod parçacığında, simülasyon cihazının istenen özelliklerde components listesindeki ekleme, güncelleştirme ve silme işlemlerini nasıl işlediği gösterilmiştir. Bir bileşenin silinmesi gerektiğini belirtmek için nasıl null değerlerini kullanabileceğinizi görebilirsiniz:

// Keep track of all the components the device knows about
var componentList = {};

// Use this componentList list and compare it to the delta to infer
// if anything was added, deleted, or updated.
twin.on('properties.desired.components', function(delta) {
  if (delta === null) {
    componentList = {};
  }
  else {
    Object.keys(delta).forEach(function(key) {

      if (delta[key] === null && componentList[key]) {
        // The delta contains a null value, and the
        // device has a record of this component.
        // Must be a delete operation.
        console.log(chalk.green('\nDeleting component ' + key));
        delete componentList[key];

      } else if (delta[key]) {
        if (componentList[key]) {
          // The delta contains a component, and the
          // device has a record of it.
          // Must be an update operation.
          console.log(chalk.green('\nUpdating component ' + key + ':'));
          console.log(JSON.stringify(delta[key]));
          // Store the complete object instead of just the delta
          componentList[key] = twin.properties.desired.components[key];

        } else {
          // The delta contains a component, and the
          // device has no record of it.
          // Must be an add operation.
          console.log(chalk.green('\nAdding component ' + key + ':'));
          console.log(JSON.stringify(delta[key]));
          // Store the complete object instead of just the delta
          componentList[key] = twin.properties.desired.components[key];
        }
      }
    });
  }
});

Arka uç uygulamasından istenen özellikleri gönderme

Bir cihazın istenen özellik güncelleştirmelerini almak için nasıl işleyici uyguladığını gördünüz. Bu bölümde, bir arka uç uygulamasından bir cihaza nasıl istenen özellik değişiklikleri gönderilebileceği gösterilmiştir.

İstenen özellikleri alan simülasyon cihazı örnek kodunu görüntülemek için indirdiğiniz örnek Node.js projesinde iot-hub/Tutorials/DeviceTwins klasörüne gidin. Sonra ServiceClient.js dosyasını bir metin düzenleyicide açın.

Aşağıdaki kod parçacığında cihaz kimliği kayıt defterine bağlanıp belirli bir cihazın ikizine nasıl erişilebileceği gösterilmiştir:

// Create a device identity registry object
var registry = Registry.fromConnectionString(connectionString);

// Get the device twin and send desired property update patches at intervals.
// Print the reported properties after some of the desired property updates.
registry.getTwin(deviceId, async (err, twin) => {
  if (err) {
    console.error(err.message);
  } else {
    console.log('Got device twin');

Aşağıdaki kod parçacığında arka uç uygulamasının cihaza gönderdiği farklı istenen özellik patches (düzeltme ekleri) gösterilmiştir:

// Turn the fan on
var twinPatchFanOn = {
  properties: {
    desired: {
      patchId: "Switch fan on",
      fanOn: "false",
    }
  }
};

// Set the maximum temperature for the climate component
var twinPatchSetMaxTemperature = {
  properties: {
    desired: {
      patchId: "Set maximum temperature",
      components: {
        climate: {
          maxTemperature: "92"
        }
      }
    }
  }
};

// Add a new component
var twinPatchAddWifiComponent = {
  properties: {
    desired: {
      patchId: "Add WiFi component",
      components: {
        wifi: { 
          channel: "6",
          ssid: "my_network"
        }
      }
    }
  }
};

// Update the WiFi component
var twinPatchUpdateWifiComponent = {
  properties: {
    desired: {
      patchId: "Update WiFi component",
      components: {
        wifi: { 
          channel: "13",
          ssid: "my_other_network"
        }
      }
    }
  }
};

// Delete the WiFi component
var twinPatchDeleteWifiComponent = {
  properties: {
    desired: {
      patchId: "Delete WiFi component",
      components: {
        wifi: null
      }
    }
  }
};

Aşağıdaki kod parçacığında arka uç uygulamasının bir cihaza nasıl istenen özellik güncelleştirmesi gönderdiği gösterilmiştir:

// Send a desired property update patch
async function sendDesiredProperties(twin, patch) {
  twin.update(patch, (err, twin) => {
    if (err) {
      console.error(err.message);
    } else {
      console.log(chalk.green(`\nSent ${twin.properties.desired.patchId} patch:`));
      console.log(JSON.stringify(patch, null, 2));
    }
  });
}

Cihazdan durum bilgilerini alma

Arka uç uygulamanız durum bilgilerini bir cihazdan bildirilen özellikler olarak alır. Bir cihaz, bildirilen özellikleri ayarlar ve hub’ınıza gönderir. Bir arka uç uygulaması, hub'ınızda depolanan cihaz ikizinden bildirilen özelliklerin geçerli değerlerini okuyabilir.

Bir cihazdan bildirilen özellikler gönderme

Bildirilen özellik değerlerine düzeltme eki olarak güncelleştirmeler gönderebilirsiniz. Aşağıdaki kod parçacığında simülasyon cihazının gönderdiği düzeltme eki için bir şablon gösterilmiştir. Simülasyon cihazı hub’a göndermeden önce düzeltme ekinin alanlarını güncelleştirir:

// Create a patch to send to the hub
var reportedPropertiesPatch = {
  firmwareVersion:'1.2.1',
  lastPatchReceivedId: '',
  fanOn:'',
  minTemperature:'',
  maxTemperature:''
};

Simülasyon cihazı bildirilen özellikleri içeren düzeltme ekini hub’a göndermek için aşağıdaki işlevi kullanır:

// Send the reported properties patch to the hub
function sendReportedProperties() {
  twin.properties.reported.update(reportedPropertiesPatch, function(err) {
    if (err) throw err;
    console.log(chalk.blue('\nTwin state reported'));
    console.log(JSON.stringify(reportedPropertiesPatch, null, 2));
  });
}

Bildirilen özellikleri işleme

Bir arka uç uygulaması cihaz ikizi aracılığıyla bir cihazın geçerli bildirilen özellik değerlerine erişir. Aşağıdaki kod parçacığında arka uç uygulamasının sanal cihaz için bildirilen özellik değerlerini nasıl okuduğu gösterilmiştir:

// Display the reported properties from the device
function printReportedProperties(twin) {
  console.log("Last received patch: " + twin.properties.reported.lastPatchReceivedId);
  console.log("Firmware version: " + twin.properties.reported.firmwareVersion);
  console.log("Fan status: " + twin.properties.reported.fanOn);
  console.log("Min temperature set: " + twin.properties.reported.minTemperature);
  console.log("Max temperature set: " + twin.properties.reported.maxTemperature);
}

Uygulamaları çalıştırma

Bu bölümde, bir arka uç uygulamasının istenen özellik güncelleştirmelerini simülasyon cihazı uygulamasına gönderdiğini gözlemlemek için iki örnek uygulamayı çalıştıracaksınız.

Simülasyon cihazını ve arka uç uygulamalarını çalıştırmak için cihaz ve hizmet bağlantı dizelerine sahip olmanız gerekir. Bu öğreticinin başlangıcında kaynakları oluştururken bağlantı dizelerini not almıştınız.

Simülasyon cihazı uygulamasını çalıştırmak için bir kabuk veya komut istemi penceresi açın ve indirdiğiniz Node.js projesinin iot-hub/Tutorials/DeviceTwins klasörüne gidin. Sonra aşağıdaki komutları çalıştırın:

npm install
node SimulatedDevice.js "{your device connection string}"

Arka uç uygulamasını çalıştırmak için başka bir kabuk veya komut istemi penceresi açın. Sonra indirdiğiniz Node.js projesindeki iot-hub/Tutorials/DeviceTwins klasörüne gidin. Sonra aşağıdaki komutları çalıştırın:

npm install
node ServiceClient.js "{your service connection string}"

İstenen özellik güncelleştirmelerini gözlemleyin

Aşağıdaki ekran görüntüsünde simülasyon cihazı uygulamasından alınan çıkış gösterilmiş ve uygulamanın maxTemperature istenen özelliğine yönelik bir güncelleştirmeyi nasıl işlediği vurgulanmıştır. Her iki üst düzey işleyicinin ve iklim bileşeni işleyicilerinin nasıl çalıştığını görebilirsiniz:

Screenshot that shows how both the top-level handler and the climate component handlers run.

Aşağıdaki ekran görüntüsünde arka uç uygulamasından alınan çıkış gösterilmiş ve uygulamanın maxTemperature istenen özelliğine yönelik bir güncelleştirmeyi nasıl gönderdiği vurgulanmıştır:

Screenshot that shows the output from the back-end application and highlights how it sends an update.

Bildirilen özellik güncelleştirmelerini gözlemleme

Aşağıdaki ekran görüntüsünde simülasyon cihazı uygulamasından alınan çıkış gösterilmiş ve uygulamanın hub’ınıza nasıl bir bildirilen özellik güncelleştirmesi gönderdiği vurgulanmıştır:

Screenshot that shows the simulated device updating its twin state.

Aşağıdaki ekran görüntüsü arka uç uygulamasının çıkışını gösterir ve bir cihazdan bildirilen özellik güncelleştirmesini nasıl aldığını ve işlediğini vurgular:

Screenshot that shows the back-end application receiving the device reported properties.

Kaynakları temizleme

Sonraki öğreticiyi tamamlamayı planlıyorsanız, kaynak grubunu ve IoT hub'ını daha sonra yeniden kullanmak üzere bırakın.

Artık gerekli değilse portaldan IoT hub’ı ve kaynak grubunu silin. Bunu yapmak için IoT hub'ınızı içeren tutorial-iot-hub-rg kaynak grubunu seçin ve Sil'i seçin.

Alternatif olarak, CLI kullanın:

# Delete your resource group and its contents
az group delete --name tutorial-iot-hub-rg

Sonraki adımlar

Bu öğreticide, cihazınız ile IoT hub’ınız arasında durum bilgilerini nasıl eşitleyebileceğinizi öğrendiniz. Cihaz güncelleştirme işlemini uygulamak için cihaz ikizlerini kullanmayı öğrenmek için sonraki öğreticiye ilerleyin.

Raspberry Pi 3 B+ Başvuru Görüntüsünü kullanarak Azure IoT Hub öğreticisi için bir cihaz güncelleştirmesi uygulayın.