LoRa APRS i-Gate & Tracker

Je travaille depuis quelques jours sur l’implémentation d’une i-Gate et un tracker APRS sur le protocole LoRa. (Merci à F4EED et F4ASS d’en avoir parlé ;), et merci à F4EWI pour la doc sur PlatformIO)

Le code de base utilisé est celui produit par Peter Buchegger (OE5BPA).

Le matériel utilisé pour ce projet est le suivant :

NOTE 1 : attention de bien prendre la version 433Mhz! Il existe des versions en 868 Mhz et 915 Mhz
NOTE 2 : attention de bien respecter les règles et d’avoir une licence radio/autorisation d’émettre dans la bandes choisie !

Après avoir reçu le matériel, j’ai compilé le code et uploadé le tout en suivant la documentation de F4EWI à partir des repos ci-dessous :

Les premiers tests semblent concluants, cependant selon les endroits ou je me promène, je me retrouve à une couverture de 9Km vers le Nord, et 16,4Km vers l’Ouest.

J’ai donc entrepris de modifier le code de l’iGate pour stocker les messages APRS reçus, le RSSI, et le SNR.

Le but étant de faire une couverture et identifier ce que je pourrais améliorer dans l’installation pour avoir une couverture plus intéressante.

Il faudra modifier l’URL ou vous envoyez vos trames, car dans le code, ça arrive chez moi 😉

PS : si jamais vous n’avez pas de quoi stocker les données, poussez-moi un message. On verra ensemble pour que vous ayez accès à vos données.

Voici le script qui récupère les données :

<?php


//Si vous n'avez pas de serveur mysql, vous pouvez décommenter les lignes suivantes et commenter le reste. Cela va vous créer un fichier plat avec toutes les données brutes
//$handle = fopen("data.txt", "a+");
//fwrite($handle, gmdate("Ymd H:i:s"). '; ');
//fwrite($handle, rtrim($_POST['msg']).' ; ');
//fwrite($handle, $_POST['rssi'].' ; ');
//fwrite($handle, $_POST['snr'].PHP_EOL);
//fclose($handle);

// Si pas de serveur mysql/mariadb, commentez ou supprimez les lignes ci-dessous
$user = "user";
$pass = "pass";
$db   = "database";

$link = new mysqli('localhost', $user, $pass, $db);
if ($link->connect_errno){
	printf("Echec de la cnx : %s\n",$link->connect_error);
	exit();
}

if (strpos($_POST['msg'],'/')) {
	$ast=strpos($_POST['msg'],'/');
}else {
	$ast=strpos($_POST['msg'],'\\');
}

$latitude = substr($_POST['msg'],strpos($_POST['msg'],'=')+1,8);
$lat_deg = substr($latitude,0,2);
$lat_min = substr($latitude,2,2);
$lat_dir = substr($latitude,7,1);
$latitude = intval($lat_deg)+(floatval($lat_min)/60);
if ($lat_dir=='S') {
	$latitude = $latitude*-1;
}

$longitude = substr($_POST['msg'],$ast+1,9);
$lon_deg=substr($longitude,0,3);
$lon_min=substr($longitude,3,2);
$lon_dir=substr($longitude,8,1);
$longitude = intval($lon_deg)+(floatval($lon_min)/60);
if ($lon_dir=='W') {
	$longitude = $longitude *-1;
}


$callsign = substr($_POST['msg'],7,strpos($_POST['msg'],',')-7);
$msg  = $_POST['msg'];
$rssi = $_POST['rssi'];
$snr  = $_POST['snr'];


$sql = "INSERT INTO `data` (`timestamp`, `callsign`, `msg`,`lat`,`lon`, `rssi`, `snr`) VALUES (current_timestamp(), \"".$callsign."\", \"".$msg."\",".$latitude.",".$longitude.", ".$rssi.", ".$snr."); ";
echo $sql;
if ($link->query($sql) === TRUE) {
	echo "Record inserted";
}

// Fermeture de la connexion
mysqli_close($link);

?>

Ici la structure de la base mysql/mariadb :

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
--
-- Structure de la table `data`
--

CREATE TABLE `data` (
  `timestamp` timestamp NOT NULL DEFAULT current_timestamp(),
  `callsign` char(255) NOT NULL,
  `msg` varchar(4096) NOT NULL,
  `lat` float NOT NULL,
  `lon` float NOT NULL,
  `rssi` float NOT NULL,
  `snr` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf32;
COMMIT;

Ça vous donnera quelque-chose comme suivant dans la base de donnée :

3 commentaires sur “LoRa APRS i-Gate & Tracker”

  1. Bonjour Johan,

    J’essaie de maquetter une nouvelle version de notre digi/iGate (avec mon indicatif F4BVC-3 pour l’instant) avec ton code mais j’ai ce message lors de la compilation :

    src/LoRa_APRS_iGate.cpp: In function ‘void loop()’:
    src/LoRa_APRS_iGate.cpp:231:7: warning: unused variable ‘httpResponseCode’ [-Wunused-variable]
    int httpResponseCode = http.POST(httpRequestData);
    ^

    Cependant, tout semble fonctionner…sauf l’envoi vers chez toi.
    J’aimerais beaucoup pousser les données sur ton site dans un premier temps. Est-ce toujours possible ?

    Merci d’avance.
    Amicalement, F4BVC

    1. Bonjour Sébastien,

      oui le message d’erreur est un warning, je n’ai pas pris le temps de nettoyer cela, mais aucun soucis sur la remontée d’infos.

      Je vois ce qui est remonté et t’envois un mail séparé sur le sujet 🙂

      73s

  2. Hello Johan,

    Grâce à Sébastien F4GPM, nous expérimentons actuellement au club F8KGK un digi+iGate LoRa en fixe : F8KGK-3.

    A cette occasion, nous nous sommes demandés, dans le cas d’une utilisation mobile ou portable d’une plateforme T-beam Lilygo à des fins de Digi+iGate, s’il y aurait possibilité d’inclure dans le code la position live du Digi+iGate ?

    En tout cas, merci pour tes essais et tes modifications.
    Record d’aujourd’hui avec un T-beam en mobile : F4BVC-8 316 2022-10-02 12:32:05 2022-10-09 18:34:39 JN09HD > JN09NL 49.3 km 227° 2022-10-09 10:04:10

    Amicalement, F4BVC

Laisser un commentaire