Pages

Thursday, 14 November 2019

MQTT_Linux_Bringup_ver1.1


Steps to configure and bring up Mosquitto MQTT Broker on AWS EC2


Mainly 2 steps
1.Bring up EC2 Linux System
2.Install mosquitto on the above system
Bring up EC2 Linux System















Steps to configure and bring up Mosquitto MQTT Broker on AWS EC2



Steps to configure and bring up Mosquitto MQTT Broker on AWS EC2





























Steps to configure and bring up Mosquitto MQTT Broker on AWS EC2



























Steps to configure and bring up Mosquitto MQTT Broker on AWS EC2





























Steps to configure and bring up Mosquitto MQTT Broker on AWS EC2






























 Steps to configure and bring up Mosquitto MQTT Broker on AWS EC2
















 Steps to configure and bring up Mosquitto MQTT Broker on AWS EC2

RDL Copyright 8 st Nov 2019
Installation of mosquitto on linux system
Follow the below steps to install mosquitto
1. sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
2. sudo apt-get update
3. sudo apt-get install mosquitto
4. sudo apt-get install mosquitto-clients
Follow the below steps to Enable user authentication
 Create a txt file in the following format
 Username:Password
 Issue the following commands to add certificate to this file
 mosquitto_passwd -U passwordfile (text file name)
 Copy this file to /etc/mosquitto
Open mosquiito.conf  and add these 2 lines to enable user authentication
allow_anonymous false
password_file  etc\mosquitto\passwords.txt 
Restart the broker to absorb the changes
ubuntu@ip-172-31-36-216:~$ mosquitto -v
1572603369: mosquitto version 1.6.7 starting
1572603369: Using default config.
1572603369: Opening ipv4 listen socket on port 1883.
1572603369: Error: Address already in use
To resolve this
ps –ef | grep mosquitto
kill -9 pid
mosquitto_sub -t '$SYS/#' –v
or
root@ip-172-31-36-216:/home/ubuntu# mosquitto
1572603616: mosquitto version 1.6.7 starting
1572603616: Using default config.
1572603616: Opening ipv4 listen socket on port 1883.

1572603616: Opening ipv6 listen socket on port 1883.


 Steps to configure and bring up Mosquitto MQTT Broker on AWS EC2

To enable Message flow on to AWS ES2 system, follow the below steps
Create Security Group to allow TCP/1883 traffic in the inbound direction
















                                     Add the Security Group to the Next Interface associated to the EC2 resource
















Steps to configure and bring up Mosquitto MQTT Broker on AWS EC2

On MQTTFx client, include Public domain IP4 address as Broker Address














                                    Provide user credentials configured in the password.txt on the MQTT broker
















Steps to configure and bring up Mosquitto MQTT Broker on AWS EC2

Mosquitto SSL Configuration -MQTT TLS Security

Server Side: Openssl tool is used to generate the required keys and certificats for both
the server and client
Issue the following commands in sequence and make changes to the
mosquitto.conf on the server for the changes to take effect

1. openssl genrsa -des3 -out ca.key 2048 2.  openssl req -new -x509 -days 1826 -key ca.key -out ca.crt 3. openssl genrsa -out server.key 2048 4. openssl req -new -out server.csr -key server.key 5. openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 360
The directory file listing would look similar to the below












Copy the ca.crt, server.crt and server.key file to /etc/mosquitto/cert folder

Make the following changes to the mosquitto.conf file

Add the following lines

Port 8883

Cafile /etc/mosquitto/certs/ca.crt

Keyfile /etc/mosquitto/certs/server.key

Certfile /etc/mosquitto/certs/server.crt

Most important step is to copy the ca.crt on to the client system.

Incase its get challenging to transfer this file, as it would from AWS EC2 environment. Please use
notepad+ (not plain notepad) to copy paste the certificate contents

Client Side: Configure the MQTT Client with the broker address, enable SSL and point to the ca.crt
file and connect for application.


For reference: https://researchdesignlab.com/projects/MQTT_Linux_Bringup_ver1.0.pdf

Friday, 20 September 2019

ESP32-OTA (Over the air) programming

ESP32-OTA (Over the air) programming

Aim:

Turn ON and OFF an LED after Particular delay using OTA web server

Description:

Turn To learn how to connect LED to digital pins of an ESP32 Microcontroller and program to blink an LED using OTA web server.

Hardware required:

ESP32-Microcontroller development board.

Pin connection:


Pin Mapping:

LED
ESP32
LED
I04

Procedure:
1. When you install the ESP32 add-on for the Arduino IDE, it will automatically install the      
    Arduino OTA library.
2. Go to File > Examples > ArduinoOTA > OTAWebUpdater.


3. The following code should load.

#include <WiFi.h>
#include <WiFiClient.h
#include <WebServer.h
#include <ESPmDNS.h
#include <Update.h>
const char* host = "esp32"; const char* ssid = "ssid";
const char* password = "password";

WebServer server(80);

/*
* Login page
*/

const char* loginIndex = "<form name='loginForm'>"
"<table width='20%' bgcolor='A09F9F' align='center'>" 
   "<tr>"
"<td colspan=2>"
"<center><font size=4><b>ESP32 Login Page</b></font></center>" 
"<br>"
"</td>" 
"<br>"
"<br>"
"</tr>"
"<td>Username:</td>"
"<td><input type='text' size=25 name='userid'><br></td>" 
"</tr>"
"<br>"
"<br>"
"<tr>"
"<td>Password:</td>"
"<td><input type='Password' size=25 name='pwd'><br></td>" 
"<br>"
"<br>" 
"</tr>"
"<tr>"
"<td><input type='submit' onclick='check(this.form)' value='Login'></td>" 
"</tr>"
"</table>"
"</form>"
"<script>"
"function check(form)" 
"{"
"if(form.userid.value=='admin' && form.pwd.value=='admin')" 
"{"
"window.open('/serverIndex')" 
"}"
"else" 
 "{"
" alert('Error Password or Username')/*displays error message*/" 
"}"
"}"
"</script>";

/*
* Server Index Page
*/

const char* serverIndex =
"<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'></script>" 
"<form method='POST' action='#' enctype='multipart/form-data' id='upload_form'>"
"<input type='file' name='update'>" 
"<input type='submit' value='Update'>"
"</form>"
"<div id='prg'>progress: 0%</div>" 
"<script>" 
"$('form').submit(function(e){" "e.preventDefault();"
"var form = $('#upload_form')[0];" "var data = new FormData(form);" " $.ajax({"
"url: '/update',"
"type: 'POST',"
"data: data," "contentType: false," "processData:false," "xhr: function() {"
"var xhr = new window.XMLHttpRequest();" "xhr.upload.addEventListener('progress', function(evt) {" "if (evt.lengthComputable) {"
"var per = evt.loaded / evt.total;"
"$('#prg').html('progress: ' + Math.round(per*100) + '%');" 
"}"
"}, false);"  
"return xhr;" 
"},"
"success:function(d, s) {" "console.log('success!')" 
"},"
"error: function (a, b, c) {" "}"
"});"
"});"
"</script>";

/*
* setup function
*/
void setup(void) {
Serial.begin(115200);

// Connect to WiFi network
WiFi.begin(ssid, password);
Serial.println("");

// Wait for connection
while (WiFi.status() != WL_CONNECTED) { delay(500);
Serial.print(".");
}
Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP());

/*use mdns for host name resolution*/
if (!MDNS.begin(host)) { //http://esp32.local Serial.println("Error setting up MDNS responder!"); 
while (1) {
delay(1000);
}
}
Serial.println("mDNS responder started");
/*return index page which is stored in serverIndex */ server.on("/", HTTP_GET, []() { server.sendHeader("Connection", "close"); 
server.send(200, "text/html", loginIndex);
});
server.on("/serverIndex", HTTP_GET, []() { server.sendHeader("Connection", "close"); server.send(200, "text/html", serverIndex);
});
/*handling uploading firmware file */ 
server.on("/update", HTTP_POST, []() { server.sendHeader("Connection", "close");
server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK"); ESP.restart();
}, []() {
HTTPUpload& upload = server.upload();
if (upload.status == UPLOAD_FILE_START) {
Serial.printf("Update: %s\n", upload.filename.c_str());
if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size
Update.printError(Serial);
}
} else if (upload.status == UPLOAD_FILE_WRITE) {
/* flashing firmware to ESP*/
if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
Update.printError(Serial);
}
} else if (upload.status == UPLOAD_FILE_END) {
if (Update.end(true)) { //true to set the size to the current progress
Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
} else {
Update.printError(Serial);
}
}
});
server.begin();
}

void loop(void) { server.handleClient(); delay(1);
}

1. You should change the following lines on the code to include your own network credentials.
Ø  const char* ssid = “ ” ;
Ø  const char* password = “ ” ;
    2.       Upload the above code to ESP32 board. Enter proper network credentials.
    3.       Now select proper board and serial port.
    4.   Once the code is uploaded , open serial monitor select baud rate 115200 and press enable         
          button and then you will get ESP32 IP address.


   8.   Copy the IP address which you obtain from the serial monitor and paste it in your browser.

   9.  Username: admin
          Password: admin

    10. After entering the username and password a new tab should open on the /serverIndex URL.  
          This page allows you to upload a new code to your ESP32. You should upload .bin files.


Preparing the sketch:
    1.  Write a simple program (Blinking of LED) using OTA web server and save it with the name 
           LED_blink and complile it.

     2.      Once the uploading is done go to Sketch<Export compiled binary.


         3.        Then select Sketch<Show sketch folder.
         4.        In this folder two files will be generated .ino and .bin.
         5.        You should upload the .bin file using OTA Web Server.


        6.        In browser on ESP32 OTA Web Updater page , click on choose file button
        7.        Select .bin file and click Update.
        8.        Code will be successfully uploaded.


Output: