Mengirim Data Sederhana ke Antares

Pada project ini Anda akan diarahkan untuk mengirim data sederhana dari board NB-LYNX-7000 ke Antares IoT Platform menggunakan serangkaian AT Command dari modul SIM7000.

Prasyarat

Material yang dibutuhkan mengikuti Prasyarat Umum pada laman sebelumnya. Jika Anda belum menyiapkan kebutuhan pada laman tersebut, maka Anda dapat mengunjungi laman berikut.

Langkah Kerja

1. Setup Peralatan

Hal yang perlu Anda lakukan pertama kali adalah melakukan setup peralatan dengan cara menghubungkan board NB-LYNX-7000 ke perangkat laptop/komputer Anda menggunakan kabel USB-C.

Pastikan Anda telah memasang antena pada port antena GSM sebelum menghubungkan board NB-LYNX-7000 ke laptop/komputer.

Berikut adalah rangkaian peralatan yang sudah dihubungkan ke laptop/komputer.

2. Jalankan Aplikasi Arduino IDE

3. Menginputkan Kode Program

Untuk mengirim data ke Antares, Anda perlu menginputkan kode program di bawah pada Arduino IDE.

#include <Arduino.h>

// Configurable macros
#define APN "nb1internet"
#define APPNAME "YOUR-APP-NAME"
#define DEVNAME "YOUR-DEVICE-NAME"
#define ACCESSKEY "0000000000000000:0000000000000000"
#define PAYLOAD "{\\\"t\\\":\\\"25.5\\\",\\\"h\\\":\\\"60.35\\\"}"
#define SIM7000_POWER_KEY 25

const uint32_t interval = 10000; // 10 s interval to send message
uint32_t previousMillis = 0;  // will store last time message sent
uint32_t counter = 0;      // message counter

String sendCommand(String command, uint32_t timeout, char delimiter)
{
 while (Serial2.available())
  Serial2.read();

 uint32_t T = millis();
 String res = "";
 Serial.print("[SYS CMD] ");
 Serial.print(command);
 Serial.println("=========");
 Serial2.print(command);
 while ((millis() - T) < timeout)
 {
  while (Serial2.available())
  {
   res = Serial2.readStringUntil(delimiter);
   res.trim();
   if (res.length() > 0)
   {
    Serial.print("[SYS RES] ");
    Serial.println(res);
    return res;
   }
  }
 }
 return "TIMEOUT";
}

String receiveAddCommand(int32_t timeout)
{
 String res = "";
 uint32_t T = millis();
 while ((millis() - T) < timeout)
 {
  while (Serial2.available())
  {
   res = Serial2.readStringUntil('\0');
   res.trim();
   if (res.length() > 0)
   {
    Serial.print("[SYS RES] ");
    Serial.println(res);
    return res;
   }
  }
 }
 return res;
}

bool checkResponse(String response, String expected_response)
{
 if (response.indexOf(expected_response) != -1)
  return true;
 else
  return false;
}

bool sim7000_L1()
{
 pinMode(SIM7000_POWER_KEY, OUTPUT);
 delay(100);
 digitalWrite(SIM7000_POWER_KEY, HIGH);
 delay(1000);
 digitalWrite(SIM7000_POWER_KEY, LOW);
 delay(5000);
 for (uint8_t i = 0; i < 5; i++)
 {
  if (checkResponse(sendCommand("AT\r\n", 200, '\0'), "OK"))
  {
   sendCommand("ATE0\r\n", 200, '\n');
   return true;
  }

  delay(1000);
 }
 return false;
}

bool sim7000_L2()
{
 if (!checkResponse(sendCommand("AT+CNMP=38\r\n", 200, '\n'), "OK"))
  return false;
 if (!checkResponse(sendCommand("AT+CMNB=2\r\n", 200, '\n'), "OK"))
  return false;

 return true;
}

bool sim7000_L3(uint8_t stage)
{
 switch (stage)
 {
 case 0:
  if (!checkResponse(sendCommand("AT+CIPSHUT\r\n", 300 * 200, '\n'), "SHUT OK"))
   return false;

 case 1:
  if (!checkResponse(sendCommand("AT+CSTT=\"" + String(APN) + "\"\r\n", 200, '\n'), "OK"))
   return false;

 case 2:
  if (!checkResponse(sendCommand("AT+CIICR\r\n", 300 * 200, '\n'), "OK"))
   return false;

 default:
  if (checkResponse(sendCommand("AT+CIFSR\r\n", 200, '\n'), "ERROR"))
   return false;
 }

 return true;
}

bool sim7000_L3_check()
{
 String response = sendCommand("AT+CIPSTATUS\r\n", 200, '\0');
 if (checkResponse(response, "OK"))
 {
  if (checkResponse(response, "PDP DEACT") || checkResponse(response, "TCP CLOSED"))
   return sim7000_L3(0);
  else if (checkResponse(response, "IP INITIAL"))
   return sim7000_L3(1);
  else if (checkResponse(response, "IP START"))
   return sim7000_L3(2);
  else if (checkResponse(response, "IP GPRSACT"))
   return sim7000_L3(3);
  else
   return sim7000_L3(0);
 }
 else
  return sim7000_L3(0);
}

