Le système doit permettre de surveiller à distance des distributeurs automatiques (café, fruits secs, céréales, …) afin d’optimiser le processus de réapprovisionnement.
- Chaque distributeur automatique est équipé de capteurs et d’une carte embarquée (The Things Uno ou modèle équivalent) communiquant via LoRaWan avec un serveur The Things Network. [Étudiants EC]
- Une application PC Desktop supervise l’ensemble des distributeurs afin de déterminer leur état d’approvisionnement. Les données sont reçues au format JSON par le protocole MQTT via le réseau The Things Network. [Étudiants IR]
- Une application mobile pour Android permettra aux opérateurs d’assurer leur intervention (géolocalisation, parcours, type de produits à réapprovisionner, validation de l’intervention, ...). [Étudiant IR]
- Android :
Fonctionnalité (Android) | Oui | Non |
---|---|---|
Lister les distributeurs | X | |
Visualiser l'état d'un distributeur | X | |
Réaliser une intervention | X | |
Visualiser une intervention | X | |
Valider une intervention | X | |
Dialoguer avec les distributeurs | X |
- Desktop Qt :
Fonctionnalité (Android) | Oui | Non |
---|---|---|
Lister les distributeurs | X | |
Visualiser l'état d'un distributeur | X | |
Planifier une intervention | X | |
Visualiser une intervention | X | |
Configurer les distributeurs | X | |
Dialoguer avec les distributeurs | X | |
Sélectionner les bacs pour intervention | X | |
Imprimer une intervention (et sauvegarder en pdf) | X | |
Visualiser un distributeur sur une carte | X |
https://btssn-lasalle-84.github.io/just-feed-2023/
- Application Desktop :
Désignation | Caractéristiques |
---|---|
OS Poste de développement | PC sous GNU/Linux Ubuntu 20.04 |
EDI | Qt Creator 4.11.0 |
Développement | Qt 5.12.8 / C++ (GCC 9.3.0, 64 bits) |
- Application Android :
Désignation | Caractéristiques |
---|---|
OS Poste de développement | PC sous GNU/Linux Ubuntu 20.04 |
EDI | Android Studio 2021.3 / Gradle 7.3.1 |
Développement | Java (JDK 11.0.13) |
Diaporamas étudiants IR :
-
Android :
- Mayeul FARGIER : Revue finale - Just Feed - Fargier.pptx
-
Qt :
- Matthieu SALAUN : Revue finale - Just Feed - Salaun.pptx
- Nicolas ROUANET : Revue finale - Just Feed - Rouanet.pptx
https://www.youtube.com/@projets-btssn-lasalle84
- Android :
- Qt Desktop :
- Android :
- PC Desktop Qt :
Base de données MySQL 8.0 justfeed
hébergée sur www.db4free.net (pour les tests) :
-- LDD (langage de définition de données)
-- Voir aussi : https://www.db4free.net/phpMyAdmin/
DROP DATABASE IF EXISTS `justfeed`;
CREATE DATABASE IF NOT EXISTS `justfeed` CHARACTER SET utf8;
--
-- Base de données : `justfeed`
--
USE justfeed;
DROP TABLE IF EXISTS Approvisionnement;
DROP TABLE IF EXISTS Intervention;
DROP TABLE IF EXISTS Bac;
DROP TABLE IF EXISTS Produit;
DROP TABLE IF EXISTS Distributeur;
DROP TABLE IF EXISTS Operateur;
DROP TABLE IF EXISTS ServeurTTN;
-- --------------------------------------------------------
--
-- Structure de la table `ServeurTTN`
--
CREATE TABLE `ServeurTTN` (
`idServeurTTN` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`hostname` varchar(255) NOT NULL,
`port` int NOT NULL DEFAULT '1883',
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`applicationID` varchar(255) NOT NULL,
`estActif` int DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Structure de la table `Operateur`
--
CREATE TABLE `Operateur` (
`idOperateur` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`nom` varchar(64) NOT NULL,
`prenom` varchar(64) NOT NULL,
`identifiant` varchar(255) DEFAULT NULL,
`email` varchar(64) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Structure de la table `Distributeur`
--
CREATE TABLE `Distributeur` (
`idDistributeur` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`idServeurTTN` int NOT NULL,
`nomDistributeur` varchar(255) DEFAULT NULL,
`description` varchar(255) DEFAULT NULL,
`adresse` varchar(255) DEFAULT NULL,
`ville` varchar(255) DEFAULT NULL,
`codepostal` varchar(5) DEFAULT NULL,
`dateMiseEnService` date NOT NULL,
`longitude` varchar(255) DEFAULT NULL,
`latitude` varchar(255) DEFAULT NULL,
`deviceID` varchar(255) NOT NULL,
`nbBacs` int NOT NULL DEFAULT '2'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `Distributeur`
ADD UNIQUE KEY `deviceID` (`deviceID`),
ADD KEY `Distributeur_fk_1` (`idServeurTTN`);
ALTER TABLE `Distributeur`
ADD CONSTRAINT `Distributeur_fk_1` FOREIGN KEY (`idServeurTTN`) REFERENCES `ServeurTTN` (`idServeurTTN`) ON DELETE CASCADE;
-- --------------------------------------------------------
--
-- Structure de la table `Produit`
--
CREATE TABLE `Produit` (
`idProduit` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`nomProduit` varchar(255) DEFAULT NULL,
`marque` varchar(255) NOT NULL,
`description` varchar(255) DEFAULT NULL,
`codeEAN` varchar(13) DEFAULT NULL,
`prix` double DEFAULT NULL,
`poidsUnitaire` double DEFAULT NULL,
`volumeUnitaire` double DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `Produit`
ADD UNIQUE KEY `codeEAN` (`codeEAN`);
-- --------------------------------------------------------
--
-- Structure de la table `Bac`
--
CREATE TABLE `Bac` (
`idBac` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`idDistributeur` int NOT NULL,
`idProduit` int NOT NULL,
`poidsActuel` double,
`poidsTotal` double NOT NULL,
`hygrometrie` int DEFAULT '0',
`remplissage` double DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `Bac`
ADD KEY `Bac_fk_1` (`idDistributeur`),
ADD KEY `Bac_fk_2` (`idProduit`);
ALTER TABLE `Bac`
ADD CONSTRAINT `Bac_fk_1` FOREIGN KEY (`idDistributeur`) REFERENCES `Distributeur` (`idDistributeur`) ON DELETE CASCADE,
ADD CONSTRAINT `Bac_fk_2` FOREIGN KEY (`idProduit`) REFERENCES `Produit` (`idProduit`) ON DELETE CASCADE;
-- --------------------------------------------------------
--
-- Structure de la table `Intervention`
--
CREATE TABLE `Intervention` (
`idIntervention` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`idOperateur` int NOT NULL,
`idDistributeur` int NOT NULL,
`dateIntervention` date NOT NULL,
`aRemplir` int DEFAULT '0',
`aDepanner` int DEFAULT '0',
`etat` enum('EN_COURS','VALIDEE','A_FAIRE') NOT NULL DEFAULT 'A_FAIRE'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `Intervention`
ADD KEY `Intervention_fk_1` (`idOperateur`),
ADD KEY `Intervention_fk_2` (`idDistributeur`);
ALTER TABLE `Intervention`
ADD CONSTRAINT `Intervention_fk_1` FOREIGN KEY (`idOperateur`) REFERENCES `Operateur` (`idOperateur`) ON DELETE CASCADE;
ALTER TABLE `Intervention`
ADD CONSTRAINT `Intervention_fk_2` FOREIGN KEY (`idDistributeur`) REFERENCES `Distributeur` (`idDistributeur`);
-- --------------------------------------------------------
--
-- Structure de la table `Approvisionnement`
--
CREATE TABLE `Approvisionnement` (
`idApprovisionnement` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`idIntervention` int NOT NULL,
`idBac` int NOT NULL,
`poidsAPrevoir` float NOT NULL,
`heureApprovisionnement` time NOT NULL,
`effectue` int DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `Approvisionnement`
ADD KEY `Approvisionnement_fk_1` (`idIntervention`),
ADD KEY `Approvisionnement_fk_2` (`idBac`);
ALTER TABLE `Approvisionnement`
ADD CONSTRAINT `Approvisionnement_fk_1` FOREIGN KEY (`idIntervention`) REFERENCES `Intervention` (`idIntervention`) ON DELETE CASCADE,
ADD CONSTRAINT `Approvisionnement_fk_2` FOREIGN KEY (`idBac`) REFERENCES `Bac` (`idBac`) ON DELETE CASCADE;
Voir aussi : modules-lora/README.md
Qt MQTT fournit une implémentation conforme à la norme MQTT.
Qt MQTT fait parti de Qt For Automation et pas directement de Qt. Il faut donc l'installer.
Installation :
- Identifier la version de Qt :
$ qmake -v
QMake version 3.1
Using Qt version 5.12.8 in /usr/lib/x86_64-linux-gnu
Ici, la version de Qt est 5.12.8
.
- Récupérer le code source du module
mqtt
en clonant le dépôt git
$ sudo git clone https://code.qt.io/qt/qtmqtt.git
$ cd qtmqtt/
- Sélectionner la branche qui correspond à la version de Qt utilisée
$ sudo git checkout 5.12.8
- Installer le paquet fournissant les fichiers d'en-tête de développement indépendants
$ sudo apt install qtbase5-private-dev
- Fabriquer et installer le module
mqtt
$ sudo qmake
$ sudo make
$ sudo make install
Pour accèder aux classes du module Qt MQTT, il faudra ajouter le module mqtt
au fichier de projet .pro
:
QT += mqtt
Il faut ajouter les dépendances vers les bibliothèques nécessaires à l’utilisation du protocole MQTT : le client Paho MQTT et le service Android fournis par Eclipse.
Liens : Eclipse Paho et github
- Il faut ajouter l’url d’Eclipse Paho dans le ficher
build.gradle
du projet :
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven {
url "https://repo.eclipse.org/content/repositories/paho-snapshots/"
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
- Puis, il faut ajouter les dépendances vers le client Paho MQTT et le service Android dans le fichier build.gradle du dossier
app
:
...
dependencies {
...
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
}
- L’utilisation du protocole MQTT suppose que l’on ait un accès réseau. Pour cela, on va attribuer les permissions
INTERNET
,ACCESS_NETWORK_STATE
,ACCESS_WIFI_STATE
etWAKE_LOCK
à l’application Android dans son fichierAndroidManifest.xml
. On ajoutera aussi le serviceMqttService
.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
...>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
...>
...
<service android:name="org.eclipse.paho.android.service.MqttService" />
</application>
</manifest>
Étudiants IR :
- Matthieu SALAUN matthieusalaun30@gmail.com
- Nicolas ROUANET rouanet.nicolas.pro@gmail.com
- Mayeul FARGIER mayeulfargier.pro@gmail.com
©️ LaSalle Avignon 2023