教學課程:與連線至解決方案的 IoT 隨插即用裝置互動
IoT 隨插即用讓您無須具備基礎裝置實作的知識,即可與裝置的功能互動,而使 IoT 得以簡化。 本教學課程說明如何使用 C# 連線至您的解決方案,並控制已連線至解決方案的 IoT 隨插即用裝置。
必要條件
在繼續之前,請確定您已設定環境,包括您的 IoT 中樞。
您可以在 Linux 或 Windows 上執行本教學課程。 本教學課程中的殼層命令會遵循路徑分隔符號 '/
' 的 Linux 慣例,如果您在 Windows 上遵循,請務必針對 '\
' 交換這些分隔符號。
使用範例程式碼複製 SDK 存放庫
如果您已完成教學課程:將在 Windows 上執行的範例 IoT 隨插即用裝置應用程式連線至 IoT 中樞 (C#) (部分機器翻譯),您已經複製了存放庫。
從 Azure IoT SDK for C# GitHub 存放庫複製範例。 在您選擇的資料夾中開啟命令提示字元。 執行下列命令,複製 Microsoft Azure IoT SDK for .NET (英文) GitHub 存放庫:
git clone https://github.com/Azure/azure-iot-sdk-csharp.git
建置裝置程式碼
您現在可以建置裝置範例並加以執行。 執行下列命令以建置範例:
cd azure-iot-sdk-csharp/iothub/device/samples/solutions/PnpDeviceSamples/Thermostat
dotnet build
執行裝置範例
若要執行範例,請執行下列命令:
dotnet run
裝置現在已可接收命令和屬性更新,並已開始將遙測資料傳送至中樞。 完成後續步驟後,請讓範例保持執行狀態。
執行範例解決方案
在設定 IoT 隨插即用的環境快速入門和教學課程中,您建立兩個環境變數,以設定範例連線至 IoT 中樞:
- IOTHUB_CONNECTION_STRING:您先前記下的 IoT 中樞連接字串。
- IOTHUB_DEVICE_ID:
"my-pnp-device"
。
在本教學課程中,您使用以 C# 撰寫的範例 IoT 解決方案,與您剛剛設定並執行的範例裝置進行互動。
在另一個終端機視窗中,瀏覽至 azure-iot-sdk-csharp/iothub/service/samples/solutions/PnpServiceSamples/Thermostat 資料夾。
執行下列命令以建置服務範例:
dotnet build
執行下列命令以執行服務範例:
dotnet run
取得裝置對應項
下列程式碼片段會顯示服務應用程式如何擷取裝置對應項:
// Get a Twin and retrieves model Id set by Device client
Twin twin = await s_registryManager.GetTwinAsync(s_deviceId);
s_logger.LogDebug($"Model Id of this Twin is: {twin.ModelId}");
注意
這個範例會使用 IoT 中樞服務用戶端 中的 Microsoft.Azure.Devices.Client 命名空間。 若要深入了解 API (包括數位對應項 API),請參閱服務開發人員指南。
這會程式碼產生下列輸出:
[09/21/2020 11:26:04]dbug: Thermostat.Program[0]
Model Id of this Twin is: dtmi:com:example:Thermostat;1
下列程式碼片段會示範如何使用「修補程式」,透過裝置對應項來更新屬性:
// Update the twin
var twinPatch = new Twin();
twinPatch.Properties.Desired[PropertyName] = PropertyValue;
await s_registryManager.UpdateTwinAsync(s_deviceId, twinPatch, twin.ETag);
當服務更新 targetTemperature
屬性時,此程式碼會從裝置產生下列輸出:
[09/21/2020 11:26:05]dbug: Thermostat.ThermostatSample[0]
Property: Received - { "targetTemperature": 60°C }.
[09/21/2020 11:26:05]dbug: Thermostat.ThermostatSample[0]
Property: Update - {"targetTemperature": 60°C } is InProgress.
...
[09/21/2020 11:26:17]dbug: Thermostat.ThermostatSample[0]
Property: Update - {"targetTemperature": 60°C } is Completed.
叫用命令
下列程式碼片段示範如何呼叫命令:
private static async Task InvokeCommandAsync()
{
var commandInvocation = new CloudToDeviceMethod(CommandName) { ResponseTimeout = TimeSpan.FromSeconds(30) };
// Set command payload
string componentCommandPayload = JsonConvert.SerializeObject(s_dateTime);
commandInvocation.SetPayloadJson(componentCommandPayload);
CloudToDeviceMethodResult result = await s_serviceClient.InvokeDeviceMethodAsync(s_deviceId, commandInvocation);
if (result == null)
{
throw new Exception($"Command {CommandName} invocation returned null");
}
s_logger.LogDebug($"Command {CommandName} invocation result status is: {result.Status}");
}
當服務呼叫 getMaxMinReport
命令時,此程式碼會從裝置產生下列輸出:
[09/21/2020 11:26:05]dbug: Thermostat.ThermostatSample[0]
Command: Received - Generating max, min and avg temperature report since 21/09/2020 11:25:58.
[09/21/2020 11:26:05]dbug: Thermostat.ThermostatSample[0]
Command: MaxMinReport since 21/09/2020 11:25:58: maxTemp=32, minTemp=32, avgTemp=32, startTime=21/09/2020 11:25:59, endTime=21/09/2020 11:26:04
IoT 隨插即用讓您無須具備基礎裝置實作的知識,即可與裝置的功能互動,而使 IoT 得以簡化。 本教學課程說明如何使用 Java 連線至您的解決方案,並控制已連線至解決方案的 IoT 隨插即用裝置。
必要條件
在繼續之前,請確定您已設定環境,包括您的 IoT 中樞。
您可以在 Linux 或 Windows 上執行本教學課程。 本教學課程中的殼層命令會遵循路徑分隔符號 '/
' 的 Linux 慣例,如果您在 Windows 上遵循,請務必針對 '\
' 交換這些分隔符號。
若要完成本教學課程,請在本機開發環境中安裝下列軟體:
- Java SE 開發套件 8 或更新版本 (部分機器翻譯)。
- Apache Maven 3。
使用範例程式碼複製 SDK 存放庫
如果您已完成教學課程:將在 Windows 上執行的範例 IoT 隨插即用裝置應用程式連線至 IoT 中樞 (Java) (部分機器翻譯),您已經複製了存放庫。
在您選擇的目錄中開啟命令提示字元。 執行下列命令,將適用於 Java 的 Microsoft Azure IoT SDK GitHub 存放庫複製到下列位置:
git clone https://github.com/Azure/azure-iot-sdk-java.git
建置並執行範例裝置
在所複製 Java SDK 存放庫中,瀏覽至控溫器範例的根資料夾,並加以建置:
cd azure-iot-sdk-java/device/iot-device-samples/pnp-device-sample/thermostat-device-sample
mvn clean package
在設定您的環境中,您建立了四個環境變數,以將範例設定為使用裝置佈建服務 (DPS) 來連線到您的 IoT 中樞:
- 值為
DPS
的 IOTHUB_DEVICE_SECURITY_TYPE - 使用 DPS 識別碼範圍的 IOTHUB_DEVICE_DPS_ID_SCOPE。
- 使用值
my-pnp-device
的 IOTHUB_DEVICE_DPS_DEVICE_ID。 - 使用註冊主要金鑰的 IOTHUB_DEVICE_DPS_DEVICE_KEY。
- 使用值
global.azure-devices-provisioning.net
的 IOTHUB_DEVICE_DPS_ENDPOINT。
若要深入了解範例設定,請參閱範例讀我檔案。
於 /device/iot-device-samples/pnp-device-sample/thermostat-device-sample 資料夾,執行應用程式:
mvn exec:java -Dexec.mainClass="samples.com.microsoft.azure.sdk.iot.device.Thermostat"
裝置現在已可接收命令和屬性更新,並已開始將遙測資料傳送至中樞。 完成後續步驟後,請讓範例保持執行狀態。
執行範例解決方案
在設定 IoT 隨插即用的環境快速入門和教學課程中,您建立兩個環境變數,以設定範例連線至 IoT 中樞:
- IOTHUB_CONNECTION_STRING:您先前記下的 IoT 中樞連接字串。
- IOTHUB_DEVICE_ID:
"my-pnp-device"
。
在本教學課程中,您使用以 Java 撰寫的範例 IoT 解決方案,與您剛剛設定的範例裝置進行互動。
注意
這個範例會使用 IoT 中樞服務用戶端中的 com.microsoft.azure.sdk.iot.service 命名空間。 若要深入了解 API (包括數位對應項 API),請參閱服務開發人員指南。
開啟另一個終端機視窗,作為您的服務終端機。
在所複製 Java SDK 存放庫中,瀏覽至 service/iot-service-samples/pnp-service-sample/thermostat-service-sample 資料夾。
若要建置並執行範例服務應用程式,請執行下列命令:
mvn clean package mvn exec:java -Dexec.mainClass="samples.com.microsoft.azure.sdk.iot.service.Thermostat"
取得裝置對應項
下列程式碼片段示範如何在服務中擷取裝置對應項:
// Get the twin and retrieve model Id set by Device client.
DeviceTwinDevice twin = new DeviceTwinDevice(deviceId);
twinClient.getTwin(twin);
System.out.println("Model Id of this Twin is: " + twin.getModelId());
更新裝置對應項
下列程式碼片段會示範如何使用「修補程式」,透過裝置對應項來更新屬性:
String propertyName = "targetTemperature";
double propertyValue = 60.2;
twin.setDesiredProperties(Collections.singleton(new Pair(propertyName, propertyValue)));
twinClient.updateTwin(twin);
裝置輸出會顯示裝置回應此屬性更新的方式。
叫用命令
下列程式碼片段示範如何在裝置上呼叫命令:
// The method to invoke for a device without components should be "methodName" as defined in the DTDL.
String methodToInvoke = "getMaxMinReport";
System.out.println("Invoking method: " + methodToInvoke);
Long responseTimeout = TimeUnit.SECONDS.toSeconds(200);
Long connectTimeout = TimeUnit.SECONDS.toSeconds(5);
// Invoke the command.
String commandInput = ZonedDateTime.now(ZoneOffset.UTC).minusMinutes(5).format(DateTimeFormatter.ISO_DATE_TIME);
MethodResult result = methodClient.invoke(deviceId, methodToInvoke, responseTimeout, connectTimeout, commandInput);
if(result == null)
{
throw new IOException("Method result is null");
}
System.out.println("Method result status is: " + result.getStatus());
裝置輸出會顯示裝置回應此命令的方式。
IoT 隨插即用讓您無須具備基礎裝置實作的知識,即可與裝置的功能互動,而使 IoT 得以簡化。 本教學課程說明如何使用 Node.js 連線至您的解決方案,並控制已連線至解決方案的 IoT 隨插即用裝置。
必要條件
在繼續之前,請確定您已設定環境,包括您的 IoT 中樞。
若要完成本教學課程,您的開發電腦上必須要有 Node.js。 您可以從 nodejs.org 下載多個平台的最新建議版本。
您可以使用下列命令,以確認開發電腦上目前的 Node.js 版本:
node --version
使用範例程式碼複製 SDK 存放庫
從 Node SDK 存放庫複製範例。 在您選擇的資料夾中開啟終端機視窗。 執行下列命令,以複製適用於 Node.js 的 Microsoft Azure IoT SDK GitHub 存放庫:
git clone https://github.com/Azure/azure-iot-sdk-node
執行範例裝置
在設定您的環境中,您建立了四個環境變數,以將範例設定為使用裝置佈建服務 (DPS) 來連線到您的 IoT 中樞:
- 值為
DPS
的 IOTHUB_DEVICE_SECURITY_TYPE - 使用 DPS 識別碼範圍的 IOTHUB_DEVICE_DPS_ID_SCOPE。
- 使用值
my-pnp-device
的 IOTHUB_DEVICE_DPS_DEVICE_ID。 - 使用註冊主要金鑰的 IOTHUB_DEVICE_DPS_DEVICE_KEY。
- 使用值
global.azure-devices-provisioning.net
的 IOTHUB_DEVICE_DPS_ENDPOINT。
若要深入了解範例設定,請參閱範例讀我檔案。
在本教學課程中,您使用以 Node.js 撰寫的範例控溫器裝置,作為 IoT 隨插即用裝置。 若要執行範例裝置:
開啟終端機視窗,並瀏覽至本機資料夾,此資料夾中包含從 GitHub 複製的適用於 Node.js 存放庫的 Microsoft Azure IoT SDK。
此終端機視窗會作為您的裝置終端機。 移至所複製存放庫的資料夾,瀏覽至 /azure-iot-sdk-node/device/samples/javascript 資料夾。 執行下列命令以安裝所有相依性:
npm install
使用下列命令來執行範例控溫器裝置:
node pnp_simple_thermostat.js
您會看到訊息,指出裝置已傳送一些資訊並回報其本身的線上狀態。 這些訊息表示裝置已開始將遙測資料傳送至中樞,且已可接收命令和屬性更新。 請勿關閉此終端機,稍後您將需要用來確認服務範例也已正常運作。
執行範例解決方案
在設定 IoT 隨插即用的環境快速入門和教學課程中,您建立兩個環境變數,以設定範例連線至 IoT 中樞:
- IOTHUB_CONNECTION_STRING:您先前記下的 IoT 中樞連接字串。
- IOTHUB_DEVICE_ID:
"my-pnp-device"
。
在本教學課程中,您使用範例 Node.js IoT 解決方案,與您剛剛設定並執行的範例裝置進行互動。
開啟另一個終端機視窗,作為您的服務終端機。
在所複製 Node SDK 存放庫中,瀏覽至 azure-iot-sdk-node/service/samples/javascript 資料夾。 執行下列命令以安裝所有相依性:
npm install
讀取屬性
當您在裝置終端機中執行範例控溫器裝置時,您會看到下列訊息,指出裝置處於線上狀態:
properties have been reported for component sending telemetry message 0...
移至服務終端機,並使用下列命令執行範例以讀取裝置資訊:
node twin.js
在服務終端機輸出中,請注意裝置對應項的回應。 您會看到已回報裝置的模型識別碼和相關聯的屬性:
Model Id: dtmi:com:example:Thermostat;1 { "deviceId": "my-pnp-device", "etag": "AAAAAAAAAAE=", "deviceEtag": "Njc3MDMxNDcy", "status": "enabled", "statusUpdateTime": "0001-01-01T00:00:00Z", "connectionState": "Connected", "lastActivityTime": "0001-01-01T00:00:00Z", "cloudToDeviceMessageCount": 0, "authenticationType": "sas", "x509Thumbprint": { "primaryThumbprint": null, "secondaryThumbprint": null }, "modelId": "dtmi:com:example:Thermostat;1", "version": 4, "properties": { "desired": { "$metadata": { "$lastUpdated": "2020-10-05T11:35:19.4574755Z" }, "$version": 1 }, "reported": { "maxTempSinceLastReboot": 31.343640523762232, "serialNumber": "123abc", "$metadata": { "$lastUpdated": "2020-10-05T11:35:23.7339042Z", "maxTempSinceLastReboot": { "$lastUpdated": "2020-10-05T11:35:23.7339042Z" }, "serialNumber": { "$lastUpdated": "2020-10-05T11:35:23.7339042Z" } }, "$version": 3 } }, "capabilities": { "iotEdge": false }, "tags": {} }
下列程式碼片段顯示 twin.js 中的程式碼,可取出裝置分身的模型識別碼:
var registry = Registry.fromConnectionString(connectionString); registry.getTwin(deviceId, function(err, twin) { if (err) { console.error(err.message); } else { console.log('Model Id: ' + twin.modelId); //... } //... }
在此案例中,會輸出 Model Id: dtmi:com:example:Thermostat;1
。
注意
這些服務範例會使用 IoT 中樞服務用戶端中的 Registry 類別。 若要深入了解 API (包括數位對應項 API),請參閱服務開發人員指南。
更新可寫入屬性
在程式碼編輯器中開啟檔案 twin.js。
請參閱範例程式碼,其中會顯示兩種更新裝置對應項的方式。 若要使用第一種方式,請修改
twinPatch
變數,如下所示:var twinPatch = { tags: { city: "Redmond" }, properties: { desired: { targetTemperature: 42 } } };
targetTemperature
屬性會在控溫器裝置型號中定義為可寫入的屬性。在服務終端機,使用下列命令執行範例以更新屬性:
node twin.js
在您的裝置終端機中,您會看到裝置已接收更新:
The following properties will be updated for the default component: { targetTemperature: { value: 42, ac: 200, ad: 'Successfully executed patch for targetTemperature', av: 2 } } updated the property
在您的 服務終端機中,執行下列命令以確認屬性已更新:
node twin.js
在服務終端機輸出中,您會在
reported
屬性區段中看到回報的更新目標溫度。 裝置可能需要一段時間才能完成更新。 重複此步驟,直到裝置處理屬性更新為止:"reported": { //... "targetTemperature": { "value": 42, "ac": 200, "ad": "Successfully executed patch for targetTemperature", "av": 4 }, //... }
叫用命令
開啟檔案 device_method.js 並檢閱程式碼。
移至服務終端機。 使用下列命令來執行範例,以叫用命令:
set IOTHUB_METHOD_NAME=getMaxMinReport set IOTHUB_METHOD_PAYLOAD=commandpayload node device_method.js
服務終端機中的輸出應該會顯示下列確認:
getMaxMinReport on my-pnp-device: { "status": 200, "payload": { "maxTemp": 23.460596940801928, "minTemp": 23.460596940801928, "avgTemp": 23.460596940801928, "endTime": "2020-10-05T12:48:08.562Z", "startTime": "2020-10-05T12:47:54.450Z" } }
在裝置終端機,您會看到命令已認可:
MaxMinReport commandpayload Response to method 'getMaxMinReport' sent successfully.
IoT 隨插即用讓您無須具備基礎裝置實作的知識,即可與裝置的模型互動,而使 IoT 得以簡化。 本教學課程說明如何使用 Python 連線至您的解決方案,並控制已連線至解決方案的 IoT 隨插即用裝置。
必要條件
在繼續之前,請確定您已設定環境,包括您的 IoT 中樞。
若要完成本教學課程,您必須在開發機器上安裝 Python。 如需目前的 Python 版本需求,請查看 Azure IoT Python SDK (英文)。 您可以使用下列命令來檢查 Python 版本:
python --version
您可以從 python.org \(英文\) 下載適用於多個平台的最新建議版本。
在您的本機 Python 環境中安裝 azure-iot-device 套件,如下所示:
pip install azure-iot-device
執行下列命令安裝 azure-iot-hub 套件:
pip install azure-iot-hub
執行範例裝置
在設定您的環境中,您建立了四個環境變數,以將範例設定為使用裝置佈建服務 (DPS) 來連線到您的 IoT 中樞:
- 值為
DPS
的 IOTHUB_DEVICE_SECURITY_TYPE - 使用 DPS 識別碼範圍的 IOTHUB_DEVICE_DPS_ID_SCOPE。
- 使用值
my-pnp-device
的 IOTHUB_DEVICE_DPS_DEVICE_ID。 - 使用註冊主要金鑰的 IOTHUB_DEVICE_DPS_DEVICE_KEY。
- 使用值
global.azure-devices-provisioning.net
的 IOTHUB_DEVICE_DPS_ENDPOINT。
若要深入了解範例設定,請參閱範例讀我檔案。
在本教學課程中,您使用以 Python 撰寫的範例控溫器裝置,作為 IoT 隨插即用裝置。 若要執行範例裝置:
在您選擇的資料夾中開啟終端機視窗。 執行下列命令,將 Azure IoT 裝置 Python SDK (英文) GitHub 存放庫複製到下列位置:
git clone --branch v2 https://github.com/Azure/azure-iot-sdk-python
此終端機視窗會作為您的裝置終端機。 移至所複製存放庫的資料夾,瀏覽至 azure-iot-sdk-python/samples/pnp 資料夾。
使用下列命令來執行範例控溫器裝置:
python simple_thermostat.py
您會看到訊息,指出裝置已傳送一些資訊並回報其本身的線上狀態。 這些訊息表示裝置已開始將遙測資料傳送至中樞,且已可接收命令和屬性更新。 請勿關閉此終端機,稍後您將需要用來確認服務範例也已正常運作。
執行範例解決方案
在本教學課程中,您使用以 Python 撰寫的範例 IoT 解決方案,與您剛剛設定的範例裝置進行互動。
開啟另一個終端機視窗,作為您的服務終端機。 執行下列命令,將 Azure IoT 中樞 Python SDK (英文) GitHub 存放庫複製到下列位置:
git clone https://github.com/Azure/azure-iot-hub-python
在已啟用
瀏覽至所複製 Python SDK 存放庫的 /azure-iot-hub-python/samples 資料夾。
開啟 registry_manager_pnp_sample.py 檔案並檢閱程式碼。 這個範例示範如何使用 IoTHubRegistryManager 類別來與 IoT 隨插即用裝置互動。
注意
這些服務範例會使用 IoT 中樞服務用戶端中的 IoTHubRegistryManager 類別。 若要深入了解 API (包括數位對應項 API),請參閱服務開發人員指南。
取得裝置對應項
在設定 IoT 隨插即用的環境快速入門和教學課程中,您建立兩個環境變數,以設定範例連線至 IoT 中樞:
- IOTHUB_CONNECTION_STRING:您先前記下的 IoT 中樞連接字串。
- IOTHUB_DEVICE_ID:
"my-pnp-device"
。
在服務終端機中使用下列命令來執行此範例:
set IOTHUB_METHOD_NAME="getMaxMinReport"
set IOTHUB_METHOD_PAYLOAD="hello world"
python registry_manager_pnp_sample.py
注意
如果您是在 Linux 上執行此範例,請使用 export
來取代 set
。
輸出會顯示裝置對應項,並列印其模型識別碼:
The Model ID for this device is:
dtmi:com:example:Thermostat;1
下列程式碼片段顯示來自 registry_manager_pnp_sample.py 的範例程式碼:
# Create IoTHubRegistryManager
iothub_registry_manager = IoTHubRegistryManager(iothub_connection_str)
# Get device twin
twin = iothub_registry_manager.get_twin(device_id)
print("The device twin is: ")
print("")
print(twin)
print("")
# Print the device's model ID
additional_props = twin.additional_properties
if "modelId" in additional_props:
print("The Model ID for this device is:")
print(additional_props["modelId"])
print("")
更新裝置對應項
此範例說明如何更新裝置中的 targetTemperature
可寫入屬性:
# Update twin
twin_patch = Twin()
twin_patch.properties = TwinProperties(
desired={"targetTemperature": 42}
) # this is relevant for the thermostat device sample
updated_twin = iothub_registry_manager.update_twin(device_id, twin_patch, twin.etag)
print("The twin patch has been successfully applied")
print("")
您可以確認更新已套用在顯示下列輸出的裝置終端機中:
the data in the desired properties patch was: {'targetTemperature': 42, '$version': 2}
服務終端機會確認修補程式已成功:
The twin patch has been successfully applied
叫用命令
範例會接著叫用命令:
服務終端機會顯示來自裝置的確認訊息:
The device method has been successfully invoked
在裝置終端機中,您會看到裝置收到命令:
Command request received with payload
hello world
Will return the max, min and average temperature from the specified time hello to the current time
Done generating
{"tempReport": {"avgTemp": 34.2, "endTime": "09/07/2020 09:58:11", "maxTemp": 49, "minTemp": 10, "startTime": "09/07/2020 09:56:51"}}
清除資源
如果您已完成快速入門和教學課程,請參閱清除資源。
下一步
在本教學課程中,您已了解如何將 IoT 隨插即用裝置連線至 IoT 解決方案。 若要深入了解 IoT 隨插即用裝置模型,請參閱: