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 :

Lien pour marque-pages : Permaliens.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *