# Retrieve Last Data from Antares Server with MQTT Protocol

In this project you will be directed to send simple data from the **Lynx-32 Development Board** to the **Antares IoT Platform** using WiFi connectivity with the MQTT protocol.

## Prerequisites

The materials required follow the **General Prerequisites** on the previous page. If you have not prepared the requirements on that page, then you can visit the following page.

{% content-ref url="../general-prerequisites-esp32-wi-fi" %}
[general-prerequisites-esp32-wi-fi](https://docs.antares.id/en/code-and-library-examples/esp32-wi-fi/general-prerequisites-esp32-wi-fi)
{% endcontent-ref %}

The additional materials specific to this project are as follows.

1. Antares ESP HTTP Library. This documentation uses the **Antares ESP MQTT library version 1.0.**

{% hint style="info" %}
If you have not installed **Antares ESP MQTT** version 1.0, you can follow these steps.

[antares-wi-fi-mqtt](https://docs.antares.id/en/getting-started/arduino-library-installation/antares-wi-fi-mqtt "mention")
{% endhint %}

## Follow These Steps

### 1. Run the Arduino IDE application

### 2. Opening Sample Programme

{% hint style="info" %}
You can open the programme code in the Arduino IDE via **File > Examples > Antares ESP MQTT > AntaresMQTTRetrieveLatestData.**
{% endhint %}

The following is the AntaresMQTTRetrieveLatestData example programme code

```arduino
/*
    This is an example sketch to subscribe to MQTT data on ESP8266
    via the Antares IoT Platform.

    MQTT server & port:
    platform.antares.id, port 1338

    MQTT topic:
    /oneM2M/req/your-access-key/antares-cse/json

    The main function in this sketch is the callback function,
    which will be fired every time a new message is published
    to the topic.

    For more information, please visit https://antares.id/id/docs.html
*/

#include <AntaresESPMQTT.h>

#define ACCESSKEY "YOUR-ACCESS-KEY"       // Antares account access key
#define WIFISSID "YOUR-WIFI-SSID"         // Wi-Fi SSID to connect to
#define PASSWORD "YOUR-WIFI-PASSWORD"     // Wi-Fi password

#define projectName "YOUR-APPLICATION-NAME"   // Name of the application created in Antares
#define deviceName "YOUR-DEVICE-NAME"     // Name of the device created in Antares

AntaresESPMQTT antares(ACCESSKEY);

unsigned long previousMillis=0;
unsigned long interval =5000;

void callback(char topic[], byte payload[], unsigned int length) {
  /*
    Get the whole received data, including the topic,
    and parse the data according to the Antares data format.
  */
  antares.get(topic, payload, length);

  Serial.println("New Message!");
  // Print topic and payload
  Serial.println("Topic: " + antares.getTopic());
  Serial.println("Payload: " + antares.getPayload());
  // Print individual data
}

void setup() {
  Serial.begin(115200);
  antares.setDebug(true);
  antares.wifiConnection(WIFISSID, PASSWORD);
  antares.setMqttServer();
  antares.setCallback(callback);
}
void loop() {
  /*
    Check if we're still connected to the MQTT broker/server.
    If disconnected, the device will try to reconnect.
  */
  antares.checkMqttConnection();

  while(millis()-previousMillis > interval)
  {
    previousMillis = millis();
    antares.retrieveLastData(projectName,deviceName);
  }
}
```

### 3. Set MQTT Parameters in Programme Code

Change the HTTP Protocol parameters in the following variables **\*ACCESSKEY, \*WIFISSID, \*PASSWORD, \*projectName,** and **\*deviceName**. Adjust to the parameters in the Antares console.

```arduino
#define ACCESSKEY "YOUR-ACCESS-KEY"       // Replace with your Antares account access key
#define WIFISSID "YOUR-WIFI-SSID"         // Replace with your Wi-Fi SSID
#define PASSWORD "YOUR-WIFI-PASSWORD"     // Replace with your Wi-Fi password

#define projectName "YOUR-APPLICATION-NAME"   // Replace with the Antares application name that was created
#define deviceName "YOUR-DEVICE-NAME"     // Replace with the Antares device name that was created
```

{% hint style="info" %}
The **\*Access key** parameter is obtained from your Antares account page.
{% endhint %}

<figure><img src="https://3873791589-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7cujmJ5QHdJaAjH815aZ%2Fuploads%2FXHHFBeUuSnF3O0235Q2x%2Fimage.png?alt=media&#x26;token=cd072367-4bf7-4176-8a4e-370739490eff" alt=""><figcaption><p>Access Key Location on Antares Account Page</p></figcaption></figure>

{% hint style="info" %}
The **WIFISSID** parameter is obtained from the **Wi-Fi/Hotspot** name that will be used by the **Lynx-32 Development Board**. An example is shown below.
{% endhint %}

<figure><img src="https://content.gitbook.com/content/7cujmJ5QHdJaAjH815aZ/blobs/aYDWO9jkvSj8WfiqqvRF/2_Wifi.png" alt=""><figcaption><p>WIFISSID</p></figcaption></figure>

{% hint style="info" %}
The **\*PASSWORD** parameter is obtained from the **WiFi password** you are currently using.
{% endhint %}

{% hint style="info" %}
The parameters **\*projectName** and **\*deviceName** are obtained from the **Application Name** and **Device Name** that have been created in the Antares account.
{% endhint %}

<figure><img src="https://3873791589-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7cujmJ5QHdJaAjH815aZ%2Fuploads%2F7DkeWkJTzeAWKdLwAQ3E%2Fimage.png?alt=media&#x26;token=46aa357b-f1ef-45ad-8d3f-b12b0d604a9b" alt=""><figcaption><p>Application Name Display</p></figcaption></figure>

<figure><img src="https://3873791589-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7cujmJ5QHdJaAjH815aZ%2Fuploads%2FsTkKbyF6ADRXH3XOMdX2%2Fimage.png?alt=media&#x26;token=871e0b81-7543-469e-8cd2-dcb59e15192f" alt=""><figcaption><p>Device Name Display</p></figcaption></figure>

### 4. Compile and Upload Program

Connect the **Lynx-32** with your computer and make sure the **Communication Port** is read.

{% hint style="info" %}
On Windows operating systems the check can be done via **Device Manage**r. If your **Lynx-32** is read then the **USB-Serial CH340** appears with the port adjusting the port availability (in this case it reads **COM4**).
{% endhint %}

<figure><img src="https://content.gitbook.com/content/7cujmJ5QHdJaAjH815aZ/blobs/I8H7fWQPFCwWRqFPiLoA/4_devmanager.PNG" alt=""><figcaption><p>Device Manager Display</p></figcaption></figure>

Set up the **ESP32** board by clicking **Tools > Board > esp32** in the Arduino IDE, then make sure the **ESP32 Dev Module** is used. Select the port according to the communication port that is read (in this case COM4). The result will look like the following image.

<figure><img src="https://content.gitbook.com/content/7cujmJ5QHdJaAjH815aZ/blobs/Lhnh1FPV8s8FoZq5FL0i/5_selectport.png" alt="" width="464"><figcaption><p>Display of Board Specifications and Ports Used</p></figcaption></figure>

After all the setup is complete, upload the programme by pressing the arrow icon as shown below. Wait for the compile and upload process to finish

<figure><img src="https://content.gitbook.com/content/7cujmJ5QHdJaAjH815aZ/blobs/mUqpiPoLnjuvTQ3FxHm2/6_upload.PNG" alt=""><figcaption><p>Compile Icon for Tick and Upload Icon for Arrow</p></figcaption></figure>

{% hint style="info" %}
**The Tick icon** on the Arduino IDE is just the verify process. Usually used to **Compile** the programme to find out whether there are errors or not. \
**The Arrow icon** on the Arduino IDE is the verify and upload process. Usually used to **Compile** the programme as well as Flash the programme to the target board.
{% endhint %}

If the programme upload is successful, it will look like the following image.

<figure><img src="https://content.gitbook.com/content/7cujmJ5QHdJaAjH815aZ/blobs/aDjYyjBbbJhMKtEfjJ7V/14_done.PNG" alt=""><figcaption><p>Upload Successful Programme Output Display</p></figcaption></figure>

After uploading the programme, you can view the **serial monitor** to debug the programme. The **serial monitor** icon is shown in the following image.

<figure><img src="https://content.gitbook.com/content/7cujmJ5QHdJaAjH815aZ/blobs/HfFdtXMmsSGzOdveK6i8/8_serialicon.png" alt=""><figcaption><p>Serial Monitor Icon</p></figcaption></figure>

Set the **serial baud rate** to 115200 and select BothNL & CR. The result will look like the following image.

<figure><img src="https://content.gitbook.com/content/7cujmJ5QHdJaAjH815aZ/blobs/jRhJGAEJhihU7aabhloC/15_serial%20monitor.PNG" alt=""><figcaption><p>Serial Monitor Display</p></figcaption></figure>

{% hint style="danger" %}
Make sure the **serial baud rate** matches the value defined in the programme code. If the **serial baud rate** is not the same between the **programme code** and the **serial monitor**, the ASCII characters will not be read properly.
{% endhint %}

### 5. Check Data in Antares

After uploading the programme successfully, then open the Antares device page and see if the data taken matches the data in the Antares Console.

<figure><img src="https://3873791589-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7cujmJ5QHdJaAjH815aZ%2Fuploads%2FpYWcynMiw1eCXHUD9sRK%2Fimage.png?alt=media&#x26;token=8129c232-f533-45cf-afc9-8bcf41217ca2" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3873791589-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7cujmJ5QHdJaAjH815aZ%2Fuploads%2FtbtnSfPFy0EjRUHubh3W%2Fimage.png?alt=media&#x26;token=59f039e3-f671-4c35-a794-36b37c4eec57" alt=""><figcaption><p>Antares Console Display</p></figcaption></figure>

{% hint style="info" %}
The data sent from the **Lynx-32 Development Board** with the MQTT protocol is in the form of temperature, humidity, wind\_speed, rain\_level, and location variables containing latitude and longitude.
{% endhint %}
