2Prototypage IoT Yocto
Différents types d'objets
● Objet simple de type capteur– Micro-contrôleur
– Logiciel « bare metal » ou OS léger type Contiki ou RIOT
● Objet complexe– CPU avec MMU
– OS Linux ou Android
Parrot flower power (µC) Eccelenza touch (Yocto)
3Prototypage IoT Yocto
Linux/IoT
● A priori n'est pas l'OS le plus adapté (32 bits)● Mais selon IoT developer Survey 2016, part des OS
– 73 % Linux
– 23 % « bare metal » (sans OS)
– 12 % FreeRTOS
– 6 % Contiki
● Cependant il y a Linux et Linux !– Distribution
– « Build system »
4Prototypage IoT Yocto
Distribution Linux
● La plupart des développeurs utilisent des distributions– Ubuntu, Debian, Fedora, etc.
● Environnement connu, simple à aborder, idéal pour débuter mais :
– Empreinte mémoire importante
– Temps de démarrage
– Reste un environnement de développement avant tout
– Faible traçabilité
– Multi-plateforme limité
– Bref, peu adapté à l'IoT
● Solution alternative → le « build system » !
5Prototypage IoT Yocto
Outils de « build system »
● Outil de création de distribution● Crée la distribution à partir des sources des
composants en utilisant un « moteur »● L'outil ne fournit pas les sources mais des recettes et
prend en compte les dépendances● L'outil produit les différents éléments de la distribution
– Bootloader
– Noyau Linux
– Images du root-filesystem + applications intégrées
● Meilleure solution au niveau empreinte mémoire et traçabilité
6Prototypage IoT Yocto
Les principaux outils disponibles
● Yocto/OpenEmbedded– Moteur écrit en Python
– Très puissant mais lourd
– Basé sur des fichiers de configuration
● Buildroot– Basé sur la commande « make »
– Au départ un démonstrateur pour uClibc
● OpenWrt– Dérivé de BR
– Gère les paquets binaires
– Utilisé sur WeIO (IoT)
7Prototypage IoT Yocto
Buildroot
● Initialement un démonstrateur de uClibc (Micro-C-libC)● Une version officielle tous les 3 mois depuis 2009.02● Outil de configuration graphique identique à celui du
noyau● Léger, rapide, basé sur des fichiers Makefile● Pas de système de paquets → « firmware Linux »
8Prototypage IoT Yocto
OpenEmbedded
● OE est un « framework de compilation croisée » ● Démarré par Chris Larson, Michael Lauer et Holger
Schuring pour OpenZaurus en 2003 → remplacer Buildroot
● Le Zaurus (SHARP) est le « premier » PDA sous Linux en 2001
9Prototypage IoT Yocto
Les principes d'OpenEmbedded
● OE utilise un « séquenceur » nommé BitBake (écrit en Python) → recette (recipe)
● La recette correspond à un fichier .bb (BitBake)● OE utilise un principe d'héritage → inherit● On peut « dériver » une recette par un .bbappend● OE utilise également des classes (.bbclass), des en-
tête (.inc) et des configurations (.conf)● Les recettes sont organisées en couches (layers) → meta-*
● OE permet de créer des paquets binaires (RPM, IPK, DEB) contrairement à BR
10Prototypage IoT Yocto
Yocto ?
« yocto (symbole y) est le préfixe du système international d'unités (SI) qui représente 10-24
fois cette unité (soit un quatrillionième).
Adopté en 1991, il provient du grec κτώ, huit car =ὀ (10-3)8 »
Ainsi parlait Wikipedia !
11Prototypage IoT Yocto
Yocto / OE
● Yocto est un projet « chapeau » démarré en 2010 ● Intègre de nombreux projets comme OE, BitBake,
Poky, Eglibc, ADT, Hob, …● Plusieurs dizaines de membres dont Intel, Montavista,
Freescale, Huawei, Mentor Graphics, Gumstix, ...● L'architecte est Richard Purdie qui a rejoint la Linux
Foundation en tant que « fellow » en décembre 2010● Organisation similaire à celle de l'équipe du noyau
Linux « meritocracy presided over by a benevolent dictator »
● Un véritable projet collaboratif promu par la fondation Linux
● De nombreux BSP industriels utilisent Yocto !
12Prototypage IoT Yocto
Yocto / OE, suite
● Utilise des paquets RPM, DEB ou IPK● Syntaxe complexe mais très bonne documentation● Investissement initial important
My project
13Prototypage IoT Yocto
Principe des « layers »
14Prototypage IoT Yocto
Buildroot ou Yocto ?
schéma de Thomas Petazzoni
15Prototypage IoT Yocto
Yocto « in a nutshell »
● Installation de Poky 2.1 (Yocto reference distro)$ git clone -b krogoth git://git.yoctoproject.org/poky
● Création du répertoire de travail$ cd poky
$ source oe-init-build-env qemux86-build
● Définition (optionnelle) du type de machine dans conf/local.conf#MACHINE ?= "qemuarm"
...
# This sets the default machine to be qemux86 if no other machine is selected:
MACHINE ??= "qemux86"
● Construction d'une image simple$ bitbake core-image-minimal
● Test de l'image$ runqemu qemux86
16Prototypage IoT Yocto
Yocto/RPi « in a nutshell »
● Installation de la couche RPi (meta-raspberrypi)$ cd poky
$ git clone git://git.yoctoproject.org/meta-raspberrypi
● Création du répertoire de travail$ source oe-init-build-env rpi-build
● Ajout de la couche RPi à conf/bblayers.confBBLAYERS ?= " \
...
<path>/poky/meta-raspberrypi \
● Ajout du type de machine à conf/local.confMACHINE = "raspberrypi"
● Création de l'image$ bitbake core-image-minimal
● Copie de l'image sur la carte SD$ sudo dd if=<path>/core-image-minimal-raspberrypi.rpi-sdimg of=/dev/sdb
17Prototypage IoT Yocto
Cas d'usage = maquette IoT
● Construire – rapidement - un capteur de température pour un démonstrateur IoT (Smile)
– Raspberry Pi
– Sonde I²C (MPL115A2)
– Wi-Fi (USB)
– Protocole HTTP → /var/pages/values.txt
18Prototypage IoT Yocto
Schéma global du démonstrateur
19Prototypage IoT Yocto
Principe de construction
● Partir de la distribution la plus simple « core-image-minimal »
● Ajouter des options et fonctionnalités standards– Gestion de paquets (package management)
– Recettes standards ou « dérivées »
– Recette(s) dédiée(s) (pilotage capteur I²C)
● Création des métadonnées → meta-iot$ yocto-layer create iot
● Modification du fichier local.conf (pour les tests)● Création d'une distribution dérivée → « rpi-iot-image »● Bon exercice d'apprentissage des techniques Yocto !
20Prototypage IoT Yocto
Dérivation et priorité de recette
● Principe très utilisé sous Yocto/OE● Une recette (.bb) est définie dans une couche A● On modifie (ou on ajoute) des options/données dans un .bbappend situé dans une autre couche B
● On peut aussi placer le même .bb dans la couche B si la priorité est > A
● Dans notre cas– Configuration Wi-Fi
– Activation I²C dans config.txt
– Chargement automatique du module i2c-dev
21Prototypage IoT Yocto
Configuration réseau (Wi-Fi + HTTP)
● Contrôleur pris en charge + chargement du module → wlan0
● Ajout de quelques paquetsIMAGE_INSTALL_append += "iw wpa_supplicant lighttpd"
● Modification /etc/network/interfaces● Authentification WPA
# wpa_passphrase <ESSID> <password> > /etc/wpa_supplicant.conf
# ifdown wlan0
# ifup wlan0
22Prototypage IoT Yocto
Prise en charge I²C
● Modification config.txtdtparam=i2c_arm=on
→ do_deploy_append() ● Ajout des paquets nécessaires à local.conf
IMAGE_INSTALL_append += "i2c-tools kernel-modules"
● Chargement du pilote I²CKERNEL_MODULE_AUTOLOAD += "i2c-dev"
→ ajout au .bbappend du noyau● Création de la recette pour pilotage MPL115A2
– Adaptation du programme existant (basé sur WiringPi)
– Service lancé au démarrage (interrogation toutes les 20 secondes) → classe update-rc.d
23Prototypage IoT Yocto
NTP
● Demande d'une fonctionnalité NTP (a posteriori)● Intégré à meta-openembedded
$ cd poky
$ git clone git://git.openembedded.org/meta-openembedded
$ git checkout krogoth
$ bitbake-layers add-layer ../meta-openembedded/meta-oe
$ bitbake-layers add-layer ../meta-openembedded/meta-python
$ bitbake-layers add-layer ../meta-openembedded/meta-networking
$ bitbake ntp tzdata
● Configuration de la zone géographique# rm -f /etc/localtime
# ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime
# cat /etc/default/ntpdate
...
NTPSERVERS="pool.ntp.org"
24Prototypage IoT Yocto
Mise à jour
● Outil SMART inclus au package management● Création des index des paquets
$ bitbake package-index
● Création des « canaux » HTTP sur la cible# smart channel --add <channel> baseurl=http://<pkg-dir>
# smart update
# smart install ntpdate tzdata
25Prototypage IoT Yocto
Références
● http://elinux.org/Build_Systems
● https://www.yoctoproject.org/
● http://buildroot.uclibc.org
● http://iot.ieee.org/images/files/pdf/iot-developer-survey-2016-report-final.pdf
● https://openwrt.org
● http://eccellenzatouchvki.com
● http://www.parrot.com/fr/produits/flower-power
● https://www.yoctoproject.org/ecosystem/iot
● http://we-io.net/hardware
● https://github.com/nodesign/weioBoard
● https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/README.md