Friday, January 17, 2025

ESP32 WIFI Analyzer with OLED Display

Wifi Analyzer

Skrip dibawah  ini berfungsi untuk scan WiFi berdekatan dan memaparkan maklumatnya pada screen OLED. Fungsi utamanya ialah:

  1. Scan WiFi setiap 5 saat.
  2. Tunjuk maklumat rangkaian seperti:
    • Nama (SSID)
    • Kekuatan signal (RSSI dalam dBm)
    • Nombor channel (Channel)
    • Jenis (WPA2, WPA, Open, dll.)
    • Bar kekuatan isyarat.

Disini saya lampirkan skripnya.

-------------------------------------------------------------------------------------------------------------------

 #include <Wire.h>

#include <SPI.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

#include <WiFi.h>


#define OLED_MOSI   21    

#define OLED_CLK    22    

#define OLED_DC     15    

#define OLED_CS     13    

#define OLED_RESET  14    

#define SCREEN_WIDTH 128

#define SCREEN_HEIGHT 64

#define BUTTON_NEXT 0     // Button for scrolling networks


Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, 

  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);


#define MAX_NETWORKS 20

int networkCount = 0;

int currentNetwork = 0;

const int scanTime = 5; // In seconds

unsigned long lastScan = 0;


struct WiFiNetwork {

  String ssid;

  int32_t rssi;

  wifi_auth_mode_t encryptionType;

  int channel;

};


WiFiNetwork networks[MAX_NETWORKS];


void setup() {

  Serial.begin(115200);

  pinMode(BUTTON_NEXT, INPUT_PULLUP);

  

  // Setup OLED

  if (!display.begin(SSD1306_SWITCHCAPVCC)) {

    Serial.println(F("OLED initialization failed"));

    while (1);

  }

  

  display.clearDisplay();

  display.setTextColor(SSD1306_WHITE);

  

  // Show initial message

  display.setTextSize(1);

  display.setCursor(0,0);

  display.println("WiFi Analyzer");

  display.println("Initializing...");

  display.display();

  

  // Setup WiFi

  WiFi.mode(WIFI_STA);

  WiFi.disconnect();

  delay(100);

}


void loop() {

  // Scan networks every 5 seconds

  if (millis() - lastScan >= scanTime * 1000) {

    scanNetworks();

    lastScan = millis();

  }

  

  // Change network when button is pressed

  if (digitalRead(BUTTON_NEXT) == LOW && networkCount > 0) {

    currentNetwork = (currentNetwork + 1) % networkCount;

    delay(200); // Debounce

    displayNetworks();

  }

}


void scanNetworks() {

  display.clearDisplay();

  display.setTextSize(1);

  display.setCursor(0,0);

  display.println("Scanning...");

  display.display();

  

  networkCount = WiFi.scanNetworks();

  

  if (networkCount == 0) {

    display.clearDisplay();

    display.setCursor(0,0);

    display.println("No networks found!");

    display.display();

  } else {

    networkCount = min(networkCount, MAX_NETWORKS);

    for (int i = 0; i < networkCount; i++) {

      networks[i].ssid = WiFi.SSID(i);

      networks[i].rssi = WiFi.RSSI(i);

      networks[i].encryptionType = WiFi.encryptionType(i);

      networks[i].channel = WiFi.channel(i);

    }

    displayNetworks();

  }

  

  // Clear scan results

  WiFi.scanDelete();

}


String getEncryptionTypeString(wifi_auth_mode_t encryptionType) {

  switch (encryptionType) {

    case WIFI_AUTH_OPEN:

      return "Open";

    case WIFI_AUTH_WEP:

      return "WEP";

    case WIFI_AUTH_WPA_PSK:

      return "WPA-PSK";

    case WIFI_AUTH_WPA2_PSK:

      return "WPA2-PSK";

    case WIFI_AUTH_WPA_WPA2_PSK:

      return "WPA/WPA2";

    case WIFI_AUTH_WPA2_ENTERPRISE:

      return "WPA2-ENT";

    default:

      return "Unknown";

  }

}


void displayNetworks() {

  display.clearDisplay();

  display.setTextSize(1);

  

  // Header

  display.setCursor(0,0);

  display.print(networkCount);

  display.print(" Networks | ");

  display.print(currentNetwork + 1);

  display.print("/");

  display.println(networkCount);

  display.drawLine(0, 9, SCREEN_WIDTH-1, 9, SSD1306_WHITE);

  

  if (networkCount > 0) {

    // Network SSID

    display.setCursor(0,12);

    String ssid = networks[currentNetwork].ssid;

    if (ssid.length() > 20) {

      ssid = ssid.substring(0, 17) + "...";

    }

    display.println(ssid);

    

    // Signal strength

    display.print("RSSI: ");

    display.print(networks[currentNetwork].rssi);

    display.println(" dBm");

    

    // Channel

    display.print("CH: ");

    display.println(networks[currentNetwork].channel);

    

    // Encryption type

    display.print("Security: ");

    display.println(getEncryptionTypeString(networks[currentNetwork].encryptionType));

    

    // Signal strength bar

    int strength = map(networks[currentNetwork].rssi, -100, -40, 0, SCREEN_WIDTH);

    display.drawRect(0, 54, SCREEN_WIDTH, 10, SSD1306_WHITE);

    display.fillRect(0, 54, strength, 10, SSD1306_WHITE);

  }

  

  display.display();

}

---------------------------------------------------------------------------------------------------------------------

semoga bermanfaat, 73 9m2zak


Monday, January 13, 2025

Space Shooter Game Lilygo TTGO ESP32

 

Untuk bermain permainan ini, korang memerlukan 2 butang untuk mengawal pesawat angkasa.

Manakala tembakannya adalah auto, so kita hanya perlu kawal sahaja.

Untuk sambung 2 butang kawalan kiri kanan tu, 

- sambung butang ke pin GPIO0 (kiri) dan GPIO35 (kanan)

dan pastikan kedua-dua butang itu di gnd kan. Dalam video di bawah saya tiada butang tu.

Maka saya tap sajalah... hahahaha.


jika berminat, dibawah ini adalah scriptnya. have fun!!!.

-------------------------------------------------------------------------------------------------------------------

#include <Wire.h>

#include <SPI.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>


#define OLED_MOSI   21    

#define OLED_CLK    22    

#define OLED_DC     15    

#define OLED_CS     13    

#define OLED_RESET  14    

#define SCREEN_WIDTH 128

#define SCREEN_HEIGHT 64

#define BUTTON_LEFT 0     // Butang kiri (GPIO0)

#define BUTTON_RIGHT 35   // Butang kanan (GPIO35)


Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, 

  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);


// Struktur untuk pesawat pemain

struct Player {

  int x = SCREEN_WIDTH/2;

  int y = SCREEN_HEIGHT-10;

  int width = 8;

  int height = 8;

  int score = 0;

  int lives = 3;

};


// Struktur untuk peluru

struct Bullet {

  int x = -1;

  int y = -1;

  bool active = false;

};


// Struktur untuk musuh

struct Enemy {

  int x;

  int y;

  bool active = false;

};


Player player;

Bullet bullet;

Enemy enemies[3];

unsigned long lastEnemySpawn = 0;

unsigned long lastBulletFired = 0;


void setup() {

  Serial.begin(115200);

  

  // Setup butang

  pinMode(BUTTON_LEFT, INPUT_PULLUP);

  pinMode(BUTTON_RIGHT, INPUT_PULLUP);

  

  if (!display.begin(SSD1306_SWITCHCAPVCC)) {

    Serial.println(F("OLED initialization failed"));

    while (1);

  }

  

  // Mulakan permainan

  initGame();

}


void initGame() {

  display.clearDisplay();

  display.setTextSize(1);

  display.setTextColor(SSD1306_WHITE);

  

  // Reset kedudukan musuh

  for(int i = 0; i < 3; i++) {

    enemies[i].active = false;

  }

  

  // Reset pemain

  player.x = SCREEN_WIDTH/2;

  player.score = 0;

  player.lives = 3;

}


void loop() {

  // Baca input

  handleInput();

  

  // Update game state

  updateGame();

  

  // Lukis skrin

  drawGame();

  

  delay(50);

}


void handleInput() {

  // Gerakkan pemain ke kiri

  if(digitalRead(BUTTON_LEFT) == LOW) {

    player.x = max(player.width/2, player.x - 2);

  }

  

  // Gerakkan pemain ke kanan

  if(digitalRead(BUTTON_RIGHT) == LOW) {

    player.x = min(SCREEN_WIDTH - player.width/2, player.x + 2);

  }

  

  // Tembak peluru (automatik)

  if(!bullet.active && millis() - lastBulletFired > 500) {

    bullet.x = player.x;

    bullet.y = player.y - 5;

    bullet.active = true;

    lastBulletFired = millis();

  }

}


void updateGame() {

  // Update peluru

  if(bullet.active) {

    bullet.y -= 3;

    if(bullet.y < 0) bullet.active = false;

  }

  

  // Spawn musuh baharu

  if(millis() - lastEnemySpawn > 2000) {

    for(int i = 0; i < 3; i++) {

      if(!enemies[i].active) {

        enemies[i].x = random(10, SCREEN_WIDTH-10);

        enemies[i].y = 0;

        enemies[i].active = true;

        lastEnemySpawn = millis();

        break;

      }

    }

  }

  

  // Update musuh

  for(int i = 0; i < 3; i++) {

    if(enemies[i].active) {

      enemies[i].y += 1;

      

      // Periksa perlanggaran dengan peluru

      if(bullet.active && 

         abs(bullet.x - enemies[i].x) < 8 && 

         abs(bullet.y - enemies[i].y) < 8) {

        enemies[i].active = false;

        bullet.active = false;

        player.score += 10;

      }

      

      // Periksa perlanggaran dengan pemain

      if(abs(enemies[i].x - player.x) < 8 && 

         abs(enemies[i].y - player.y) < 8) {

        enemies[i].active = false;

        player.lives--;

        if(player.lives <= 0) {

          initGame();

          return;

        }

      }

      

      // Reset musuh jika keluar skrin

      if(enemies[i].y > SCREEN_HEIGHT) {

        enemies[i].active = false;

      }

    }

  }

}


void drawGame() {

  display.clearDisplay();

  

  // Lukis pemain

  display.fillTriangle(

    player.x, player.y - 4,

    player.x - 4, player.y + 4,

    player.x + 4, player.y + 4,

    SSD1306_WHITE);

  

  // Lukis peluru

  if(bullet.active) {

    display.drawPixel(bullet.x, bullet.y, SSD1306_WHITE);

  }

  

  // Lukis musuh

  for(int i = 0; i < 3; i++) {

    if(enemies[i].active) {

      display.drawRect(enemies[i].x - 4, enemies[i].y - 4, 8, 8, SSD1306_WHITE);

    }

  }

  

  // Papar skor dan nyawa

  display.setCursor(0,0);

  display.print("Score:");

  display.print(player.score);

  

  display.setCursor(SCREEN_WIDTH-30,0);

  for(int i = 0; i < player.lives; i++) {

    display.print("<3 ");

  }

  

  display.display();

}

-------------------------------------------------------------------------------------------------------------------------

Sunday, January 12, 2025

Lora APRS Igate setup

 

Lora Aprs Igate 9W2DCW-10 
Langkah 1

Pergi ke laman web ini untuk flash firmware Lora APRS Igate, link seperti di bawah.

https://richonguzman.github.io/lora-igate-web-flasher/installer.html

kemudian paparan ini akan kelihatan.


pada baris atas iaitu Board (enviroment) pilih board yang sesuai dengan board yang ada pada kita, 

pada saya ada board LILYGO TTGO  Lora32 V1.6.1 seperti gambar di bawah.

V1.6.1
maka saya pilih board ni lah pada web flasher tu.


kemudian tekan Flash Firmware dalam kotak hijau tu dan paparan ini akan muncul.


pilih port USB Single Serial tu dan tekan connect


paparan ini akan muncul dan klik Install ttgo-lora32-v21 factory.json. kemudian paparan dibawah akan muncul dan tick erase device dan tekan next.

kemudian paparan diatas akan muncul dan tick erase device dan tekan next.

kemudian paparan dibawah akan muncul dan klik install.


tunggu sehingga dia selesai spt dibawah


dan tunggu lagi seperti di bawah...


dan tunggu lagi 


sehinggalah keluar gambar ini.


dan selesai, anda boleh tutup web flasher ini dan jom ke langkah 2

Langkah 2

Dalam langkah 2 ini kita akan connect atau link-kan Lilygo kita dengan komputer untuk masuk ke dalamnya untuk proses setting. Cara untuk masuk ke dalam Lilygo ini adalah dengan menggunakan wifi.


cari SSID NOCALL-10-AP dan masuk, passwordnya ialah 1234567890


kemudian buka browser anda, dan taip IP 192.168.4.1. dimana saya dapat IP ini? saya dapat dengan melihatnya di screen LILYGO tersebut. 


pada browser anda taip IP tersebut. seperti di bawah.


kemudian, paparan seperti di bawah akan muncul, dan boleh lah kita isi segala butirannya.


Langkah 3 - Pengisian data

anda boleh mengisi seperti di bawah dan hanya perlu ubah ikut station anda seperti callsign, dan latitude dan longitud

Station

wifi


APRS-IS



                                                                           Beaconing


                                                                     Black list dan Digipeating


                                                 LORA, ubah freq ke 433.400

                                                                Display dan Battery


                                                            WXtelemetry, syslog dan tnc


                                                          reboot time, wifi auto IP dan OTA


kemudian tekan button save warna hijau tu dan siaplah... untuk pastikan samada jadi ke, sila tgk di aprs.fi. jika jadi akan keluar macam ni.


Igate Lora akan papar simbol L latarbelakang merah. dan pada screen Lilygo anda akan terpapar seperti ini. lihat bawah.


                     semoga bermanfaat, selamat ber-LORA dan semoga berjumpa lagi. 73 de 9m2zak

Monday, January 6, 2025

Meshtastic Setup

 Meshtastic setup : Flash board anda disini dahulu : https://flasher.meshtastic.org/ kemudian

 Pastikan lilygo/tbeam/heltec/tdeck anda connect dengan bluetooth di telefon

anda terlebih dahulu. Download dahulu apps meshtastic di google play (android) atau app store (apple).

Pada apps Meshtastic, terus klik Setting dan setup 3 perkara ini iaitu Lora, Channels dan MQTT.

---------------------------------------------------------------------------------------------------------------------------------------------

Lora

Modem preset = LONG_FAST

Frequency offset (MHz) = 0.0

Region (Frequency plan) = Malaysia 919MHz

Hop Limit = 3

TX enabled = True

TX power (dBm) = 27

Frequency slot = 16

Override Duty Cycle = False

SX126X RX boosted gain = True

Override frequency (MHz) = 922.875

Ignore MQTT = False

OK to MQTT = True

 

MQTT

MQTT Config

MQTT enabled = True

Address = mqtt.lucifernet.com

Username = meshdev

Password = large4cats

Encrytion enabled = True

JSON output enabled = False

TLS enabled = False

Root topic = msh/MY_919

Proxy to client enabled = False jika guna wifi, True jika guna Bluetooth

Map Reporting = True

Precise location = True

Map reporting interval (seconds) = 0

 

Channel

 Channels name = LongFast

PSK = AQ==

Uplink enabled = True

Downlink enabled = True

Position enabled = True

Precise location = True

 

Wednesday, June 12, 2024

Connect a GPS module to a Raspberry Pi 4

 


To connect a GPS module with four wires (RST, TX, VCC, and GND) to a Raspberry Pi 4, follow these steps:

 Materials Needed:

1. GPS module with RST, TX, VCC, and GND pins

2. Raspberry Pi 4

3. Jumper wires

4. Breadboard (optional, for easier connections)

Steps:

1. Identify the Pins on the GPS Module:**

   - RST: Reset pin (might not be used in a basic connection)

   - TX: Transmit pin (sends data to the Raspberry Pi)

   - VCC: Power supply pin (typically 3.3V or 5V)

   - GND: Ground pin

2. Connect the GPS Module to the Raspberry Pi:

   - VCC to 3.3V or 5V: Connect the VCC pin of the GPS module to the 3.3V or 5V pin on the Raspberry Pi. Refer to your GPS module's datasheet to determine the correct voltage.

   - GND to GND: Connect the GND pin of the GPS module to one of the GND pins on the Raspberry Pi.

   - TX to RX (GPIO15): Connect the TX pin of the GPS module to the RX pin (GPIO15, physical pin 10) on the Raspberry Pi.

3. Configure the Raspberry Pi:

   - Boot up your Raspberry Pi and open a terminal.

   - Disable the Linux serial console to free up the serial port for the GPS module. Edit the `cmdline.txt` file:

          sudo nano /boot/cmdline.txt

     Remove any reference to `serial0` or `ttyAMA0`. Save and exit.

   - Edit the `config.txt` file to enable the serial port:

     sudo nano /boot/config.txt

    - Add the following lines at the end of the file:

     enable_uart=1

     dtoverlay=pi3-disable-bt

     -Save and exit.

   - Reboot your Raspberry Pi:

     sudo reboot

4. Install Necessary Software:

   - Install `gpsd` and `gpsd-clients` to read data from the GPS module:

     sudo apt update

     sudo apt install gpsd gpsd-clients

      - Configure `gpsd` to use the serial port:

      sudo nano /etc/default/gpsd

     Modify the file to look like this:

     START_DAEMON="true"

     GPSD_OPTIONS="-n"

     DEVICES="/dev/serial0"

     USBAUTO="false"

     GPSD_SOCKET="/var/run/gpsd.sock"

     Save and exit.

   - Restart `gpsd`:

     sudo systemctl restart gpsd

 5. Test the GPS Module:

   - Connect to the GPS module using `gpsmon`:

     gpsmon /dev/serial0

     - Or you can use `cgps` to get a simpler display:

    cgps -s 

You should now see data from the GPS module being displayed in the terminal.

Additional Notes:

- If the GPS module does not work, double-check all connections and ensure the GPS module is getting the correct voltage.

- Some GPS modules might require a specific baud rate. You can set this using the `stty` command:

  stty -F /dev/serial0 9600

  Replace `9600` with the baud rate required by your GPS module.

By following these steps, you should be able to successfully connect and communicate with a GPS module using your Raspberry Pi 4.

73 de Zaki 9M2ZAK

Monday, June 3, 2024

Definisi qAC, qAO dan qAR dalam APRS

 Dalam APRS (Automatic Packet Reporting System), `qAC`, `qAO`, dan `qAR` merujuk kepada tiga jenis penapisan laluan (path filtering) yang digunakan dalam proses penghantaran paket data melalui network.


1. qAC (Acknowledge Counter):

   - `qAC` menunjukkan bahawa paket tersebut telah melalui penapis acknowledge counter. 
Ini biasanya merujuk kepada bilangan node atau stesen yang telah mengenali atau mengakui
 paket tersebut. Acknowledge counter adalah penting untuk mengawal dan mengurangkan 
pengulanganatau penghantaran semula paket yang tidak perlu dalam rangkaian.

Dalam konteks APRS, stesen yang paling kerap menggunakan `qAC` adalah stesen 
digipeater. Berikut adalah penjelasan mengapa digipeater sering menggunakan `qAC`:


 Digipeater:

   - Definisi: Digipeater adalah singkatan dari "digital repeater" yang berfungsi untuk menerima, menyimpan, dan mengulang paket APRS dalam rangkaian radio.   - Peranan qAC: Digipeater menggunakan `qAC` untuk menghitung dan menandai berapa kali paket telah diulang atau diproses. Ini membantu dalam mengelakkan penghantaran semula yang berlebihan dan memastikan bahawa paket hanya diulang sebanyak yang diperlukan untuk mencapai destinasi tanpa membebankan rangkaian dengan paket yang sama berulang kali.


Mengapa Digipeater Menggunakan qAC?

- Pengurusan Trafik: Dengan menggunakan `qAC`, digipeater dapat mengawal lalu lintas paket dalam rangkaian dengan lebih berkesan. Mereka dapat menapis paket yang telah diulang terlalu banyak kali untuk mengurangkan kesesakan.

- Pengoptimuman Laluan: `qAC` membantu memastikan paket mengikuti laluan yang paling efisien dan mengurangkan kemungkinan paket terperangkap dalam gelung (loop) tanpa henti dalam rangkaian.

- Pengiktirafan Acknowledgements: Dalam sesetengah sistem APRS, pengesahan atau acknowledge paket adalah penting, dan digipeater dapat menggunakan `qAC` untuk mengesan paket yang memerlukan pengesahan tambahan atau telah menerima pengesahan yang mencukupi.

Oleh itu, digipeater adalah stesen utama yang menggunakan `qAC` dalam rangkaian APRS untuk membantu mengurus dan mengoptimumkan penghantaran paket data.

2. qAO (Overlaid Digipeater):

   - `qAO` menunjukkan bahawa paket tersebut telah melalui overlaid digipeater. 

Overlaid digipeater adalah stesen pengulang yang dipasang atau diletakkan pada kedudukan yang sama atau hampir sama dengan stesen lain untuk memperluas liputan rangkaian. Digipeater jenis ini membantu memastikan bahawa kawasan yang tidak dapat dijangkau oleh satu stesen pengulang masih boleh menerima dan menghantar paket melalui stesen yang lain. Dalam konteks APRS, stesen yang paling kerap menggunakan `qAO` adalah stesen overlaid digipeater. 

Berikut adalah penjelasan lanjut mengenai overlaid digipeater dan mengapa mereka menggunakan `qAO`:

Overlaid Digipeater

- Definisi: Overlaid digipeater adalah stesen pengulang yang dipasang pada kedudukan yang sama atau berdekatan dengan stesen lain untuk memperluas liputan rangkaian APRS. Mereka berfungsi untuk mengulang paket data dari stesen radio amatur ke kawasan yang lebih luas.

- Peranan qAO: `qAO` menunjukkan bahawa paket tersebut telah melalui overlaid digipeater. Ini membantu dalam mengenal pasti laluan yang telah diambil oleh paket dan memastikan bahawa ia telah melalui satu atau lebih stesen pengulang overlaid.

Mengapa Overlaid Digipeater Menggunakan qAO?

- Liputan Kawasan Lebih Luas: Dengan menggunakan `qAO`, overlaid digipeater dapat mengesahkan bahawa mereka telah mengulang paket untuk mencapai kawasan yang lebih luas yang mungkin tidak dapat dicapai oleh satu stesen pengulang sahaja.

