iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 23
0
Microsoft Azure

Azure 的奇幻之旅系列 第 23

Azure 系列文(23) - Device Provision Service 快速佈建裝置

上一篇我們實作了裝置註冊到IoT Hub的幾種方法,可是每次都要去IoT Hub新增裝置是不是顯得有點麻煩呢?剛好Azure Device Provision Service(APDS)是可以快速的把IoT裝置連上IoT Hub,所以我們就可以不用一直去新增裝置了,而且ADPS也會自動分配相對應的IoT Hub,馬上來實作看看吧!

準備

  • Azure 帳號
  • IoT Hub

建立 Azure Device Provision Service

首先我們到Azure Portal搜尋裝置佈建服務,按下建立
https://ithelp.ithome.com.tw/upload/images/20201002/20127994LmaINxvxdZ.png

再來填一些基本資訊,按下建立
https://ithelp.ithome.com.tw/upload/images/20201002/20127994XeXld0DGL9.png

接下就可以看到Auzre DPS已經建立成功囉~記下幾個待會會用到的參數

  • 服務端點
  • 全域裝置端點
  • 識別碼範圍

建立X.509憑證 (上一篇已經做完可以跳至上傳憑證)

首先下載範例程式碼

git clone https://github.com/Azure/azure-iot-sdk-c.git

進入腳本目錄

cd azure-iot-sdk-c-master/tools/CACertificates/

修改腳本權限

chmod 700 certGen.sh

產生Root憑證跟中繼憑證

./certGen.sh create_root_and_intermediate

上傳憑證

再來到IoT Hub的憑證頁,點擊新增
https://ithelp.ithome.com.tw/upload/images/20201002/20127994bzUdyatsrW.png

接下來上傳你的Root憑證,按下儲存
https://ithelp.ithome.com.tw/upload/images/20201002/20127994xWIJWhYcDI.png

驗證憑證

就可以看到憑證已經建立了,接下來點擊它,就可以看到憑證的詳細資料,按下產生驗證碼,並且複製,輸入指令

./certGen.sh create_verification_certificate {your-verify-code}

接著上傳剛創立好的verification-code.cert.pem就可以了
https://ithelp.ithome.com.tw/upload/images/20201002/20127994xLCMGtIX5X.png

就可以看到狀態已經Verified
https://ithelp.ithome.com.tw/upload/images/20201002/20127994YFEHVDRmxr.png

連結IoT Hub

再來到側邊欄的連結的 IoT 中樞,按下新增
https://ithelp.ithome.com.tw/upload/images/20201002/20127994n9Mqe7DoRe.png

選擇你要連結的IoT Hub,並且按下儲存
https://ithelp.ithome.com.tw/upload/images/20201002/20127994SV1zJivDt1.png

註冊裝置至ADPS

到ADPS的頁面選擇管理註冊,然後新增註冊群組

  • 註冊群組: 使用相同的憑證註冊到群組
  • 個別註冊: 個別的憑證
    https://ithelp.ithome.com.tw/upload/images/20201002/20127994CBAOSOAj0h.png

填下

  • 群組名稱: 你的群組名稱

  • 證明類型: 憑證

  • IoT Edge 裝置: False (後續會介紹到)

  • 憑證類型: CA

  • 主要憑證: 選擇你上面上傳的憑證

  • 次要憑證: No certificate selected

  • 選取要如何將裝置指派到中樞: 最低延遲

  • 選取可以指派以此群組的 IoT 中樞: 選擇剛剛連結的IoT Hub (如果沒選擇的話,預設會選擇全部)

接著按下儲存
https://ithelp.ithome.com.tw/upload/images/20201002/20127994RyinhInJUN.png

接著就可以看到群組已經註冊成功了
https://ithelp.ithome.com.tw/upload/images/20201002/20127994yHA86km0Mf.png

下載NodeJS範例

git clone https://github.com/Azure/azure-iot-sdk-node

進入應用程式目錄

cd azure-iot-sdk-node/provisioning/device/samples

編輯register_x509.js

register_x509.js 填入對應的值

  • provisioningHost
  • idScope
  • registrationId
  • deviceCert
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

'use strict';

var iotHubTransport = require('azure-iot-device-mqtt').Mqtt;
var Client = require('azure-iot-device').Client;
var Message = require('azure-iot-device').Message;

var fs = require('fs');
// You can change the following using statement if you would like to try another protocol.
var Transport = require('azure-iot-provisioning-device-mqtt').Mqtt;
// var Transport = require('azure-iot-provisioning-device-amqp').Amqp;
// var Transport = require('azure-iot-provisioning-device-amqp').AmqpWs;
// var Transport = require('azure-iot-provisioning-device-http').Http;
// var Transport = require('azure-iot-provisioning-device-mqtt').MqttWs;

var X509Security = require('azure-iot-security-x509').X509Security;
var ProvisioningDeviceClient = require('azure-iot-provisioning-device').ProvisioningDeviceClient;

var provisioningHost = process.env.PROVISIONING_HOST;
var idScope = process.env.PROVISIONING_IDSCOPE;
var registrationId = process.env.PROVISIONING_REGISTRATION_ID;
var deviceCert = {
  cert: fs.readFileSync(process.env.CERTIFICATE_FILE).toString(),
  key: fs.readFileSync(process.env.KEY_FILE).toString()
};

var transport = new Transport();
var securityClient = new X509Security(registrationId, deviceCert);
var deviceClient = ProvisioningDeviceClient.create(provisioningHost, idScope, transport, securityClient);

// Register the device.  Do not force a re-registration.
deviceClient.register(function(err, result) {
  if (err) {
    console.log("error registering device: " + err);
  } else {
    console.log('registration succeeded');
    console.log('assigned hub=' + result.assignedHub);
    console.log('deviceId=' + result.deviceId);
    var connectionString = 'HostName=' + result.assignedHub + ';DeviceId=' + result.deviceId + ';x509=true';
    var hubClient = Client.fromConnectionString(connectionString, iotHubTransport);
    hubClient.setOptions(deviceCert);
    hubClient.open(function(err) {
      if (err) {
        console.error('Failure opening iothub connection: ' + err.message);
      } else {
        console.log('Client connected');
        var message = new Message('Hello world');
        hubClient.sendEvent(message, function(err, res) {
          if (err) console.log('send error: ' + err.toString());
          if (res) console.log('send status: ' + res.constructor.name);
          process.exit(1);
        });
      }
    });
  }
});

之後執行應用程式

node registry_x509.js

驗證裝置有無註冊成功

接著再透過VScode上面的Azure IoT Hub套件監視訊息,果然有收到"Hello World!"
https://ithelp.ithome.com.tw/upload/images/20201002/20127994Vno3edzXX0.png

之後我們回到ADPS裡的註冊群組,看一下註冊紀錄,果然真的有註冊成功!
https://ithelp.ithome.com.tw/upload/images/20201002/20127994g7IPGsczG3.png

透過上面的方式我們就不需要在逐一的去新增裝置,可以節省許多的時間,可是它現在好像會自己自動分配IoT Hub欸?沒錯,因為我們上面有填到選取要如何將裝置指派到中樞: 最低延遲這個項目,所以他會依照最低延遲去分配IoT Hub,那如果我想要自定義分配呢?總不可能架一個DPS對一個IoT Hub吧?那我們下一篇會介紹到如何自訂義分配IoT Hub!!


上一篇
Azure 系列文(22) - IoT Hub 裝置註冊(X.509)
下一篇
Azure 系列文(24) - Device Provision Service 幫 Device 找到自己的家
系列文
Azure 的奇幻之旅30

尚未有邦友留言

立即登入留言