Repository files navigation

LoraWan

Deploiement d'un réseau IoT lorawan Multitenant sur le technopole ElGhazala

Project Description

Deployment of a Lorawan Multitenant IoT network on the ElGhazala technopole This involves installing 3 gateways connected to the ChirpStack network server. For a user to exploit the network, simply he should ask the admin to create a tenant on Chirpstack and assign it as admin to that tenant. The admin adds shared gateways to all tenants. Now the user can create applications and can add the end-devices associated to his application. This project targets all students, PhD students and teachers of Sup'Com as well as professionals in partnership.

Tutorial using Chirpstack v3

Prerequisites

  • A single machine running a Linux based operating system.

  • A single machine running a Windows based operating system for monitoring / administration.

  • Docker version 23.0.5 and Docker Compose version 2.17.3 is used in this tutorial. Detailed installation instructions can be found here.

  • Arduino IDE. Detailed installation instructions can be found here.

  • Postman. Detailed installation instructions can be found here.

  • Git

sudo apt-get install git

Chirpstack v3 setup

  • To install Chirpstack v3 with docker, follow the next steps.
git clone https://github.com/chirpstack/chirpstack-docker.git
cd chirpstack-docker
git checkout v3
docker compose up
  • To check whether the installation was successful go to the server IP on port 8080. In the following tutorial my server IP address is 192.168.33.69.

Hardware

  • A seeeduino lorawana gateway kit. For further details on the kit visit this wiki page
  • A DHT11 temperatur and humidity sensor.

Architecture

The tutorial allows the deployment of the following system, comprising a basic FIWARE IoT stack:

image

  • A LoRaWAN end-node based on an Seeeduino LoRaWAN development board. In our application, the device will readtemperatur and humidity values from the DHT11 sensor, encode the information using CayenneLpp data model and forward the result to Chirpstack LoRaWAN stack through the gateways.
  • The LoRaWAN gateway plays the role of a concentrator which forwards the messages to the LoRaWAN network server, included in Chirpstack v3 stack.
  • Chirpstack v3 stack implements the functionalities of the LoRaWAN network server and LoRaWAN application server.
  • FIWARE IoT Agent enables the ingestion of data from LoRaWAN application servers in NGSI context brokers, subscribing to appropriate communication channels (i.e., MQTT topics), decoding payloads and translating them to NGSI data model. It relies on a MongoDB database to persist information.
  • FIWARE Context Broker manages large-scale context information abstracting the type of data source and the underlying communication technologies. It relies on a MongoDB database to persist information.
  • FIWARE Quantum Leap subscribes to notifications of new data ingested by FIWARE Context Brokers and stores the historical information in time-series format. It relies on a CrateDB database to persist information.
  • Grafana provides an easy and intuitive mechanism to visualize and explore data by means of fashionable dashboards.

Clone the GitHub repository

All the code and files needed to follow this tutorial are included in FiwareAtSupCom\LoraWan GitHub repository. To clone the repository:

git clone https://github.com/FiwareAtSupCom/LoraWan.git

Gateway configuration

To configure the gateway for forwarding lorawan packets to the network server, you need to follow the next steps.

  • Hardware connection.
  • Open gateway terminal (over Serial or SSH). You can follow the instructions in the Seeeduino getting started section.
  • Configure the gateway to forward the lorawan packets to chirpstack server:
nano /home/rxhf/risinghf/pktfwd/local_conf.json

Change the server_address to your chirpstack server IP address, change serv_port_up and server_port_down to 1700, and keep the gateway_ID, we will need it later.

{
"gateway_conf": {
"gateway_ID": "b827ebfffe0e1174",
"autoquit_threshold": 5,
"server_address": "SERVER_ADDRESS",
"serv_port_up": 1700,
"serv_port_down": 1700
}
}
  • To apply the changes reboot the gateway:
sudo reboot

Adding the gateway to Chirpstack

  • Go to the web UI of chirpstack following this link: http://192.168.33.69:8080 and login using "admin" as a username and a password.

  • Add a network server:

image

  • Add a new service profile.

  • Add a new gateway:

image

  • Verify that the gateway is active in the dashboard.

image

Adding Application and device

  • Add a new device profile and make sure to check OTAA mode support and CayenneLPP as a codec:

image

  • Add an application.

  • Add a device to the created application using the device profile. For that you will need to generate an Appkey (that you need to keep for the next step)and the DEV EUI which you can get following Seeeduino AT communication section.

image

End node setup

  • Open the end node device sketch located in seeeduino_lorawana_end_device/end_node_cayenneLPP_payload_OTAA.

  • Install the required libraries and seeeduino lorawan board. You can follow this tutorial.
  • Change the appkey generated in the previous step.
  • Upload the code to the board and make the wiring as shown in the next figure.

Deploy FIWARE Stack

  • We will create the FIWARE stack containers using the following command.
docker compose -f docker/fiware/docker-compose.yml
  • For the containers administration and visualisation we will use Portainer web UI installed using the previous cmd.(You will need to create an account.)

  • You can open the UI interface using this link: https://192.168.33.69:9443

image

  • Import the Postman workspace located in "postman/fiware1.postman_collection.json" which containes the needed HTTP requests.

1. Check Orion version

  • GET request to:
http://192.168.33.69:1026/version
  • The output should be like this:
{
"orion": {
"version": "3.8.1",
"uptime": "0 d, 21 h, 19 m, 10 s",
"git_hash": "30622caf67bb4384b73747abb17733e5ad9989a8",
"compile_time": "Fri Feb 17 10:20:06 UTC 2023",
"compiled_by": "root",
"compiled_in": "02a18b9e9dcd",
"release_date": "Fri Feb 17 10:20:06 UTC 2023",
"machine": "x86_64",
"doc": "https://fiware-orion.rtfd.io/en/3.8.1/",
"libversions": {
"boost": "1_74",
"libcurl": "libcurl/7.74.0 OpenSSL/1.1.1n zlib/1.2.12 brotli/1.0.9 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.3.0) libssh2/1.9.0 nghttp2/1.43.0 librtmp/2.3",
"libmosquitto": "2.0.15",
"libmicrohttpd": "0.9.73",
"openssl": "1.1",
"rapidjson": "1.1.0",
"mongoc": "1.23.1",
"bson": "1.23.1"
}
}
}

2. Check IOT Agent about:

  • GET request to:
http://192.168.33.69:4041/iot/about
  • The output should be like this:
{
"libVersion": "2.21.0",
"port": 4041,
"baseRoot": "/",
"version": "1.2.5"
}

3. Add device to IOT Agent

  • POST request to:
http://192.168.33.69:4041/iot/devices
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • And this body(you should change the fields of: dev_eui, app_eui, application_id, application_key. You can get them from the chirpstack application.)
{
"devices": [
{
"device_id": "dht_001",
"entity_name": "DHT_001",
"entity_type": "DHT",
"timezone": "Europe/Berlin",
"attributes": [
{
"object_id": "rh1",
"name": "relative_humidity_1",
"type": "Number"
},
{
"object_id": "t1",
"name": "temperature_1",
"type": "Number"
}
],
"internal_attributes": {
"lorawan": {
"application_server": {
"host": "192.168.33.69",
"username": "admin",
"password": "admin",
"provider": "chirpstack"
},
"dev_eui": "8cf957200004c487",
"app_eui": "4569343567897875",
"application_id": "1",
"application_key": "75B7EBC63DA30B7C9E3BAE8DFFAE94B3",
"data_model": "cayennelpp"
}
}
}
]
}
  • The output should be like this with 201 status code
{}

4. Show the added device

  • GET request to:
http://192.168.33.69:4041/iot/devices
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be:
{
"count": 1,
"devices": [
{
"device_id": "dht_001",
"service": "smartroom",
"service_path": "/rooms",
"entity_name": "DHT_001",
"entity_type": "DHT",
"attributes": [
{
"object_id": "rh1",
"name": "relative_humidity_1",
"type": "Number"
},
{
"object_id": "t1",
"name": "temperature_1",
"type": "Number"
}
],
"lazy": [],
"commands": [],
"static_attributes": [],
"internal_attributes": {
"lorawan": {
"application_server": {
"host": "192.168.33.69",
"username": "admin",
"password": "admin",
"provider": "chirpstack"
},
"dev_eui": "8cf957200004c487",
"app_eui": "4569343567897875",
"application_id": "1",
"application_key": "75B7EBC63DA30B7C9E3BAE8DFFAE94B3",
"data_model": "cayennelpp"
}
}
}
]
}

5. Show the DHT11 entity from Orion context broker

  • GET request to:
http://192.168.33.69:1026/v2/entities/DHT_001
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be:
{
"id": "DHT_001",
"type": "DHT",
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z",
"metadata": {}
},
"relative_humidity_1": {
"type": "Number",
"value": 62,
"metadata": {
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z"
}
}
},
"temperature_1": {
"type": "Number",
"value": 26,
"metadata": {
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z"
}
}
}
}

6. Check Quantumleap version

  • GET request to:
http://192.168.33.69:8668/version
  • The output should be like this:
{
"version": "0.8.x"
}

7. Add subscription to Orion context broker

  • POST request to:
http://192.168.33.69:1026/v2/subscriptions
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • And this body:
{
"description": "Notify QuantumLeap of all DHT Sensor changes",
"subject": {
"entities": [
{
"idPattern": "DHT*"
}
],
"condition": {
"attrs": [
"relative_humidity_1",
"temperature_1"
]
}
},
"notification": {
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"attrs": [
"relative_humidity_1",
"temperature_1"
],
"metadata": ["dateCreated", "dateModified"]
}
}
  • This should return an empty response body with a 201 status code

8. Show the created subscription

  • GET request to:
http://192.168.33.69:1026/v2/subscriptions
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be like this:
[
{
"id": "646e24594282b5b0b902b9ce",
"description": "Notify QuantumLeap of all DHT Sensor changes",
"status": "active",
"subject": {
"entities": [
{
"idPattern": "DHT*"
}
],
"condition": {
"attrs": [
"relative_humidity_1",
"temperature_1"
]
}
},
"notification": {
"timesSent": 1,
"lastNotification": "2023-05-24T14:51:06.000Z",
"attrs": [
"relative_humidity_1",
"temperature_1"
],
"onlyChangedAttrs": false,
"attrsFormat": "normalized",
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"metadata": [
"dateCreated",
"dateModified"
],
"lastSuccess": "2023-05-24T14:51:06.000Z",
"lastSuccessCode": 200,
"covered": false
}
}
]

9. Show records history from quantumleap

  • GET request to:
http://192.168.33.69:8668/v2/entities/DHT_001
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be like this:
{
"attributes": [
{
"attrName": "TimeInstant",
"values": [
null,
null,
null,
null,
null
]
},
{
"attrName": "relative_humidity_1",
"values": [
62.0,
62.0,
62.0,
62.0,
61.0
]
},
{
"attrName": "temperature_1",
"values": [
26.0,
26.0,
26.0,
27.0,
26.0
]
}
],
"entityId": "DHT_001",
"index": [
"2023-05-24T14:50:16.840+00:00",
"2023-05-24T14:50:26.865+00:00",
"2023-05-24T14:50:36.888+00:00",
"2023-05-24T14:50:46.908+00:00",
"2023-05-24T14:51:06.962+00:00"
]
}

Grafana visualisation

  • Navigate to http://192.168.33.69:3000 and log in with default credentials which are: admin / admin

  • Add a new data source using the following parameters:

image

  • Import the dashboard located in: grafana_dashboard folder.

image

  • The final result should look like this:

image

About

Deploiement d'un réseau IoT lorawan Multitenant sur le technopole ElGhazala

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

LoraWan

Deploiement d'un réseau IoT lorawan Multitenant sur le technopole ElGhazala

Project Description

Deployment of a Lorawan Multitenant IoT network on the ElGhazala technopole This involves installing 3 gateways connected to the ChirpStack network server. For a user to exploit the network, simply he should ask the admin to create a tenant on Chirpstack and assign it as admin to that tenant. The admin adds shared gateways to all tenants. Now the user can create applications and can add the end-devices associated to his application. This project targets all students, PhD students and teachers of Sup'Com as well as professionals in partnership.

Tutorial using Chirpstack v3

Prerequisites

  • A single machine running a Linux based operating system.

  • A single machine running a Windows based operating system for monitoring / administration.

  • Docker version 23.0.5 and Docker Compose version 2.17.3 is used in this tutorial. Detailed installation instructions can be found here.

  • Arduino IDE. Detailed installation instructions can be found here.

  • Postman. Detailed installation instructions can be found here.

  • Git

sudo apt-get install git

Chirpstack v3 setup

  • To install Chirpstack v3 with docker, follow the next steps.
git clone https://github.com/chirpstack/chirpstack-docker.git
cd chirpstack-docker
git checkout v3
docker compose up
  • To check whether the installation was successful go to the server IP on port 8080. In the following tutorial my server IP address is 192.168.33.69.

Hardware

  • A seeeduino lorawana gateway kit. For further details on the kit visit this wiki page
  • A DHT11 temperatur and humidity sensor.

Architecture

The tutorial allows the deployment of the following system, comprising a basic FIWARE IoT stack:

image

  • A LoRaWAN end-node based on an Seeeduino LoRaWAN development board. In our application, the device will readtemperatur and humidity values from the DHT11 sensor, encode the information using CayenneLpp data model and forward the result to Chirpstack LoRaWAN stack through the gateways.
  • The LoRaWAN gateway plays the role of a concentrator which forwards the messages to the LoRaWAN network server, included in Chirpstack v3 stack.
  • Chirpstack v3 stack implements the functionalities of the LoRaWAN network server and LoRaWAN application server.
  • FIWARE IoT Agent enables the ingestion of data from LoRaWAN application servers in NGSI context brokers, subscribing to appropriate communication channels (i.e., MQTT topics), decoding payloads and translating them to NGSI data model. It relies on a MongoDB database to persist information.
  • FIWARE Context Broker manages large-scale context information abstracting the type of data source and the underlying communication technologies. It relies on a MongoDB database to persist information.
  • FIWARE Quantum Leap subscribes to notifications of new data ingested by FIWARE Context Brokers and stores the historical information in time-series format. It relies on a CrateDB database to persist information.
  • Grafana provides an easy and intuitive mechanism to visualize and explore data by means of fashionable dashboards.

Clone the GitHub repository

All the code and files needed to follow this tutorial are included in FiwareAtSupCom\LoraWan GitHub repository. To clone the repository:

git clone https://github.com/FiwareAtSupCom/LoraWan.git

Gateway configuration

To configure the gateway for forwarding lorawan packets to the network server, you need to follow the next steps.

  • Hardware connection.
  • Open gateway terminal (over Serial or SSH). You can follow the instructions in the Seeeduino getting started section.
  • Configure the gateway to forward the lorawan packets to chirpstack server:
nano /home/rxhf/risinghf/pktfwd/local_conf.json

Change the server_address to your chirpstack server IP address, change serv_port_up and server_port_down to 1700, and keep the gateway_ID, we will need it later.

{
"gateway_conf": {
"gateway_ID": "b827ebfffe0e1174",
"autoquit_threshold": 5,
"server_address": "SERVER_ADDRESS",
"serv_port_up": 1700,
"serv_port_down": 1700
}
}
  • To apply the changes reboot the gateway:
sudo reboot

Adding the gateway to Chirpstack

  • Go to the web UI of chirpstack following this link: http://192.168.33.69:8080 and login using "admin" as a username and a password.

  • Add a network server:

image

  • Add a new service profile.

  • Add a new gateway:

image

  • Verify that the gateway is active in the dashboard.

image

Adding Application and device

  • Add a new device profile and make sure to check OTAA mode support and CayenneLPP as a codec:

image

  • Add an application.

  • Add a device to the created application using the device profile. For that you will need to generate an Appkey (that you need to keep for the next step)and the DEV EUI which you can get following Seeeduino AT communication section.

image

End node setup

  • Open the end node device sketch located in seeeduino_lorawana_end_device/end_node_cayenneLPP_payload_OTAA.

  • Install the required libraries and seeeduino lorawan board. You can follow this tutorial.
  • Change the appkey generated in the previous step.
  • Upload the code to the board and make the wiring as shown in the next figure.

Deploy FIWARE Stack

  • We will create the FIWARE stack containers using the following command.
docker compose -f docker/fiware/docker-compose.yml
  • For the containers administration and visualisation we will use Portainer web UI installed using the previous cmd.(You will need to create an account.)

  • You can open the UI interface using this link: https://192.168.33.69:9443

image

  • Import the Postman workspace located in "postman/fiware1.postman_collection.json" which containes the needed HTTP requests.

1. Check Orion version

  • GET request to:
http://192.168.33.69:1026/version
  • The output should be like this:
{
"orion": {
"version": "3.8.1",
"uptime": "0 d, 21 h, 19 m, 10 s",
"git_hash": "30622caf67bb4384b73747abb17733e5ad9989a8",
"compile_time": "Fri Feb 17 10:20:06 UTC 2023",
"compiled_by": "root",
"compiled_in": "02a18b9e9dcd",
"release_date": "Fri Feb 17 10:20:06 UTC 2023",
"machine": "x86_64",
"doc": "https://fiware-orion.rtfd.io/en/3.8.1/",
"libversions": {
"boost": "1_74",
"libcurl": "libcurl/7.74.0 OpenSSL/1.1.1n zlib/1.2.12 brotli/1.0.9 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.3.0) libssh2/1.9.0 nghttp2/1.43.0 librtmp/2.3",
"libmosquitto": "2.0.15",
"libmicrohttpd": "0.9.73",
"openssl": "1.1",
"rapidjson": "1.1.0",
"mongoc": "1.23.1",
"bson": "1.23.1"
}
}
}

2. Check IOT Agent about:

  • GET request to:
http://192.168.33.69:4041/iot/about
  • The output should be like this:
{
"libVersion": "2.21.0",
"port": 4041,
"baseRoot": "/",
"version": "1.2.5"
}

3. Add device to IOT Agent

  • POST request to:
http://192.168.33.69:4041/iot/devices
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • And this body(you should change the fields of: dev_eui, app_eui, application_id, application_key. You can get them from the chirpstack application.)
{
"devices": [
{
"device_id": "dht_001",
"entity_name": "DHT_001",
"entity_type": "DHT",
"timezone": "Europe/Berlin",
"attributes": [
{
"object_id": "rh1",
"name": "relative_humidity_1",
"type": "Number"
},
{
"object_id": "t1",
"name": "temperature_1",
"type": "Number"
}
],
"internal_attributes": {
"lorawan": {
"application_server": {
"host": "192.168.33.69",
"username": "admin",
"password": "admin",
"provider": "chirpstack"
},
"dev_eui": "8cf957200004c487",
"app_eui": "4569343567897875",
"application_id": "1",
"application_key": "75B7EBC63DA30B7C9E3BAE8DFFAE94B3",
"data_model": "cayennelpp"
}
}
}
]
}
  • The output should be like this with 201 status code
{}

4. Show the added device

  • GET request to:
http://192.168.33.69:4041/iot/devices
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be:
{
"count": 1,
"devices": [
{
"device_id": "dht_001",
"service": "smartroom",
"service_path": "/rooms",
"entity_name": "DHT_001",
"entity_type": "DHT",
"attributes": [
{
"object_id": "rh1",
"name": "relative_humidity_1",
"type": "Number"
},
{
"object_id": "t1",
"name": "temperature_1",
"type": "Number"
}
],
"lazy": [],
"commands": [],
"static_attributes": [],
"internal_attributes": {
"lorawan": {
"application_server": {
"host": "192.168.33.69",
"username": "admin",
"password": "admin",
"provider": "chirpstack"
},
"dev_eui": "8cf957200004c487",
"app_eui": "4569343567897875",
"application_id": "1",
"application_key": "75B7EBC63DA30B7C9E3BAE8DFFAE94B3",
"data_model": "cayennelpp"
}
}
}
]
}

5. Show the DHT11 entity from Orion context broker

  • GET request to:
http://192.168.33.69:1026/v2/entities/DHT_001
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be:
{
"id": "DHT_001",
"type": "DHT",
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z",
"metadata": {}
},
"relative_humidity_1": {
"type": "Number",
"value": 62,
"metadata": {
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z"
}
}
},
"temperature_1": {
"type": "Number",
"value": 26,
"metadata": {
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z"
}
}
}
}

6. Check Quantumleap version

  • GET request to:
http://192.168.33.69:8668/version
  • The output should be like this:
{
"version": "0.8.x"
}

7. Add subscription to Orion context broker

  • POST request to:
http://192.168.33.69:1026/v2/subscriptions
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • And this body:
{
"description": "Notify QuantumLeap of all DHT Sensor changes",
"subject": {
"entities": [
{
"idPattern": "DHT*"
}
],
"condition": {
"attrs": [
"relative_humidity_1",
"temperature_1"
]
}
},
"notification": {
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"attrs": [
"relative_humidity_1",
"temperature_1"
],
"metadata": ["dateCreated", "dateModified"]
}
}
  • This should return an empty response body with a 201 status code

8. Show the created subscription

  • GET request to:
http://192.168.33.69:1026/v2/subscriptions
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be like this:
[
{
"id": "646e24594282b5b0b902b9ce",
"description": "Notify QuantumLeap of all DHT Sensor changes",
"status": "active",
"subject": {
"entities": [
{
"idPattern": "DHT*"
}
],
"condition": {
"attrs": [
"relative_humidity_1",
"temperature_1"
]
}
},
"notification": {
"timesSent": 1,
"lastNotification": "2023-05-24T14:51:06.000Z",
"attrs": [
"relative_humidity_1",
"temperature_1"
],
"onlyChangedAttrs": false,
"attrsFormat": "normalized",
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"metadata": [
"dateCreated",
"dateModified"
],
"lastSuccess": "2023-05-24T14:51:06.000Z",
"lastSuccessCode": 200,
"covered": false
}
}
]

9. Show records history from quantumleap

  • GET request to:
http://192.168.33.69:8668/v2/entities/DHT_001
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be like this:
{
"attributes": [
{
"attrName": "TimeInstant",
"values": [
null,
null,
null,
null,
null
]
},
{
"attrName": "relative_humidity_1",
"values": [
62.0,
62.0,
62.0,
62.0,
61.0
]
},
{
"attrName": "temperature_1",
"values": [
26.0,
26.0,
26.0,
27.0,
26.0
]
}
],
"entityId": "DHT_001",
"index": [
"2023-05-24T14:50:16.840+00:00",
"2023-05-24T14:50:26.865+00:00",
"2023-05-24T14:50:36.888+00:00",
"2023-05-24T14:50:46.908+00:00",
"2023-05-24T14:51:06.962+00:00"
]
}

Grafana visualisation

  • Navigate to http://192.168.33.69:3000 and log in with default credentials which are: admin / admin

  • Add a new data source using the following parameters:

image

  • Import the dashboard located in: grafana_dashboard folder.

image

  • The final result should look like this:

image

About

Deploiement d'un réseau IoT lorawan Multitenant sur le technopole ElGhazala

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

LoraWan