- Redundansi dan Keandalan: Overlaid digipeater menyediakan redundansi dalam rangkaian. Jika satu digipeater mengalami masalah, stesen lain yang berdekatan dapat mengambil alih fungsi pengulangan. `qAO` membantu mengesan laluan paket dalam situasi ini.

- Pengelakkan Pengulangan Berlebihan: `qAO` membantu dalam mengelakkan pengulangan yang berlebihan oleh overlaid digipeater. Dengan menandai paket yang telah melalui stesen overlaid, ia memastikan bahawa paket tersebut tidak diulang secara tidak perlu oleh stesen yang sama atau berdekatan.

Kegunaan Praktikal

- Penambahbaikan Rangkaian: `qAO` digunakan untuk meningkatkan keberkesanan dan kecekapan rangkaian APRS dengan memastikan paket data dihantar melalui laluan yang optimum tanpa pengulangan yang tidak perlu.

- Pemantauan dan Analisis: Operator APRS dapat menggunakan maklumat `qAO` untuk memantau dan menganalisis prestasi rangkaian, mengenal pasti kawasan yang memerlukan penambahbaikan dalam liputan, dan mengoptimumkan penempatan stesen digipeater.

Secara ringkas, stesen overlaid digipeater adalah yang paling kerap menggunakan `qAO` untuk memastikan liputan yang luas dan keandalan dalam penghantaran paket data dalam rangkaian APRS.

3. qAR (Received via IGate):

   - `qAR` menunjukkan bahawa paket tersebut telah diterima melalui IGate (Internet Gateway). IGate adalah stesen yang menghubungkan rangkaian radio APRS dengan rangkaian internet. Paket dengan `qAR` telah melalui proses penapisan dan disahkan oleh IGate sebelum dihantar ke destinasi yang ditetapkan, biasanya melalui internet.

Dalam konteks APRS (Automatic Packet Reporting System), stesen yang paling kerap menggunakan `qAR` adalah IGate (Internet Gateway). Berikut adalah penjelasan lanjut mengenai IGate dan mengapa mereka menggunakan `qAR`:

IGate (Internet Gateway)

- Definisi: IGate adalah stesen yang menghubungkan rangkaian radio APRS dengan rangkaian internet. Mereka berfungsi sebagai jambatan untuk menghantar data dari rangkaian radio ke internet dan sebaliknya.

- Peranan qAR: `qAR` menunjukkan bahawa paket tersebut telah diterima atau dihantar melalui IGate. Ini membantu dalam mengenal pasti laluan paket yang telah melalui proses penyambungan dari radio ke internet atau sebaliknya.

Mengapa IGate Menggunakan qAR?

- Penyambungan Rangkaian: IGate menggunakan `qAR` untuk menandakan paket yang telah diterima melalui rangkaian radio dan dihantar ke rangkaian internet, atau paket yang diterima dari internet dan dihantar ke rangkaian radio. Ini memastikan bahawa paket tersebut dapat dijejaki dan dikenalpasti dalam proses penyambungan dua hala.

-Pengesahan dan Kebolehpercayaan: Dengan menandakan paket dengan `qAR`, IGate dapat memberikan pengesahan bahawa paket tersebut telah melalui proses penyambungan yang sah dan dapat dipercayai. Ini penting untuk memastikan kebolehpercayaan data yang disalurkan antara kedua-dua rangkaian.

-Pengurusan Trafik: `qAR` membantu IGate dalam menguruskan lalu lintas data dengan lebih berkesan. Dengan mengetahui paket mana yang telah melalui IGate, ia dapat mengelakkan penghantaran semula yang tidak perlu dan memastikan aliran data yang lancar.

Kegunaan Praktikal

-Penyebaran Data Global: Dengan menggunakan `qAR`, IGate dapat membantu dalam menyebarkan data APRS ke seluruh dunia melalui internet. Ini meningkatkan liputan dan akses kepada data APRS bagi pengguna di pelbagai lokasi.