void sim7000_send()
{
 String httpBody = "{\"m2m:cin\": {\"con\": \"%1\"}}";
 httpBody.replace("%1", PAYLOAD);

 String response = sendCommand("AT+CIPSTART=\"TCP\",\"platform.antares.id\",\"8080\"\r\n", 200, '\n');
 if (checkResponse(response, "OK"))
 {
  if (!checkResponse(response, "CONNECT OK") && !checkResponse(response, "ALREADY CONNECT"))
  {
   response = receiveAddCommand(300 * 200);
   Serial.print("Response : ");
   Serial.println(response);
  }

  if (checkResponse(response, "CONNECT OK") || checkResponse(response, "ALREADY CONNECT"))
  {
   Serial.print("POST /~/antares-cse/antares-id/" + String(APPNAME) + "/" + String(DEVNAME) + " HTTP/1.1\r\n");
   Serial.print("Host: platform.antares.id:8080\r\n");
   Serial.print("Accept: application/json\r\n");
   Serial.print("Content-Type: application/json;ty=4\r\n");
   Serial.print("X-M2M-Origin: " + String(ACCESSKEY) + "\r\n");
   Serial.print("Content-Length: " + String(httpBody.length()) + "\r\n\r\n");
   Serial.println(httpBody);

   sendCommand("AT+CIPSEND\r\n", 200, '\0');
   Serial2.print("POST /~/antares-cse/antares-id/" + String(APPNAME) + "/" + String(DEVNAME) + " HTTP/1.1\r\n");
   Serial2.print("Host: platform.antares.id:8080\r\n");
   Serial2.print("Accept: application/json\r\n");
   Serial2.print("Content-Type: application/json;ty=4\r\n");
   Serial2.print("X-M2M-Origin: " + String(ACCESSKEY) + "\r\n");
   Serial2.print("Content-Length: " + String(httpBody.length()) + "\r\n\r\n");
   Serial2.print(httpBody);
   Serial2.write(0x1A);

   String response2 = receiveAddCommand(300 * 200);
   Serial.print("Response2 : ");
   Serial.println(response2);
  }

  sendCommand("AT+CIPCLOSE\r\n", 200, '\n');
 }
}

bool nbSetup()
{
 Serial2.begin(9600);
 Serial.println("[SIM7000] Turning ON...");
 if (sim7000_L1())
  Serial.println("Success");
 else
 {
  Serial.println("Failed");
  return false;
 }

 Serial.println("[SIM7000] Set NB Mode... ");
 if (sim7000_L2())
  Serial.println("Success");
 else
 {
  Serial.println("Failed");
  return false;
 }

 Serial.println("[SIM7000] Start IP Connection...");
 sim7000_L3(0);

 return true;
}

void setup()
{
 Serial.begin(115200);
 if (!nbSetup())
 {
  while (1)
   delay(1000);
 }
}

void loop() {
 // Check interval overflow
 if (millis() - previousMillis > interval) {
  previousMillis = millis();

  if (sim7000_L3_check()) {
   char message[50];
   sprintf(message, "Sending frame : %d", counter);
   Serial.println(message);
   sim7000_send();
   counter++;
  }
 }

 // Add a stopping condition here
 if (counter >= 10) { // Stop after sending 10 messages
  Serial.println("Program stopped.");
  while (1) { // Enter an infinite loop to stop further execution
   delay(1000);
  }
 }
}

Jangan lupa untuk menggganti APPNAME dengan nama aplikasi yang Anda buat di platform Antares, DEVNAME dengan nama device yang dibuat pada platform Antares, dan ACCESSKEY dengan access-key akun Anda.

Setelah menginputkan kode program, jangan lupa untuk menyimpan kode program tersebut dengan memilih File > Save As. Berikut adalah tampilan pada Arduino IDE ketika Anda sudah menginputkan kodenya.

4. Penjelasan Kode Program

Supaya board NB-LYNX-7000 dapat berkomunikasi dengan platform Antares, digunakan modul SIM7000. SIM7000 merupakan modul komunikasi seluler yang dikembangkan oleh SIMCom Wireless Solutions. Modul ini menerapkan beberapa protokol yang memungkinkan perangkat untuk terhubung ke jaringan menggunakan AT command. Berikut dijelaskan beberapa AT command yang digunakan pada kode program.

AT<CR><LF>

Pada kode program terdapat command "AT\r\n" yang dikirimkan sebagai starting point atau tahap inisialisasi modul SIM7000. \r merupakan carriage return , sedangkan \n merupakan line feed. Command ini dikirimkan untuk mendapatkan respons “OK”.

ATE0<CR><LF>

Pada kode program terdapat command "ATE0\r\n" yang dikirimkan setelah mendapatkan respons “OK”. Command ini digunakan untuk menonaktifkan echo mode yang menandakan bahwa inisialisasi telah berhasil.

AT+CNMP=<mode><CR><LF>