Deploiement d'un réseau IoT lorawan Multitenant sur le technopole ElGhazala

Project Description

Deployment of a Lorawan Multitenant IoT network on the ElGhazala technopole This involves installing 3 gateways connected to the ChirpStack network server. For a user to exploit the network, simply he should ask the admin to create a tenant on Chirpstack and assign it as admin to that tenant. The admin adds shared gateways to all tenants. Now the user can create applications and can add the end-devices associated to his application. This project targets all students, PhD students and teachers of Sup'Com as well as professionals in partnership.

Tutorial using Chirpstack v3

Prerequisites

  • A single machine running a Linux based operating system.

  • A single machine running a Windows based operating system for monitoring / administration.

  • Docker version 23.0.5 and Docker Compose version 2.17.3 is used in this tutorial. Detailed installation instructions can be found here.

  • Arduino IDE. Detailed installation instructions can be found here.

  • Postman. Detailed installation instructions can be found here.

  • Git

sudo apt-get install git

Chirpstack v3 setup

  • To install Chirpstack v3 with docker, follow the next steps.
git clone https://github.com/chirpstack/chirpstack-docker.git
cd chirpstack-docker
git checkout v3
docker compose up
  • To check whether the installation was successful go to the server IP on port 8080. In the following tutorial my server IP address is 192.168.33.69.

Hardware

  • A seeeduino lorawana gateway kit. For further details on the kit visit this wiki page
  • A DHT11 temperatur and humidity sensor.

Architecture

The tutorial allows the deployment of the following system, comprising a basic FIWARE IoT stack:

image

  • A LoRaWAN end-node based on an Seeeduino LoRaWAN development board. In our application, the device will readtemperatur and humidity values from the DHT11 sensor, encode the information using CayenneLpp data model and forward the result to Chirpstack LoRaWAN stack through the gateways.
  • The LoRaWAN gateway plays the role of a concentrator which forwards the messages to the LoRaWAN network server, included in Chirpstack v3 stack.
  • Chirpstack v3 stack implements the functionalities of the LoRaWAN network server and LoRaWAN application server.
  • FIWARE IoT Agent enables the ingestion of data from LoRaWAN application servers in NGSI context brokers, subscribing to appropriate communication channels (i.e., MQTT topics), decoding payloads and translating them to NGSI data model. It relies on a MongoDB database to persist information.
  • FIWARE Context Broker manages large-scale context information abstracting the type of data source and the underlying communication technologies. It relies on a MongoDB database to persist information.
  • FIWARE Quantum Leap subscribes to notifications of new data ingested by FIWARE Context Brokers and stores the historical information in time-series format. It relies on a CrateDB database to persist information.
  • Grafana provides an easy and intuitive mechanism to visualize and explore data by means of fashionable dashboards.

Clone the GitHub repository

All the code and files needed to follow this tutorial are included in FiwareAtSupCom\LoraWan GitHub repository. To clone the repository:

git clone https://github.com/FiwareAtSupCom/LoraWan.git

Gateway configuration

To configure the gateway for forwarding lorawan packets to the network server, you need to follow the next steps.

  • Hardware connection.
  • Open gateway terminal (over Serial or SSH). You can follow the instructions in the Seeeduino getting started section.
  • Configure the gateway to forward the lorawan packets to chirpstack server:
nano /home/rxhf/risinghf/pktfwd/local_conf.json

Change the server_address to your chirpstack server IP address, change serv_port_up and server_port_down to 1700, and keep the gateway_ID, we will need it later.

{
"gateway_conf": {
"gateway_ID": "b827ebfffe0e1174",
"autoquit_threshold": 5,
"server_address": "SERVER_ADDRESS",
"serv_port_up": 1700,
"serv_port_down": 1700
}
}
  • To apply the changes reboot the gateway:
sudo reboot

Adding the gateway to Chirpstack

  • Go to the web UI of chirpstack following this link: http://192.168.33.69:8080 and login using "admin" as a username and a password.

  • Add a network server:

image

  • Add a new service profile.

  • Add a new gateway:

image

  • Verify that the gateway is active in the dashboard.

image

Adding Application and device

  • Add a new device profile and make sure to check OTAA mode support and CayenneLPP as a codec:

image

  • Add an application.

  • Add a device to the created application using the device profile. For that you will need to generate an Appkey (that you need to keep for the next step)and the DEV EUI which you can get following Seeeduino AT communication section.

image

End node setup

  • Open the end node device sketch located in seeeduino_lorawana_end_device/end_node_cayenneLPP_payload_OTAA.

  • Install the required libraries and seeeduino lorawan board. You can follow this tutorial.
  • Change the appkey generated in the previous step.
  • Upload the code to the board and make the wiring as shown in the next figure.

Deploy FIWARE Stack

  • We will create the FIWARE stack containers using the following command.
docker compose -f docker/fiware/docker-compose.yml
  • For the containers administration and visualisation we will use Portainer web UI installed using the previous cmd.(You will need to create an account.)

  • You can open the UI interface using this link: https://192.168.33.69:9443

image

  • Import the Postman workspace located in "postman/fiware1.postman_collection.json" which containes the needed HTTP requests.

1. Check Orion version

  • GET request to:
http://192.168.33.69:1026/version
  • The output should be like this:
{
"orion": {
"version": "3.8.1",
"uptime": "0 d, 21 h, 19 m, 10 s",
"git_hash": "30622caf67bb4384b73747abb17733e5ad9989a8",
"compile_time": "Fri Feb 17 10:20:06 UTC 2023",
"compiled_by": "root",
"compiled_in": "02a18b9e9dcd",
"release_date": "Fri Feb 17 10:20:06 UTC 2023",
"machine": "x86_64",
"doc": "https://fiware-orion.rtfd.io/en/3.8.1/",
"libversions": {
"boost": "1_74",
"libcurl": "libcurl/7.74.0 OpenSSL/1.1.1n zlib/1.2.12 brotli/1.0.9 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.3.0) libssh2/1.9.0 nghttp2/1.43.0 librtmp/2.3",
"libmosquitto": "2.0.15",
"libmicrohttpd": "0.9.73",
"openssl": "1.1",
"rapidjson": "1.1.0",
"mongoc": "1.23.1",
"bson": "1.23.1"
}
}
}

2. Check IOT Agent about:

  • GET request to:
http://192.168.33.69:4041/iot/about
  • The output should be like this:
{
"libVersion": "2.21.0",
"port": 4041,
"baseRoot": "/",
"version": "1.2.5"
}

3. Add device to IOT Agent

  • POST request to:
http://192.168.33.69:4041/iot/devices
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • And this body(you should change the fields of: dev_eui, app_eui, application_id, application_key. You can get them from the chirpstack application.)
{
"devices": [
{
"device_id": "dht_001",
"entity_name": "DHT_001",
"entity_type": "DHT",
"timezone": "Europe/Berlin",
"attributes": [
{
"object_id": "rh1",
"name": "relative_humidity_1",
"type": "Number"
},
{
"object_id": "t1",
"name": "temperature_1",
"type": "Number"
}
],
"internal_attributes": {
"lorawan": {
"application_server": {
"host": "192.168.33.69",
"username": "admin",
"password": "admin",
"provider": "chirpstack"
},
"dev_eui": "8cf957200004c487",
"app_eui": "4569343567897875",
"application_id": "1",
"application_key": "75B7EBC63DA30B7C9E3BAE8DFFAE94B3",
"data_model": "cayennelpp"
}
}
}
]
}
  • The output should be like this with 201 status code
{}

4. Show the added device

  • GET request to:
http://192.168.33.69:4041/iot/devices
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be:
{
"count": 1,
"devices": [
{
"device_id": "dht_001",
"service": "smartroom",
"service_path": "/rooms",
"entity_name": "DHT_001",
"entity_type": "DHT",
"attributes": [
{
"object_id": "rh1",
"name": "relative_humidity_1",
"type": "Number"
},
{
"object_id": "t1",
"name": "temperature_1",
"type": "Number"
}
],
"lazy": [],
"commands": [],
"static_attributes": [],
"internal_attributes": {
"lorawan": {
"application_server": {
"host": "192.168.33.69",
"username": "admin",
"password": "admin",
"provider": "chirpstack"
},
"dev_eui": "8cf957200004c487",
"app_eui": "4569343567897875",
"application_id": "1",
"application_key": "75B7EBC63DA30B7C9E3BAE8DFFAE94B3",
"data_model": "cayennelpp"
}
}
}
]
}

5. Show the DHT11 entity from Orion context broker

  • GET request to:
http://192.168.33.69:1026/v2/entities/DHT_001
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be:
{
"id": "DHT_001",
"type": "DHT",
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z",
"metadata": {}
},
"relative_humidity_1": {
"type": "Number",
"value": 62,
"metadata": {
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z"
}
}
},
"temperature_1": {
"type": "Number",
"value": 26,
"metadata": {
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z"
}
}
}
}

6. Check Quantumleap version

  • GET request to:
http://192.168.33.69:8668/version
  • The output should be like this:
{
"version": "0.8.x"
}

7. Add subscription to Orion context broker

  • POST request to:
http://192.168.33.69:1026/v2/subscriptions
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • And this body:
{
"description": "Notify QuantumLeap of all DHT Sensor changes",
"subject": {
"entities": [
{
"idPattern": "DHT*"
}
],
"condition": {
"attrs": [
"relative_humidity_1",
"temperature_1"
]
}
},
"notification": {
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"attrs": [
"relative_humidity_1",
"temperature_1"
],
"metadata": ["dateCreated", "dateModified"]
}
}
  • This should return an empty response body with a 201 status code

8. Show the created subscription

  • GET request to:
http://192.168.33.69:1026/v2/subscriptions
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be like this:
[
{
"id": "646e24594282b5b0b902b9ce",
"description": "Notify QuantumLeap of all DHT Sensor changes",
"status": "active",
"subject": {
"entities": [
{
"idPattern": "DHT*"
}
],
"condition": {
"attrs": [
"relative_humidity_1",
"temperature_1"
]
}
},
"notification": {
"timesSent": 1,
"lastNotification": "2023-05-24T14:51:06.000Z",
"attrs": [
"relative_humidity_1",
"temperature_1"
],
"onlyChangedAttrs": false,
"attrsFormat": "normalized",
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"metadata": [
"dateCreated",
"dateModified"
],
"lastSuccess": "2023-05-24T14:51:06.000Z",
"lastSuccessCode": 200,
"covered": false
}
}
]

9. Show records history from quantumleap

  • GET request to:
http://192.168.33.69:8668/v2/entities/DHT_001
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be like this:
{
"attributes": [
{
"attrName": "TimeInstant",
"values": [
null,
null,
null,
null,
null
]
},
{
"attrName": "relative_humidity_1",
"values": [
62.0,
62.0,
62.0,
62.0,
61.0
]
},
{
"attrName": "temperature_1",
"values": [
26.0,
26.0,
26.0,
27.0,
26.0
]
}
],
"entityId": "DHT_001",
"index": [
"2023-05-24T14:50:16.840+00:00",
"2023-05-24T14:50:26.865+00:00",
"2023-05-24T14:50:36.888+00:00",
"2023-05-24T14:50:46.908+00:00",
"2023-05-24T14:51:06.962+00:00"
]
}

Grafana visualisation

  • Navigate to http://192.168.33.69:3000 and log in with default credentials which are: admin / admin

  • Add a new data source using the following parameters:

image

  • Import the dashboard located in: grafana_dashboard folder.

image

  • The final result should look like this:

image

About

Deploiement d'un réseau IoT lorawan Multitenant sur le technopole ElGhazala

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

LoraWan

Deploiement d'un réseau IoT lorawan Multitenant sur le technopole ElGhazala

Project Description

Deployment of a Lorawan Multitenant IoT network on the ElGhazala technopole This involves installing 3 gateways connected to the ChirpStack network server. For a user to exploit the network, simply he should ask the admin to create a tenant on Chirpstack and assign it as admin to that tenant. The admin adds shared gateways to all tenants. Now the user can create applications and can add the end-devices associated to his application. This project targets all students, PhD students and teachers of Sup'Com as well as professionals in partnership.

Tutorial using Chirpstack v3

Prerequisites

  • A single machine running a Linux based operating system.

  • A single machine running a Windows based operating system for monitoring / administration.

  • Docker version 23.0.5 and Docker Compose version 2.17.3 is used in this tutorial. Detailed installation instructions can be found here.

  • Arduino IDE. Detailed installation instructions can be found here.

  • Postman. Detailed installation instructions can be found here.

  • Git

sudo apt-get install git

Chirpstack v3 setup

  • To install Chirpstack v3 with docker, follow the next steps.
git clone https://github.com/chirpstack/chirpstack-docker.git
cd chirpstack-docker
git checkout v3
docker compose up
  • To check whether the installation was successful go to the server IP on port 8080. In the following tutorial my server IP address is 192.168.33.69.

Hardware

  • A seeeduino lorawana gateway kit. For further details on the kit visit this wiki page
  • A DHT11 temperatur and humidity sensor.

Architecture

The tutorial allows the deployment of the following system, comprising a basic FIWARE IoT stack:

image

  • A LoRaWAN end-node based on an Seeeduino LoRaWAN development board. In our application, the device will readtemperatur and humidity values from the DHT11 sensor, encode the information using CayenneLpp data model and forward the result to Chirpstack LoRaWAN stack through the gateways.
  • The LoRaWAN gateway plays the role of a concentrator which forwards the messages to the LoRaWAN network server, included in Chirpstack v3 stack.
  • Chirpstack v3 stack implements the functionalities of the LoRaWAN network server and LoRaWAN application server.
  • FIWARE IoT Agent enables the ingestion of data from LoRaWAN application servers in NGSI context brokers, subscribing to appropriate communication channels (i.e., MQTT topics), decoding payloads and translating them to NGSI data model. It relies on a MongoDB database to persist information.
  • FIWARE Context Broker manages large-scale context information abstracting the type of data source and the underlying communication technologies. It relies on a MongoDB database to persist information.
  • FIWARE Quantum Leap subscribes to notifications of new data ingested by FIWARE Context Brokers and stores the historical information in time-series format. It relies on a CrateDB database to persist information.
  • Grafana provides an easy and intuitive mechanism to visualize and explore data by means of fashionable dashboards.

Clone the GitHub repository

All the code and files needed to follow this tutorial are included in FiwareAtSupCom\LoraWan GitHub repository. To clone the repository:

git clone https://github.com/FiwareAtSupCom/LoraWan.git

Gateway configuration

To configure the gateway for forwarding lorawan packets to the network server, you need to follow the next steps.

  • Hardware connection.
  • Open gateway terminal (over Serial or SSH). You can follow the instructions in the Seeeduino getting started section.
  • Configure the gateway to forward the lorawan packets to chirpstack server:
nano /home/rxhf/risinghf/pktfwd/local_conf.json

Change the server_address to your chirpstack server IP address, change serv_port_up and server_port_down to 1700, and keep the gateway_ID, we will need it later.

{
"gateway_conf": {
"gateway_ID": "b827ebfffe0e1174",
"autoquit_threshold": 5,
"server_address": "SERVER_ADDRESS",
"serv_port_up": 1700,
"serv_port_down": 1700
}
}
  • To apply the changes reboot the gateway:
sudo reboot

Adding the gateway to Chirpstack

  • Go to the web UI of chirpstack following this link: http://192.168.33.69:8080 and login using "admin" as a username and a password.

  • Add a network server:

image

  • Add a new service profile.

  • Add a new gateway:

image

  • Verify that the gateway is active in the dashboard.

image

Adding Application and device

  • Add a new device profile and make sure to check OTAA mode support and CayenneLPP as a codec:

image

  • Add an application.

  • Add a device to the created application using the device profile. For that you will need to generate an Appkey (that you need to keep for the next step)and the DEV EUI which you can get following Seeeduino AT communication section.

image

End node setup

  • Open the end node device sketch located in seeeduino_lorawana_end_device/end_node_cayenneLPP_payload_OTAA.

  • Install the required libraries and seeeduino lorawan board. You can follow this tutorial.
  • Change the appkey generated in the previous step.
  • Upload the code to the board and make the wiring as shown in the next figure.

Deploy FIWARE Stack

  • We will create the FIWARE stack containers using the following command.
docker compose -f docker/fiware/docker-compose.yml
  • For the containers administration and visualisation we will use Portainer web UI installed using the previous cmd.(You will need to create an account.)

  • You can open the UI interface using this link: https://192.168.33.69:9443

image

  • Import the Postman workspace located in "postman/fiware1.postman_collection.json" which containes the needed HTTP requests.

1. Check Orion version

  • GET request to:
http://192.168.33.69:1026/version
  • The output should be like this:
{
"orion": {
"version": "3.8.1",
"uptime": "0 d, 21 h, 19 m, 10 s",
"git_hash": "30622caf67bb4384b73747abb17733e5ad9989a8",
"compile_time": "Fri Feb 17 10:20:06 UTC 2023",
"compiled_by": "root",
"compiled_in": "02a18b9e9dcd",
"release_date": "Fri Feb 17 10:20:06 UTC 2023",
"machine": "x86_64",
"doc": "https://fiware-orion.rtfd.io/en/3.8.1/",
"libversions": {
"boost": "1_74",
"libcurl": "libcurl/7.74.0 OpenSSL/1.1.1n zlib/1.2.12 brotli/1.0.9 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.3.0) libssh2/1.9.0 nghttp2/1.43.0 librtmp/2.3",
"libmosquitto": "2.0.15",
"libmicrohttpd": "0.9.73",
"openssl": "1.1",
"rapidjson": "1.1.0",
"mongoc": "1.23.1",
"bson": "1.23.1"
}
}
}

2. Check IOT Agent about:

  • GET request to:
http://192.168.33.69:4041/iot/about
  • The output should be like this:
{
"libVersion": "2.21.0",
"port": 4041,
"baseRoot": "/",
"version": "1.2.5"
}

3. Add device to IOT Agent

  • POST request to:
http://192.168.33.69:4041/iot/devices
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • And this body(you should change the fields of: dev_eui, app_eui, application_id, application_key. You can get them from the chirpstack application.)
{
"devices": [
{
"device_id": "dht_001",
"entity_name": "DHT_001",
"entity_type": "DHT",
"timezone": "Europe/Berlin",
"attributes": [
{
"object_id": "rh1",
"name": "relative_humidity_1",
"type": "Number"
},
{
"object_id": "t1",
"name": "temperature_1",
"type": "Number"
}
],
"internal_attributes": {
"lorawan": {
"application_server": {
"host": "192.168.33.69",
"username": "admin",
"password": "admin",
"provider": "chirpstack"
},
"dev_eui": "8cf957200004c487",
"app_eui": "4569343567897875",
"application_id": "1",
"application_key": "75B7EBC63DA30B7C9E3BAE8DFFAE94B3",
"data_model": "cayennelpp"
}
}
}
]
}
  • The output should be like this with 201 status code
{}

4. Show the added device

  • GET request to:
http://192.168.33.69:4041/iot/devices
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be:
{
"count": 1,
"devices": [
{
"device_id": "dht_001",
"service": "smartroom",
"service_path": "/rooms",
"entity_name": "DHT_001",
"entity_type": "DHT",
"attributes": [
{
"object_id": "rh1",
"name": "relative_humidity_1",
"type": "Number"
},
{
"object_id": "t1",
"name": "temperature_1",
"type": "Number"
}
],
"lazy": [],
"commands": [],
"static_attributes": [],
"internal_attributes": {
"lorawan": {
"application_server": {
"host": "192.168.33.69",
"username": "admin",
"password": "admin",
"provider": "chirpstack"
},
"dev_eui": "8cf957200004c487",
"app_eui": "4569343567897875",
"application_id": "1",
"application_key": "75B7EBC63DA30B7C9E3BAE8DFFAE94B3",
"data_model": "cayennelpp"
}
}
}
]
}

5. Show the DHT11 entity from Orion context broker

  • GET request to:
http://192.168.33.69:1026/v2/entities/DHT_001
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be:
{
"id": "DHT_001",
"type": "DHT",
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z",
"metadata": {}
},
"relative_humidity_1": {
"type": "Number",
"value": 62,
"metadata": {
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z"
}
}
},
"temperature_1": {
"type": "Number",
"value": 26,
"metadata": {
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z"
}
}
}
}

6. Check Quantumleap version

  • GET request to:
http://192.168.33.69:8668/version
  • The output should be like this:
{
"version": "0.8.x"
}

7. Add subscription to Orion context broker

  • POST request to:
http://192.168.33.69:1026/v2/subscriptions
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • And this body:
{
"description": "Notify QuantumLeap of all DHT Sensor changes",
"subject": {
"entities": [
{
"idPattern": "DHT*"
}
],
"condition": {
"attrs": [
"relative_humidity_1",
"temperature_1"
]
}
},
"notification": {
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"attrs": [
"relative_humidity_1",
"temperature_1"
],
"metadata": ["dateCreated", "dateModified"]
}
}
  • This should return an empty response body with a 201 status code

8. Show the created subscription

  • GET request to:
http://192.168.33.69:1026/v2/subscriptions
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be like this:
[
{
"id": "646e24594282b5b0b902b9ce",
"description": "Notify QuantumLeap of all DHT Sensor changes",
"status": "active",
"subject": {
"entities": [
{
"idPattern": "DHT*"
}
],
"condition": {
"attrs": [
"relative_humidity_1",
"temperature_1"
]
}
},
"notification": {
"timesSent": 1,
"lastNotification": "2023-05-24T14:51:06.000Z",
"attrs": [
"relative_humidity_1",
"temperature_1"
],
"onlyChangedAttrs": false,
"attrsFormat": "normalized",
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"metadata": [
"dateCreated",
"dateModified"
],
"lastSuccess": "2023-05-24T14:51:06.000Z",
"lastSuccessCode": 200,
"covered": false
}
}
]

9. Show records history from quantumleap

  • GET request to:
http://192.168.33.69:8668/v2/entities/DHT_001
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be like this:
{
"attributes": [
{
"attrName": "TimeInstant",
"values": [
null,
null,
null,
null,
null
]
},
{
"attrName": "relative_humidity_1",
"values": [
62.0,
62.0,
62.0,
62.0,
61.0
]
},
{
"attrName": "temperature_1",
"values": [
26.0,
26.0,
26.0,
27.0,
26.0
]
}
],
"entityId": "DHT_001",
"index": [
"2023-05-24T14:50:16.840+00:00",
"2023-05-24T14:50:26.865+00:00",
"2023-05-24T14:50:36.888+00:00",
"2023-05-24T14:50:46.908+00:00",
"2023-05-24T14:51:06.962+00:00"
]
}

Grafana visualisation

  • Navigate to http://192.168.33.69:3000 and log in with default credentials which are: admin / admin

  • Add a new data source using the following parameters:

image

  • Import the dashboard located in: grafana_dashboard folder.

image

  • The final result should look like this:

image

About

Deploiement d'un réseau IoT lorawan Multitenant sur le technopole ElGhazala

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

LoraWan

Deploiement d'un réseau IoT lorawan Multitenant sur le technopole ElGhazala

Project Description

Deployment of a Lorawan Multitenant IoT network on the ElGhazala technopole This involves installing 3 gateways connected to the ChirpStack network server. For a user to exploit the network, simply he should ask the admin to create a tenant on Chirpstack and assign it as admin to that tenant. The admin adds shared gateways to all tenants. Now the user can create applications and can add the end-devices associated to his application. This project targets all students, PhD students and teachers of Sup'Com as well as professionals in partnership.

Tutorial using Chirpstack v3

Prerequisites

  • A single machine running a Linux based operating system.

  • A single machine running a Windows based operating system for monitoring / administration.

  • Docker version 23.0.5 and Docker Compose version 2.17.3 is used in this tutorial. Detailed installation instructions can be found here.

  • Arduino IDE. Detailed installation instructions can be found here.

  • Postman. Detailed installation instructions can be found here.

  • Git

sudo apt-get install git

Chirpstack v3 setup

  • To install Chirpstack v3 with docker, follow the next steps.
git clone https://github.com/chirpstack/chirpstack-docker.git
cd chirpstack-docker
git checkout v3
docker compose up
  • To check whether the installation was successful go to the server IP on port 8080. In the following tutorial my server IP address is 192.168.33.69.

Hardware

  • A seeeduino lorawana gateway kit. For further details on the kit visit this wiki page
  • A DHT11 temperatur and humidity sensor.

Architecture

The tutorial allows the deployment of the following system, comprising a basic FIWARE IoT stack:

image

  • A LoRaWAN end-node based on an Seeeduino LoRaWAN development board. In our application, the device will readtemperatur and humidity values from the DHT11 sensor, encode the information using CayenneLpp data model and forward the result to Chirpstack LoRaWAN stack through the gateways.
  • The LoRaWAN gateway plays the role of a concentrator which forwards the messages to the LoRaWAN network server, included in Chirpstack v3 stack.
  • Chirpstack v3 stack implements the functionalities of the LoRaWAN network server and LoRaWAN application server.
  • FIWARE IoT Agent enables the ingestion of data from LoRaWAN application servers in NGSI context brokers, subscribing to appropriate communication channels (i.e., MQTT topics), decoding payloads and translating them to NGSI data model. It relies on a MongoDB database to persist information.
  • FIWARE Context Broker manages large-scale context information abstracting the type of data source and the underlying communication technologies. It relies on a MongoDB database to persist information.
  • FIWARE Quantum Leap subscribes to notifications of new data ingested by FIWARE Context Brokers and stores the historical information in time-series format. It relies on a CrateDB database to persist information.
  • Grafana provides an easy and intuitive mechanism to visualize and explore data by means of fashionable dashboards.

Clone the GitHub repository

All the code and files needed to follow this tutorial are included in FiwareAtSupCom\LoraWan GitHub repository. To clone the repository:

git clone https://github.com/FiwareAtSupCom/LoraWan.git

Gateway configuration

To configure the gateway for forwarding lorawan packets to the network server, you need to follow the next steps.

  • Hardware connection.
  • Open gateway terminal (over Serial or SSH). You can follow the instructions in the Seeeduino getting started section.
  • Configure the gateway to forward the lorawan packets to chirpstack server:
nano /home/rxhf/risinghf/pktfwd/local_conf.json

Change the server_address to your chirpstack server IP address, change serv_port_up and server_port_down to 1700, and keep the gateway_ID, we will need it later.

{
"gateway_conf": {
"gateway_ID": "b827ebfffe0e1174",
"autoquit_threshold": 5,
"server_address": "SERVER_ADDRESS",
"serv_port_up": 1700,
"serv_port_down": 1700
}
}
  • To apply the changes reboot the gateway:
sudo reboot

Adding the gateway to Chirpstack

  • Go to the web UI of chirpstack following this link: http://192.168.33.69:8080 and login using "admin" as a username and a password.

  • Add a network server:

image

  • Add a new service profile.

  • Add a new gateway:

image

  • Verify that the gateway is active in the dashboard.

image

Adding Application and device

  • Add a new device profile and make sure to check OTAA mode support and CayenneLPP as a codec:

image

  • Add an application.

  • Add a device to the created application using the device profile. For that you will need to generate an Appkey (that you need to keep for the next step)and the DEV EUI which you can get following Seeeduino AT communication section.

image

End node setup

  • Open the end node device sketch located in seeeduino_lorawana_end_device/end_node_cayenneLPP_payload_OTAA.

  • Install the required libraries and seeeduino lorawan board. You can follow this tutorial.
  • Change the appkey generated in the previous step.
  • Upload the code to the board and make the wiring as shown in the next figure.

Deploy FIWARE Stack

  • We will create the FIWARE stack containers using the following command.
docker compose -f docker/fiware/docker-compose.yml
  • For the containers administration and visualisation we will use Portainer web UI installed using the previous cmd.(You will need to create an account.)

  • You can open the UI interface using this link: https://192.168.33.69:9443

image

  • Import the Postman workspace located in "postman/fiware1.postman_collection.json" which containes the needed HTTP requests.

1. Check Orion version

  • GET request to:
http://192.168.33.69:1026/version
  • The output should be like this:
{
"orion": {
"version": "3.8.1",
"uptime": "0 d, 21 h, 19 m, 10 s",
"git_hash": "30622caf67bb4384b73747abb17733e5ad9989a8",
"compile_time": "Fri Feb 17 10:20:06 UTC 2023",
"compiled_by": "root",
"compiled_in": "02a18b9e9dcd",
"release_date": "Fri Feb 17 10:20:06 UTC 2023",
"machine": "x86_64",
"doc": "https://fiware-orion.rtfd.io/en/3.8.1/",
"libversions": {
"boost": "1_74",
"libcurl": "libcurl/7.74.0 OpenSSL/1.1.1n zlib/1.2.12 brotli/1.0.9 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.3.0) libssh2/1.9.0 nghttp2/1.43.0 librtmp/2.3",
"libmosquitto": "2.0.15",
"libmicrohttpd": "0.9.73",
"openssl": "1.1",
"rapidjson": "1.1.0",
"mongoc": "1.23.1",
"bson": "1.23.1"
}
}
}

2. Check IOT Agent about:

  • GET request to:
http://192.168.33.69:4041/iot/about
  • The output should be like this:
{
"libVersion": "2.21.0",
"port": 4041,
"baseRoot": "/",
"version": "1.2.5"
}

3. Add device to IOT Agent

  • POST request to:
http://192.168.33.69:4041/iot/devices
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • And this body(you should change the fields of: dev_eui, app_eui, application_id, application_key. You can get them from the chirpstack application.)
{
"devices": [
{
"device_id": "dht_001",
"entity_name": "DHT_001",
"entity_type": "DHT",
"timezone": "Europe/Berlin",
"attributes": [
{
"object_id": "rh1",
"name": "relative_humidity_1",
"type": "Number"
},
{
"object_id": "t1",
"name": "temperature_1",
"type": "Number"
}
],
"internal_attributes": {
"lorawan": {
"application_server": {
"host": "192.168.33.69",
"username": "admin",
"password": "admin",
"provider": "chirpstack"
},
"dev_eui": "8cf957200004c487",
"app_eui": "4569343567897875",
"application_id": "1",
"application_key": "75B7EBC63DA30B7C9E3BAE8DFFAE94B3",
"data_model": "cayennelpp"
}
}
}
]
}
  • The output should be like this with 201 status code
{}

4. Show the added device

  • GET request to:
http://192.168.33.69:4041/iot/devices
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be:
{
"count": 1,
"devices": [
{
"device_id": "dht_001",
"service": "smartroom",
"service_path": "/rooms",
"entity_name": "DHT_001",
"entity_type": "DHT",
"attributes": [
{
"object_id": "rh1",
"name": "relative_humidity_1",
"type": "Number"
},
{
"object_id": "t1",
"name": "temperature_1",
"type": "Number"
}
],
"lazy": [],
"commands": [],
"static_attributes": [],
"internal_attributes": {
"lorawan": {
"application_server": {
"host": "192.168.33.69",
"username": "admin",
"password": "admin",
"provider": "chirpstack"
},
"dev_eui": "8cf957200004c487",
"app_eui": "4569343567897875",
"application_id": "1",
"application_key": "75B7EBC63DA30B7C9E3BAE8DFFAE94B3",
"data_model": "cayennelpp"
}
}
}
]
}

5. Show the DHT11 entity from Orion context broker

  • GET request to:
http://192.168.33.69:1026/v2/entities/DHT_001
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be:
{
"id": "DHT_001",
"type": "DHT",
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z",
"metadata": {}
},
"relative_humidity_1": {
"type": "Number",
"value": 62,
"metadata": {
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z"
}
}
},
"temperature_1": {
"type": "Number",
"value": 26,
"metadata": {
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z"
}
}
}
}

6. Check Quantumleap version

  • GET request to:
http://192.168.33.69:8668/version
  • The output should be like this:
{
"version": "0.8.x"
}

7. Add subscription to Orion context broker

  • POST request to:
http://192.168.33.69:1026/v2/subscriptions
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • And this body:
{
"description": "Notify QuantumLeap of all DHT Sensor changes",
"subject": {
"entities": [
{
"idPattern": "DHT*"
}
],
"condition": {
"attrs": [
"relative_humidity_1",
"temperature_1"
]
}
},
"notification": {
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"attrs": [
"relative_humidity_1",
"temperature_1"
],
"metadata": ["dateCreated", "dateModified"]
}
}
  • This should return an empty response body with a 201 status code

8. Show the created subscription

  • GET request to:
http://192.168.33.69:1026/v2/subscriptions
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be like this:
[
{
"id": "646e24594282b5b0b902b9ce",
"description": "Notify QuantumLeap of all DHT Sensor changes",
"status": "active",
"subject": {
"entities": [
{
"idPattern": "DHT*"
}
],
"condition": {
"attrs": [
"relative_humidity_1",
"temperature_1"
]
}
},
"notification": {
"timesSent": 1,
"lastNotification": "2023-05-24T14:51:06.000Z",
"attrs": [
"relative_humidity_1",
"temperature_1"
],
"onlyChangedAttrs": false,
"attrsFormat": "normalized",
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"metadata": [
"dateCreated",
"dateModified"
],
"lastSuccess": "2023-05-24T14:51:06.000Z",
"lastSuccessCode": 200,
"covered": false
}
}
]

9. Show records history from quantumleap

  • GET request to:
http://192.168.33.69:8668/v2/entities/DHT_001
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be like this:
{
"attributes": [
{
"attrName": "TimeInstant",
"values": [
null,
null,
null,
null,
null
]
},
{
"attrName": "relative_humidity_1",
"values": [
62.0,
62.0,
62.0,
62.0,
61.0
]
},
{
"attrName": "temperature_1",
"values": [
26.0,
26.0,
26.0,
27.0,
26.0
]
}
],
"entityId": "DHT_001",
"index": [
"2023-05-24T14:50:16.840+00:00",
"2023-05-24T14:50:26.865+00:00",
"2023-05-24T14:50:36.888+00:00",
"2023-05-24T14:50:46.908+00:00",
"2023-05-24T14:51:06.962+00:00"
]
}

Grafana visualisation

  • Navigate to http://192.168.33.69:3000 and log in with default credentials which are: admin / admin

  • Add a new data source using the following parameters:

image

  • Import the dashboard located in: grafana_dashboard folder.

image

  • The final result should look like this:

image

About

Deploiement d'un réseau IoT lorawan Multitenant sur le technopole ElGhazala

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

LoraWan

Deploiement d'un réseau IoT lorawan Multitenant sur le technopole ElGhazala

Project Description

Deployment of a Lorawan Multitenant IoT network on the ElGhazala technopole This involves installing 3 gateways connected to the ChirpStack network server. For a user to exploit the network, simply he should ask the admin to create a tenant on Chirpstack and assign it as admin to that tenant. The admin adds shared gateways to all tenants. Now the user can create applications and can add the end-devices associated to his application. This project targets all students, PhD students and teachers of Sup'Com as well as professionals in partnership.

Tutorial using Chirpstack v3

Prerequisites

  • A single machine running a Linux based operating system.

  • A single machine running a Windows based operating system for monitoring / administration.

  • Docker version 23.0.5 and Docker Compose version 2.17.3 is used in this tutorial. Detailed installation instructions can be found here.

  • Arduino IDE. Detailed installation instructions can be found here.

  • Postman. Detailed installation instructions can be found here.

  • Git

sudo apt-get install git

Chirpstack v3 setup

  • To install Chirpstack v3 with docker, follow the next steps.
git clone https://github.com/chirpstack/chirpstack-docker.git
cd chirpstack-docker
git checkout v3
docker compose up
  • To check whether the installation was successful go to the server IP on port 8080. In the following tutorial my server IP address is 192.168.33.69.

Hardware

  • A seeeduino lorawana gateway kit. For further details on the kit visit this wiki page
  • A DHT11 temperatur and humidity sensor.

Architecture

The tutorial allows the deployment of the following system, comprising a basic FIWARE IoT stack:

image

  • A LoRaWAN end-node based on an Seeeduino LoRaWAN development board. In our application, the device will readtemperatur and humidity values from the DHT11 sensor, encode the information using CayenneLpp data model and forward the result to Chirpstack LoRaWAN stack through the gateways.
  • The LoRaWAN gateway plays the role of a concentrator which forwards the messages to the LoRaWAN network server, included in Chirpstack v3 stack.
  • Chirpstack v3 stack implements the functionalities of the LoRaWAN network server and LoRaWAN application server.
  • FIWARE IoT Agent enables the ingestion of data from LoRaWAN application servers in NGSI context brokers, subscribing to appropriate communication channels (i.e., MQTT topics), decoding payloads and translating them to NGSI data model. It relies on a MongoDB database to persist information.
  • FIWARE Context Broker manages large-scale context information abstracting the type of data source and the underlying communication technologies. It relies on a MongoDB database to persist information.
  • FIWARE Quantum Leap subscribes to notifications of new data ingested by FIWARE Context Brokers and stores the historical information in time-series format. It relies on a CrateDB database to persist information.
  • Grafana provides an easy and intuitive mechanism to visualize and explore data by means of fashionable dashboards.

Clone the GitHub repository

All the code and files needed to follow this tutorial are included in FiwareAtSupCom\LoraWan GitHub repository. To clone the repository:

git clone https://github.com/FiwareAtSupCom/LoraWan.git

Gateway configuration

To configure the gateway for forwarding lorawan packets to the network server, you need to follow the next steps.

  • Hardware connection.
  • Open gateway terminal (over Serial or SSH). You can follow the instructions in the Seeeduino getting started section.
  • Configure the gateway to forward the lorawan packets to chirpstack server:
nano /home/rxhf/risinghf/pktfwd/local_conf.json

Change the server_address to your chirpstack server IP address, change serv_port_up and server_port_down to 1700, and keep the gateway_ID, we will need it later.

{
"gateway_conf": {
"gateway_ID": "b827ebfffe0e1174",
"autoquit_threshold": 5,
"server_address": "SERVER_ADDRESS",
"serv_port_up": 1700,
"serv_port_down": 1700
}
}
  • To apply the changes reboot the gateway:
sudo reboot

Adding the gateway to Chirpstack

  • Go to the web UI of chirpstack following this link: http://192.168.33.69:8080 and login using "admin" as a username and a password.

  • Add a network server:

image

  • Add a new service profile.

  • Add a new gateway:

image

  • Verify that the gateway is active in the dashboard.

image

Adding Application and device

  • Add a new device profile and make sure to check OTAA mode support and CayenneLPP as a codec:

image

  • Add an application.

  • Add a device to the created application using the device profile. For that you will need to generate an Appkey (that you need to keep for the next step)and the DEV EUI which you can get following Seeeduino AT communication section.

image

End node setup

  • Open the end node device sketch located in seeeduino_lorawana_end_device/end_node_cayenneLPP_payload_OTAA.

  • Install the required libraries and seeeduino lorawan board. You can follow this tutorial.
  • Change the appkey generated in the previous step.
  • Upload the code to the board and make the wiring as shown in the next figure.

Deploy FIWARE Stack

  • We will create the FIWARE stack containers using the following command.
docker compose -f docker/fiware/docker-compose.yml
  • For the containers administration and visualisation we will use Portainer web UI installed using the previous cmd.(You will need to create an account.)

  • You can open the UI interface using this link: https://192.168.33.69:9443

image

  • Import the Postman workspace located in "postman/fiware1.postman_collection.json" which containes the needed HTTP requests.

1. Check Orion version

  • GET request to:
http://192.168.33.69:1026/version
  • The output should be like this:
{
"orion": {
"version": "3.8.1",
"uptime": "0 d, 21 h, 19 m, 10 s",
"git_hash": "30622caf67bb4384b73747abb17733e5ad9989a8",
"compile_time": "Fri Feb 17 10:20:06 UTC 2023",
"compiled_by": "root",
"compiled_in": "02a18b9e9dcd",
"release_date": "Fri Feb 17 10:20:06 UTC 2023",
"machine": "x86_64",
"doc": "https://fiware-orion.rtfd.io/en/3.8.1/",
"libversions": {
"boost": "1_74",
"libcurl": "libcurl/7.74.0 OpenSSL/1.1.1n zlib/1.2.12 brotli/1.0.9 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.3.0) libssh2/1.9.0 nghttp2/1.43.0 librtmp/2.3",
"libmosquitto": "2.0.15",
"libmicrohttpd": "0.9.73",
"openssl": "1.1",
"rapidjson": "1.1.0",
"mongoc": "1.23.1",
"bson": "1.23.1"
}
}
}

2. Check IOT Agent about:

  • GET request to:
http://192.168.33.69:4041/iot/about
  • The output should be like this:
{
"libVersion": "2.21.0",
"port": 4041,
"baseRoot": "/",
"version": "1.2.5"
}

3. Add device to IOT Agent

  • POST request to:
http://192.168.33.69:4041/iot/devices
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • And this body(you should change the fields of: dev_eui, app_eui, application_id, application_key. You can get them from the chirpstack application.)
{
"devices": [
{
"device_id": "dht_001",
"entity_name": "DHT_001",
"entity_type": "DHT",
"timezone": "Europe/Berlin",
"attributes": [
{
"object_id": "rh1",
"name": "relative_humidity_1",
"type": "Number"
},
{
"object_id": "t1",
"name": "temperature_1",
"type": "Number"
}
],
"internal_attributes": {
"lorawan": {
"application_server": {
"host": "192.168.33.69",
"username": "admin",
"password": "admin",
"provider": "chirpstack"
},
"dev_eui": "8cf957200004c487",
"app_eui": "4569343567897875",
"application_id": "1",
"application_key": "75B7EBC63DA30B7C9E3BAE8DFFAE94B3",
"data_model": "cayennelpp"
}
}
}
]
}
  • The output should be like this with 201 status code
{}

4. Show the added device

  • GET request to:
http://192.168.33.69:4041/iot/devices
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be:
{
"count": 1,
"devices": [
{
"device_id": "dht_001",
"service": "smartroom",
"service_path": "/rooms",
"entity_name": "DHT_001",
"entity_type": "DHT",
"attributes": [
{
"object_id": "rh1",
"name": "relative_humidity_1",
"type": "Number"
},
{
"object_id": "t1",
"name": "temperature_1",
"type": "Number"
}
],
"lazy": [],
"commands": [],
"static_attributes": [],
"internal_attributes": {
"lorawan": {
"application_server": {
"host": "192.168.33.69",
"username": "admin",
"password": "admin",
"provider": "chirpstack"
},
"dev_eui": "8cf957200004c487",
"app_eui": "4569343567897875",
"application_id": "1",
"application_key": "75B7EBC63DA30B7C9E3BAE8DFFAE94B3",
"data_model": "cayennelpp"
}
}
}
]
}

5. Show the DHT11 entity from Orion context broker

  • GET request to:
http://192.168.33.69:1026/v2/entities/DHT_001
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be:
{
"id": "DHT_001",
"type": "DHT",
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z",
"metadata": {}
},
"relative_humidity_1": {
"type": "Number",
"value": 62,
"metadata": {
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z"
}
}
},
"temperature_1": {
"type": "Number",
"value": 26,
"metadata": {
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z"
}
}
}
}

6. Check Quantumleap version

  • GET request to:
http://192.168.33.69:8668/version
  • The output should be like this:
{
"version": "0.8.x"
}

7. Add subscription to Orion context broker

  • POST request to:
http://192.168.33.69:1026/v2/subscriptions
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • And this body:
{
"description": "Notify QuantumLeap of all DHT Sensor changes",
"subject": {
"entities": [
{
"idPattern": "DHT*"
}
],
"condition": {
"attrs": [
"relative_humidity_1",
"temperature_1"
]
}
},
"notification": {
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"attrs": [
"relative_humidity_1",
"temperature_1"
],
"metadata": ["dateCreated", "dateModified"]
}
}
  • This should return an empty response body with a 201 status code

8. Show the created subscription

  • GET request to:
http://192.168.33.69:1026/v2/subscriptions
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be like this:
[
{
"id": "646e24594282b5b0b902b9ce",
"description": "Notify QuantumLeap of all DHT Sensor changes",
"status": "active",
"subject": {
"entities": [
{
"idPattern": "DHT*"
}
],
"condition": {
"attrs": [
"relative_humidity_1",
"temperature_1"
]
}
},
"notification": {
"timesSent": 1,
"lastNotification": "2023-05-24T14:51:06.000Z",
"attrs": [
"relative_humidity_1",
"temperature_1"
],
"onlyChangedAttrs": false,
"attrsFormat": "normalized",
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"metadata": [
"dateCreated",
"dateModified"
],
"lastSuccess": "2023-05-24T14:51:06.000Z",
"lastSuccessCode": 200,
"covered": false
}
}
]

9. Show records history from quantumleap

  • GET request to:
http://192.168.33.69:8668/v2/entities/DHT_001
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be like this:
{
"attributes": [
{
"attrName": "TimeInstant",
"values": [
null,
null,
null,
null,
null
]
},
{
"attrName": "relative_humidity_1",
"values": [
62.0,
62.0,
62.0,
62.0,
61.0
]
},
{
"attrName": "temperature_1",
"values": [
26.0,
26.0,
26.0,
27.0,
26.0
]
}
],
"entityId": "DHT_001",
"index": [
"2023-05-24T14:50:16.840+00:00",
"2023-05-24T14:50:26.865+00:00",
"2023-05-24T14:50:36.888+00:00",
"2023-05-24T14:50:46.908+00:00",
"2023-05-24T14:51:06.962+00:00"
]
}

Grafana visualisation

  • Navigate to http://192.168.33.69:3000 and log in with default credentials which are: admin / admin

  • Add a new data source using the following parameters:

image

  • Import the dashboard located in: grafana_dashboard folder.

image

  • The final result should look like this:

image

About

Deploiement d'un réseau IoT lorawan Multitenant sur le technopole ElGhazala

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

LoraWan

Deploiement d'un réseau IoT lorawan Multitenant sur le technopole ElGhazala

Project Description