-Pemantauan dan Analisis: Operator IGate dan pengguna APRS dapat menggunakan maklumat `qAR`untuk memantau dan menganalisis laluan data, mengenal pasti masalah dalam penyambungan rangkaian, dan mengoptimumkan prestasi rangkaian.

Secara ringkas, IGate adalah stesen yang paling kerap menggunakan `qAR` untuk memastikan penyambungan yang sah dan kebolehpercayaan dalam penghantaran data antara rangkaian radio APRS dan rangkaian internet.

Kesemua kod ini digunakan untuk mengenal pasti laluan yang telah dilalui oleh paket data dalam rangkaian APRS dan membantu dalam pemantauan, pengurusan, serta pengoptimuman penghantaran data dalam rangkaian tersebut.

Saturday, May 25, 2024

Setting up a Dynamic Update Client (DUC) on a Raspberry Pi

Setting up a Dynamic Update Client (DUC) on a Raspberry Pi allows you to automatically 

update the DNS records of a domain with the current IP address of your Raspberry Pi. 

This is particularly useful if you have a dynamic IP address that changes frequently. 

Here's a step-by-step guide to set up DUC on a Raspberry Pi:


1. Choose a Dynamic DNS (DDNS) Provider

First, you need to choose a DDNS provider. Some popular ones include:

No-IP (noip.com)

DynDNS (dyndns.com)

DuckDNS (duckdns.org)

For this guide, we'll use No-IP as an example.

-------------------------------------------------------------------------------------------------------

2. Create an Account and Hostname on No-IP

Sign Up: Go to No-IP and create an account.

Create a Hostname: After logging in, create a hostname under the 

"Dynamic DNS" section. This will be the address you use to access your Raspberry Pi.

-------------------------------------------------------------------------------------------------------

3. Install No-IP DUC on Raspberry Pi

Step 1: Update and Upgrade your Raspberry Pi

First, ensure your Raspberry Pi's package list is updated:

sudo apt update

sudo apt upgrade -y

Step 2: Download and Install No-IP DUC

cd /usr/local/src/

sudo wget https://www.noip.com/client/linux/noip-duc-linux.tar.gz

Extract the Archive:

sudo tar xf noip-duc-linux.tar.gz

Navigate to the Extracted Directory:

cd noip-2.1.9-1/

Compile and Install:

sudo make

sudo make install

Step 3: Configure No-IP DUC
During the installation, you will be prompted to enter your No-IP account details 
and the hostnames you wish to update. If you need to reconfigure later, you can do so by running:

sudo /usr/local/bin/noip2 -C

Follow the prompts to enter your No-IP username, password, and hostname.

Step 4: Start No-IP DUC
To start the No-IP DUC service:

sudo /usr/local/bin/noip2

Step 5: Check No-IP DUC Status

To check the status of No-IP DUC and ensure it's running:

sudo /usr/local/bin/noip2 -S

-----------------------------------------------------------------------------------------------------------

4. Ensure No-IP DUC Runs on Boot

To make sure the No-IP DUC runs automatically on boot, you can create a cron job.

Open Crontab:

sudo crontab -e

Add the Following Line:

@reboot /usr/local/bin/noip2

This will ensure that the No-IP DUC starts whenever the Raspberry Pi boots up.

-------------------------------------------------------------------------------------------------------

5. Verify DDNS Configuration

To verify that your DDNS is working correctly, reboot your Raspberry Pi and 

check if your hostname points to your Raspberry Pi's current IP address. 

You can do this by pinging the hostname from another device or checking 

the IP address on the No-IP dashboard.

Semoga bermanfaat, 73 Zaki

ESP32 WIFI Analyzer with OLED Display

Wifi Analyzer Skrip dibawah  ini berfungsi untuk scan WiFi berdekatan dan memaparkan maklumatnya pada screen OLED. Fungsi utamanya ialah: Sc...