Pada kode program terdapat command "AT+CNMP=38\r\n" yang dikirimkan untuk memilih mode yang diinginkan. Parameter “38” diatur supaya modul SM7000 hanya bekerja pada jaringan LTE saja, yang mana umum digunakan untuk NB-IoT.

Berikut parameter <mode> lain yang dapat digunakan

  • 2 = Automatic

  • 13 = GSM only

  • 38 = LTE only

  • 51 = GSM and LTE only

AT+CMNB=<mode><CR><LF>

Pada kode program terdapat command "AT+CMNB=2\r\n" yang digunakan untuk memilih mode antara CAT-M dan NB-IoT. Parameter “2” digunakan untuk memilih NB-IoT.

Berikut terdapat parameter <mode> lain yang tersedia

  • 1 = CAT-M

  • 2 = NB-IoT

  • 3 = CAT-M dan NB-IoT

AT+CIPSHUT<CR><LF>

Pada kode program terdapat command "AT+CIPSHUT\r\n" yang dikirimkan sebagai case 0 untuk mematikan PDP (packet data protocol) context. PDP context merupakan protokol pada komunikasi seluler yang digunakan untuk mengatur data session antara perangkat dengan jaringan. Command "AT+CIPSHUT\r\n" digunakan untuk memastikan bahwa semua koneksi internet yang aktif telah dimatikan semuanya sebelum dilanjutkan dengan konfigurasi yang lain. Respons yang akan diterima ketika mengirimkan command ini adalah “SHUT OK”.

AT+CSTT=<apn>CR><LF>

Pada kode program terdapat command "AT+CSTT=""+ String(APN) + ""\r\n" yang dikirimkan sebagai case 1 untuk mengatur APN (Access Point Name) pada modul SM7000 sebagai koneksi GPRS (General Packet Radio Service). String(APN) digunakan untuk mengubah variabel yang sudah didefinisikan pada bagian awal kode menggunakan #define APN "nb1internet" menjadi string. Oleh karena itu, APN yang diatur dalam hal ini akan memiliki value “nb1internet”.

AT+CIICR<CR><LF>

Pada kode program terdapat command "AT+CIICR\r\n" yang dikirimkan sebagai case 2 untuk mengaktifkan koneksi wireless berupa IP connection. IP connection ini digunakan sebagai transmisi data.

AT+CIFSR<CR><LF>

Pada kode program terdapat command "AT+CIFSR\r\n" yang dikirimkan sebagai case default untuk mendapatkan IP address ketika case sebelumnya (case 0, case 1, dan case 2) tidak ada yang match. Command ini digunakan untuk memastikan bahwa IP address berhasil didapatkan yang ditandai dengan response berupa IP address. Apabila proses ini gagal, maka respons yang diterima adalah ERROR.

AT+CIPSTATUS<CR><LF>

Pada kode program terdapat command "AT+CIPSTATUS\r\n" yang digunakan untuk menanyakan status koneksi saat ini.

AT+CIPSTART=<mode>,<domain name>,<port><CR><LF>

Pada kode program terdapat command "AT+CIPSTART="TCP","platform.antares.id","8080"\r\n" yang digunakan untuk memulai TCP connection pada suatu host dan port. Dalam hal ini host yang digunakan adalah platform.antares.id dengan port 8080. Anda juga dapat mengganti nama host dengan IP address.

AT+CIPSEND<CR><LF>

Pada kode program terdapat command “AT+CIPSEND\r\n" yang mengindikasikan bahwa modul SIM7000 telah siap untuk mengirimkan data melalui TCP connection yang sudah dibentuk.

5. Upload Program ke Board NB-LYNX-7000

Anda harus mengatur board yang digunakan dengan memilih ESP32 Dev Module pada bagian Tools > Board > esp32.

Setelah itu, Anda perlu mengatur port yang digunakan dengan membuka Tools > Port > COM(X). Nilai X menyesuaikan dengan nomor port yang digunakan oleh board NB-LYNX-7000.

Setelah Anda mempersiapkan kode program, selanjutnya Anda dapat meng-upload kode program tersebut dengan menekan tombol upload seperti ditunjukkan pada gambar di bawah.

Jika kode program sudah berhasil di-upload, Anda dapat membuka Serial Monitor dengan menekan icon seperti ditunjukkan pada gambar di bawah. Icon tersebut dapat Anda temukan pada bagian atas sebelah kanan.

Anda perlu mengatur baud rate Serial Monitor menjadi 115200 supaya output-nya dapat terbaca.

Tampilan Serial Monitor akan menjadi seperti pada gambar di bawah yang menandakan proses inisiasi modul SIM7000.

Setelah berhasil mengirimkan data sebanyak 10 kali, maka program akan berhenti seperti ditunjukkan pada gambar berikut.

6. Periksa Data pada Antares IoT Platform

Untuk memastikan bahwa data telah terkirim dengan benar dari board NB-LYNX-7000 ke Antares IoT Platform, Anda dapat membuka URL device Anda. Gambar berikut menunjukkan tampilan pada Antares IoT Platform yang sudah menerima data dari NB-LYNX-7000.