Deployment of a Lorawan Multitenant IoT network on the ElGhazala technopole This involves installing 3 gateways connected to the ChirpStack network server. For a user to exploit the network, simply he should ask the admin to create a tenant on Chirpstack and assign it as admin to that tenant. The admin adds shared gateways to all tenants. Now the user can create applications and can add the end-devices associated to his application. This project targets all students, PhD students and teachers of Sup'Com as well as professionals in partnership.

Tutorial using Chirpstack v3

Prerequisites

  • A single machine running a Linux based operating system.

  • A single machine running a Windows based operating system for monitoring / administration.

  • Docker version 23.0.5 and Docker Compose version 2.17.3 is used in this tutorial. Detailed installation instructions can be found here.

  • Arduino IDE. Detailed installation instructions can be found here.

  • Postman. Detailed installation instructions can be found here.

  • Git

sudo apt-get install git

Chirpstack v3 setup

  • To install Chirpstack v3 with docker, follow the next steps.
git clone https://github.com/chirpstack/chirpstack-docker.git
cd chirpstack-docker
git checkout v3
docker compose up
  • To check whether the installation was successful go to the server IP on port 8080. In the following tutorial my server IP address is 192.168.33.69.

Hardware

  • A seeeduino lorawana gateway kit. For further details on the kit visit this wiki page
  • A DHT11 temperatur and humidity sensor.

Architecture

The tutorial allows the deployment of the following system, comprising a basic FIWARE IoT stack:

image

  • A LoRaWAN end-node based on an Seeeduino LoRaWAN development board. In our application, the device will readtemperatur and humidity values from the DHT11 sensor, encode the information using CayenneLpp data model and forward the result to Chirpstack LoRaWAN stack through the gateways.
  • The LoRaWAN gateway plays the role of a concentrator which forwards the messages to the LoRaWAN network server, included in Chirpstack v3 stack.
  • Chirpstack v3 stack implements the functionalities of the LoRaWAN network server and LoRaWAN application server.
  • FIWARE IoT Agent enables the ingestion of data from LoRaWAN application servers in NGSI context brokers, subscribing to appropriate communication channels (i.e., MQTT topics), decoding payloads and translating them to NGSI data model. It relies on a MongoDB database to persist information.
  • FIWARE Context Broker manages large-scale context information abstracting the type of data source and the underlying communication technologies. It relies on a MongoDB database to persist information.
  • FIWARE Quantum Leap subscribes to notifications of new data ingested by FIWARE Context Brokers and stores the historical information in time-series format. It relies on a CrateDB database to persist information.
  • Grafana provides an easy and intuitive mechanism to visualize and explore data by means of fashionable dashboards.

Clone the GitHub repository

All the code and files needed to follow this tutorial are included in FiwareAtSupCom\LoraWan GitHub repository. To clone the repository:

git clone https://github.com/FiwareAtSupCom/LoraWan.git

Gateway configuration

To configure the gateway for forwarding lorawan packets to the network server, you need to follow the next steps.

  • Hardware connection.
  • Open gateway terminal (over Serial or SSH). You can follow the instructions in the Seeeduino getting started section.
  • Configure the gateway to forward the lorawan packets to chirpstack server:
nano /home/rxhf/risinghf/pktfwd/local_conf.json

Change the server_address to your chirpstack server IP address, change serv_port_up and server_port_down to 1700, and keep the gateway_ID, we will need it later.

{
"gateway_conf": {
"gateway_ID": "b827ebfffe0e1174",
"autoquit_threshold": 5,
"server_address": "SERVER_ADDRESS",
"serv_port_up": 1700,
"serv_port_down": 1700
}
}
  • To apply the changes reboot the gateway:
sudo reboot

Adding the gateway to Chirpstack

  • Go to the web UI of chirpstack following this link: http://192.168.33.69:8080 and login using "admin" as a username and a password.

  • Add a network server:

image

  • Add a new service profile.

  • Add a new gateway:

image

  • Verify that the gateway is active in the dashboard.

image

Adding Application and device

  • Add a new device profile and make sure to check OTAA mode support and CayenneLPP as a codec:

image

  • Add an application.

  • Add a device to the created application using the device profile. For that you will need to generate an Appkey (that you need to keep for the next step)and the DEV EUI which you can get following Seeeduino AT communication section.

image

End node setup

  • Open the end node device sketch located in seeeduino_lorawana_end_device/end_node_cayenneLPP_payload_OTAA.

  • Install the required libraries and seeeduino lorawan board. You can follow this tutorial.
  • Change the appkey generated in the previous step.
  • Upload the code to the board and make the wiring as shown in the next figure.

Deploy FIWARE Stack

  • We will create the FIWARE stack containers using the following command.
docker compose -f docker/fiware/docker-compose.yml
  • For the containers administration and visualisation we will use Portainer web UI installed using the previous cmd.(You will need to create an account.)

  • You can open the UI interface using this link: https://192.168.33.69:9443

image

  • Import the Postman workspace located in "postman/fiware1.postman_collection.json" which containes the needed HTTP requests.

1. Check Orion version

  • GET request to:
http://192.168.33.69:1026/version
  • The output should be like this:
{
"orion": {
"version": "3.8.1",
"uptime": "0 d, 21 h, 19 m, 10 s",
"git_hash": "30622caf67bb4384b73747abb17733e5ad9989a8",
"compile_time": "Fri Feb 17 10:20:06 UTC 2023",
"compiled_by": "root",
"compiled_in": "02a18b9e9dcd",
"release_date": "Fri Feb 17 10:20:06 UTC 2023",
"machine": "x86_64",
"doc": "https://fiware-orion.rtfd.io/en/3.8.1/",
"libversions": {
"boost": "1_74",
"libcurl": "libcurl/7.74.0 OpenSSL/1.1.1n zlib/1.2.12 brotli/1.0.9 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.3.0) libssh2/1.9.0 nghttp2/1.43.0 librtmp/2.3",
"libmosquitto": "2.0.15",
"libmicrohttpd": "0.9.73",
"openssl": "1.1",
"rapidjson": "1.1.0",
"mongoc": "1.23.1",
"bson": "1.23.1"
}
}
}

2. Check IOT Agent about:

  • GET request to:
http://192.168.33.69:4041/iot/about
  • The output should be like this:
{
"libVersion": "2.21.0",
"port": 4041,
"baseRoot": "/",
"version": "1.2.5"
}

3. Add device to IOT Agent

  • POST request to:
http://192.168.33.69:4041/iot/devices
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • And this body(you should change the fields of: dev_eui, app_eui, application_id, application_key. You can get them from the chirpstack application.)
{
"devices": [
{
"device_id": "dht_001",
"entity_name": "DHT_001",
"entity_type": "DHT",
"timezone": "Europe/Berlin",
"attributes": [
{
"object_id": "rh1",
"name": "relative_humidity_1",
"type": "Number"
},
{
"object_id": "t1",
"name": "temperature_1",
"type": "Number"
}
],
"internal_attributes": {
"lorawan": {
"application_server": {
"host": "192.168.33.69",
"username": "admin",
"password": "admin",
"provider": "chirpstack"
},
"dev_eui": "8cf957200004c487",
"app_eui": "4569343567897875",
"application_id": "1",
"application_key": "75B7EBC63DA30B7C9E3BAE8DFFAE94B3",
"data_model": "cayennelpp"
}
}
}
]
}
  • The output should be like this with 201 status code
{}

4. Show the added device

  • GET request to:
http://192.168.33.69:4041/iot/devices
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be:
{
"count": 1,
"devices": [
{
"device_id": "dht_001",
"service": "smartroom",
"service_path": "/rooms",
"entity_name": "DHT_001",
"entity_type": "DHT",
"attributes": [
{
"object_id": "rh1",
"name": "relative_humidity_1",
"type": "Number"
},
{
"object_id": "t1",
"name": "temperature_1",
"type": "Number"
}
],
"lazy": [],
"commands": [],
"static_attributes": [],
"internal_attributes": {
"lorawan": {
"application_server": {
"host": "192.168.33.69",
"username": "admin",
"password": "admin",
"provider": "chirpstack"
},
"dev_eui": "8cf957200004c487",
"app_eui": "4569343567897875",
"application_id": "1",
"application_key": "75B7EBC63DA30B7C9E3BAE8DFFAE94B3",
"data_model": "cayennelpp"
}
}
}
]
}

5. Show the DHT11 entity from Orion context broker

  • GET request to:
http://192.168.33.69:1026/v2/entities/DHT_001
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be:
{
"id": "DHT_001",
"type": "DHT",
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z",
"metadata": {}
},
"relative_humidity_1": {
"type": "Number",
"value": 62,
"metadata": {
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z"
}
}
},
"temperature_1": {
"type": "Number",
"value": 26,
"metadata": {
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z"
}
}
}
}

6. Check Quantumleap version

  • GET request to:
http://192.168.33.69:8668/version
  • The output should be like this:
{
"version": "0.8.x"
}

7. Add subscription to Orion context broker

  • POST request to:
http://192.168.33.69:1026/v2/subscriptions
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • And this body:
{
"description": "Notify QuantumLeap of all DHT Sensor changes",
"subject": {
"entities": [
{
"idPattern": "DHT*"
}
],
"condition": {
"attrs": [
"relative_humidity_1",
"temperature_1"
]
}
},
"notification": {
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"attrs": [
"relative_humidity_1",
"temperature_1"
],
"metadata": ["dateCreated", "dateModified"]
}
}
  • This should return an empty response body with a 201 status code

8. Show the created subscription

  • GET request to:
http://192.168.33.69:1026/v2/subscriptions
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be like this:
[
{
"id": "646e24594282b5b0b902b9ce",
"description": "Notify QuantumLeap of all DHT Sensor changes",
"status": "active",
"subject": {
"entities": [
{
"idPattern": "DHT*"
}
],
"condition": {
"attrs": [
"relative_humidity_1",
"temperature_1"
]
}
},
"notification": {
"timesSent": 1,
"lastNotification": "2023-05-24T14:51:06.000Z",
"attrs": [
"relative_humidity_1",
"temperature_1"
],
"onlyChangedAttrs": false,
"attrsFormat": "normalized",
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"metadata": [
"dateCreated",
"dateModified"
],
"lastSuccess": "2023-05-24T14:51:06.000Z",
"lastSuccessCode": 200,
"covered": false
}
}
]

9. Show records history from quantumleap

  • GET request to:
http://192.168.33.69:8668/v2/entities/DHT_001
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be like this:
{
"attributes": [
{
"attrName": "TimeInstant",
"values": [
null,
null,
null,
null,
null
]
},
{
"attrName": "relative_humidity_1",
"values": [
62.0,
62.0,
62.0,
62.0,
61.0
]
},
{
"attrName": "temperature_1",
"values": [
26.0,
26.0,
26.0,
27.0,
26.0
]
}
],
"entityId": "DHT_001",
"index": [
"2023-05-24T14:50:16.840+00:00",
"2023-05-24T14:50:26.865+00:00",
"2023-05-24T14:50:36.888+00:00",
"2023-05-24T14:50:46.908+00:00",
"2023-05-24T14:51:06.962+00:00"
]
}

Grafana visualisation

  • Navigate to http://192.168.33.69:3000 and log in with default credentials which are: admin / admin

  • Add a new data source using the following parameters:

image

  • Import the dashboard located in: grafana_dashboard folder.

image

  • The final result should look like this:

image

About

Deploiement d'un réseau IoT lorawan Multitenant sur le technopole ElGhazala

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

LoraWan

Deploiement d'un réseau IoT lorawan Multitenant sur le technopole ElGhazala

Project Description

