Aller au contenu

Communiquer avec l'application

Pour communiquer entre votre Ruban et l'application, nous allons devoir intéragir avec le Broker MQTT.

Le Broker va servir d'intermédiaire pour faire passer nos commandes.

Aujourd'hui, nous avons fourni un client tout prêt et adapté à l'objet connecté pour vous faciliter la vie.

Configurer le Client

Voici le code qui permet d'instancier le Client qui communique avec le Controleur de LEDs. Dans l'exemple, les valeurs de configuration sont récupéres depuis le fichier .env :

Dotenv dotenv = Dotenv.configure().load();
String clientId = dotenv.get("MQTT_CLIENT_ID");
String mqttHost = dotenv.get("MQTT_HOST");
String mqttUsername = dotenv.get("MQTT_USERNAME");
String mqttPassword = dotenv.get("MQTT_PASSWORD");

// TODO replace by your Device ID
String deviceId = "led-1";

// Instanciation du Client MQTT
this.mqttClient = StandardTakIOTClient.newInstance(mqttHost, clientId, mqttUsername, mqttPassword);
this.ledLightingMiddleware = new LedLightingMiddleware(deviceId);
mqttClient.use(ledLightingMiddleware);
mqttClient.connect();

Vous pouvez le voir, il y a deux parties :

  • la première où l'on récupère les variables d'environnement (que vous avez placé dans le .env)
  • la seconde où on crée le client MQTT (générique) et le middleware.

Note

Le middleware, c'est un peu notre Plugin pour gérer le contrôleur de LEDs. Notre Middleware s'appelle ledLighting, et c'est grâce à lui qu'on va pouvoir intéragir avec notre module.

Warning

Pensez bien à remplacer deviceId par le bon deviceId présent sur votre objet. Sinon, cela ne fonctionnera pas.

Changer l'état d'une LED

Nous l'avons dit dans le briefing : la seule commande d'un contrôleur de LEDs est celle qui permet de dire quelle couleur donner à chaque LED.

Cette commande s'appelle setLights.

Comme nous pilotons des pixels, nous devrons fournir à chaque fois la liste de tous les pixels et leur valeur RGB (Red, Green, Blue).

Dans le programme, il suffit de créer des Pixels, de les mettre dans une liste, et d'appeler le Middleware comme suit :

// On crée une couleur RGB R=223, G=2, B=104
PixelColor futureColor = new PixelColor(223, 2, 104);

// Ici, on crée 25 pixels car on a 25 LEDs
int pixelCount = 25;
List<PixelColor> pixels = new ArrayList<>(pixelCount);

for (int i = 0; i < pixelCount; i++) {
    // On met tous nos pixels de la même couleur
    pixels.add(futureColor);    
}

// On prépare le message à envoyer au Broker MQTT
var message = new SetLightsMessage(pixels);
// On utilise le middleware pour l'envoyer
ledLightingMiddleware.publishSetLights(message);
// C'est fini !

Méthodes utilitaires

Pour vous faciliter la vie, nous avons mis à votre disposition plusieurs méthodes utilitaires :

ofRepeated : Permet de créer une Liste de pixels tous de la même couleur

Ce code :

List<PixelColor> pixels = ListUtils.ofRepeated(myColor, pixelCount);

Est équivalent à celui-ci :

List<PixelColor> pixels = new ArrayList<>(pixelCount);

for (int i = 0; i < pixelCount; i++) {
    // On met tous nos pixels de la même couleur
    pixels.add(myColor);    
}

Colors.XXX.value() : Donne une quinzaine couleurs standard pour aller plus vite

PixelColor black = Colors.BLACK.value();

TimerUtils.sleepMillis(long millis) : Permet de temporiser l'exécution de votre application pendant X millisecondes.

// Pause pendant 10 secondes
TimerUtils.sleepMillis(10_000);