When developing an IoT solution, the connected devices are not always available from the start. An ideal solution for this is to temporarily simulate a device.

Also, a simulated device is ideal for test work. Since we control the simulated device ourselves, we can explore boundary-value, for example.

In this article I will go further into what is needed and how to make a simulated device.

Preparation

First of all, we need to add the IoT extension to the Azure Cloud Shell. Open de Cloud Shell in the Azure portal. In the portal you can find the Azure Cloud Shell in the top menu bar:

Enter the text below to add the IoT extention.

az extension add --name azure-iot

IoT Hub

Next, we need an IoT Hub where we can publish the simulated device. We start by creating a resource group.

az group create --name <Recoure Group name> --location westeurope

And now we can create the IoT Hub

az iot hub create --name <IoT Hub name> --resource-group <Recoure Group name> --sku S1

Device

Before we can start simulating the device needs to be created.

az iot hub device-identity create --hub-name <IoT Hub name> --device-id <Device name>

The connection string is needed to connect to the device. We need this connection string later in the process.

az iot hub device-identity show-connection-string --hub-name <IoT Hub name> --device-id <Device name> --output table

Simulated Device

For the simulated device we use node.js. We created the script below to simulate a device. Store this script as MyDevice.js in a folder.

///////////////////////////////////////////////////////////////////
// Device Simulator
// This is a DEMO device
///////////////////////////////////////////////////////////////////
'use strict';
var IotHubString = '<connection string>';
var Mqtt = require('azure-iot-device-mqtt').Mqtt;
var DeviceClient = require('azure-iot-device').Client
var Message = require('azure-iot-device').Message;
var client = DeviceClient.fromConnectionString(IotHubString, Mqtt);
// Create a message and send it to the IoT hub every second
setInterval(function(){
// Simulate telemetry.
var message = new Message(JSON.stringify({
Name:'MyDevice',
Latitude: 40.741895,
Longitude: -73.989308,
Coordinates: [49.81158139, 8.57908623],
Value1: Math.random() * 25,
Value2: Math.random() * 45
}));
console.log('Sending message: ' + message.getData());
// Send the message.
client.sendEvent(message, function (err) {
if (err) {
console.error('send error: ' + err.toString());
} else {
console.log('message sent');
}
});
}, 1000);

Store this script as package.json in a folder.

{
"name": "MyDevice",
"version": "1.0.0",
"description": "My simulated device",
"main": "MyDevice.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"azure-iot-device": "^1.7.1",
"azure-iot-device-mqtt": "^1.7.1"
}
}

Start simulation

Now we can start the simulation. Open a Command Prompt and browse to the folder of the MyDevice.js script. Install node.js (only once):

npm install

Now start the simulation:

node MyDevice.js

The result will look like the screenshot below

node MyDevice.js - Device Simulation