L’objectif sera de créer un système de communication permettant d’envoyer une chaîne de caractère sous forme de JSON au travers de la lumière visible à partir d’un éméteur Li-Fi VLC et vers un recepteur Li-Fi VLC.
De façon générale, une fois cet objectif atteint, il sera possible de communiquer tout modèle de données au travers de la lumière. Vous pourrez donc donner libre cours à votre imagination.
Pour réussir cet objectif vous allez devoir :
- Flasher un Beaglebone
- Réaliser une configuration commune à l’émetteur et recepteur Li-Fi VLC (TX et RX)
- Configurer un émetteur Li-Fi VLC (TX)
- Configurer un récepteur Li-Fi VLC (RX)
- Pour aller plus loin
Juste avant de commencer voici quelques notions et définitions importantes afin de savoir ce qu’est le Li-Fi et la communication visible par la lumière et contrairement à beaucoup d’idée reçues, il ne s’agit pas de Li-Fi
- Lumière
- La lumière est une onde éléctromagnétique donc la longueur est comprise entre 1 nm et 1 mm.
- Li-Fi
- Le Li-Fi est une technologie de communication utilisant la lumière. La lumière étant une onde dont la longueur est comprise entre 1 nm et 1 mm donc le Lifi permet de communiquer en utilisant toutes les ondes dont la longueur est comprise entre 1 nm et 1 mm.
- VLC
- Visible Light Communication ou en français communication par la lumière visible. La lumière étant une onde dont la longueur est comprise entre 10 nm et 1 mm et que l’oeil humain permet de voir uniquement les ondes ayant une longueur comprisent entre 380 et 780 nm (fin des ultraviolet et début des infrarouges), les dispositifs VLC permettent de communiquer via la lumière en utilisant uniquement les longueurs d’ondes dont le spectre est compris 380 et 780 nm.
- OpenVLC
- OpenVLC est un projet open source permettant de communiquer des informations via le spectre visible de la lumière
Après la lecture de ces définitions, on comprend qu’utiliser le terme Li-Fi pour parler de VLC est un abus de langage qui permet de se faire comprendre rapidement par les néophytes.
Dans la suite du tutoriel nous parlerons de Li-Fi VLC afin de parler de communication visible par la lumière.
1. Flasher un Beaglebone black
Préparer la carte SD
Afin de flasher un BB, nous aurons besoin d’une carte SD d’au moins 4GB sur laquelle une image Débian aura été installée.
- Formatter la carte SD à l’aide d’un logiciel spécialisé avec le mode ‘overwrite’
- Télécharger l’image bone-debian-8.7-armhf
- Mettez l’image téléchargé sur la carte SD à l’aide de Win32 Disk Imager
Flasher le Beagle Bone Black
Maintenant que la carte SD est prête, nous allons pouvoir installer l’OS sur le BBB
- Sans que le Beagle soit alimenté, insérer la carte SD dans l’emplacement prévu à cet effet
- Alimentez le Beagle bone grâce à votre ordinateur et sur le port USB
-
Une fois démarré, connectez vous via le port ssh
ssh debian@192.168.7.2
A ce stade, nous avons lancé l’os installé sur la carte SD, il nous faut maintenant installer l’OS sur la mémoire interne du BB
-
se déplacer dans le répertoire /opt/scripts/tools/eMMC
cd /opt/scripts/tools/eMMC
-
Installer l’OS sur la mémoire interne du BB
sudo ./bbb-eMMC-flasher-eewiki-ext4.sh
Attendre jusqu’à ce que vous voyez écrit à l’écran
eMMC has been flashed
- Déconnecter le câble, enlever la carte SD et redémarrer le BBB
Bravo, vous venez de finir de flasher un BB
Configurer une connexion internet
Afin de configurer votre connexion internet, il est nécessaire de configurer les interfaces réseaux du Beaglebone. Bien que l’interface 192.168.7.2 soit configurée par défaut, aucune passerelle par défaut n’est encore configurée sur le BB.
Nous vous proposons un tutoriel permettant de configurer les interfaces réseau et la connexion internet d’un Beaglebone à adapter suivant vos besoins.
Une fois la connexion à internet obtenue, vous pouvez passer à l’étape 3.
2. Configuration commune à l’éméteur (TX) et au récepteur (RX)
La carte openVLC a besoin de plusieurs pins afin de fonctionner avec le BB. Notamment la pin HDMi qui est déja utilisée. C’est pourquoi nous allons tout d’abord la désactiver.
-
Désactiver l’utilisation de la pin HDMI
sudo nano /boot/uEnv.txt
Puis commenter les lignes suivantes
dtb=am335x-boneblack-emmc-overlay.dtb
-
Si ça n’est pas déjà fait, mettre à jour la liste des dépots officiels
sudo apt-get update
-
Installer le header
sudo apt-get install linux-headers-$(uname -r)
-
Télécharger le repository contenant le kernel et le code
git clone https://github.com/nfacciolo/Reactic.io-OpenVLC.git
Le repository OpenVLC que je propose a été modifier par rapport à l’original. Il s’agit principalement d’améliorer les explications fournies dans la documentation officielle, de supprimer les retours chariots qui empêchaient d’exécuter certains scripts ainsi que la création de quelques scripts.
3. Configurer au moins un TX
-
Compiler le programme
cd /home/debian/OpenVLC/OpenVLC1.3_revA/ chmod +x ./compile-open-vlc-kernel.sh ./compile-open-vlc-kernel.sh 192.168.0.1 255.255.255.252
Le Tx et le RX doivent avoir des adresses Ip configurées différentes. Vous pouvez utiliser ce script afin changer la configuration.
-
Deployer le programme
Dans le même dossier exécuter les actions suivanteschmod +x ./deploy-open-vlc-tx.sh ./deploy-open-vlc-tx.sh
-
Activer l’ip forwarding
echo "1" | sudo tee /proc/sys/net/ipv4/ip_forward
L’ip forwarding permet de recevoir une requête sur une interface et la faire suivre sur une autre. Il sera utile si vous décider d’implémenter une configuration plus complexe que celle vue dans notre tutoriel.
-
Vérifier la configuration réseau
-
Vérifier la configuration de la table de routage
route -n
Le résultat devrait être similaire au résultat ci-dessous
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0 192.168.0.0 0.0.0.0 255.255.255.252 U 0 0 0 vlc0 192.168.6.0 0.0.0.0 255.255.255.252 U 0 0 0 usb1 192.168.7.0 0.0.0.0 255.255.255.252 U 0 0 0 usb0 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
On peut observer ici que nous disposons d’une nouvelle interface vlc0 dont le réseau est 192.168.0.0/30
-
Vérifier la configuration ip
ifconfig
Le résultat devrait être similaire au résultat ci-dessous
vlc0 Link encap:Local Loopback inet addr:192.168.0.1 Mask:255.255.255.252 UP RUNNING NOARP MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Afin de simplifier la lecture j’ai volontairement supprimé l’affichage des autres interfaces réseau configurées.
On peut observer qu’on a attribué l’adresse ip 192.168.0.1 à l’interface vlc0. Ce qui est cohérent avec la configuration vue précédemment.
-
Vérifier la configuration de la table de routage
-
Tester l’emission d’un ping vers le RX (Réseau 192.168.0.0)
ping 192.168.0.2
Si tout s’est bien déroulé, vous devriez voir la lumière du TX s’alumer une fraction de seconde à chaque ping envoyé ainsi qu’un message vous expliquant que 100% des paquets ont été perdu. Ce qui est normal puisque l’éméteur et le récepteur open vlc dans cette configuration est prévu pour travailler avec le protocole de communication UDP, donc en emission seulement et sans garantir la réception des données.
-
Installer un client udp envoyant des données à une adresse ip spécifique
-
Télécharger le client udp créé par Reactic
git clone https://github.com/nfacciolo/Reactic.io-udp-client-loop
-
Lancer le client udp
cd Reactic.io-udp-client-loop node ./main.js
-
Visualiser les données envoyées
Les données envoyées sont présentes dans le fichierdata.json
nano ./data.json
Il s’agit d’un fichier Json initialement rempli comme ci-dessous
{ "lifi_open_vlc_id": 1, "lifi_open_vlc_dataExample": "Another Li-Fi OpenVLC data example" }
!! Attention en fonction de la taille du message que vous aurez à envoyer, il faudra moduler le temps entre chaque message envoyés par le client. Pour cela, il faudra modifier la variable
TIMEOUT_BETWEEN_REQUESTS
présente dans le fichier/home/debian/Reactic.io-udp-client-loop/udp-client.js
. Si un temps trop court est configuré, le système prendra du retard lors de l’envoi de données, puis lorsque la mémoire vive sera pleine, il finira par crasher !! -
Télécharger le client udp créé par Reactic
-
Configurer une tâche CRON afin de lancer automatiquement le client UDP
Juste pour vous, nous avons créé des scripts que vous pourrez lancer automatiquement au démarrage du TX et du RX qui effectueront toutes les actions nécessaires pour faire fonctionner le système.
Il existe 3 manières de lancer un programme au démarrage d’un système d’exploitation Linux. Afin d’exécuter un script, la méthode la plus commode reste la tâche CRON.
Le script du TX à exécuter se trouve à l’emplacement/home/debian/Reactic.io-OpenVLC/OpenVLC1.3_revA/deploy-open-vlc-tx.sh
Tester la configuration du TX
-
Redémarrer l’émeteur Li-Fi
sudo reboot
Félicitation, à ce stade vous venez de finir de configurer le TX. Vous pouvez envoyer n’importe quel type de données en modifiant le fichier data.json
Il reste encore à configurer la reception du signal lumineux sur le RX afin permettre l’utilisation des données envoyées.
4. Configurer au moins un RX
Reproduire les étapes 2-3-4
-
Compiler le programme
cd /home/debian/Reactic.io-OpenVLC/OpenVLC1.3_revA/ chmod +x ./compile-open-vlc-kernel.sh ./compile-open-vlc-kernel.sh 192.168.0.2 255.255.255.252
Le Tx et le RX doivent avoir des adresses Ip configurées différentes. Vous pouvez utiliser ce script afin changer la configuration.
-
Deployer le programme
Dans le même dossier exécuter les actions suivantes :chmod +x ./deploy-open-vlc-rx.sh ./deploy-open-vlc-rx.sh
-
Activer l’ip forwarding
echo "1" | sudo tee /proc/sys/net/ipv4/ip_forward
L’ip forwarding permet de recevoir une requête sur une interface et la faire suivre sur une autre. Il sera utile si vous décider d’implémenter une configuration plus complexe que celle vue dans notre tutoriel.
-
Vérifier la configuration réseau
-
Vérifier la configuration de la table de routage
route -n
Le résultat devrait être similaire au résultat ci-dessous
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0 192.168.0.0 0.0.0.0 255.255.255.252 U 0 0 0 vlc0 192.168.6.0 0.0.0.0 255.255.255.252 U 0 0 0 usb1 192.168.7.0 0.0.0.0 255.255.255.252 U 0 0 0 usb0 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
On peut observer ici que nous disposons d’une nouvelle interface vlc0 dont le réseau est 192.168.0.0/30
-
Vérifier la configuration ip
ifconfig
Le résultat devrait être similaire au résultat ci-dessous
vlc0 Link encap:Local Loopback inet addr:192.168.0.2 Mask:255.255.255.252 UP RUNNING NOARP MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
On peut observer qu’on a attribué l’adresse ip 192.168.0.2 à l’interface vlc0. Ce qui est cohérent avec la configuration vue précédemment.
-
Vérifier la configuration de la table de routage
-
Installer un serveur udp permettant de traiter les données envoyées par le TX
-
Télécharger le serveur udp créé par Reactic
git clone https://github.com/nfacciolo/Reactic.io-udp-server
-
Lancer le serveur udp
cd Reactic.io-udp-server node ./udp-server.js
-
Visualiser les données envoyées
Mettre le RX et le TX face à face. Afin d’optimiser le taux de réussite de transmission des messages, éloignez vous des sources de lumières fortes et surface réfléchissantes.
Vous devriez voir apparaitre dans la console le message configuré dans le fichier data.jsonserver got: a msg from 192.168.0.1:52658 { "lifi_open_vlc_id": 1, "lifi_open_vlc_dataExample": "Another Li-Fi OpenVLC data example" }
-
Télécharger le serveur udp créé par Reactic
-
Configurer une tâche CRON afin de lancer automatiquement le server UDP
Comme vu à l’étape 3.7 nous avons créé des script que vous pouvez lancer au démarrage et qui efféctueront toutes les actions nécessaires au lancement du RX.
Le script du RX à exécuter se trouve à l’emplacement/home/debian/Reactic.io-OpenVLC/OpenVLC1.3_revA/deploy-open-vlc-rx.sh
Pour aller plus loin
Afin de mieux connaître les enjeux du Li-Fi, je vous propose de lire un article expliquant ce qu’est le Li-Fi.
Si vous êtes êtes à un niveau un peu plus avancé de connaissance, que vous souhaitez augmenter votre productivité ou simplement vous renseigner sur Docker, vous pouvez lire un article expliquant ce qu’est Docker et les conteneurs.