Deployment of a Lorawan Multitenant IoT network on the ElGhazala technopole This involves installing 3 gateways connected to the ChirpStack network server. For a user to exploit the network, simply he should ask the admin to create a tenant on Chirpstack and assign it as admin to that tenant. The admin adds shared gateways to all tenants. Now the user can create applications and can add the end-devices associated to his application. This project targets all students, PhD students and teachers of Sup'Com as well as professionals in partnership.

Tutorial using Chirpstack v3

Prerequisites

  • A single machine running a Linux based operating system.

  • A single machine running a Windows based operating system for monitoring / administration.

  • Docker version 23.0.5 and Docker Compose version 2.17.3 is used in this tutorial. Detailed installation instructions can be found here.

  • Arduino IDE. Detailed installation instructions can be found here.

  • Postman. Detailed installation instructions can be found here.

  • Git

sudo apt-get install git

Chirpstack v3 setup

  • To install Chirpstack v3 with docker, follow the next steps.
git clone https://github.com/chirpstack/chirpstack-docker.git
cd chirpstack-docker
git checkout v3
docker compose up
  • To check whether the installation was successful go to the server IP on port 8080. In the following tutorial my server IP address is 192.168.33.69.

Hardware

  • A seeeduino lorawana gateway kit. For further details on the kit visit this wiki page
  • A DHT11 temperatur and humidity sensor.

Architecture

The tutorial allows the deployment of the following system, comprising a basic FIWARE IoT stack:

image

  • A LoRaWAN end-node based on an Seeeduino LoRaWAN development board. In our application, the device will readtemperatur and humidity values from the DHT11 sensor, encode the information using CayenneLpp data model and forward the result to Chirpstack LoRaWAN stack through the gateways.
  • The LoRaWAN gateway plays the role of a concentrator which forwards the messages to the LoRaWAN network server, included in Chirpstack v3 stack.
  • Chirpstack v3 stack implements the functionalities of the LoRaWAN network server and LoRaWAN application server.
  • FIWARE IoT Agent enables the ingestion of data from LoRaWAN application servers in NGSI context brokers, subscribing to appropriate communication channels (i.e., MQTT topics), decoding payloads and translating them to NGSI data model. It relies on a MongoDB database to persist information.
  • FIWARE Context Broker manages large-scale context information abstracting the type of data source and the underlying communication technologies. It relies on a MongoDB database to persist information.
  • FIWARE Quantum Leap subscribes to notifications of new data ingested by FIWARE Context Brokers and stores the historical information in time-series format. It relies on a CrateDB database to persist information.
  • Grafana provides an easy and intuitive mechanism to visualize and explore data by means of fashionable dashboards.

Clone the GitHub repository

All the code and files needed to follow this tutorial are included in FiwareAtSupCom\LoraWan GitHub repository. To clone the repository:

git clone https://github.com/FiwareAtSupCom/LoraWan.git

Gateway configuration

To configure the gateway for forwarding lorawan packets to the network server, you need to follow the next steps.

  • Hardware connection.
  • Open gateway terminal (over Serial or SSH). You can follow the instructions in the Seeeduino getting started section.
  • Configure the gateway to forward the lorawan packets to chirpstack server:
nano /home/rxhf/risinghf/pktfwd/local_conf.json

Change the server_address to your chirpstack server IP address, change serv_port_up and server_port_down to 1700, and keep the gateway_ID, we will need it later.

{
"gateway_conf": {
"gateway_ID": "b827ebfffe0e1174",
"autoquit_threshold": 5,
"server_address": "SERVER_ADDRESS",
"serv_port_up": 1700,
"serv_port_down": 1700
}
}
  • To apply the changes reboot the gateway:
sudo reboot

Adding the gateway to Chirpstack

  • Go to the web UI of chirpstack following this link: http://192.168.33.69:8080 and login using "admin" as a username and a password.

  • Add a network server:

image

  • Add a new service profile.

  • Add a new gateway:

image

  • Verify that the gateway is active in the dashboard.

image

Adding Application and device

  • Add a new device profile and make sure to check OTAA mode support and CayenneLPP as a codec:

image

  • Add an application.

  • Add a device to the created application using the device profile. For that you will need to generate an Appkey (that you need to keep for the next step)and the DEV EUI which you can get following Seeeduino AT communication section.

image

End node setup

  • Open the end node device sketch located in seeeduino_lorawana_end_device/end_node_cayenneLPP_payload_OTAA.

  • Install the required libraries and seeeduino lorawan board. You can follow this tutorial.
  • Change the appkey generated in the previous step.
  • Upload the code to the board and make the wiring as shown in the next figure.

Deploy FIWARE Stack

  • We will create the FIWARE stack containers using the following command.
docker compose -f docker/fiware/docker-compose.yml
  • For the containers administration and visualisation we will use Portainer web UI installed using the previous cmd.(You will need to create an account.)

  • You can open the UI interface using this link: https://192.168.33.69:9443

image

  • Import the Postman workspace located in "postman/fiware1.postman_collection.json" which containes the needed HTTP requests.

1. Check Orion version

  • GET request to:
http://192.168.33.69:1026/version
  • The output should be like this:
{
"orion": {
"version": "3.8.1",
"uptime": "0 d, 21 h, 19 m, 10 s",
"git_hash": "30622caf67bb4384b73747abb17733e5ad9989a8",
"compile_time": "Fri Feb 17 10:20:06 UTC 2023",
"compiled_by": "root",
"compiled_in": "02a18b9e9dcd",
"release_date": "Fri Feb 17 10:20:06 UTC 2023",
"machine": "x86_64",
"doc": "https://fiware-orion.rtfd.io/en/3.8.1/",
"libversions": {
"boost": "1_74",
"libcurl": "libcurl/7.74.0 OpenSSL/1.1.1n zlib/1.2.12 brotli/1.0.9 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.3.0) libssh2/1.9.0 nghttp2/1.43.0 librtmp/2.3",
"libmosquitto": "2.0.15",
"libmicrohttpd": "0.9.73",
"openssl": "1.1",
"rapidjson": "1.1.0",
"mongoc": "1.23.1",
"bson": "1.23.1"
}
}
}

2. Check IOT Agent about:

  • GET request to:
http://192.168.33.69:4041/iot/about
  • The output should be like this:
{
"libVersion": "2.21.0",
"port": 4041,
"baseRoot": "/",
"version": "1.2.5"
}

3. Add device to IOT Agent

  • POST request to:
http://192.168.33.69:4041/iot/devices
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • And this body(you should change the fields of: dev_eui, app_eui, application_id, application_key. You can get them from the chirpstack application.)
{
"devices": [
{
"device_id": "dht_001",
"entity_name": "DHT_001",
"entity_type": "DHT",
"timezone": "Europe/Berlin",
"attributes": [
{
"object_id": "rh1",
"name": "relative_humidity_1",
"type": "Number"
},
{
"object_id": "t1",
"name": "temperature_1",
"type": "Number"
}
],
"internal_attributes": {
"lorawan": {
"application_server": {
"host": "192.168.33.69",
"username": "admin",
"password": "admin",
"provider": "chirpstack"
},
"dev_eui": "8cf957200004c487",
"app_eui": "4569343567897875",
"application_id": "1",
"application_key": "75B7EBC63DA30B7C9E3BAE8DFFAE94B3",
"data_model": "cayennelpp"
}
}
}
]
}
  • The output should be like this with 201 status code
{}

4. Show the added device

  • GET request to:
http://192.168.33.69:4041/iot/devices
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be:
{
"count": 1,
"devices": [
{
"device_id": "dht_001",
"service": "smartroom",
"service_path": "/rooms",
"entity_name": "DHT_001",
"entity_type": "DHT",
"attributes": [
{
"object_id": "rh1",
"name": "relative_humidity_1",
"type": "Number"
},
{
"object_id": "t1",
"name": "temperature_1",
"type": "Number"
}
],
"lazy": [],
"commands": [],
"static_attributes": [],
"internal_attributes": {
"lorawan": {
"application_server": {
"host": "192.168.33.69",
"username": "admin",
"password": "admin",
"provider": "chirpstack"
},
"dev_eui": "8cf957200004c487",
"app_eui": "4569343567897875",
"application_id": "1",
"application_key": "75B7EBC63DA30B7C9E3BAE8DFFAE94B3",
"data_model": "cayennelpp"
}
}
}
]
}

5. Show the DHT11 entity from Orion context broker

  • GET request to:
http://192.168.33.69:1026/v2/entities/DHT_001
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be:
{
"id": "DHT_001",
"type": "DHT",
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z",
"metadata": {}
},
"relative_humidity_1": {
"type": "Number",
"value": 62,
"metadata": {
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z"
}
}
},
"temperature_1": {
"type": "Number",
"value": 26,
"metadata": {
"TimeInstant": {
"type": "DateTime",
"value": "2023-05-24T14:49:26.718Z"
}
}
}
}

6. Check Quantumleap version

  • GET request to:
http://192.168.33.69:8668/version
  • The output should be like this:
{
"version": "0.8.x"
}

7. Add subscription to Orion context broker

  • POST request to:
http://192.168.33.69:1026/v2/subscriptions
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • And this body:
{
"description": "Notify QuantumLeap of all DHT Sensor changes",
"subject": {
"entities": [
{
"idPattern": "DHT*"
}
],
"condition": {
"attrs": [
"relative_humidity_1",
"temperature_1"
]
}
},
"notification": {
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"attrs": [
"relative_humidity_1",
"temperature_1"
],
"metadata": ["dateCreated", "dateModified"]
}
}
  • This should return an empty response body with a 201 status code

8. Show the created subscription

  • GET request to:
http://192.168.33.69:1026/v2/subscriptions
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be like this:
[
{
"id": "646e24594282b5b0b902b9ce",
"description": "Notify QuantumLeap of all DHT Sensor changes",
"status": "active",
"subject": {
"entities": [
{
"idPattern": "DHT*"
}
],
"condition": {
"attrs": [
"relative_humidity_1",
"temperature_1"
]
}
},
"notification": {
"timesSent": 1,
"lastNotification": "2023-05-24T14:51:06.000Z",
"attrs": [
"relative_humidity_1",
"temperature_1"
],
"onlyChangedAttrs": false,
"attrsFormat": "normalized",
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"metadata": [
"dateCreated",
"dateModified"
],
"lastSuccess": "2023-05-24T14:51:06.000Z",
"lastSuccessCode": 200,
"covered": false
}
}
]

9. Show records history from quantumleap

  • GET request to:
http://192.168.33.69:8668/v2/entities/DHT_001
  • Add these headers:
fiware-service: smartroom
fiware-servicepath: /rooms
  • The output should be like this:
{
"attributes": [
{
"attrName": "TimeInstant",
"values": [
null,
null,
null,
null,
null
]
},
{
"attrName": "relative_humidity_1",
"values": [
62.0,
62.0,
62.0,
62.0,
61.0
]
},
{
"attrName": "temperature_1",
"values": [
26.0,
26.0,
26.0,
27.0,
26.0
]
}
],
"entityId": "DHT_001",
"index": [
"2023-05-24T14:50:16.840+00:00",
"2023-05-24T14:50:26.865+00:00",
"2023-05-24T14:50:36.888+00:00",
"2023-05-24T14:50:46.908+00:00",
"2023-05-24T14:51:06.962+00:00"
]
}

Grafana visualisation

  • Navigate to http://192.168.33.69:3000 and log in with default credentials which are: admin / admin

  • Add a new data source using the following parameters:

image

  • Import the dashboard located in: grafana_dashboard folder.

image

  • The final result should look like this:

image

About

Deploiement d'un réseau IoT lorawan Multitenant sur le technopole ElGhazala

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages