In the world of the Internet of Things (IoT), Linux has emerged as a popular operating system for IoT devices. Its popularity can be attributed to Linux's flexibility, robustness, open-source nature, and a rich set of tools, libraries, and utilities that make it ideal for IoT solutions. One such utility is Python, a powerful, easy-to-learn, and widely-used programming language.
Python, with its vast selection of libraries, simplifies the task of data collection, processing, and transmission. It enables IoT devices to communicate with cloud platforms and send data for further analysis and visualization.
A wide array of industrial IoT devices and gateways are now powered by Linux, opening up new opportunities for leveraging the potential of these devices. Some of these include:
Robustel: Their R3000 LG and R2000 Dual industrial routers are powered by Linux and provide secure and reliable connectivity.
NCD.io: NCD.io offers the PR55-17B Industrial IoT Linux Wireless Gateway which is capable of high-performance data aggregation.
Advantech: The company offers a range of Linux-based devices, including the ECU-1000 series of industrial IoT gateways.
Red Lion: Their Sixnet® series RTUs (Remote Terminal Units) and IndustrialPro® SN-6000 cellular routers come with robust Linux platforms.
Revolution Pi: The Revolution Pi series, based on the Raspberry Pi platform, are open-source, modular, and industrial-grade PLCs running on Linux.
OWASYS: Known for their advanced Linux-based embedded devices like owa5X IoT Gateways.
Given the proliferation of these Linux-based IoT devices, we have created a Python script that can send data from these devices to the Ubidots platform. The data can be sent over HTTP or MQTT, two widely used IoT protocols.
Python Script
From the Command Line:
Install Required Libraries: If not already installed, install the necessary Python libraries using pip:
pip install paho-mqtt
pip install requestsCreate Python file: Create a file called
ubidots_send.py
and enter the following script:
import sys
import requests
import json
from paho.mqtt import client as mqtt_client
def send_http(payload, device_label, token):
url = f"https://industrial.api.ubidots.com/api/v1.6/devices/{device_label}"
headers = {"X-Auth-Token": token, "Content-Type": "application/json"}
response = requests.post(url, headers=headers, json=payload)
print(response.text)
def send_mqtt(payload, device_label, token):
broker = 'industrial.api.ubidots.com'
port = 1883
topic = f"/v1.6/devices/{device_label}"
client_id = token
username = token
password = ''
def connect_mqtt():
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(client_id)
client.username_pw_set(username, password)
client.on_connect = on_connect
client.connect(broker, port)
return client
def publish(client):
msg = json.dumps(payload)
result = client.publish(topic, msg)
status = result[0]
if status == 0:
print(f"Send `{msg}` to topic `{topic}`")
else:
print(f"Failed to send message to topic {topic}")
client = connect_mqtt()
publish(client)
def main():
args = sys.argv
if len(args) != 5:
print("Usage: python script.py payload device_label token protocol")
return
# In this line, you should replace the variables below, with the ones expected according to your application:
payload = dict(zip(
["engine_rpm", "oil_level", "oil_temperature", "fuel_level", "engine_temperature", "ambient_temperature", "runtime", "estimated_fuel_efficiency", "lat", "lng"],
map(float, args[1].split(','))
))
device_label = args[2]
token = args[3]
protocol = args[4]
if protocol == "http":
send_http(payload, device_label, token)
elif protocol == "mqtt":
send_mqtt(payload, device_label, token)
else:
print("Invalid protocol. Use 'http' or 'mqtt'")
if __name__ == "__main__":
main()
3. Prepare Your Data: In the following line, replace the variables below, with the ones expected according to your application:
payload = dict(zip(["engine_rpm", "oil_level", "oil_temperature", "fuel_level", "engine_temperature", "ambient_temperature", "runtime", "estimated_fuel_efficiency", "lat", "lng"], map(float, args[1].split(','))))
4. Run the Script: Run the script from the terminal, passing the required arguments: payload, Ubidots device-label, Ubidots token, and the desired protocol. Use the following command, replacing the placeholders with your actual data:
python ubidots_send.py "1000,50,80,75,100,20,300,15,40.712776,-74.005974" my-device my-token http
For example:
python ubidots_send.py "1000,50,80,75,100,20,300,15,40.712776,-74.005974" my-device BBFF-UMrU5BPuGAltESk8UyHJXVkhTSudQ4 mqtt
Results
After running the command, the following response is expected:
python ubidots_send.py "1000,50,80,75,100,20,300,15,40.712776,-74.005974" my-device BBFF-UMrU5BPuGAltESk8UyHJXVkhTSudQ4 mqtt
Send `{"engine_rpm": 1000.0, "oil_level": 50.0, "oil_temperature": 80.0, "fuel_level": 75.0, "engine_temperature": 100.0, "ambient_temperature": 20.0, "runtime": 300.0, "estimated_fuel_efficiency": 15.0, "lat": 40.712776, "lng": -74.005974}` to topic `/v1.6/devices/my-device`
...and then the data can be seen in your Ubidots account:
Others found useful...