0% ont trouvé ce document utile (0 vote)
136 vues128 pages

Iot

Ce document est un support de formation sur l'Internet des Objets (IoT), visant à fournir des bases conceptuelles et des activités pratiques. Il aborde les technologies, protocoles, architectures, et applications de l'IoT, tout en soulignant l'importance croissante de l'interconnectivité des objets dans divers secteurs. Le document inclut également des prérequis techniques et des illustrations de matériel utilisé dans des laboratoires de formation.

Transféré par

ericsen.greg
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
136 vues128 pages

Iot

Ce document est un support de formation sur l'Internet des Objets (IoT), visant à fournir des bases conceptuelles et des activités pratiques. Il aborde les technologies, protocoles, architectures, et applications de l'IoT, tout en soulignant l'importance croissante de l'interconnectivité des objets dans divers secteurs. Le document inclut également des prérequis techniques et des illustrations de matériel utilisé dans des laboratoires de formation.

Transféré par

ericsen.greg
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Table des matières

Préface 1.1

L'Internet des Objets 1.2

Les Objets de l'Internet 1.2.1

Modèles IoT 1.2.2


Protocoles IoT 1.2.3

Protocole MQTT 1.2.3.1

Sécurité MQTT 1.2.3.2

Architectures IoT 1.2.4

Labs Infrastructure 1.3


Labs OpenWRT 1.3.1

Debian Cross-Compilation for Mirabox 1.3.2


Labs Littlebits 1.4
Labs Littlebits Logic 1.4.1

Labs Cloudbits 1.4.2


Labs Raspberry Pi 1.5

Labs Pibrella 1.5.1


Labs GrovePi 1.5.2
Labs PiCAM 1.5.3

Labs Z-Wave 1.5.4


Labs Réseau 1.5.5

Labs Cluster 1.5.6


Labs RaPBX 1.5.7
Labs Pi Zero 1.5.8

Labs BLE 1.6


Labs Mini-Drone Controller 1.6.1

Labs Parrot Flower Power 1.6.2


Labs Arduino 1.7

2
Préface

Préface
Ce document est un support de formation sur le sujet de l'Internet des Objets (IoT).

Figure 1 : Page de garde

Version HTML
Version PDF
Version EPUB
Version MOBI

Objectifs
Ce document invite à comprendre les technologies utilisées dans le paradigme de l'Internet des Objets en fournissant des bases
conceptuelles d'une part, mais aussi et surtout en menant d'autre part des activités pratiques de hacking au sens initial^[hacking] sur
du matériel de développement ou de production "grand public".

Il pourrait aisément s'illustrer dans un contexte d'autant plus industriel dont celui des usines à logiciels.

On sensibilisera le lecteur technique à la popularité croissante des plateformes et des systèmes différents de Wintel en entreprise ou
à la maison. En effet, on proposera de s'intéresser à des matériels embarqués et légers (ARM, MIPS), fonctionnant sous Linux et
disposant la plupart du temps d'une connectivité sans fil (Wi-Fi, BLE, Z-Wave). Mais le propos invite aussi à aborder les
problématiques de contrôle et d'automation des objets invitant à la rédaction de code et à la compréhension des architectures
informatiques et des technologies infonuagiques.

3
Préface

On pourrait résumer l'objectif de ce support en une seule phrase : Ouvrir la boîte de l'Internet de Objets.
hacking
. https://fr.wikipedia.org/wiki/Hacking#cite_note-:0-2 ↩

Programme
Concepts
Activités pratiques (labs)

Pré-requis
Ce sujet requiert de bonnes connaissances ou une excellente détermination à la fois dans :

1. L'administration système (sysadmin) : La gestion des environnements Linux, côté client sur des ordinateurs embarqués, côté
serveur dans le nuage (cloud)
2. L'administration réseau (netadmin) : L'infrastructure du réseau local, les protocoles TCP/IP et les architectures de l'Internet
3. Le Développement applicatif (dev) : Selon la nature du projet en scripts sémantiques, bash, python, node.js.
4. La cybersécurité : Sujet transversal

Illustrations
Littlebits / cloudbits avec les modules logiques, leur API et IFTTT
Routeurs TP-Link avec OpenWRT
Raspbery pi avec Pibrella, PiGrove, Z-Wave, Hypriot, Wi-Fi et BLE
Power Plant et Minidrones Rolling Spider de Parrot (BLE)
Arduino avec Grove et Robot M-Block
Mikrotik, Mirabox

Droits
CC-BY-SA
Image de couverture : https://pixabay.com/static/uploads/photo/2014/04/17/09/40/honey-bees-326336_960_720.jpg

4
L'Internet des Objets

L'Internet des Objets


1. Définition
2. Marché et applications

1. Définition
Source : https://fr.wikipedia.org/wiki/Internet_des_objets#D.C3.A9finition

L'Internet des objets (IdO ou IoT pour Internet of Things en anglais) représente l'extension d'Internet à des choses et à des lieux du
monde physique.

Alors qu'Internet ne se prolonge habituellement pas au-delà du monde électronique, l'internet des objets connectés représente les
échanges d'informations et de données provenant de dispositifs présents dans le monde réel vers le réseau Internet.

L'internet des objets est considéré comme la troisième évolution de l'Internet, baptisée Web 3.0 qui fait suite à l'ère du Web social.

L'internet des objets revêt un caractère universel pour désigner des objets connectés aux usages variés, dans le domaine de la e-
santé, de la domotique ou du Quantified Self.

L'internet des objets est en partie responsable d'un accroissement exponentiel du volume de données générées sur le réseau, à
l'origine du Big Data.

Selon une équipe de l'ETH de Zurich avec les smartphones puis un nombre croissant d'objets connectés, en dix ans (2015-2025) 150
milliards d'objets devraient se connecter entre eux, avec l'internet et avec plusieurs milliards de personnes.

Source : https://www.i-scoop.eu/internet-of-things/

2. Marché et applications
Le nombre de connexions entre des personnes et de choses et la quantité de données générées étaient précédemment inimaginables.
Une explosion du nombre de périphériques avec un accès à la puissance de l'Internet (du nuage) permet de nouvelles interactions
intelligentes entre ces choses. On considère que l'ère de l'IoT a commencé à partir du moment où le nombre d'objets connectés a
dépassé le nombre d'êtres humains sur le globe.

5
L'Internet des Objets

L'impact de l'IoT sur l'économie couvre aussi bien les industries que les marchés verticaux. Il s'agit d'économiser des coûts
d'exploitation grâce aux avantages de l'IoT comme par exemple dans l'industrie des énergies fossiles.

Pour les fournisseurs d'équipement réseau et d'applications, l'IoT représente potentiellement une énorme opportunité de marché.
Différentes tendances sont apparues ces dernières années et annoncent ensembles l'émergence du marché IoT :

Croissance rapide des données et de leurs analyses disponibles grâce à l'informatique en nuage Cloud Computing
Croissance rapide des prériphériques mobiles intelligents
Augmentation de l'interconnectivité entre des périphériques industriels, opérationnels et mobiles
Convergence des réseaux industriels et d'entreprise pour rendre disponible des applications comme la vidéosurveillance, la prise
de mesure intelligente, le suivi d'actifs, la gestion de véhicules, la surveillance de la santé, etc.

Source : Cisco Systems, https://cdn.iotwf.com/resources/71/IoT_Reference_Model_White_Paper_June_4_2014.pdf

Les applications IoT les plus populaires sont :

1. La maison intelligente : thermostats, ampoules, frigo, fermtures de portes intelligents


2. Les vêtements connectés : montres, bracelets et lunettes intelligentes
3. Les villes intelligentes : parking et gestion des déchets intelligents

Mais on retrouve l'IoT au quotidien dans la gestion des bâtiments (facility), dans la surveillance physique, dans les loisirs, dans le
secteur de la santé, dans la gestion des modes de transport.

On retiendra aussi le contexte du développement des usines logicielles.

Source : https://iot-analytics.com/10-internet-of-things-applications/

On pourrait segmenter le marché IoT à la manière de iot-analytics.com :

6
L'Internet des Objets

Le marché est ici divisé selon le type de clientèle "grand public" et "Entreprise".

Le marché entreprise peut se diviser en huit catégories verticales :

1. Retail
i. Stores
ii. Shop
iii. Convenience
2. Health
i. Monitoring
ii. Mesasurement
iii. Diagnosis
iv. Surgey
v. Patient care
3. Energy
i. Transmission & Disribution
ii. Fossil
iii. Nuclear
iv. Alternative
4. Mobility
i. Aerospace & Airports
ii. Marine
iii. Rail & Stations
iv. Automotive
v. Alternative
5. Cities
i. Infrastructure
ii. Water /Wasterwater
iii. HVAC
iv. Lighting
v. Security
vi. Life safety
6. Manufactures
i. Mining
ii. Oil & Gas
iii. Discrete production
iv. Continuous production
v. Supply chain
7. Public & Services
i. Schools
ii. Universities
iii. Banking
iv. Insurance

7
L'Internet des Objets

v. Administration
vi. Commercial services
8. Others
Environment
Military
Agriculture
Hospitality

Le marché "Grand public" peut se diviser en quatre catégories :

1. Maison (Home)
i. Home automation
ii. Home Improvment
iii. Energy Efficiency
2. Syle de vie (Lifestyle)
i. Wearable Comuting
ii. Entertainment & Music
iii. Family
iv. Leisure
v. Pets
vi. Toys
vii. Drones
3. Santé (Health)
i. Fitness
ii. Monitoring
iii. Measurment
iv. Diagnosis
4. Mobilité
i. Connnected cars
ii. eBikes

Selon https://iot-analytics.com/iot-market-segments-analysis/, le marché "entreprise" prend autant de parts que le marché "grand
public". Le segment "Manufacturing et "Healthcare" sont certainement les plus prometteurs dans le marché "entreprise". Les voitures
connectées, le secteur de l'énergie et du "Manufactoring" seront les plus actifs.

Toujours selon la même étude, ce sont les catégories "Home" et "Lifestyle" qui seront les plus remarquables dans le marché "Grand
public".

Le nombre d'objets connectés qui sont mis sur le marché augmentant de jour en jour, il serait vain de les énoncer ici. Il suffit de
trouver un rayon domotique, drones ou wearables ou solutions multimédia pour trouver son bonheur.

On citera ici du matériel de lab de classe de formation en vue de comprendre le fonctionnement du paradigme IoT. La plupart des
plate-formes proposées ici si elles ne sont pas entièrement open source du matériel au logiciel, sont suffisamment ouvertes et
intéressantes à titre de prototype et pour du développement.

8
Les Objets de l'Internet

Les Objets de l'Internet


1. Les objets de l'Internet, les SoC
2. Plateformes IoT
Processeurs
Architectures ARM
SoC ARM
Architecture ARM
Architecture MIPS
3. Matériel industriel
4. Matériel en production grand public
5. Matériel de développement

1. Les objets de l'Internet, les SoC


Définition Wikipedia : Un système sur une puce, également souvent désigné dans la littérature scientifique par le terme anglais
system on a chip (d'où son abréviation SoC), est un système complet embarqué sur une seule puce, pouvant comprendre de la
mémoire, un ou plusieurs microprocesseurs, des périphériques d'interface, ou tout autre composant nécessaire à la réalisation de la
fonction attendue. On peut intégrer de la logique, de la mémoire (statique, dynamique, flash, ROM, PROM, EPROM, EEPROM), des
dispositifs (capteurs) mécaniques, opto-électroniques, chimiques ou biologiques ou des circuits radio.

2. Plateformes IoT
MIPS
ARM
X86
PowerPC

Processeurs

ARM Intel/AMD

Architecture RISC Architecture CISC

A performance égale, réduction des coûts de production et meilleure Complexité matérielle plus coûteuse (AMD Jaguar
efficacité thermique (ARM Cortex-A15 28nm 1.62mm²) 28nm 3.1mm²) en conception et en énergie

Stratégie commerciale : licence Intel/AMD

Unix Unix / Windows

Bootloader Bios

Architectures ARM
Les architectures ARM sont des architectures matérielles RISC 32 bits (ARMv1 à ARMv7) et 64 bits (ARMv8)1 développées par ARM
Ltd depuis 1990 et introduites à partir de 1983 par Acorn Computers.

Dotés d'une architecture relativement plus simple que d'autres familles de processeurs, et bénéficiant d'une faible consommation, les
processeurs ARM sont devenus dominants dans le domaine de l'informatique embarquée, en particulier la téléphonie mobile et les
tablettes.

Ces processeurs sont fabriqués sous licence par un grand nombre de constructeurs.

SoC ARM

9
Les Objets de l'Internet

Aujourd'hui, ARM est surtout connu pour ses SoC, intégrant sur une seule puce, microprocesseur, processeur graphique (GPU), DSP,
FPU, SIMD, et contrôleur de périphériques. Ceux-ci sont présents dans la majorité des smartphones et tablettes. ARM propose des
architectures, qui sont vendues sous licence de propriété intellectuelle aux concepteurs. Ils proposent différentes options dans
lesquelles les constructeurs peuvent prendre ce qui les intéresse pour compléter avec leurs options propres ou de concepteurs tiers.
ARM propose ainsi pour les SoC les plus récents, les microprocesseurs Cortex (Cortex-A pour l'appliance, Cortex-M pour le couplage à
un microcontrôleur, Cortex-R pour les microprocesseurs temps réel), des processeurs graphiques (Mali), des bus AMBA sous licence
libre, ainsi que les divers autres composants nécessaires à la composition du SoC complet. Certains constructeurs, comme Nvidia
préfèrent produire leur propre processeur graphique, d'autres, comme Samsung, préfèrent prendre dans certains cas un processeur
graphique de prestataire tiers ou d'ARM selon les modèles, et d'autres, comme Apple, modifient certains composants du
microprocesseur en mélangeant plusieurs architectures processeur ARM (l'Apple A6 par exemple, mixe les technologies de
microprocesseur Cortex-A9 et Cortex-A15).

Architecture ARM
L'architecture ARM a initialement été développée en interne par la société britannique Acorn Computers, qui l'utilisa à partir de 1987
dans sa gamme d'ordinateurs 32 bits Archimedes. ARM signifiait alors 'Acorn Risc Machine'. Ultérieurement la division « création de
microprocesseurs » d'Acorn fut détachée de la société mère et devint la société « Advanced Risc Machine limited », se positionnant
avec une offre indépendante pour le marché de l'électronique embarquée.

Une particularité des processeurs ARM est leur mode de vente. En effet, ARM Ltd. ne fabrique ni ne vend ses processeurs sous forme
de circuits intégrés. La société vend les licences de ses processeurs de manière à ce qu'ils soient gravés dans le silicium par d'autres
fabricants. Aujourd'hui, la plupart des grands fondeurs de puces proposent de l'architecture ARM.

Le coeur le plus célèbre est l’ARM7TDMI[réf. souhaitée] qui comporte trois niveaux de pipeline. De plus, le ARM7TDMI dispose d'un
second jeu d'instructions appelé THUMB permettant le codage d'instructions sur 16 bits et, ainsi, de réaliser un gain de mémoire
important, notamment pour les applications embarquées.

ARM Ltd. a ensuite développé le coeur ARM9 qui comporte 5 niveaux de pipeline. Cela permet ainsi l'augmentation du nombre
d'opérations logiques sur chaque cycle d'horloge et donc une amélioration des performances en vitesse.

L'architecture ARM est utilisée dans de très nombreux domaines et équipe par exemple les calculatrices TI-Nspire. Cette architecture
est notamment très répandue dans la téléphonie mobile.

De nombreux systèmes d'exploitation sont compatibles avec cette architecture :

Symbian S60 avec les Nokia N97 ou Samsung Player HD ;


iOS avec l'iPhone et l'iPad ;
Linux, avec la plupart des distributions ou avec Android ;
BlackBerry OS avec les BlackBerry
Windows CE, Windows Phone 7 et Windows RT2, une version de Windows 8.
le système PlayStation Vita
Risc OS
etc.

Le monde des ordinateurs portables pourrait connaître prochainement une évolution avec le remplacement progressif des
processeurs x86 par l'architecture ARM. Windows 8 est compatible avec cette architecture (avec certaines limitations), tout comme
Google Chrome OS. L'utilisation de l'architecture ARM devrait permettre la réduction de la consommation électrique.

En revanche, les fondeurs des processeurs x86 (Intel et AMD) se préparent à cette concurrence en réduisant la consommation
électrique de leurs solutions et en simplifiant leurs architectures, comme avec les Atom et Bobcat, par exemple en intégrant les
capacités graphiques avec le processeur. De l'autre côté, les fondeurs des SoC à base d'architecture ARM, comme NVidia et
Qualcomm, continuent d'augmenter les performances de leurs puces, par exemple en augmentant le nombre de coeurs ou en ajoutant
de nouvelles instructions.

Il est également possible d’agglomérer différents coeurs de différentes puissances, les plus faibles en consommation et puissance
travaillant la majorité du temps, afin de minimiser la consommation électrique et des coeurs plus puissants activés uniquement en
cas de forte demande de calcul afin d'en accélérer le traitement. Cette technologie est appelée big.LITTLE, elle est utilisée par
Samsung, avec ses Exynos 5 octo (4 cortex-A7 faible consommation et 4 cortex-A15 de forte puissance), MediaTek et d'autres. Le
Tegra 3 de NVidia, utilise une technique similaire avec un seul coeur de faible consommation et plusieurs de forte puissance.

Source : https://fr.wikipedia.org/wiki/Architecture_ARM

Architecture MIPS

10
Les Objets de l'Internet

L'architecture MIPS (de l'anglais : microprocessor without interlocked pipeline stages) est une architecture de processeur de type
Reduced instruction set computer (RISC) développée par la société MIPS Technologies (alors appelée MIPS Computer Systems),
basée à Mountain View en Californie.

Les processeurs fabriqués selon cette architecture ont surtout été utilisés dans les systèmes SGI. On les retrouve aussi dans
plusieurs systèmes embarqués, comme les ordinateurs de poche, les routeurs Cisco et les consoles de jeux vidéo (Nintendo 64 et
Sony PlayStation, PlayStation 2 et PSP).

Vers la fin des années 1990, on estimait que les processeurs dérivés de l'architecture MIPS occupaient le tiers des processeurs RISC
produits.

De nos jours cette architecture reste populaire dans le marché de l'informatique embarquée où elle subit une intense concurrence de
la part de l'architecture ARM.

Les MIPS sont aussi présents dans des routeurs ou des NAS, mais ils deviennent aussi de plus en plus rares dans ce domaine face à
la concurrence des ARM, PowerPC et x86 basse consommation.

Malgré tout, les MIPS reviennent peu à peu dans le marché de l'informatique à haute performance grâce aux recherches menées par
la Chine avec les processeurs Loongson qui ont été utilisés pour la création du supercalculateur Dawning 5000L et 6000.

En 2015, la Russie annonce vouloir remplacer les processeurs conçus par des sociétés des États-Unis par des processeurs locaux
dans les systèmes informatique nationaux. Les processeurs d'architecture MIPS, Baikal T1 de la société russe spécialisée dans les
supercalculateurs T-Platforms sont alors choisis. il est soutenu pour sa conception par le conglomérat de la défense Rostec et co-
financé par l'entreprise publique russe Rosnano (Роснано).

Source : https://fr.wikipedia.org/wiki/Architecture_MIPS

3. Matériel industriel
...

4. Matériel en production grand public


1. Game Nest
2. Game Fibaro
3. Chromecats
4. Apple Watch
5. Philips Hue
6. TV box
7. Parrot
8. et beaucoup d'autres

5. Matériel de développement
1. Embarqué MIPS / Intel avec OpenWRT, Arch Linux ou Debian/Ubuntu
2. Littlebits : moudule Cloudbit, modules logiques et module arduino
3. Raspberry pi : Pibrella, Z-Wave, Grove, Réseau infra, Cluster
4. Parrot Power Flower et Minidrone Rolling Spider en BLE (Linux, Mac et RPi)
5. Arduino en Wi-Fi/BLE

Voir aussi https://postscapes.com/internet-of-things-hardware

11
Modèles IoT

Modèles de référence
L'Internet de Objets demande un modèle de référence qui permettrait de décrire la manière avec laquelle ces systèmes, ces réseaux
et ces applications interagissent entre eux. En effet, un tel modèle aurait les avantages de

Simplifier la compréhension de systèmes complexes découpés en parties plus compréhensibles


Clarifier en fournissant des informations supplémentaires identifiant les niveaux de l'IoT et fournissant une terminoologie
commune
identifier où des types spécifiques de traitement sont optimisés dans les différentes parties du système
Standardiser pour créer les conditions d'une inter-opérabilité entre des produits IoT de différents fabriquants
Organiser rend l'IoT plus accessible et moins conceptuel

Cisco Systems propose un modèle en sept couches qui découpe les opérations IoT en sept niveaux distincts chacun correspond à une
fonction dans le processus de traitement. Il ne faut pas voir ce modèle comme étant strictement défini quant aux composants ou aux
endroits. Par exemple chaque fonction peut être combinée dans une seule armoire dans un centre de données ou être distribuée sur
différents périphériques répartis dans le monde. Le modèle explique comment les tâches exécutés au niveau de chaque couche peut
être maintenue de manière simple, avec haute disponibilité et support. Enfin, le modèle définit les conditions pour disposer d'un
système IoT complet.

Le modèle de référence IoT en sept couches décrit deux flux :

dans un modèle de contrôle, un flux descendant, de la couche 7 à la couche 1


dans un modèle de surveillance, un flux montant, de la couche 1 à la couche 7

12
Modèles IoT

Sources : https://cdn.iotwf.com/resources/71/IoT_Reference_Model_White_Paper_June_4_2014.pdf,
https://www.cisco.com/web/PH/ciscoconnect/pdf/bigdata/jim_green_cisco_connect.pdf

13
Protocoles IoT

Protocoles IoT
1. Protocoles d'accès
Protocoles M2M / WPAN / WBAN
Protocoles LAN
Protocoles WAN
2. Protocoles Applicatifs

1. Protocoles d'accès
Protocoles M2M / WPAN / WBAN
BLE
ZigBee
Z-Wave
Autres RF voir grove et Littlebits

Protocoles LAN
Ethernet
Wi-Fi

Protocoles WAN
Ethernet
xDSL / DOCSIS
GSM

2. Protocoles Applicatifs
IPv4 / IPv6 / 6LoWPAN
TCP/UDP
HTTP
UPnP
CoAP
MQTT
XMPP
Services IoT
Protocole de passerelle
Sécurité et interopérabilté

14
Protocole MQTT

Protocole MQTT
1. Introduction à MQTT
1. Historique
2. Modèle publish/subscribe (pub/sub)
Evolutivité
Filtrage
Difficultés
MQTT en modèle pub/sub
MQTT n'est une solution MQ (Message Queuing)
3. Etablissement de connexion MQTT Client/Broker
4. Messages Publish, Subscribe et Unsubscribe
5. Topics MQTT
6. Qualité de Service
7. Persistence des messages et gestion des files d'attente
8. Messages "retained" de garde
9. Fonctionnalités dernière volonté et testatment
10. MQTT Keep Alive et Client Take-Over
11. MQTT sur WebSockets
Sources

MQTT est un protocole de messagerie ISO-ISO (IEC/PRF 20922) basé sur un modèle publish/subscribe. I fonctionne au-dessus du
protocole TCP/IP comme protocole de couche Application. Il est conçu pour les connexions avec des emplacements distants où une
"empreinte réduite de code" est requise ou si la bande passante du réseau est limitée. Le modèle de messagerie de publish/subscribe
requiert un broker de messages.

La spécification ne précise pas la signification de "empreinte réduite de code" ou la signification de "bande passante réseau limitée".
Ainsi, la disponibilité du protocole dépend du contexte. En 2013, IBM a soumis MQTT v3.1 à l'organisme de spécification OASIS avec
une charte garantissant que seules des modifications mineures de la spécification pourraient être acceptées. MQTT For Sensor
Networks (MQTT-SN) est une variante du protocole principal destiné aux périphériques embarqués sur des réseaux non-TCP/IP, tels
que ZigBee.

Andy Stanford-Clark d'IBM et Arlen Nipper de Cirrus Link ont ​rédigé la première version du protocole en 1999. Historiquement, le "MQ"
dans "MQTT" provenait de la gamme de produits de mise en file d'attente des messages MQ Series d'IBM. Toutefois, la mise en file
d'attente elle-même n'est pas nécessaire pour être prise en charge en tant que fonctionnalité standard dans toutes les situations.

Des protocoles alternatifs sont par exemple :

le protocole AMQP (Advanced Message Queuing Protocol),


le protocole STOMP (Streamed Text Oriented Messaging Protocol),
les protocoles d'application contrainte IETF comme :
XMPP,
DDS,
OPC UA
et Web Application Messaging Protocol (WAMP).

1. Introduction à MQTT
MQTT is a Client Server publish/subscribe messaging transport protocol. It is light weight, open, simple, and designed so as to
be easy to implement. These characteristics make it ideal for use in many situations, including constrained environments such
as for communication in Machine to Machine (M2M) and Internet of Things (IoT) contexts where a small code footprint is
required and/or network bandwidth is at a premium.

Citation de la Spécification officielle MQTT 3.1.1 que l'on pourrait traduire par :

MQTT est un protocole de transport de messages en modèle Client/Server publish/subscribe. Il est léger, ouvert, simple et
conçu pour être facile à mettre en oeuvre. Ces caractéristiques le rendent idéal dans de nombreuses situations, notamment
dans des environnements contraints tels que la communication machine à machine (M2M) et l'Internet des objets (IoT) où une
empreinte de code réduite est requise et/ou la bande passante réseau est cruciale.

15
Protocole MQTT

Il s'agit d'un protocole très léger et binaire qui excelle lors du transfert de données sur le réseau par rapport à des protocoles comme
HTTP par ce que la surchage en en-têtes est moins importante. Un autre aspect important à relever la facilité de mise en oeuvre du
protocole MQTT du côté client. Cette facilité convient parfaitement aux dispositifs contraints avec des ressources limitées. En fait, il
s'agit là d'un des objectifs de départ de MQTT.

1. Historique
MQTT a été inventé par Andy Stanford-Clark (IBM) et Arlen Nipper (Arcom, maintenant Cirrus Link) en 1999. Leur cas d'usage était de
créer un protocole avec une perte de charge électrique et une bande passante minimales. Ils ont spécifié les objectifs du futur
protocole :

Simple à mettre en oeuvre


Livraison de données avec qualité de service
Léger et efficient avec la bande passante
Agnostique quant aux données
Maintenance des sessions

Ces objectifs sont toujours au coeur de MQTT tandis que l'attention s'est déplacée des systèmes intégrés propriétaires aux cas
d'usage de l'Internet des objets. Il y a souvent une confusion quant à la signification appropriée de l'abréviation MQTT. La réponse
courte est que MQTT n'a officiellement plus d'acronyme, c'est juste MQTT. La réponse longue histoire raconte que l'ancien acronyme
signifiait "Transport de télémétrie MQ" (Message Queuing Telemetry Transport), alors que MQ fait référence à "MQ Series", un
produit développé par IBM qui prend notamment en charge MQTT. Le protocole a été nommé après quand il a été inventé 1999.

Souvent MQTT est incorrectement nommé comme protocole de file d'attente. Il n'y a pas de files d'attente comme dans les solutions
traditionnelles de mise en file d'attente des messages. Cependant, il est possible de mettre en file d'attente des messages dans
certains cas. Donc, après que MQTT ait été utilisé par IBM en interne pendant un certain temps, la version 3.1 est sortie libre de droits
en 2010. À partir de là, tout le monde a pu l'implémenter et l'utiliser.

Environ trois ans après la publication initiale, le 29 octobre 2014, MQTT devait être normalisé sous comme standard OASIS, une
organisation ouverte ayant pour but de faire progresser les normes. MQTT 3.1.1 est la dernière version du protocole.

2. Modèle publish/subscribe (pub/sub)


Le modèle publish/subscribe (pub/sub) est une alternative au modèle "client/serveur" traditionnel dans lequel un client communique
directement avec un point de terminaison. Le modèle "Pub/Sub" dissocie le client qui envoie un message particulier (appelé
publisher) d'un autre client (ou plusieurs clients) qui reçoit le message (appelé subscriber). En conséquence, le publisher et le
subscriber ne se connaissent pas l'un l'autre. Il existe un troisième composant, appelé le broker, qui est connu à la fois par le publisher
et le subscriber qui filtre tous les messages entrants et les distribue en conséquence.

[Diagramme]

L'élément fondamental dans le modèle "pub/sub" est la dissociation des clients publisher et subscriber.

Ceux-ci peuvent être différenciés sous plusieurs dimensions:

Dissociation spatiale : le publisher et le subscriber n'ont pas besoin de se connaître (adresse IP et port par exemple) :
Dissociation temporelle : le publisher et le subscriber n'ont pas besoin de s'exécuter en même temps.
Dissociation de synchronisation : les opérations sur les deux éléments ne sont pas interrompues lors de la publication ou de la
réception.

En résumé, le modèle publish/subscribe dissocie l'éditeur (publisher) et le destinataire (subscriber) d'un message. Grâce à un filtrage
des messages il est possible que seulement certains clients reçoivent certains messages. Le découplage a donc trois dimensions:
espace, temps et synchronisation.

Evolutivité
L'évolutivité est aussi une des caractéristiques du modèle "pub/sub" par rapport à l'approche traditionnelle "client/serveur". En effet,
les opérations sur le broker peuvent être fortement parallélisées et traitées par événements. De même, la mise en cache des
messages et leur routage intelligent sont souvent déterminants pour améliorer l'évolutivité. Pour supporter des millions de
connexions, il peut être nécessaire de répartir les charges sur des cluster de brokers.

Filtrage

16
Protocole MQTT

Le filtrage des messages est aussi une autre caractéristique du modèle "pub/sub".

Option 1: Filtrage par sujet (topic). Le filtrage est basé sur un sujet (topic) qui fait partie de chaque message. Le client
destinataire s'abonne sur les sujets qui l'intéressent sur le broker. Il reçoit alors tous les messages en fonction des sujets dans
lesquels il s'est inscrit. Les sujets sont en général des chaînes avec une structure hiérarchique qui permettent le filtrage basé sur
un nombre limité d'expressions.
Option 2: Filtrage basé sur le contenu. Le filtrage basé sur le contenu filtre le message en fonction de règles de filtrage de
contenu spécifiques. Un gros inconvénient est que le contenu du message doit être connu au préalable et ne peut être chiffré ou
modifié facilement.
Option 3: Filtrage par type. Dans les langages orientés objet, il est d'usage de filtrer en fonction du type ou de classe du message
(événement). Dans ce cas, un abonné peut écouter tous les messages.

Difficultés
Quels sont les éléments qui posent des difficultés dans le modèle pub/sub ?

D'abord, il faut connaître la structuration des données au préalable. Dans le cas d'un filtrage par sujet, l'éditeur et l'abonné doivent
connaître les sujets appropriés à utiliser.
Ensuite, quant à la livraison des messages, un publisher ne peut pas présumer que quelqu'un écoute ses messages. Par
conséquent, il se peut qu'un message ne soit lu par aucun subscriber.

MQTT en modèle pub/sub


MQTT incarne tous les aspects mentionnés en fonction de ce que vous voulez réaliser avec.

MQTT découpe l'espace du publisher et du subscriber. Il leur suffit donc de connaître le nom d'hôte ou adresse ip et le port du broker
pour publier ou s'abonner aux messages.

MOQTT se dissocie également avec le temps, mais souvent il s'agit simplement d'un comportement de repli, car le cas d'utilisation
concernent principalement de la livraison de messages en temps quasi réel. Bien sûr, le broker est capable de stocker des messages
pour les clients qui ne sont pas en ligne. (Cela nécessite deux conditions : le client s'est connecté une fois et sa session est
persistante et il s'est abonné à un sujet avec une valeur QoS supérieure à 0).

MQTT est également capable de dissocier la synchronisation, car la plupart des bibliothèques clientes fonctionnent de manière
asynchrone et sont basées sur des rappels (callbacks) ou modèle similaire. Ainsi, il ne bloquera pas d'autres tâches en attendant un
message ou en publiant un message. Mais il existe certains cas d'utilisation où la synchronisation est souhaitable et également
possible. Certaines bibliothèques ont donc des API synchrones pour attendre un certain message. Mais généralement, le flux est
asynchrone.

Un autre élément qui devrait être mentionné est que MQTT est particulièrement facile à utiliser du côté client. La plupart des
systèmes pub/sub dispose de la logique du côté broker, mais MQTT représente l'essence même du modèle "pub/sub" en utilisant une
bibliothèque cliente qui en fait un protocole léger pour les périphériques petits et contraints.

MQTT utilise un filtrage par sujet des messages. Ainsi, chaque message contient un sujet (topic) que le broker utilise pour savoir si
un client subscriber recevra le message ou non.

MQTT n'est une solution MQ (Message Queuing)


Quelles sont les différences entre MQTT et une file d'attente de messages traditionnelle ?

Une file d'attente de messages stocke le message jusqu'à ce qu'ils soient consommés. Lors de l'utilisation des files d'attente de
messages, chaque message entrant sera stocké dans cette file d'attente jusqu'à ce qu'il soit détecté par un client (souvent
appelé consumer). Autrement, le message sera simplement bloqué dans la file d'attente et attendra d'être consommé. Il est
impossible que les messages ne soient traités par aucun client comme c'est le cas dans MQTT si personne ne s'abonne à un
sujet.
Un message ne sera consommé que par un client. Une autre grande différence est le fait que dans une file d'attente traditionnelle,
un message est traité par un seul consommateur. Alors que la charge peut être répartie entre tous les consommateurs pour une
file d'attente particulière. Dans MQTT c'est tout à fait le contraire, chaque abonné reçoit le message s'il s'est abonné au sujet.
Les files d'attente sont nommées et doivent être créées explicitement. Une file d'attente est beaucoup plus rigide qu'un sujet.
Avant d'utiliser une file d'attente, elle doit être créée explicitement avec une commande séparée. Seulement après cette
opération, il est possible de publier ou de consommer des messages. Les sujets MQTT sont extrêmement flexibles et peuvent
être créés à la volée.

17
Protocole MQTT

3. Etablissement de connexion MQTT Client/Broker

4. Messages Publish, Subscribe et Unsubscribe

5. Topics MQTT

6. Qualité de Service

7. Persistence des messages et gestion des files d'attente

8. Messages "retained" de garde

9. Fonctionnalités dernière volonté et testatment

10. MQTT Keep Alive et Client Take-Over

11. MQTT sur WebSockets

Sources
https://www.hivemq.com/blog/mqtt-essentials/
https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html
https://en.wikipedia.org/wiki/MQTT

18
Sécurité MQTT

Sécurité MQTT
1. Introducing the MQTT Security Fundamentals
2. Authentication with Username and Password
3. Advanced Authentication Mechanisms
4. Authorization
5. TLS / SSL
6. X509 Client Certificate Authentication
7. OAuth 2.0 & MQTT
8. MQTT Payload Encryption
9. MQTT Message Data Integrity
10. Securing MQTT Systems
11. Sources

1. Introducing the MQTT Security Fundamentals

2. Authentication with Username and Password

3. Advanced Authentication Mechanisms

4. Authorization

5. TLS / SSL

6. X509 Client Certificate Authentication

7. OAuth 2.0 & MQTT

8. MQTT Payload Encryption

9. MQTT Message Data Integrity

10. Securing MQTT Systems

11. Sources
https://www.hivemq.com/blog/mqtt-security-fundamentals-wrap-up

19
Architectures IoT

Architectures IoT
Architectures
Rôle de l'infonuagique (cloud)
1. Graphes
2. Services MQTT Broker gratuits
3. Service IFTTT
4. Node-Red
5. Plateformes de développement IoT

Source : https://www.linkedin.com/pulse/simple-steps-learn-iot-architecture-brucelin-kithion

Architectures
https://postscapes.com/internet-of-things-protocols
https://iot.eclipse.org/standards
https://eclipse.org/community/eclipse_newsletter/2014/february/article2.php
https://electronicdesign.com/iot/mqtt-and-coap-underlying-protocols-iot
https://www.openiot.eu/
https://www.iot-a.eu/public/public-documents/d1.5/view

Rôle de l'infonuagique (cloud)


...

1. Graphes
https://emoncms.org/
Xively
Google charts

2. Services MQTT Broker gratuits


This page is an effort to list the publically-accessible MQTT brokers, often useful for testing and prototyping.

Note: none of these test brokers carry any guarantee of service. Be sensible when using them and don't break things for others! :-)

field value

address iot.eclipse.org

port 1883 , 80 (WebSockets)

type mosquitto

info web page, Xively statistics, topics and HTTP bridge

field value

address test.mosquitto.org

port 1883 , 8883 (SSL), 8884 (SSL), 80 (WebSockets)

type mosquitto

info web page, Xively statistics, topics and HTTP bridge

field value

address dev.rabbitmq.com

20
Architectures IoT

port 1883

type rabbitmq

info admin dashboard

field value

address broker.mqttdashboard.com

port 1883 , 8000 (WebSockets)

type HiveMQ

info information page, stastistics and dashboard

field value

address q.m2m.io

port 1883

type m2m.io

info requires signup/username and password, connecting to m2m.io

field value

address www.cloudmqtt.com (Note: actual host varies, see dashboard)

port 18443 , 28443 (SSL)

type mosquitto

info requires signup/username and password, pricing (free plan available), documentation

field value

address mqtt.simpleml.com

port 1883 (MQTT), 8883 (MQTT+SSL), 80 (REST), 80 (WebSockets), 5683 (CoAP)

type SimpleML

info Free MQTT service to evaluate Machine Learning models, documentation

field value

address mqtt.kgbvax.net

port 1883 (MQTT)

type mosquitto

info Free shared instance, currently supports persistence

3. Service IFTTT
IFTTT : "If This Then That" service gratuit qui fournit des constructions conditionnelles, appelées des recettes (recipes). Ces recettes
font entrer en jeu des déclenchements et des actions par des services Web ou des objets connectés.

Par exemple, un courrier électronique reçu sur un compte Gmail déclenche un message Twitter, change la couleur d'une ampoule Hue
ou enregistre la pièce attachée sur un compte Dropbox.

Le fournisseur connecte un nombre impressionnant de contrustructeur et de prestataires SaaS.

21
Architectures IoT

4. Node-Red
Logiciels :
Node-RED : https://en.wikipedia.org/wiki/Node-RED, https://nodered.org/docs/

...

5. Plateformes de développement IoT


IBM Watson Bluemix https://www.ibm.com/Search/?
q=IoT+Raspberry+Pi&v=18&en=utf&lang=en&cc=us&sn=dw&dws=dw&hpp=20, https://www.iot-academy.info/
Google https://cloud.google.com/solutions/iot-overview
https://www.carriots.com/
https://exosite.com/
https://tinamous.com/
https://thingspeak.com/
https://ubidots.com/
https://evrythng.com/

22
Labs Infrastructure

Labs Infrastructure
Routeurs OpenWRT
Mirabox
APU1D4
Mikrotik (RouterOS)

Routeurs OpenWRT
16 X v8.2 et v9

inventaire

https://fr.wikipedia.org/wiki/Architecture_MIPS
https://wiki.openwrt.org/toh/tp-link/tl-wr841nd

Mirabox
1X-

https://archlinuxarm.org/platforms/armv7/marvell/mirabox

23
Labs Infrastructure

1.2Ghz Marvell Armada 370


802.11b/g/n wireless with Marvell 88W8787 and Bluetooth 3.0
1GB NAND Flash / 1GB DDR3 RAM
2x Gigabit Ethernet
2x USB 3.0
1 external and 1 internal micro SD slots (USB-connected)
Internal Mini PCIe slot for expansion

Liens :

https://www.solinno.co.uk/public/mirabox/debian_cross_compile.html
https://archlinuxarm.org/platforms/armv7/marvell/mirabox
https://github.com/psanford/mirabox
https://forum.doozan.com/read.php?2,12096

APU1D4
1X-

http://pcengines.ch/apu1d4.htm

24
Labs Infrastructure

Mikrotik (RouterOS)
Mikrotik CRS125-24G-1S-2HnD-IN
Mikrotik RB

25
Labs OpenWRT

Labs OpenWRT
1. Matériel nécessaire
1.1. TL-WR841ND
TP-Link TL-WR810N
TP-Link TL-WDR3600
Gl.Inet AR300M
1.2. Logiciels Console/Telnet/SSH
1.3. Images OpenWrt pour TL-WR841ND
TL-WR841N(D) v8
TL-WR841N(D) v9
TL-WR841N(D) v10
TL-WR841N(D) v11
1.4. Mise-à-jour vers OpenWRT
Objectif
Matériel nécessaire
Procédure
2. Remise à zéro
2.1. Démarrage en mode sans échec
2.2. Remise à zéro de la configuration
3. Mise-à-jour du système en version stable
3.1. Placer le dernier firmware sur le routeur
Première Option
Seconde Option
3.2. Mise à jour du firmware OpenWRT
4. Vérification du réseau
4.1. Vérification des interfaces
4.2. Analyse de la table de routage IPv4
4.3. Analyse de la table de routage IPv6
4.4. Vérification du trajet à travers l'Internet
4.5. On peut aussi procéder à un ping stratégique
4.6. Vérification DNS
4.7. Redémarrage du réseau
4.8. Configuration TCP/IP du noyau
5. Fichiers de configuration
5.1. Services
5.2. Liste des fichiers
5.3. Lire le contenu d’un fichier avec le programme cat

5.4. Lire le contenu d’un fichier avec le programme less

5.5. Faire une copie d’un fichier


6. Configuration de la passerelle
6.1. Activation de SSH
6.2. Configuration de l’interface br-lan en bash
6.3. Configuration des paramètres système
6.4. Modification du port HTTP d’administration (commandes UCI)
7. Examen de l’interface graphique
7.1. Redémarrage
7.2. Accès Web
7.3. Menu Status
7.4. Menu System
7.5. Menu Network
Interfaces
Wifi
Switch
DHCP et DNS
Hostnames
Static routes

26
Labs OpenWRT

Firewall
Diagnostics
8. Activités étendues

1. Matériel nécessaire
1.1. TL-WR841ND

Figure 2 : TP-Link TL-WR841ND

Pages officielles

http://www.tp-link.com/lk/products/details/?model=TL-WR841ND#spec
http://openwrt.org/toh/tp-link/tl-wr841nd
http://www.amazon.fr/dp/B0019EQ1RW/ref=wl_it_dp_o_pC_S_ttl?
_encoding=UTF8&colid=3U2BD7X6Y9Y31&coliid=I2SCI8P495BZJX

Il existe plusieurs versions du matériel, ce qui implique plusieurs versions du firmware pour un même modèle. On peut encore trouver
aujourd'hui des versions 8, 9, 10 et 11. Voici les caractéristiques de ce matériel :

Processeur : AR9341 (v8), QCA9533-AL3A (v9, v10 et v11) cadencés entre 535 et 560 MHz
Flash : 4 Mo
RAM : 32 Mo
Wireless 802.11bgn
Switch Ethernet (différent v8/v9) avec 5 ports 100 Mbps

Autant de services supportés sur un système de fichiers de 4 Mo est remarquable !

On observe sur ce matériel :

5 ports Ethernet 10/100 Mbps


deux antennes Wi-Fi qui étendent une interface de réseau sans fil
un bouton On/Off
un bouton reset

27
Labs OpenWRT

Aussi d'un point de vue logique, voici l'agencement des interfaces :

4 ports LAN : Switch0 eth0

1 port WAN eth1

Interface Wi-Fi wlan0

LAN : Pont (bridge) VLAN x + Wi-Fi br-lan

Ce matériel vieillissant est donc limité à 4 Mo de Flash et 32 Mo de RAM. Openwrt a publié un avis sur cette situation : 4/32 warning.

On proposera des alternatives matérielles pour ce lab telles que :

TP-Link TL-WR810N
TP-Link TL-WDR3600
Gl.Inet AR300M
ou encore tout autre matériel supporté dans la liste OpenWRT Table of Hardware

TP-Link TL-WR810N
En 2016, on proposera le TL-WR810N, un modèle d'expérimentation plus compact, plus performant et bon marché.

Figure 3 : TP-Link TL-WR810N

https://openwrt.org/toh/tp-link/tl-wr810n
Processeur : Qualcomm Atheros QCA9531-BL3A cadencé à 650 MHz
Flash : 8 Mo
RAM : 364 Mo
Wireless 802.11bgn
Switch Ethernet avec 2 ports 100 Mbps

TP-Link TL-WDR3600
De la même époque, mis à jour en 5 GHz et en Gigabit Ethernet, avec 128 Mo de RAM et 8 Mo de Flash, le TP-Link TL-WDR3600 :

28
Labs OpenWRT

Figure 4 : TP-Link TL-WDR3600

https://openwrt.org/fr/toh/tp-link/tl-wdr3600
Architecture: MIPS MIPS 74Kc
Vendor: Qualcomm Atheros
bootloader: U-Boot
System-On-Chip: AR9344 (MIPS)
CPU/Speed 560 MHz
Flash-Chip: Spansion FL064KIF docs
Flash size: 8192 KiB
RAM: 128 MiB
Wireless No1: Atheros AR9340 2.4GHz 802.11bgn
Wireless No2: Atheros AR9582 5GHz 802.11an
switch: Atheros AR8327N Gigabit Switch
USB: Yes 2 x 2.0 (GL850G chip - 4 ports capable)

Gl.Inet AR300M
Mieux encore le mini-routeur Gl.Inet AR300M qui est une plateforme qui embarque nativement OpenWRT.

https://www.gl-inet.com/docs/mini/ar300m/
Atheros 9531 650Mhz CPU
Wireless 802.11bgn
Dual Flash: 16MB Nor + 128MB Nand
128MB DDR2 RAM
UART, PCIe, USB-A Interfaces
Alimentation USB Female Micro-B 5V 1W, 3.3V
Dimension/poids 585825mm, 39g

29
Labs OpenWRT

Bootloader: uBoot
WI1 antenna connector: U.FL, RP-SMA
ETH chip1: Qualcomm Atheros QCA9531

30
Labs OpenWRT

31
Labs OpenWRT

1.2. Logiciels Console/Telnet/SSH


putty.exe

32
Labs OpenWRT

pscp.exe
plink.exe
WinSCP

1.3. Images OpenWrt pour TL-WR841ND


Versions Trunk ou Stable
Images Factory ou Sysupgrade

TL-WR841N(D) v8
version 15.05
image factory : https://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/openwrt-15.05.1-ar71xx-generic-tl-
wr841n-v8-squashfs-factory.bin
image sysupgrade : https://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/openwrt-15.05.1-ar71xx-generic-tl-
wr841n-v8-squashfs-sysupgrade.bin

TL-WR841N(D) v9
Version 15.05 :
image factory : https://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/openwrt-15.05.1-ar71xx-generic-tl-
wr841n-v9-squashfs-factory.bin
image sysupgrade : https://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/openwrt-15.05.1-ar71xx-generic-tl-
wr841n-v9-squashfs-sysupgrade.bin
Version Trunk : https://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/openwrt-ar71xx-generic-tl-wr841-v9-squashfs-
sysupgrade.bin

TL-WR841N(D) v10
Version 15.05.1 :
image factory : https://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/openwrt-15.05.1-ar71xx-generic-tl-
wr841n-v10-squashfs-factory.bin
image sysupgrade : https://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/openwrt-15.05.1-ar71xx-generic-tl-
wr841n-v10-squashfs-sysupgrade.bin

TL-WR841N(D) v11
Version DD trunk :
image factory : https://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/openwrt-ar71xx-generic-tl-wr841-v11-
squashfs-factory.bin
image sysupgrade : https://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/openwrt-ar71xx-generic-tl-wr841-v11-
squashfs-sysupgrade.bin

1.4. Mise-à-jour vers OpenWRT


Cette étape est nécessaire uniquement pour passer du système TP-LINK vers un système OpenWRT. L'image utilisée est l'image
factory qui est une image compilée pour le flasheur de bootloader ou le logiciel de flash d'origine.

Soit le matériel est neuf, soit on a procédé à la restauration du logiciel original (https://openwrt.org/toh/tp-link/tl-
wr841nd#go_back_to_original_firmware).

Objectif
Remplacer le firmware TP-Link original par celui d’OpenWRT (version Trunk ou Stable) et réaliser une configuration minimale.
L’activité peut prendre 30 minutes. L’intérêt est de manipuler le matériel réseau avec un OS ouvert, évolutif, stable et facile à prendre
en main.

Matériel nécessaire
une station de travail

33
Labs OpenWRT

une connexion Internet


un routeur TL-841ND v9.0
le firmware correpsondant (image Factory)

Procédure
Etape 1 : Identification de la version du matériel

Vérifier la version Hardware au verso du matériel.

Se procurer le Firmware (Version Trunk pour TL-841ND v9.0) à l’adresse suivante :


http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-tl-wr841n-v9-squashfs-factory.bin
Se procurer le Firmware (Version Trunk pour TL-841ND v8.2) : http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-
ar71xx-generic-tl-wr841n-v8-squashfs-factory.bin

Etape 2 : Connectique et démarrage

Connectique : connexion de la station de travail à un port LAN (jaune) et l’Internet sur le port WAN (bleu).
Allumer le routeur.
Le routeur offrira par défaut des adresses IP dans la plage 192.168.0.0/24 sur son interface LAN.

Etape 3 : Mise à jour

Mise à jour du firmware. Le routeur est accessible par défaut en HTTP sur l’adresse 192.168.0.1.

Ouvrir un navigateur Web et se rendre à l’adresse http://192.168.0.1/ (admin:admin)


Aller dans le menu System Tools/Firmware Upgrade, choisir le fichier du firmware et appuyer sur le bouton “Upgrade”.
Patienter plusieurs minutes le temps du redémarrage.

Etape 4 : Installation de l'interface graphique

Après la mise à jour, le routeur dispose d’une nouvelle adresse IPv4 en 192.168.1.1. L’adresse de la station de travail a changé
également de manière dynamique.

Pour installer l’interface graphique.

A partir de la station de travail, se connecter avec le logiciel putty en Telnet sur l’adresse du routeur 192.168.1.1
Mettre à jour la liste des paquetages : opkg update

Installer l’interface Web graphique : opkg install luci

Lancer le serveur Web à chaque redémarrage : /etc/init.d/uhttpd enable

Démarrer le serveur Web : /etc/init.d/uhttpd start

Etape 5 : Interface Web

Accéder au routeur via l'interface désormais à l'écoute sur la nouvelle adresse http://192.168.1.1/

2. Remise à zéro
2.1. Démarrage en mode sans échec
Cette opération permet de reprendre la main sur le routeur en le démarrant en mode sans échec (Failsafe boot).

OpenWrt possède un mode de démarrage sans échec interne qui essaye de contourner tous les paramètres de configuration en faveur
de quelques paramètres inscrits en dur dans le code. Une fois entré dans ce mode, le routeur devient accessible à l'adresse
192.168.1.1/24 (même si la configuration est fixée à une autre valeur) avec seulement les services essentiels qui fonctionnent. Depuis
cet état (démarrage sans échec), vous pouvez vous reconnecter via telnet (à l'adresse 192.168.1.1) et régler certains problèmes.

Sources et compléments : http://openwrt.org/fr/doc/howto/generic.failsafe

1. Eteindre le routeur
2. Déconnecter la connexion “Wan” du routeur
3. Connecter le PC à un port “Lan” du routeur
4. Maintenir sont doigt sur le bouton reset pendant plus de 30 secondes en rebranchant l’alimentation, la dernière diode clignote
rapidement

2.2. Remise à zéro de la configuration

34
Labs OpenWRT

En réalité, le système lui-même est présent sur une partition en lecture seule. Toute modification ou ajout au firmware original est
enregistré dans une partition “rootfs_data”. “mtd” est le logiciel qui permet d’agir sur des disques Flash.

Sources et compléments : http://openwrt.org/fr/doc/techref/flash.layout

1. (Fixer l’adresse IP de l’interface du PC à 192.168.1.2/24)


2. Lancer un telnet 192.168.1.1 et lire le message d’accueil ? Quelle est l’information importante à retenir ?
3. Effacer la configuration : mtd -r erase rootfs_data

3. Mise-à-jour du système en version stable


La dernière version stable est déjà compilée avec l’interface graphique. On devra se passer d’une interface graphique avec la version
Trunk téléchargée.

Sources et compléments :

http://openwrt.org/fr/about/latest,
http://openwrt.org/doc/howto/generic.sysupgrade,
http://openwrt.org/doc/techref/sysupgrade

3.1. Placer le dernier firmware sur le routeur


Deux options sont disponibles :

Avec une connexion Internet, à partir du routeur


En transférant le fichier du firmware par SSH

Première Option
Directement à partir du routeur avec vérification d’intégrité (connexion WAN nécessaire), veuillez adapter les URLs :

1. Lancer un telnet 192.168.1.1


2. se rendre dans le dossier /tmp : cd /tmp

3. Télécharger le dernier firmware : par exemple, wget http://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/generic/openwrt-

ar71xx-generic-tl-wr841n-v9-squashfs-sysupgrade.bin

4. Télécharger la somme de contrôle MD5 : wget http://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/generic/md5sums

5. Lancer la vérification : md5sum -c md5sums 2> /dev/null | grep OK

Seconde Option
En SSH/SCP à partir d’une station de travail Windows.

Sur le routeur, activer SSH en changeant le mot de passe (de de l’utilisateur root) : passwd

Sortie de la session telnet : exit

Installer pscp.exe sur son pc (Equivalent Linux scp ) ou via WinSCP (client graphique)
placer le firmware sur le routeur en une seule ligne : pscp -scp openwrt-*-sysupgrade.bin root@192.168.1.1:/tmp/

3.2. Mise à jour du firmware OpenWRT


Exécution de la commande : sysupgrade -v /tmp/openwrt-*-sysupgrade.bin

4. Vérification du réseau
Sources et compléments : http://openwrt.org/doc/uci/network

4.1. Vérification des interfaces

ifconfig -a

Quelles sont les interfaces ?


Leur état

35
Labs OpenWRT

Leur adresse IPv4


Leurs adresses IPv6
Leur usage/type

4.2. Analyse de la table de routage IPv4

route

4.3. Analyse de la table de routage IPv6

route -A inet6

4.4. Vérification du trajet à travers l'Internet

traceroute www.google.com

4.5. On peut aussi procéder à un ping stratégique

ping www.google.com

ping 8.8.8.8

ping 192.168.1.1

4.6. Vérification DNS


Résolveur de nom :

cat /etc/resolv.conf

cat /tmp/resolv.conf.auto

Résolution de nom :

nslookup www.google.com

4.7. Redémarrage du réseau

/etc/init.d/network restart

4.8. Configuration TCP/IP du noyau

cat /etc/sysctl.conf

5. Fichiers de configuration
5.1. Services

ps

top

ps | grep uhttpd

ps | grep dropbear

36
Labs OpenWRT

5.2. Liste des fichiers

ls -l /etc/config/

dhcp : service DHCP/DHCPv6


dropbear : service SSH
firewall : service firewall Netfilter
luci : application graphique
network : interfaces TCP/IP
system : système ()
ubootenv : démarrage
ucitrack : correspondance entre UCI et les services
uhttpd : service WEB
wireless : interfaces wi-fi

5.3. Lire le contenu d’un fichier avec le programme cat

cat /etc/config/wireless

5.4. Lire le contenu d’un fichier avec le programme less

less /etc/config/network

5.5. Faire une copie d’un fichier


Copie d'un fichier texte avec cat :

cat /etc/config/network > /etc/config/network.old


ls -l /etc/config/net*

Plus simplement copier avec la commande cp :

cp /etc/config/wireless /etc/config/wireless.old
ls -l /etc/config/wi*

6. Configuration de la passerelle
Le but de l'exercice est de monter une passerelle OpenWRT selon le modèle présenté ci-dessus.

37
Labs OpenWRT

Les tâches consistent à configurer et activer différents services :

Activer un service sécurisé d'accès distant


Activer l'adressage IP côté LAN et côté WAN
Vérifier le routage
Vérifier les services IP
DHCP
Neighbor Discovery IPv6
DHCPv6
DNS
Firewall

6.1. Activation de SSH

passwd

6.2. Configuration de l’interface br-lan en bash

cat /etc/config/network | grep '192.168.1.1'

Changement de l’adresse de 192.168.1.1 en 192.168.8.1 :

sed -i "s/1\.1/8\.1/g" /etc/config/network

Vérification

cat /etc/config/network | grep '192.168.8.1'

Prendre en compte les changements d’interface

38
Labs OpenWRT

reboot

6.3. Configuration des paramètres système


Hostname : LAB-XXXXXX
Timezone : Europe/Brussels
NTP list server : 0.be.pool.ntp.org

Écrire dans un fichier avec vi

vi /etc/config/system

Installation et usage de nano

date; df -h | head -n 2
opkg update
date; df -h | head -n 2
opkg install nano
date; df -h | head -n 2
nano /etc/config/system

6.4. Modification du port HTTP d’administration (commandes UCI)


On peut aussi configurer tout le système via des commandes uci (voir https://openwrt.org/doc/uci#command_line_utility)

uci set uhttpd.main.listen_http=8080


uci commit uhttpd
/etc/init.d/uhttpd restart
netstat -antp | grep 8080
grep 8080 /etc/config/uhttpd

7. Examen de l’interface graphique


7.1. Redémarrage
Pour que tous ces paramètres soient pris en compte, il est certainement nécessaire de redémarrer le périphérique.

7.2. Accès Web


L’interface graphique est désormais accessible via un navigateur Web sur l’URL http://LAB-XXXXXX:8080/

7.3. Menu Status


Aperçu général : Overview
Routes
Table ARP
Routes IPv4
Routes IPv6
System logs
Kernel logs
Real Times Graphs
Charge
Trafic
Sans-fil
Connexions

7.4. Menu System


System Properties
Hostname : RXXX
Timezone : Europe/Brussels

39
Labs OpenWRT

NTP client
NTP server
0.be.pool.ntp.org
Logging Syslog
Administration : régler SSH
Password (désactiver Telnet/activer SSH)
Software : installation de logiciels supplémentaires
Startup : vérifier les services au démarrage
Scheduled Tasks
LED Configuration
Flash operations
Backup / Restore configuration
Flash new firmware image en gardant ou non la configuration
reboot

7.5. Menu Network

Interfaces
Statut, démarrage, édition
Intégrer une nouvelle interface
Préfixe IPv6 ULA

Wifi

Switch

DHCP et DNS

Hostnames

Static routes

Firewall
Vérification des paramètres de zone

Diagnostics

8. Activités étendues
Transfert de ports TCP/UDP IPv4
Routeur Wi-fi WAN
Authentification 802.1X avec serveur radius + VLAN + zone VPN : https://openwrt.org/doc/howto/wireless.security.8021x,
https://openwrt.org/oldwiki/wpa2enterprise, https://openwrt.org/doc/uci/wireless#wpaenterpriseaccesspoint
Client DDNS
Client ovpn
Création d'un DMZ
Routeur RIP/OSPF
Compilation d'une image
http://blog.flozz.fr/2013-07-14/debriquer-routeur-tp-link-tl-wr841nd/

40
Debian Cross-Compilation for Mirabox

Debian Cross-Compilation for Mirabox


Pre-requisites
Step 1 - Decide where to deploy everything
Step 2 - install the required packages
Step 3 - Clone the Linux-stable git repository
Step 4 - Checkout the desired stable version
Step 5 - Build the Linux kernel
Step 6 - Create the ARM chroot environment
Step 7 - Trim the size of the chroot environment
Step 8 - Configure the chroot initramfs
Step 9 - Deploy the kernel into the chroot environment
Step 10 - Install some additional packages required for the Mirabox
Step 11 - Configure the chroot environment for the Mirabox
Step 12 - Create the SD Card image
Step 13 - Mount the SD Card image
Step 14 - Populate the SD Card image
Step 15 - Copy the SD Card image to a real SD card
Step 16 - Boot on the Mirabox
Step 17 - Rough notes for the moment - ignore for now
Changelog
Notes

Source : Debian Cross-compile

This work in progress procedure will create an image that can be copied onto an SD card and be used to boot a Mirabox. It aims to use
a stock kernel and stock Debian.

Pre-requisites
I am assuming you are running Debian 9 (Stretch) on 32-bit or 64-bit Intel PC or Server. I have tested this procedure on a minimal
install on a VM.

You will require root access using sudo.

Step 1 - Decide where to deploy everything


You will need around 4GB of free disk space for the git tree and the chroot environment. For this demonstration I will use the
MIRABUILD environment variable as the root of the tree.

MIRABUILD=~/mirabuild
export MIRABUILD

The very first time you start, you'll need to create the build directory:

mkdir $MIRABUILD

Don't forget to re-export the environment variable if you repeat parts of the procedure.

Step 2 - install the required packages


Debian now includes a GCC cross-compiler for ARM as well as a really easy mechanism to create a chroot environment for a foreign
architecture using Qemu. We'll use both of those in this procedure.

Use apt-get to install the required packages.

sudo apt-get install --no-install-recommends gcc-arm-linux-gnueabihf build-essential git ca-certificates bc binfmt-support qemu-u

41
Debian Cross-Compilation for Mirabox

ser-static debootstrap parted dosfstools rsync

Step 3 - Clone the Linux-stable git repository


We will use the linux-stable git repository and install using the latest stable version at the time of writing.

cd $MIRABUILD
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

If you have already cloned the repository and want to bring it up to date with the latest stable version, perform the following:

cd $MIRABUILD/linux-stable
git checkout -- .
git checkout master
git pull

Step 4 - Checkout the desired stable version


We will checkout the latest stable version at the time of writing.

cd $MIRABUILD/linux-stable
git checkout v4.14.16
git checkout -b v4.14.16-mirabox

Step 5 - Build the Linux kernel


I will use my personal Linux kernel configuration. You can use this as a base and amend to your liking. Be careful! This configuration
probably will not work with systemd as it does not include several required features (e.g. cgroups). Also, make sure the resultant
kernel is less than 2MB in size if you intend to flash it to NAND.

I also have a small patch to disable detection of the Marvell SD8787 Bluetooth AMP device, which doesn't work with the SD8787
firmware I use.

cd $MIRABUILD/linux-stable
wget -O.config https://www.solinno.co.uk/public/mirabox/config-mirabox-4.14.16
wget -O- https://www.solinno.co.uk/public/mirabox/mirabox-sdio.patch | patch -p1
export CROSS_COMPILE=arm-linux-gnueabihf-
make ARCH=arm -j3

Step 6 - Create the ARM chroot environment


We'll use an ARM chroot environment both to help create the kernel image and initial ramdisk, but also to let us create an SD card
image. Change the Debian mirror to be one appropriate to your country.

Note that I remove dmsetup as without this the initial ramdisk becomes too large. If you need dmsetup then you will need to disable
the initramfs hook after it is installed.

cd $MIRABUILD
sudo qemu-debootstrap --arch=armhf --include=sysvinit-core,locales,ntp,vim-tiny,initramfs-tools,u-boot-tools,xz-utils stretch $MI
RABUILD/debian_armhf_stretch http://ftp.debian.org/debian/
sudo chroot $MIRABUILD/debian_armhf_stretch apt-get remove -y --purge dmsetup systemd
sudo chroot $MIRABUILD/debian_armhf_stretch apt-get clean
sudo mkdir $MIRABUILD/debian_armhf_stretch/uboot

Step 7 - Trim the size of the chroot environment


To keep the chroot environment as small as possible I install a dpkg.cfg file that excludes man pages, documentation and non-
English locales. You may edit this to your needs, if required.

42
Debian Cross-Compilation for Mirabox

cd $MIRABUILD/debian_armhf_stretch
wget -O- https://www.solinno.co.uk/public/mirabox/etc_dpkg_dpkg.cfg | sudo tee etc/dpkg/dpkg.cfg >/dev/null
sudo rm -fr $MIRABUILD/debian_armhf_stretch/usr/share/man/*
sudo rm -fr $MIRABUILD/debian_armhf_stretch/usr/share/doc/*
ls -d $MIRABUILD/debian_armhf_stretch/usr/share/locale/*/LC_MESSAGES | sed -e 's/\/LC_MESSAGES$//' -e 's/^/rm -fr /' | grep -v -e
'locale/en' -e '/uk$' | sudo sh

Step 8 - Configure the chroot initramfs


In order to keep the initial ramdisk as small as possible we configure it to use xz compression and just include the modules needed to
get the root filesystem mounted. NB: This configuration is suitable for booting from the SD Card using the ext4 filesystem.

cd $MIRABUILD/debian_armhf_stretch
wget -O- https://www.solinno.co.uk/public/mirabox/etc_initramfs-tools_initramfs.conf | sudo tee etc/initramfs-tools/initramfs.con
f >/dev/null
wget -O- https://www.solinno.co.uk/public/mirabox/etc_initramfs-tools_modules | sudo tee etc/initramfs-tools/modules >/dev/null

NOTE: The fsck attempted by the initial ramdisk will fail when the mirabox boots, however this won't prevent booting. You can
correct the problem by recreating the initial ramdisk on the mirabox itself (where it will be able to correctly determine the root
filesystem).

Step 9 - Deploy the kernel into the chroot environment


This step copies the kernel and modules into the chroot environment and creates the u-boot images that can be loaded by the
Mirabox.

Firstly, we will create the kernel image. Because the version of u-boot shipped with the Mirabox is too old to pass a DTB to the
bootloader, we will have to append the DTB to the kernel. We set the option to enable this in the kernel configuration downloaded in
step 4.

cd $MIRABUILD/linux-stable
RELEASE=$(make ARCH=arm kernelrelease)
sudo cp arch/arm/boot/zImage $MIRABUILD/debian_armhf_stretch/boot/vmlinuz-$RELEASE
cat arch/arm/boot/dts/armada-370-mirabox.dtb | sudo tee -a $MIRABUILD/debian_armhf_stretch/boot/vmlinuz-$RELEASE >/dev/null
sudo chroot $MIRABUILD/debian_armhf_stretch mkimage -A arm -O linux -C none -a 0x00008000 -e 0x00008000 -n uImage-$RELEASE -d /bo
ot/vmlinuz-$RELEASE /uboot/uImage-$RELEASE

Secondly, we will install the kernel modules.

cd $MIRABUILD/linux-stable
make ARCH=arm modules
sudo make ARCH=arm INSTALL_MOD_PATH=$MIRABUILD/debian_armhf_stretch modules_install

Thirdly, we will create the initial ramdisk.

sudo chroot $MIRABUILD/debian_armhf_stretch update-initramfs -c -k $RELEASE

If you've already created an initial ramdisk and need to update, use this instead:

sudo chroot $MIRABUILD/debian_armhf_stretch update-initramfs -u -k $RELEASE

Now, create the u-boot initial ramdisk image:

sudo chroot $MIRABUILD/debian_armhf_stretch mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n uInitrd-$RELEASE -d /boot/ini
trd.img-$RELEASE /uboot/uInitrd-$RELEASE

Step 10 - Install some additional packages required for the Mirabox

43
Debian Cross-Compilation for Mirabox

We will now install some additional packages that are appropriate for a Mirabox. These include the utilities for PCI, USB, MTD and
Wireless components. Also, I use the busybox-syslogd as it doesn't continually write to the filesystem, thus preserving the life of the
NAND flash.

sudo chroot $MIRABUILD/debian_armhf_stretch apt-get install --purge -y bluez crda iw mtd-utils pciutils usbutils wireless-regdb w
pasupplicant busybox-syslogd

While we are on, remove a package or two we don't need. If you think you need any of these packages, don't remove them!

sudo chroot $MIRABUILD/debian_armhf_stretch apt-get remove --purge dmidecode tasksel tasksel-data debconf-i18n gnupg gnupg-agent

Finally, we will install the SD8787 firmware so that the onboard wireless works. Note! This is for v1 and v2 of the Mirabox. v3 uses a
different wireless chip, and I don't have access to one.

sudo mkdir -p $MIRABUILD/debian_armhf_stretch/lib/firmware


wget -O- 'https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/mrvl/sd8787_uapsta.bin' | sudo tee $M
IRABUILD/debian_armhf_stretch/lib/firmware/sd8787_uapsta.bin >/dev/null

Step 11 - Configure the chroot environment for the Mirabox


Before we create the SD Card image, we need to set up the chroot environment so that when the Mirabox boots from it, things will
work correctly.

Set the hostname of the image.

echo mirabox | sudo tee "$MIRABUILD/debian_armhf_stretch/etc/hostname" >/dev/null

Create a suitable filesystem table (/etc/fstab).

wget -O- https://www.solinno.co.uk/public/mirabox/etc_fstab | sudo tee "$MIRABUILD/debian_armhf_stretch/etc/fstab" >/dev/null

Create a suitable inittab placing a getty on the Mirabox serial port.

wget -O- https://www.solinno.co.uk/public/mirabox/etc_inittab | sudo tee "$MIRABUILD/debian_armhf_stretch/etc/inittab" >/dev/null

Add the configuration file for fw_printenv and fw_setenv so the u-boot configuration and be modified from the operating system.

wget -O- https://www.solinno.co.uk/public/mirabox/etc_fw_env.config | sudo tee "$MIRABUILD/debian_armhf_stretch/etc/fw_env.config"


>/dev/null

Set the root password so we can login the first time we boot.

echo 'root:mirabox' | sudo chpasswd -c SHA512 -R "$MIRABUILD/debian_armhf_stretch"

Step 12 - Create the SD Card image


We will now create an SD card image with a small MS-DOS partition and filling the rest of the image with an ext4 partition. In the dd
command seek=1886 will create a (slightly less than) 2GB image suitable for a typical SD card. You may need to check your SD card
to see how many sectors are on it to get this precisely right.

rm -f $MIRABUILD/sdcard.img
dd if=/dev/zero of=$MIRABUILD/sdcard.img bs=1024k count=0 seek=1886
sudo losetup /dev/loop0 $MIRABUILD/sdcard.img
sudo parted -s /dev/loop0 mklabel msdos
sudo parted -s /dev/loop0 unit s mkpart primary fat32 -- 2048 64MB
sudo parted -s /dev/loop0 set 1 boot on
sudo parted -s /dev/loop0 unit s mkpart primary ext4 -- 64MB -1

Now, create the filesystems on the image:

44
Debian Cross-Compilation for Mirabox

sudo mkfs.vfat -n miraboot /dev/loop0p1


sudo mkfs.ext4 -L miraroot /dev/loop0p2

Don't worry about the warning issued by mkfs.vfat, it won't affect the Mirabox.

Step 13 - Mount the SD Card image


Now we create loop devices for the indivual partitions, and mount them.

sudo fdisk -l /dev/loop0 | awk '/loop0p1/{print "losetup /dev/loop1 '$MIRABUILD'/sdcard.img -o " $3 * 512 " --sizelimit " $4 * 51
2}' | sudo sh
sudo fdisk -l /dev/loop0 | awk '/loop0p2/{print "losetup /dev/loop2 '$MIRABUILD'/sdcard.img -o " $2 * 512 " --sizelimit " $3 * 51
2}' | sudo sh
sudo mkdir $MIRABUILD/sysimage
sudo mount -t ext4 /dev/loop2 $MIRABUILD/sysimage
sudo mkdir $MIRABUILD/sysimage/uboot
sudo mount -t vfat /dev/loop1 $MIRABUILD/sysimage/uboot

Step 14 - Populate the SD Card image


In this step, we will copy the files across from the chroot environment to the mounted filesystems on the SD Card image file.

sudo rsync -a $MIRABUILD/debian_armhf_stretch/ $MIRABUILD/sysimage/

We can check to see how full the filesystems are, there should be plenty of space free.

df -h $MIRABUILD/sysimage $MIRABUILD/sysimage/uboot

Once we are happy, unmount the filesystems and remove the loop devices.

sudo umount $MIRABUILD/sysimage/uboot


sudo umount $MIRABUILD/sysimage
sudo losetup -d /dev/loop2
sudo losetup -d /dev/loop1
sudo losetup -d /dev/loop0

Step 15 - Copy the SD Card image to a real SD card


This step is DANGEROUS! Make sure you select the correct device for your SD Card reader. Replace /dev/sdXXXXX with the correct
device. Check three times before proceeding.

sudo dd if=$MIRABUILD/sdcard.img of=/dev/sdXXXXX bs=2048

Step 16 - Boot on the Mirabox


Interrupt autoboot then type in the following commands to the Marvell> prompt.

usb start
fatload usb 1 0x6400000 uImage-4.14.16+
fatload usb 1 0x7400000 uInitrd-4.14.16+
setenv bootargs console=ttyS0,115200 root=LABEL=miraroot rootdelay=4
bootm 0x6400000 0x7400000

All being well, you now have an SD card that you can manually boot a recent Debian version with a recent kernel.

When I get time I will add instructions to transfer the SD card image to the onboard flash.

If any part of this procedure does not work, please contact leigh AT solinno DOT co DOT uk for assistance.

45
Debian Cross-Compilation for Mirabox

Step 17 - Rough notes for the moment - ignore for now


To erase kernel and initial ramdisk area in one go:

nand erase 0x400000 0x400000

To erase kernel and initial ramdisk individually:

nand erase 0x400000 0x200000


nand erase 0x600000 0x200000

To write kernel and initial ramdisk:

nand write 0x6400000 0x400000 0x200000


nand write 0x7400000 0x600000 0x200000

To load kernel and initial ramdisk from nand and boot:

nand read 0x6400000 0x400000 0x400000


bootm 0x6400000 0x6600000

For the following refer to Re: Re-Installing OS on Mirabox. Inspect or change a rootfs UBI Image file

Changelog
V1.0 2018-02-04 Initial release.
V1.1 2018-02-05 Add download of SD8787 firmware. Fix patching kernel.
V1.2 2018-02-06 Add note about initial ramdisk fsck failure.
V1.3 2018-02-06 Add download of /etc/fw_env.config for fw_printenv.

Notes
setenv bootcmd_nand "nand read 0x6400000 0x400000 0x400000; run bootargs_nand; bootm 0x6400000"
setenv bootargs_nand "setenv bootargs console=ttyS0,115200 $mtdparts ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs"
setenv bootcmd_mmc "usb start; fatload usb 1 0x6400000 uImage-4.14.16+; fatload usb 1 0x7400000 uInitrd-4.14.16+; run bootargs_mm
c; bootm 0x6400000 0x7400000"
setenv bootargs_mmc "setenv bootargs console=ttyS0,115200 root=LABEL=miraroot rootdelay=4"
setenv bootcmd "run bootcmd_mmc"
saveenv

46
Labs Littlebits

Littlebits
1. Des objets littlebits
2. Circuits simples
Guides d'activités par kit
3. Circuits logiques
4. Cloudbits

1. Des objets littlebits


Les littlebits sont des composants électroniques à emboiter qui permettent de construire facilement des circuits. L'idée qui préside à
ce projet est de faciliter la créativité en dépassant la barrière de la fabrication (soudures, plaque) de circuits électroniques.

La présentation au TED par sa créatrice est bien plus éloquente :


https://www.ted.com/talks/ayah_bdeir_building_blocks_that_blink_beep_and_teach?language=fr

47
Labs Littlebits

Les littlebits sont représentés dans un catalogue de plusieurs dizaines/centaines de composants permettant la création de circuits à
l'infini. Le catalogue est divisé en plusieurs catégories :

Power en bleu : en pile de 9V ou en secteur 5V (USB).


Input en rose : différent commutateurs de circuits (bouton, interrupteur, digital, ...) et capteurs (température, luminosité,
mouvement, bruit, ...) et de traitement du signal (dimmer, slider) notamment en vue de traiter du son (composants de synthé,
lecteur MP3).
Output : de la lumière (IR, UV, LEDs, barre, display), du son, du mouvement (moteurs, bras, ...)
Wire : ce qui transmet et traite du signal allant des simples fils, à la répartition du signal, des fonctions logiques, la transmission
sans fil, le stockage USB, la mise en place du contrôleur Arduino ou d'un ordinateur tel que le Cloudbit.

On trouvera le catalogue à cette page : http://littlebits.cc/shop/bits

48
Labs Littlebits

2. Circuits simples

49
Labs Littlebits

Guides d'activités par kit


Les modules sont aussi vendu en kit, voici la liste des booklets :

Base Kit : https://s3.amazonaws.com/littleBits_pdfs/BASE-booklet.pdf


Premium Kit : https://s3.amazonaws.com/littleBits_pdfs/PREMIUM-booklet.pdf
Synth Kit : http://s3.amazonaws.com/littleBits_pdfs/SYNTH-booklet.pdf
Smart Home Kit : https://s3.amazonaws.com/lB_images/Smart+Home+Kit/700-0070-SmartHomeKit-Poster-V1-6+(2).pdf
STEAM Student kit : https://d3ii2lldyojfer.cloudfront.net/pdf/STEAM+Student+Set/STEAM-Student-Set-Invention-Guide.pdf

3. Circuits logiques
Les Littlebits permettent de mettre en place facilement et rapidement des activités et des prototypes utilisant les fonctions logiques
OR, AND, NOR, NAND, XOR, Latch.

50
Labs Littlebits

De plus le contrôleur open source bien connu Arduino a été porté sur Littlebits !

4. Cloudbits
Un Cloudbit est un module qui propose un ordinateur connecté au cloud Littlebits. On peut le commander via un API HTTP ou une
interface/app Web. Il s'agit d'interconnecter n'importe qu'il objet à l'Internet via le Cloudbit. Il fournit à l'objet intelligence et
connectivité. Il peut aussi un devenir un sujet d'étude en terme de conception, de sécurité, de modèle de fonctionnement IoT, etc.

51
Labs Littlebits

52
Labs Littlebits

53
Labs Littlebits

54
Labs Littlebits Logic

Labs Littlebits Logic


1. Sujets
2. Méthode
3. Sources
4. Arduino Littlebits
5. Bitcraft

A cet instant de la rédaction du support, l'auteur propose de se référer à la documentation originale.

1. Sujets
États
Circuits séries
Circuits parallèles
Fonction AND
Fonction OR
Fonction XOR
Fonction NOT
Fonction NAND
Fonction NOR

2. Méthode
Pour chaque sujet :

Explication
Prototype
Exemple réel
Activité

3. Sources
http://littlebits.cc/expansion-packs/logic
http://littlebits.cc/tips-tricks/education-lessons-in-logic
https://s3.amazonaws.com/littleBits_pdfs/LOGIC+LESSONS_littleBits_big.pdf
More Control Networks
http://littlebits.cc/lessons/multiplexers-sharing-a-communication-channel
Multiplexer
http://littlebits.cc/lessons/half-adder-a-littlebit-of-arithmetic
http://littlebits.cc/lessons/full-adder-a-littlebit-more-arithmetic
http://littlebits.cc/tips-tricks/fridays-tips-tricks-the-logic-bits
http://littlebits.cc/lets-get-logical
http://littlebits.cc/projects/double-and
http://littlebits.cc/projects/double-or
http://littlebits.cc/projects/nand
http://littlebits.cc/projects/nor
http://littlebits.cc/projects/xor
http://s3.amazonaws.com/littleBits_pdfs/SPACE-booklet.pdf
https://s3.amazonaws.com/lB_images/Smart+Home+Kit/700-0070-SmartHomeKit-Poster-V1-6+(2).pdf

4. Arduino Littlebits
http://discuss.littlebits.cc/t/getting-started-with-arduino/109
http://littlebits.cc/arduino-sketches

55
Labs Littlebits Logic

http://discuss.littlebits.cc/t/introduction-to-arduino-programming-2-push-my-button/22238
http://discuss.littlebits.cc/t/introduction-to-arduino-programming-3-you-light-up-my-life/22239
http://discuss.littlebits.cc/t/introduction-to-arduino-programming-4-blinkys-revenge/22240
http://discuss.littlebits.cc/t/introduction-to-arduino-programming-5-troubleshooting-your-code/22284
http://littlebits.cc/projects/8-bit-8-track-jukebox

5. Bitcraft
http://littlebits.cc/bitcraft

56
Labs Cloudbits

Labs Cloudbit
1. Matériel nécessaire
2. Prise de mesure et alerte
3. Contrôle à partir de litllebitscloud
4. Contrôle via API HTTP
5. Automation IFTT
6. Cloudbits hacking
Système de fichier du cloudbit
Prerequisites
Backup SD Card (just in case)
Mount FileSystem
Enable sshd on CloudBit
Linux Access
Other Info
Set output level
Query ADC
Other commands
Cloud Client Conf
Scripts Conf
References

1. Matériel nécessaire
1 x PC
1 x connexion au WLAN (un client et un point d'accès connecté à l'Internet)
1 x module cloudbit
1 x module bouton
1 x module d'entrée (température, mouvement, son, curseur, ...)
1 x module de sortie (buzzer, led, bargraph)
1 x compte gmail.com

57
Labs Cloudbits

2. Prise de mesure et alerte


Un premier montage : prise de température et alerte

3. Contrôle à partir de litllebitscloud


A partir de l'interface http://control.littlebitscloud.cc/

1. Brancher le cloudbit.
2. Attendre que la diode devienne verte ou blanche .
3. A partir de http://control.littlebitscloud.cc/ lancer la procédure d'installation via "+ New CloudBit"
4. Maintenir son doigt sur le bouton jusqu'à ce que la diode devienne bleue clignotante. Le cloudbit passe en mode de configuration
et devient point d'accès local quand la diode bleue est fixée.
5. Connecter son PC au SSID Wi-Fi " littleBits_Cloud_... " que le cloudbit propose.
6. Encoder le mot de passe du réseau Wi-Fi local.

Image : https://files.linuxgizmos.com/littlebits_cloudbit_app.jpg !!!

4. Contrôle via API HTTP


Image : http://files.linuxgizmos.com/littlebits_cloudbit_arch.jpg

Source : http://hackerboards.com/tiny-linux-sbc-taps-plug-and-play-iot-modules/

La documentation de l'API des cloudbits se trouve sur http://developer.littlebitscloud.cc/.

Concepts :
REST : https://en.wikipedia.org/wiki/Representational_state_transfer avec des exemples
http://blog.nicolashachet.com/niveaux/confirme/larchitecture-rest-expliquee-en-5-regles/
JSON : https://fr.wikipedia.org/wiki/JavaScript_Object_Notation
HTTP : http://linux.goffinet.org/a2_http11.html
Outils :
curl pour lancer des requêtes HTTP (https://curl.haxx.se/download.html)
python ou bash pour automatiser les tâches (https://www.python.org/downloads/windows/)
jq pour traiter les sorties json (bash)(https://stedolan.github.io/jq/download/)
Usage : insérer ces requêtes dans des applications
Formattage : | python -mjson.tool

58
Labs Cloudbits

Modèle publisher/subscriber : https://fr.wikipedia.org/wiki/Publish-subscribe

L'API est interrogée via des méthodes HTTP GET ou POST sur des URIs précis.

Pour manipuler l'API cloudbit, il est nécessaire de connaître son "token", sorte de jeton d'authentification. On le trouvera dans l'onglet
"Settings" de l'interface http://control.littlebitscloud.cc/.

Les requêtes HTTP doivent contenir des Headers HTTP avec ces valeurs :

Authorization: Bearer $TOKEN


Accept: application/vnd.littlebits.v2+json

La méthode GET permet d'obtenir des données et la commande PUT permet de placer des données. L'API est basée sur le modèle
REST et propose un service pub/sub.

On trouvera plus bas 6 exemples de fonctions curl (https://gist.github.com/goffinet/85f6869aaf06a8e541b04b35f7caf8eb) :

#!/bin/bash

# dependencies : curl, python, jq

DEVICE_ID=put_your_device_id
TOKEN=put_your_device_token

# ! mettre les headers HTTP en variable

# Fonctions all,id,signal,value,pub,sub
# curl -i : pour voir les entêtes des sorties
# pour formater les sorties json "`| python -mjson.tool`" ou "`| jq`"
# par exemple ./cb.sh all | jq

all() {
#echo "Liste les cloudbits"
curl -XGET -H "Authorization: Bearer $TOKEN" -H "Accept: application/vnd.littlebits.v2+json" \
https://api-http.littlebitscloud.cc/devices
}

id() {
#echo "Donne des infos sur l'ID"
curl -XGET -H "Authorization: Bearer $TOKEN" -H "Accept: application/vnd.littlebits.v2+json" \
https://api-http.littlebitscloud.cc/devices/$DEVICE_ID
}

signal() {
#echo "Envoit un signal à 100/100 pendant 1s"
curl -XPOST -H "Authorization: Bearer $TOKEN" -H "Accept: application/vnd.littlebits.v2+json" \
https://api-http.littlebitscloud.cc/devices/$DEVICE_ID/output -d percent=100 -d duration_ms=1000
}

value() {
#echo "Demande la valeur d'entrée du cloudbit"
curl -XGET -H "Authorization: Bearer $TOKEN" -H "Accept: application/vnd.littlebits.v2+json" \
https://api-http.littlebitscloud.cc/devices/$DEVICE_ID/input
}

pub() {
#echo "Souscriptions en tant que publisher"
curl -XGET -H "Authorization: Bearer $TOKEN" -H "Accept: application/vnd.littlebits.v2+json" \
https://api-http.littlebitscloud.cc/subscriptions?publisher_id=$DEVICE_ID
}

sub() {
#echo "Souscriptions en tant que subscriber"
curl -XGET -H "Authorization: Bearer $TOKEN" -H "Accept: application/vnd.littlebits.v2+json" \
https://api-http.littlebitscloud.cc/subscriptions?subscriber_id=$DEVICE_ID
}

$1

Par exemple, pour lire les données du premier objet :

curl -XGET -H 'Authorization: Bearer $TOKEN' -H 'Accept: application/vnd.littlebits.v2+json' \


https://api-http.littlebitscloud.cc/devices \
| jq '.[0]'

Résultat formaté :

59
Labs Cloudbits

{
"label": "cb01",
"id": "243c200bfb48",
"subscriptions": [],
"subscribers": [
{
"publisher_id": "243c200bfb48",
"subscriber_id": "https://api-ifttt.littlebitscloud.cc/receive_cloudbit_event/ignite/e2397f",
"publisher_events": [
"amplitude:delta:ignite"
]
}
],
"user_id": 98950,
"is_connected": false,
"input_interval_ms": 200
}

Par exemple pour obtenir le nom du premier objet :

curl -XGET -H 'Authorization: Bearer $TOKEN' -H 'Accept: application/vnd.littlebits.v2+json' \


https://api-http.littlebitscloud.cc/devices \
| jq '.[] .label'

Par exemple, pour tous les id et leur label :

curl -XGET -H 'Authorization: Bearer $TOKEN' -H 'Accept: application/vnd.littlebits.v2+json' \


https://api-http.littlebitscloud.cc/devices \
| jq '[] .label, .[] .id'

Voir le projet en Node-RED sur https://github.com/eciggaar/littlebits-to-bluemix

5. Automation IFTT

https://ifttt.com/

60
Labs Cloudbits

6. Cloudbits hacking

61
Labs Cloudbits

Système de fichier du cloudbit


Source : Read CloubBit FileSystem https://github.com/yepher/littlebits/edit/master/CloubitFileSystem.md

This webpage from LittleBits meant to post a link to the open parts of CloubBits source code. Looks like they put a wrong link there.

Based on the componenetly used by the device it seems easy enough to just mount CloudBits filesystem on Mac and try and find the
web interfaces manually.

Prerequisites
The CloudBits filesystem is ext4 which in not natvily supported by OSX. You will need to install some tools to enable support for ext4.

OSXFuse Note you need the MacFuse compat layer


fuse-ext2

NOTO: If I can get permission from LittleBits I will provide access to a CloudBit image that already has SSHD running and ready..

Backup SD Card (just in case)


Warning dd can be a very dagerous command that can wipe your SDCard or worse you Mac harddrive. You should study up on this
command before you use it.

Open terminal
connect sdcard to Mac
type sudo dd if=/dev/disk1s3 of=/tmp/backupfile.img

type open /tmp

put the file somewhere safe


Create a duplicate of the card to keep the original safe
TODO: descibe how to do this....

Mount FileSystem
Remove SD card from the CloudBit
Use Spotlight to open Disk Utility

Connct SD card to your Mac and Note the new names


Open Terminal
mkdir /Volumes/little

sudo fuse-ext2 -o force /dev/disk1s3 /Volumes/little

cd /Volumes/little (or view in finder with: open /Volume/little )

One line form: mkdir /Volumes/little && sudo fuse-ext2 -o force /dev/disk1s3 /Volumes/little && cd /Volumes/little

Enable sshd on CloudBit


This part assume you already mounted the SD card from the CloudBit.

edit /Volumes/little/etc/ssh/sshd_config
change UsePAM yes to UsePAM no

uncommnet #PermitRootLogin yes to PermitRootLogin yes

save and close file


edit /Volumes/little/usr/lib/sysctl.d/50-default.conf
Add line net.ipv4.conf.default.rp_filter = 0

Disable iptables
mv /Volumes/little/etc/systemd/system/multi-user.target.wants/iptables.service /Volumes/little/etc/systemd/

cd /Volumes/little/etc/systemd/system

cp /Volumes/little/usr/lib/systemd/system/sshdgenkeys.service .

cp /Volumes/little/usr/lib/systemd/system/sshd.service .

TODO: decribe howto setup password


Unmount SDCARD
Put back into CloudBit and ssh to device

Linux Access

62
Labs Cloudbits

Shadow file
Generate password: openssl passwd -1 -salt bit cloud

Original root shadow password


$6$p9leKwKF$MkCEuyjkObA0/Yl7GD93WaqHHEA/yFY4sWpUqN5vB2YVIdBOf/UoQfMUgB0uh1enC7q2BrEaCRJfcD0tkheXZ/

Other Info
netstat -an

tcp 0 0 10.0.6.181:56173 54.235.112.129:9480 ESTABLISHED

ps -efxw
PID TTY STAT TIME COMMAND
2 ? S 0:00 [kthreadd]
3 ? S 0:06 \_ [ksoftirqd/0]
4 ? S 0:03 \_ [kworker/0:0]
5 ? S< 0:00 \_ [kworker/0:0H]
7 ? S< 0:00 \_ [kworker/u:0H]
8 ? S 0:01 \_ [watchdog/0]
9 ? S< 0:00 \_ [cpuset]
10 ? S< 0:00 \_ [khelper]
11 ? S 0:00 \_ [kdevtmpfs]
12 ? S< 0:00 \_ [netns]
13 ? S 0:00 \_ [kworker/u:1]
159 ? S 0:00 \_ [bdi-default]
160 ? S< 0:00 \_ [kintegrityd]
162 ? S< 0:00 \_ [kblockd]
205 ? S 0:00 \_ [khubd]
305 ? S 0:00 \_ [khungtaskd]
308 ? S 0:00 \_ [kswapd0]
309 ? S 0:00 \_ [fsnotify_mark]
310 ? S< 0:00 \_ [cifsiod]
311 ? S< 0:00 \_ [crypto]
368 ? S< 0:00 \_ [ci_otg]
380 ? S 0:00 \_ [kworker/u:2]
391 ? S< 0:00 \_ [deferwq]
394 ? S 0:14 \_ [mmcqd/0]
400 ? S 0:00 \_ [jbd2/mmcblk0p3-]
401 ? S< 0:00 \_ [ext4-dio-unwrit]
419 ? S 0:00 \_ [kworker/0:2]
806 ? S 0:14 \_ [RTW_CMD_THREAD]
1 ? Ss 0:56 /sbin/init HOME=/ TERM=linux
425 ? Ss 0:01 /usr/lib/systemd/systemd-journald LANG=en_US.UTF-8 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/b
in NOTIFY_SOCKET=@/org/freedesktop/systemd1/notify LISTEN_PID=425 LISTEN_FDS
528 ? Ss 0:00 /usr/lib/systemd/systemd-udevd LANG=en_US.UTF-8 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
NOTIFY_SOCKET=@/org/freedesktop/systemd1/notify LISTEN_PID=528 LISTEN_FDS=2
717 ? Ss 0:00 /usr/bin/sshd -D LANG=en_US.UTF-8 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
1018 ? Ss 0:16 \_ sshd: root@pts/0 n
1020 pts/0 Ss 0:07 \_ -bash USER=root LOGNAME=root HOME=/root PATH=/usr/bin:/bin:/usr/sbin:/sbin MAIL=/var/mail/root
SHELL=/bin/bash SSH_CLIENT=10.0.6.169 58324 22 SSH_CONNECTION=10.0.6.169 583
3226 pts/0 R+ 0:00 \_ ps -efxw TERM=xterm-256color SHELL=/bin/bash SSH_CLIENT=10.0.6.169 58324 22 SSH_TTY=/dev/pt
s/0 USER=root MAIL=/var/mail/root PATH=/usr/local/sbin:/usr/local/bin:/usr/b
720 ? Ss 0:00 /usr/local/lb/ADC/bin/ADC.d LANG=en_US.UTF-8 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
723 ? Ss 0:00 login -- root
786 ttyAMA0 Ss+ 0:00 \_ -bash HOME=/root USER=root SHELL=/bin/bash TERM=vt102 PATH=/usr/local/lb/ADC/bin:/usr/local/lb/Butt
on/bin:/usr/local/lb/DAC/bin:/usr/local/lb/LEDcolor/bin:/usr/local/lb/cloud_
725 ? Ss 0:00 /usr/local/lb/DAC/bin/DAC.d LANG=en_US.UTF-8 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
731 ? Ss 0:26 /usr/local/lb/Button/bin/button.d LANG=en_US.UTF-8 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/b
in
781 ? Ss 0:00 /usr/lib/systemd/systemd-logind LANG=en_US.UTF-8 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
NOTIFY_SOCKET=@/org/freedesktop/systemd1/notify WATCHDOG_PID=781 WATCHDOG_U
782 ? Ss 0:00 /usr/lib/systemd/systemd --user LANG=en_US.UTF-8 PATH=/usr/local/lb/ADC/bin:/usr/local/lb/Button/bin:/u
sr/local/lb/DAC/bin:/usr/local/lb/LEDcolor/bin:/usr/local/lb/cloud_client/bi
784 ? S 0:00 \_ (sd-pam) HOME=/ TERM=linux
811 ? Ss 0:01 wpa_supplicant -B -P /run/wpa_supplicant_wlan0.pid -i wlan0 -D nl80211,wext -c/etc/wpa_supplicant/cloud
bit.conf OLDPWD=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin PWD
947 ? Ss 0:00 dhcpcd -4qL -t 30 wlan0 OLDPWD=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin PWD=/ LANG=en_U
S.UTF-8 SHLVL=1 _=/usr/sbin/dhcpcd
977 ? Ss 0:04 /usr/local/lb/cloud_client/bin/cloud_client LANG=en_US.UTF-8 PATH=/usr/local/sbin:/usr/local/bin:/usr/s
bin:/usr/bin
980 ? Ss 0:00 /usr/local/lb/LEDcolor/bin/LEDcolor.d LANG=en_US.UTF-8 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/u
sr/bin
981 ? Ss 0:27 /bin/bash /usr/local/lb/bit-util/monitorNetctl.sh &> /dev/null & LANG=en_US.UTF-8 PATH=/usr/local/sbin:
/usr/local/bin:/usr/sbin:/usr/bin
3225 ? S 0:00 \_ sleep 5 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin PWD=/ LANG=en_US.UTF-8 SHLVL=1 _=/us
r/sbin/sleep
[root@alarm etc]#

Set output level

63
Labs Cloudbits

Set output to max /usr/local/lb/DAC/bin/setDAC ffff

Set output to min /usr/local/lb/DAC/bin/setDAC 0

Query ADC

[root@alarm /]# /usr/local/lb/ADC/bin/getADC -1


126
15
[root@alarm /]# /usr/local/lb/ADC/bin/getADC -1
0
0

Other commands

[root@alarm /]# tree /usr/local/lb


+---lb
| +---ADC
| | +---bin
| +---Button
| | +---bin
| +---DAC
| | +---bin
| +---LEDcolor
| | +---bin
| +---bit-util
| +---cloud_client
| | +---bin
| +---comm-util
| +---etc
| | +---hostapd
| | +---iptables
| | +---lighttpd
| | +---systemd
| +---hw_util
| | +---bin
| +---mfg_test
| | +---ADCtoDAC
| | | +---bin
| | +---RGBcycle
| | | +---bin
Total directories = 25

Cloud Client Conf

#Cloud Client Conf


[cloud_parameters]
cloud_host = cloud.littlebits.cc
cloud_port = 9480
setup_version = 1.0.0
protocol_version = 1.1.0
use_ssl = 1
dont_ignore_pings = 1 #switch to 1 if you want to connect to staging, this switches ping styles

[daemon_parameters]
adc_host = /var/lb/ADC_socket
dac_host = /var/lb/DAC_socket
led_host = /var/lb/SET_COLOR_socket

[client_parameters]
mac_file = /var/lb/mac
hash_id_file = /var/lb/id
ssid_file = /var/lb/current_ssid
device = littlebits-module-cloud
current_ssid = /var/lb/current_ssid
#this (and other parameters) should be pulled from the same place as the scripts do
firmware_version=1.0.140611a
ping_timeout = 2400
ping_maxmiss = 3
rx_buff_len = 100
tx_buff_len = 1000
token_len = 11

Scripts Conf

64
Labs Cloudbits

#!/usr/bin/env

# GENERAL
WADAP=wlan0
LB_WWW="www.littlebits.cc"
LB_DOM="littlebits.cc"
NTP_SERVER="pool.ntp.org"
TMP_DIR="/var/lb"
PM_MODE="/var/lb/power_mode"
CLOUDID="/var/lb/id"
MACADDR="/var/lb/mac"
SALT="/var/salt"

# LED COLORS
DEFAULT_COLOR="violet"
COMMISSION_COLOR="blue"
CONNECTING_COLOR="yellow"
CONNECTED_COLOR="green"
NOT_CONNECTED_COLOR="red"

# COMMISSIONING
GATEWAYIP=10.0.0.1
NETMASK=255.255.255.0
DOMAIN="cloudsetup.cc"
NETCTL_CONFIG="/etc/netctl/cloudbit"
WPA_CONFIG="/etc/wpa_supplicant/cloudbit.conf"
HOSTAPD_CONFIG="/etc/hostapd/hostapd.conf"
DNS_CONFIG="/etc/dnsmasq.conf"
COMM_LOG="/var/log/commissioning"

# DAEMON PATHS
CCPATH=/usr/local/lb/cloud_client/bin
BUTTONPATH=/usr/local/lb/Button/bin
ADCPATH=/usr/local/lb/ADC/bin
DACPATH=/usr/local/lb/DAC/bin
LEDPATH=/usr/local/lb/LEDcolor/bin

# SCRIPT PATHS
TESTPATH=/usr/local/lb/mfg_test
CUTILPATH=/usr/local/lb/comm-util

References
systemd
Japanese chobie@github

65
Labs Raspberry Pi

Labs Raspberry Pi
1. Labs
Autres Labs
Compilation Croisée (Cross-Compile) pour Raspebrry Pi
Mise en place
Configuration Wi-Fi WPA
Paramètres de base
Mise à jour du firmware
Installation de Node-Red
Après-projet : Renforcement Raspbian Jessie
Ressources
GPIO
What are they for? What can I do with them?
How the GPIO pins work
Output
Input
The end of the guide. The start of something amazing.
Glossary
BCM mode
BOARD mode
GPIO
LED
Physical computing
A technical note on pin numbering.
Source
Licence

Objectifs
Modèles et formats
Administration Linux
Distributions dédiées

1. Labs
1. Labs Pibrella
2. Labs Z-Wave
3. Labs Grove
4. Labs Réseau
5. Labs Cluster
6. Labs RaspiPBX
7. Labs PiCAM (photomaton)

Autres Labs
http://www.pi-in-the-sky.com/
http://www.jeffgeerling.com/blogs/jeff-geerling/introducing-dramble-raspberry
http://www.scottmadethis.net/interactive/beetbox/
http://lifehacker.com/5900626/create-a-kickass-seamless-play-everything-media-center-the-complete-guide
http://diyhacking.com/raspberry-pi-home-automation-ibm-bluemix/
https://github.com/IBM-Bluemix/python-iot-raspberry-pi
https://www.sitepoint.com/connecting-a-raspberry-pi-to-ibm-watson-and-bluemix/

Compilation Croisée (Cross-Compile) pour Raspebrry Pi


https://stackoverflow.com/questions/19162072/how-to-install-the-raspberry-pi-cross-compiler-on-my-linux-host-
machine/58559140#58559140

66
Labs Raspberry Pi

https://github.com/Pro/raspi-toolchain
https://solarianprogrammer.com/2018/05/06/building-gcc-cross-compiler-raspberry-pi/
https://sourceforge.net/projects/raspberry-pi-cross-compilers/

Mise en place
Choix de la distribtion
Gravure de la carte SD
touch /boot/ssh

hostname, interfaces, update, upgrade, reboot

Configuration Wi-Fi WPA


Adaptation du fichier /etc/wpa_supplicant/wpa_supplicant.conf :

country=BE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="PUT_YOUR_SSID"
psk="PUT_YOUR_PSK"
key_mgmt=WPA-PSK
}

Paramètres de base
Nom
Zone horaire

$ sudo raspi-config

Mise à jour du firmware

$ sudo rpi-update

Installation de Node-Red
!!! à réviser !!!

$ sudo apt-get update && \


$ sudo apt-get -y upgrade && \
$ sudo apt-get install npm && \
$ sudo npm install -g npm@2.x && \
$ hash -r
$ sudo systemctl enable nodered.service
$ sudo reboot

Après-projet : Renforcement Raspbian Jessie


http://www.blaess.fr/christophe/2015/10/19/renforcer-une-distribution-raspbian-jessie/

Désactivation de la SWAP

Ressources
Node-Red
Bluemix
http://www.cayenne-mydevices.com/
http://ubidots.com/
https://freeboard.io/

67
Labs Raspberry Pi

GPIO
An introduction to GPIO and physical computing on the Raspberry Pi

One powerful feature of the Raspberry Pi is the row of GPIO (general purpose input/output) pins along the edge of the board, next to
the yellow video out socket.

These pins are a physical interface between the Pi and the outside world. At the simplest level, you can think of them as switches that
you can turn on or off (input) or that the Pi can turn on or off (output). Seventeen of the 26 pins are GPIO pins; the others are power or
ground pins.

What are they for? What can I do with them?


You can program the pins to interact in amazing ways with the real world. Inputs don't have to come from a physical switch; it could be
input from a sensor or a signal from another computer or device, for example. The output can also do anything, from turning on an LED
to sending a signal or data to another device. If the Raspberry Pi is on a network, you can control devices that are attached to it from
anywhere** and those devices can send data back. Connectivity and control of physical devices over the internet is a powerful and
exciting thing, and the Raspberry Pi is ideal for this. There are lots of brilliant examples of physical computing on our blog.

Note: Not literally anywhere, of course. You need things like access to the network, a network capable computing device, and
electricity. Please do not write to us to point this out. :)

How the GPIO pins work

68
Labs Raspberry Pi

Output
WARNING: If you follow the instructions, then messing about with the GPIO is safe and fun. Randomly plugging wires and power
sources into your Pi, however, may kill it. Bad things can also happen if you try to connect things to your Pi that use a lot of power;
LEDs are fine, motors are not. If you are worried about this, then you might want to consider using a breakout board such as the
Pibrella until you are confident enough to use the GPIO directly.

Ignoring the Pi for a moment, one of the simplest electrical circuits that you can build is a battery connected to a light source and a
switch (the resistor is there to protect the LED):

When we use a GPIO pin as an output, the Raspberry Pi replaces both the switch and the battery in the above diagram. Each pin can
turn on or off,or go HIGH or LOW in computing terms. When the pin is HIGH it outputs 3.3 volts (3v3); when the pin is LOW it is off.

Here's the same circuit using the Raspberry Pi. The LED is connected to a GPIO pin (which can output +3v3) and a ground pin (which is
0v and acts like the negative terminal of the battery):

69
Labs Raspberry Pi

The next step is to write a program to tell the pin to go HIGH or LOW. Here's an example using Python (see Step 2), and here's how to
do it in Scratch.

Input
GPIO outputs are easy; they are on or off, HIGH or LOW, 3v3 or 0v. Inputs are a bit trickier because of the way that digital devices work.
Although it might seem reasonable just to connect a button across an input pin and a ground pin, the Pi can get confused as to
whether the button is on or off. It might work properly, it might not. It's a bit like floating about in deep space; without a reference it
would be hard to tell if you were going up or down, or even what up or down meant!

This is why you will see phrases like "pull up" and "pull down" in Raspberry Pi GPIO tutorials. It's a way of giving the input pin a
reference so it knows for certain when an input is received.

If you'd like to have a go at using the GPIO as an input then have a look at our screaming jelly baby and quick reaction game tutorials
for Python, or a reaction game for Scratch.

The end of the guide. The start of something amazing.


We hope that this has encouraged you to have a go at physical computing using the Pi's GPIO; it's really not as daunting as it looks. It
all starts with a simple LED, but it can take you to incredible places. Do not underestimate the fun, creativity and sense of
achievement you can get from a little computer and a bunch of pins. Have fun! And if you do make something cool please let us know.
:)

Glossary

BCM mode
GPIO pin numbering system where pins are referred to as they are seen by the SoC (System on a Chip, the "brains" of the Raspberry
Pi). The system has its basis in engineering, so to most people it appears random. BCM is short for Broadcom, who make the SoC.

BOARD mode
GPIO pin numbering system, where pin 1 is top left with the SD card slot at the top; the pins are counted across and down. The pins in
the vertical column on the left are odd-numbered, those in the right column even-numbered, with pin 26 bottom right.

GPIO
General purpose input/output; in this specific case the pins on the Raspberry Pi and what you can do with them. So called because you
can use them for all sorts of purposes; most can be used as either inputs or outputs, depending on your program.

LED
Light-emitting diode- a small, low-power light source used widely in electronics. Ideal as an introduction to physical computing on the
Pi.

Physical computing
Computing that involves tangible things connected to a computer, beyond standard input and output devices like keyboards and
monitors. Think buttons, lights, robots, alarms, sensors, home automation, teddy bears called Babbage in near space and so on. We
love physical computing because as well as being lots of fun, it's such a powerful teaching and learning tool and encourages creativity,
problem solving, and collaboration. Computing beyond the screen engages children of all ages, and you can make very cool stuff!

A technical note on pin numbering.


When programming the GPIO pins there are two different ways to refer to them. You can count across and down from pin 1 at the top
left (nearest to the SD card), as in the diagram at the top of the page. You may see this referred to as BOARD mode in Python.
Alternatively, you can refer to the pins as the computer sees them (BCM mode). You can see this on the Raspberry Pi LED circuit
above; for example, physical pin 3 is labelled "2" and physical pin 11 is labelled "17".

70
Labs Raspberry Pi

While there are good reasons for software engineers to use the BCM numbering system (the GPIO pins can do more than just simple
input and output), most beginners find the human readable numbering system more useful. Counting down the pins is simple, and you
don't need a reference or have to remember which is which. Take your pick though; as long as you use the same scheme within a
program then all will be well. Note that pin numbering can also depend on what programming language you are using; for example,
Scratch GPIO enforces certain pins as input and output.

For more details on the advanced capabilities of the GPIO pins see gadgetoid's interactive pinout diagram.

Source
https://github.com/tommybobbins/PiBrella-lesson/blob/master/lessons/lesson2a-handout.md

Licence
This document and images are covered by the following license:

Figure 5 : Creative Commons License

Raspberry Pi Documentation by the Raspberry Pi Foundation is licensed under a Creative Commons Attribution 4.0 International
License.

Based on a work at https://github.com/raspberrypi/documentation.

71
Labs Pibrella

Labs Pibrella
1. Carte Pibrella
1.1. Description
1.2. Montage
1.3. Installation des librairies Pibrella
1.4. Un second exemple : Alarme
1.5. Un troisième exemple : une intrusion
1.6. Premières étapes
1.7. LEDs clignotantes et à pulsation
1.8. Entrées et sorties
1.9. Le bouton
1.10. Le buzzer
1.11. Manipulation d'événements
1.12. Référence rapide
Aides
LEDs
Sorties
Entrées
Général
1.13. Projets programme Disco
Projet 1 : Créer un programme de lumières aléatoires
Projet 2 : Boucler 5 fois
Projet 3 : Utiliser une fonction pour stocker votre boucle de lumière disco
Projet 4: Utiliser un bouton pour démarrer votre programme Disco
1.14. Exemple de feu de signalisation
1.15. Lumières aléatoires
1.16. Jeux de réaction
1.17. Sources à consulter
2. Node-Red
2.1. JavaScript
2.2. Node.js
2.3. Node-RED
2.4. Installation de Node-RED sur Rpi
2.5. Ajout d'un noeud
2.6. Traffic Light Simulator
2.7. Lab Twitter
2.8. Lab Picam Photobooth
2.9. Lab Appel SIP
2.10. Lab Node-RED HTTP

1. Carte Pibrella
https://www.diigo.com/outliner/fd6yst/pibrella?key=ck20nxkxx4

72
Labs Pibrella

1.1. Description
PiBrella est une carte d'extension pour Raspberry Pi à usage multiple avec son, lumière, entrées et sorties. Elle prend un nombre élevé
de broches GPIO tout en laissant les bus série, SPI et i2c libres.

PiBrella est conçu pour pouvoir fournir plus de courant que ne peut le faire le GPIO du Raspberry-Pi et la carte dispose même d'un
connecteur d'alimentation USB pour fournir plus de puissance aux moteurs, relais et solénoïdes connectés sur les sorties (26 broches
(pins) et 13 broches GPIO actifs)

Figure 6 : Carte pibrella

73
Labs Pibrella

Figure 7 : Emplacements carte pibrella

Source : https://fr.pinout.xyz/pinout/pibrella

1.2. Montage

74
Labs Pibrella

1. Arrêtez le Raspberry Pi et déconnectez l'alimentation. Veuillez toujours arrêter proprement votre Pi avant de connecter des

modules complémentaires.
2. Fixez votre carte Pibrella. Elle s'insère bien sur l'en-tête GPIO pour le couvrir complètement.

3. Connectez l'alimentation à la carte Pibrella. La prise ressemble à celle de votre Pi.

1.3. Installation des librairies Pibrella

sudo apt-get update && sudo apt-get -y upgrade


sudo apt-get -y install python-pip git

sudo pip install pibrella

git clone http://github.com/pimoroni/pibrella


cd pibrella/examples

75
Labs Pibrella

ls -l
total 16
-rwxr-xr-x 1 pi pi 258 May 7 20:22 random-blink.py
-rwxr-xr-x 1 pi pi 2903 May 7 20:22 react.py
-rwxr-xr-x 1 pi pi 1120 May 7 20:22 siren.py
-rwxr-xr-x 1 pi pi 1123 May 7 20:22 test.py

cat siren.py
#!/usr/bin/env python

import os
import signal
import sys
import time

import pibrella

sys.path.insert(1, os.path.join(sys.path[0], '..'))

# Pulse all of the lights

TIME_ON = 0.2
TIME_OFF = 0.2
FADE_ON = 0.2
FADE_OFF = 0.2

# Play a siren

siren_stopped = True

def siren():
if siren_stopped == True:
pibrella.buzzer.stop()
return True
for x in xrange(-30,30,2):
pibrella.buzzer.note(x)
time.sleep(0.01)
for x in reversed(xrange(-30,30,2)):
pibrella.buzzer.note(x)
time.sleep(0.01)

pibrella.async_start('siren',siren)

def start_siren():
global siren_stopped
siren_stopped = False
pibrella.light.pulse(TIME_ON, TIME_OFF, FADE_ON, FADE_OFF)

def stop_siren():
global siren_stopped
siren_stopped = True
pibrella.light.stop()

def handle_button(button):
global siren_stopped
if siren_stopped == True:
start_siren()
print("Starting Siren")
else:
stop_siren()
print("Stopping Siren")

pibrella.button.released(handle_button)

# Sleep for 20 seconds

#time.sleep(20)

signal.pause()

# Exit!

sudo python siren.py

1.4. Un second exemple : Alarme

76
Labs Pibrella

Source : http://pibrella.com/#projects

Entrer dans le shell Python.

sudo python -i

Ecrire un bout de code.

import pibrella
pibrella.buzzer.fail()
pibrella.light.pulse(0.2)

En terminer.

quit()

1.5. Un troisième exemple : une intrusion


Entrer dans le shell Python.

sudo python -i

Ecrire un bout de code.

# burglar alarm! (catches grinches and gruffalos)


import pibrella, signal

def alarm(pin):
pibrella.buzzer.fail() # make some noise
pibrella.light.pulse() # flash lights

def reset(pin):
pibrella.light.stop() # reset alarm

pibrella.input.a.changed(alarm) # listen for intruder


pibrella.button.pressed(reset) # in case of stupid cat

signal.pause() # waiting for intruder

Maintenant, activez l'entrée A ! Connectez les 2 broches de l'entrée A avec un fil ou une résistance. (Appuyez sur le gros bouton rouge
pour réinitialiser)

1.6. Premières étapes


Source : https://github.com/pimoroni/pibrella/blob/master/README.md

Lancer le shell Python.

sudo python -i

Charger la librairie Pibrella qui va configurer les GPIO et collecter toutes les entrées et sorties en objets manipulables.

import pibrella

Allumer la LED rouge.

pibrella.light.red.on()

Eteindre la LED rouge.

pibrella.light.red.off()

Les collections ( lights, inputs, outputs ) permettent de contrôler un groupe de choses en même temps. Pour éteindre toutes les LEDs.

77
Labs Pibrella

pibrella.light.off()

Pour allumer toutes les LEDs

pibrella.light.on()

1.7. LEDs clignotantes et à pulsation


Les LEDs peuvent être pulsée, décolorée, clignotantes et stroboscopiques.

pibrella.light.red.blink(ON_TIME, OFF_TIME)

Par pulsation.

pibrella.light.red.pulse(FADE_IN_TIME, FADE_OUT_TIME, ON_TIME, OFF_TIME)

Voici des équivalents.

pibrella.light.red.pulse(0, 0, 1, 1)
pibrella.light.red.blink(1, 1)

Un fondu d'une luminosité à l'autre.

pibrella.light.red.fade(0, 100, 2) # From 0 to 100% in 2 seconds

1.8. Entrées et sorties


Les collections d'entrée et de sortie correspondent aux quatre pins d'entrée et quatre pins de sortie de la carte Pibrella. Ceux-ci sont
nommés a, b, c, d pour les entrées et e, f, g, h pour les sorties - vous verrez ces étiquettes sur la carte elle-même.

Pour activer la sortie "e".

pibrella.output.e.on()

On peut aussi écrire une valeur explicite :

1 correspond à "on/high"
0 correspond à "off/low"

pibrella.output.e.write(1)

C'est utile si on souhaite activer et désactiver un pin par programmation ou écrire une valeur d'entrée directement sur une sortie.

Et on peut écrire simultanément sur l'ensemble de la collection de sortie si on le souhaite.

pibrella.output.write(1)

Les entrées fonctionnent de manière semblable sauf qu'on les lit au lieu de les écrire en "on" ou en "off".

Pour lire une seule entrée.

my_value = pibrella.input.a.read()

Ou pour lire toutes les entrées dans un dictionnaire.

inputs = pibrella.input.read()
input_a = inputs['a']

1.9. Le bouton

78
Labs Pibrella

Le bouton de la carte Pibrella est juste une autre entrée. Il dispose toutefois d'une résistance pull-down qui l'empêche de lire les
fluctuations électriques aléatoires comme des pressions de bouton.

Comme toute autre entrée, vous pouvez lire l'état du bouton à tout moment:

pibrella.button.read()

1.10. Le buzzer
Le buzzer est juste une autre sortie. Cependant, le fait de l'allumer et de l'éteindre ne vous rapportera pas beaucoup plus qu'un simple
pop, il faut le basculer rapidement pour obtenir un son continu. Nous avons fourni des fonctions pour cela.

D'abord, on peut buzzer sur une fréquence spécifique.

pibrella.buzzer.buzz( frequency )

Ou jouer une note (on peut utiliser des valeurs positives et négatives ici, avec 0 à A à 440Hz).

pibrella.buzzer.note( 1 )

Ou jouer une tonalité incluse.

pibrella.buzzer.fail()
pibrella.buzzer.success()

1.11. Manipulation d'événements


"changed", "pressed", "released".

Si on veut capturer un état de changement d'entrée et exécuter une fonction spécifique, on peut utiliser "changed" (changé), "pressed"
(pressé) et "released" (relâché) sur l'une des entrées ou sur le bouton. "changed" (changé) se déclenchera quand une broche passera
de 1 (high / on) à 0 (low / off) ou vice versa. "pressed" (pressé) se déclenche quand il passe de 0 à 1, et "released" (relâché) quand il
passe de 1 à 0.

Par exemple.

def button_pressed(pin):
print("You pressed the button!")

pibrella.button.pressed(button_pressed)

pibrella.pause()

La commande pibrella.pause () est ici pour empêcher la sortie immédiate du programme et permet de maintenir votre programme
occupé.

Le paramètre "pin" de la fonction bouton pressé est le pin de la carte Pibrella qui a déclenché l'évènement, dans ce cas "pin" sera égal
à "pibrella.button".

def button_changed(pin):
if pin.read() == 1:
print("You pressed the button!")
else:
print("You released the button!")

pibrella.button.changed(button_changed)

pibrella.pause()

Pour allumer une LED lorsque vous appuyez sur le bouton, votre code devrait ressembler à ceci:

import pibrella

def button_changed(pin):
pibrella.light.red.write(pin.read())

79
Labs Pibrella

pibrella.button.changed(button_changed)

pibrella.pause()

1.12. Référence rapide


Toutes les entrées, sorties et LEDs de la carte Pibrella sont stockées dans des collections. On peut référencer une broche par son
nom ou son index de l'une des trois manières suivantes.

pibrella.light[0] # By index
pibrella.light['red'] # By name, for use with a variable
pibrella.light.red # By name

On peut également se référer à une collection entière en une seule fois, simplement en omettant l'index ou le nom:

pibrella.light

Aides
Pibrella a une petite aide intégrée. Pour connaître les noms des LEDs, des entrées ou des entrées.

pibrella.lights

pibrella.inputs

pibrella.outputs

LEDs
Les méthodes suivantes sont disponibles pour les LEDs de la carte pibrella.

.on() # Allume le LED


.off() # Etient le LED
.high() # Allume le LED
.low() # Etient le LED

.toggle() # Bascule l'état des lumières de allumé à éteint et éteint à allumé


# Si les LEDs clignotent / pulsent, la bascule les éteint toujours

.pulse( transition_on, transition_off, time_on, time_off ) # pulsations légères, valeurs en secondes


.blink( time_on, time_off ) # clignotement léger, valeurs en secondes
.write( value ) # Allume si la valeur = 1, ou éteint si la valeur = 0

Sorties
Une sortie peut faire tout ce qu'un LED peut faire, ils sont identiques dans tout sauf le nom!

Entrées
Les méthodes suivantes sont disponibles pour chaque entrée Pibrella.

Général

pibrella.pause () # Wrapper signal.pause(), idéal pour mettre votre application en pause après avoir appelé un clignotement, une
impulsion ou une boucle

pibrella.loop (nom_fonction) # Passez une fonction de pibrella à exécuter encore et encore, de manière asynchrone
# Vous devez appeler pibrella.pause() après lui avoir donné une fonction pour faire une boucle, sinon le code échouera

1.13. Projets programme Disco


Source : https://github.com/raspberrypilearning/pibrella-intro/blob/master/worksheet.md

Projet 1 : Créer un programme de lumières aléatoires

80
Labs Pibrella

En plus d'utiliser la bibliothèque pibrella dans un programme simple, vous pouvez également utiliser les fonctionnalités d'autres
bibliothèques comme random et time .

1. Créez un nouveau fichier Python en tapant nano disco.py dans une fenêtre LXTerminal ou sur la ligne de commande. Un nouveau
fichier de texte vide s'ouvre.
2. Sur la première ligne, importez les bibliothèques que vous devrez utiliser:

import pibrella, random, time

3. Puis étiquetez chacune des LEDs comme ceci:

red = pibrella.light.red
amber = pibrella.light.amber
green = pibrella.light.green

Chaque étiquette est appelée une variable. Les variables sont utilisées ici pour stocker une longue commande comme raccourci
pour l'étape suivante.

4. En dessous, ajoutez les noms de couleurs à une liste comme celle-ci :

colour = [red, amber, green]

Des éléments, comme les couleurs, peuvent être stockés dans une liste et recevoir un nom en Python. Vous pouvez aussi écrire la
liste comme ceci color = [pibrella.light.red, pibrella.light.amber, pibrella.light.green] au lieu d'utiliser des noms de
variables pour stocker la commande.

5. Maintenant que vous avez configuré le programme, créez une boucle en utilisant while True: qui sélectionne une couleur
aléatoire dans la liste des couleurs, puis allume et éteint la lumière correspondante pendant 0,2 seconde. Attention à l'identation :

while True:
result = random.choice(colour)
time.sleep(1)
result.pulse(0.2)

Au sein de cette boucle, qui se répète indéfiniment, vous avez utilisé la fonction random.choice pour sélectionner une couleur de
la liste que vous avez créée aléatoirement, puis la stocker dans la variable appelée result . Après 1 seconde, le LED de couleur
qui a été sélectionnée au hasard et puis est ensuite stocké dans la variable de résultat result qui va pulser pendant 0,2
seconde.

6. Enregistrez et quittez en appuyant sur CTRL et X sur le clavier, puis sur Y ou O pour oui.

7. Pour exécuter votre programme, tapez sudo python disco.py .


8. Comme vous avez utilisé une boucle continue, ce programme ne se termine pas tant que vous n'appuyez pas sur les touches
CTRL et C du clavier pour l'interrompre.

Projet 2 : Boucler 5 fois


Maintenant que vous avez un "disco light" en boucle, ajoutons du code pour qu'il ne se répète qu'un certain nombre de fois, plutôt que
pour toujours.

1. Ouvrez votre programme disco en tapant nano disco.py dans une fenêtre LXTerminal ou depuis la ligne de commande.
2. A l'aide des flèches de votre clavier, naviguez vers le bas juste en dessous de la liste des couleurs et avant la boucle while .
Tapez n = 0 pour stocker la valeur numérique 0 en tant que variable.
3. Puis modifier la boucle while :

n = 0

while n < 5:
result = random.choice(colour)
time.sleep(1)
result.pulse(0.2)
n = n + 1

81
Labs Pibrella

Au lieu de donner la commande while True: pour boucler pour toujours, vous avez utilisé while n <5: alors que n est inférieur
ou égal à la valeur 5. Cela signifie que cette boucle ne se répète que si n contient une valeur inférieure à 5 ou 5. Vous avez déjà
défini la valeur de n sur 0 avant le démarrage de la boucle. Ensuite, en bas de la boucle, vous avez ajouté la ligne n = n + 1 qui
ajoutera 1 à la valeur à chaque tour de la boucle. Par exemple, 0 + 1, puis 1 + 1, puis 2 + 1, etc., chaque fois que vous stockez la
nouvelle valeur dans la variable n .

4. Enregistrez et quittez en appuyant sur CTRL et X sur le clavier, puis sur Y ou O pour oui.

5. Pour exécuter votre programme, tapez sudo python disco.py .

Projet 3 : Utiliser une fonction pour stocker votre boucle de lumière disco
Les fonctions vous permettent de stocker des parties de code pour pouvoir les réutiliser plus tard. Mettons votre nouvelle boucle dans
une fonction.

1. Avec votre programme disco.py ouvert, naviguez jusqu'à la ligne n = 0 et enveloppez votre code dans une fonction comme
celle-ci:

def disco():
n = 0
while n < 5:
result = random.choice(colour)
time.sleep(1)
result.pulse(0.2)
n = n + 1

Si vous lancez votre programme maintenant, rien ne se passera. Comme les variables, vous avez donné un nom à ce morceau de
code mais ous ne l'avez pas encore appelé pour fonctionner !

2. Sous la boucle, tapez disco() .

3. Maintenant, sauvegardez et exécutez le code pour voir ce qui se passe!

Projet 4: Utiliser un bouton pour démarrer votre programme Disco


Maintenant que vous avez un programme disco Pibrella fonctionnel, vous pouvez commencer à utiliser certains des autres éléments
sur la carte Pibrella, par exemple un bouton d'entrée pour déclencher le programme. Placer le code de bouclage dans une fonction
rend les choses plus aisées.

1. Sous la fonction disco, créez une boucle répétitive infinie :

while True:
if pibrella.button.read():
disco()

L'intérieur de la boucle est une condition, ce qui signifie que la fonction disco ne sera déclenchée que si la condition est remplie.
Dans ce cas, la condition est remplie lorsque le bouton est enfoncé.

2. Enregistrez votre code et exécutez-le pour voir ce qui se passe.

3. Vous avez peut-être remarqué que les lumières clignotent maintenant. Vous pouvez sortir de la boucle continue après 5 secondes
en tapant break à l'intérieur de la boucle while True: :

while True:
if pibrella.button.read():
disco()
time.sleep(5)
break

1.14. Exemple de feu de signalisation


Cet exemple pourrait trouver des adaptations.

Source : https://github.com/johnblackmore/pibrella-adventures

## Basic (UK) Traffic Light Example


#
# When the Pibrella button is pressed, loop through the traffic light sequence.

82
Labs Pibrella

# In the UK this is Red and Amber, Green, Amber, Red.

import pibrella, time

# Traffic light sequence, each light represents the red, amber and green light values and a time delay
sequence = [
[1, 1, 0, 1],
[0, 0, 1, 5],
[0, 1, 0, 2],
[1, 0, 0, 1]
]

# Callback function to process button presses


def button_changed(pin):
if pin.read() == 1:
traffic_light()

# Simple function to loop the traffic light sequence


def traffic_light():
for i in sequence:
pibrella.light.red.write(i[0])
pibrella.light.yellow.write(i[1])
pibrella.light.green.write(i[2])
time.sleep(i[3])

# Set initial state (red light)


pibrella.light.red.on()

# Register the button press callback


pibrella.button.changed(button_changed)

# Wait for input


pibrella.pause()

1.15. Lumières aléatoires

cd ~/pibrella/examples

cat random-blink.py
#!/usr/bin/env python

import random
import time

import pibrella

"""
This example will blink an LED at random
"""

while True:
with random.choice(pibrella.light) as l: # Pick a random light
l.on()
time.sleep(0.5)
l.off()
time.sleep(0.5)

sudo python random-blink.py

1.16. Jeux de réaction


Appuyer le plus vite possible sur le bouton quand le LED rouge s'allume.

cd ~/pibrella/examples
sudo python react.py

1.17. Sources à consulter


https://github.com/nate-drake/pibrella-doomsdaydevice
https://github.com/tommybobbins/PiBrella-lesson
https://github.com/daniel-thompson/pibrella-examples

83
Labs Pibrella

https://github.com/raymondlesley/pibrella-play
https://github.com/josejuansanchez/pibrella_playground
https://github.com/lesp/LinuxVoice_Pibrella
https://github.com/ForToffee/Pibrella
https://github.com/jdmoore0883/Annoy-Pi
https://github.com/e2jk/pibrella-scripts
https://github.com/hansamann/pibrella-minecraft
https://github.com/AdhikariSaurabh/Pibrella_WiringPi_traffic_light
https://github.com/raspberrypilearning/sorting-hat-lesson
https://github.com/zebra-tech-savanna/mbed-client-rpi-executables

2. Node-Red
https://projects.raspberrypi.org/en/projects/getting-started-with-node-red
https://diyprojects.io/node-red-module-dashboard-gui/#.Wu9jKtOWTq4

2.1. JavaScript
JavaScript est un langage de programmation de scripts principalement employé dans les pages web interactives mais aussi pour les
serveurs avec l'utilisation (par exemple) de Node.js. A ne pas confondre avec Java.

2.2. Node.js
Node.js est une plateforme logicielle libre et événementielle en JavaScript orientée vers les applications réseau qui doivent pouvoir
monter en charge.

Elle utilise la machine virtuelle V8 et implémente sous licence MIT les spécifications CommonJS.

Parmi les modules natifs de Node.js, on retrouve http qui permet le développement de serveur HTTP. Il est donc possible de se passer
de serveurs web tels que Nginx ou Apache lors du déploiement de sites et d'applications web développés avec Node.js.

2.3. Node-RED
Node-RED est un outil de programmation basé sur les flux, original développé par l'équipe Emerging Technology Services d'IBM et
maintenant membre de la JS Fondation.

Inventée par J. Paul Morrison dans les années 1970, la programmation basée sur les flux est une façon de décrire le comportement
d'une application sous la forme d'un réseau de boîtes noires, ou "noeuds" comme on les appelle dans Node-RED. Chaque "noeud" a un
but bien défini ; on lui donne des données, il en fait quelque chose et ensuite il les transmet. Le réseau est responsable du flux de
données entre les noeuds.

C'est un modèle qui se prête très bien à une représentation visuelle et le rend plus accessible à un plus grand nombre d'utilisateurs. Si
quelqu'un peut décomposer un problème en étapes discrètes, il peut regarder un flux et avoir une idée de ce qu'il fait; sans avoir à
comprendre les différentes lignes de code dans chaque noeud.

Node-RED consiste en une exécution basée sur Node.js que vous appelez dans un navigateur Web pour accéder à l'éditeur de flux.
Dans le navigateur, vous créez votre application en faisant glisser les noeuds de votre palette dans un espace de travail et vous pouvez
commencer à les relier entre eux. En un seul clic, l'application est redéployée (deploy) dans l'environnement d'exécution où elle est
exécutée.

La palette de nœuds peut être facilement étendue en installant de nouveaux noeuds créés par la communauté et les flux que vous
créez peuvent être facilement partagés en tant que fichiers JSON.

En bref, pour l'histoire, Node-RED a vu le jour début 2013 sous la forme d'un projet parallèle de Nick O'Leary et Dave Conway-Jones du
groupe IBM Emerging Technology Services. Démarré comme une preuve de concept pour visualiser et manipuler les correspondances
entre les sujets MQTT, Node-RED est rapidement devenu un outil beaucoup plus général qui pourrait facilement être étendu dans
n'importe quelle direction. Il a été ouvert en septembre 2013 et a été développé à l'extérieur depuis, ce qui en a fait l'un des projets
fondateurs de la JS Fondation en octobre 2016.

2.4. Installation de Node-RED sur Rpi


Pour installer ou mettre à jour en utilisant la commande de script de mise à niveau Node-RED.

84
Labs Pibrella

bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)

sudo systemctl enable nodered.service

2.5. Ajout d'un noeud


Procédure d'ajout d'un noeud (https://flows.nodered.org/?num_pages=1)

cd ~/.node-red
npm install node-red-{example node name}

Installation du noeud pibrella.

cd ~/.node-red
npm install node-red-node-pibrella
sudo reboot

2.6. Traffic Light Simulator


Input and Output controls for Pibrella on Raspberry Pi

Figure 8 : Flux du lab Traffic Light Simulator

[
{
"id": "79097754.9d1008",
"type": "rpi-gpio in",
"z": "18cae352.8e61fd",
"name": "red button",
"pin": "23",
"intype": "tri",
"x": 220.31746673583984,
"y": 948.7460508346558,
"wires": [
[
"c67ca9d5.dee8c8"
]
]
},
{
"id": "caa28bcf.fa1ec8",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "red",
"pin": "13",
"x": 741.3174667358398,
"y": 1062.7460508346558,

85
Labs Pibrella

"wires": []
},
{
"id": "93fb6475.cc9ec8",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "green",
"pin": "7",
"x": 1076.3174667358398,
"y": 1172.7460508346558,
"wires": []
},
{
"id": "a5be988a.307c48",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "amber",
"pin": "11",
"x": 565.3174667358398,
"y": 1013.7460508346558,
"wires": []
},
{
"id": "d170d63.0c5e528",
"type": "delay",
"z": "18cae352.8e61fd",
"name": "",
"pauseType": "delay",
"timeout": "5",
"timeoutUnits": "seconds",
"rate": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"x": 562.3174667358398,
"y": 1061.7460508346558,
"wires": [
[
"caa28bcf.fa1ec8",
"b4d9ee9b.b9122",
"ae7203e7.f294"
]
]
},
{
"id": "b4d9ee9b.b9122",
"type": "delay",
"z": "18cae352.8e61fd",
"name": "",
"pauseType": "delay",
"timeout": "10",
"timeoutUnits": "seconds",
"rate": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"x": 743.3174667358398,
"y": 1108.7460508346558,
"wires": [
[
"b12d97db.ebf498",
"9e8fbbbc.daaa38"
]
]
},
{
"id": "b12d97db.ebf498",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "amber",
"pin": "11",
"x": 917.3174667358398,
"y": 1108.7460508346558,
"wires": []
},
{
"id": "9e8fbbbc.daaa38",
"type": "delay",
"z": "18cae352.8e61fd",
"name": "",
"pauseType": "delay",
"timeout": "5",

86
Labs Pibrella

"timeoutUnits": "seconds",
"rate": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"x": 932.3174667358398,
"y": 1171.7460508346558,
"wires": [
[
"93fb6475.cc9ec8",
"d4a1805d.081f1"
]
]
},
{
"id": "ae7203e7.f294",
"type": "function",
"z": "18cae352.8e61fd",
"name": "0",
"func": "msg.payload = 0;\n\n\nreturn msg;",
"outputs": 1,
"x": 745.3174667358398,
"y": 1019.7460508346558,
"wires": [
[
"4e806e7a.9f6ed"
]
]
},
{
"id": "4e806e7a.9f6ed",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "amber",
"pin": "11",
"x": 892.3174667358398,
"y": 1019.7460508346558,
"wires": []
},
{
"id": "d4a1805d.081f1",
"type": "function",
"z": "18cae352.8e61fd",
"name": "0",
"func": "msg.payload = 0;\n\n\nreturn msg;",
"outputs": 1,
"x": 1074.3174667358398,
"y": 1131.7460508346558,
"wires": [
[
"8e502ad3.72f6c8",
"b7290695.3cb028"
]
]
},
{
"id": "b7290695.3cb028",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "red",
"pin": "13",
"x": 1230.3174667358398,
"y": 1143.7460508346558,
"wires": []
},
{
"id": "8e502ad3.72f6c8",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "amber",
"pin": "11",
"x": 1228.3174667358398,
"y": 1099.7460508346558,
"wires": []
},
{
"id": "c67ca9d5.dee8c8",
"type": "function",
"z": "18cae352.8e61fd",
"name": "rising edge",
"func": "if (msg.payload == 1)\n{\n return msg;\n}\nelse\n{\n return null;\n}\n",
"outputs": 1,
"x": 355.31746673583984,

87
Labs Pibrella

"y": 949.7460508346558,
"wires": [
[
"a5be988a.307c48",
"d170d63.0c5e528",
"7b7a0e4d.15e3"
]
]
},
{
"id": "7b7a0e4d.15e3",
"type": "function",
"z": "18cae352.8e61fd",
"name": "0",
"func": "msg.payload = 0;\n\n\nreturn msg;",
"outputs": 1,
"x": 566.3174667358398,
"y": 964.7460508346558,
"wires": [
[
"9f95082e.8a4708"
]
]
},
{
"id": "9f95082e.8a4708",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "green",
"pin": "7",
"x": 723.3174667358398,
"y": 963.7460508346558,
"wires": []
},
{
"id": "67545769.bfc408",
"type": "inject",
"z": "18cae352.8e61fd",
"name": "initialise to green",
"topic": "",
"payload": "1",
"repeat": "",
"crontab": "",
"once": false,
"x": 229.31746673583984,
"y": 865.746036529541,
"wires": [
[
"6c3ffc3a.1bba34"
]
]
},
{
"id": "b37bb59f.47e5d8",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "green",
"pin": "7",
"x": 554.3174667358398,
"y": 879.7460508346558,
"wires": []
},
{
"id": "1fadc29c.6a01dd",
"type": "function",
"z": "18cae352.8e61fd",
"name": "0",
"func": "msg.payload = 0;\n\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 560.3174667358398,
"y": 826.7460508346558,
"wires": [
[
"97949c1c.841bd",
"e447c19a.3922b"
]
]
},
{
"id": "97949c1c.841bd",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "amber",

88
Labs Pibrella

"pin": "11",
"x": 698.3174667358398,
"y": 803.7460508346558,
"wires": []
},
{
"id": "e447c19a.3922b",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "red",
"pin": "13",
"x": 696.3174667358398,
"y": 848.7460508346558,
"wires": []
},
{
"id": "6c3ffc3a.1bba34",
"type": "delay",
"z": "18cae352.8e61fd",
"name": "",
"pauseType": "delay",
"timeout": "1",
"timeoutUnits": "seconds",
"rate": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"x": 388.31746673583984,
"y": 866.7460508346558,
"wires": [
[
"1fadc29c.6a01dd",
"b37bb59f.47e5d8"
]
]
},
{
"id": "105d33b8.58904c",
"type": "comment",
"z": "18cae352.8e61fd",
"name": "traffic light simulator - push the red button!",
"info": "",
"x": 305.3174819946289,
"y": 771.412769317627,
"wires": []
}
]

2.7. Lab Twitter

Figure 9 : Flux du lab Twitter

89
Labs Pibrella

[
{
"id": "4f4c115b.b9b8c",
"type": "tab",
"label": "pibrella twitter",
"disabled": false,
"info": ""
},
{
"id": "c8047d70.90478",
"type": "rpi-pibrella in",
"z": "4f4c115b.b9b8c",
"name": "Red button #redled",
"pin": "Red Button",
"read": false,
"x": 285.5,
"y": 248,
"wires": [
[
"bc404312.ede54"
]
]
},
{
"id": "c13b8e4a.b1af1",
"type": "debug",
"z": "4f4c115b.b9b8c",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"x": 925.5,
"y": 133,
"wires": []
},
{
"id": "bc404312.ede54",
"type": "switch",
"z": "4f4c115b.b9b8c",
"name": "",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "eq",
"v": "1",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 481.5,
"y": 248,
"wires": [
[
"8c019734.aa9f68"
]
]
},
{
"id": "8c019734.aa9f68",
"type": "function",
"z": "4f4c115b.b9b8c",
"name": "tag + timestamp",
"func": "msg.payload = \"#redled \" + new Date().toString();\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 688.5,
"y": 247,
"wires": [
[
"c13b8e4a.b1af1",
"b48e4f16.304e9",
"8bca00da.05563"
]
]
},
{
"id": "5ba72bf0.e5f144",
"type": "trigger",

90
Labs Pibrella

"z": "4f4c115b.b9b8c",
"op1": "1",
"op2": "0",
"op1type": "str",
"op2type": "str",
"duration": "5",
"extend": false,
"units": "s",
"reset": "",
"bytopic": "all",
"name": "",
"x": 501.5,
"y": 412,
"wires": [
[
"8f465102.d37f9",
"2116a5f7.66d95a"
]
]
},
{
"id": "8f465102.d37f9",
"type": "rpi-pibrella out",
"z": "4f4c115b.b9b8c",
"name": "",
"pin": "Red LED",
"set": false,
"level": "0",
"out": "out",
"x": 741.5,
"y": 411,
"wires": []
},
{
"id": "b48e4f16.304e9",
"type": "twitter out",
"z": "4f4c115b.b9b8c",
"twitter": "",
"name": "Tweet @feglab",
"x": 932.5,
"y": 196,
"wires": []
},
{
"id": "8078dfcf.be61",
"type": "twitter in",
"z": "4f4c115b.b9b8c",
"twitter": "",
"tags": "#redled",
"user": "false",
"name": "#redled tag catch",
"topic": "tweets",
"inputs": 0,
"x": 273.5,
"y": 412,
"wires": [
[
"5ba72bf0.e5f144"
]
]
},
{
"id": "2116a5f7.66d95a",
"type": "rpi-pibrella out",
"z": "4f4c115b.b9b8c",
"name": "",
"pin": "Buzzer ",
"set": false,
"level": "0",
"out": "out",
"x": 736.5,
"y": 497,
"wires": []
},
{
"id": "b2a7b089.d2dca",
"type": "rpi-pibrella out",
"z": "4f4c115b.b9b8c",
"name": "",
"pin": "Green LED",
"set": true,
"level": "0",
"out": "out",
"x": 1108.5,

91
Labs Pibrella

"y": 246,
"wires": []
},
{
"id": "8bca00da.05563",
"type": "trigger",
"z": "4f4c115b.b9b8c",
"op1": "1",
"op2": "0",
"op1type": "str",
"op2type": "str",
"duration": "3",
"extend": false,
"units": "s",
"reset": "",
"bytopic": "all",
"name": "",
"x": 911.5,
"y": 246,
"wires": [
[
"b2a7b089.d2dca"
]
]
},
{
"id": "1f08f815.f2d758",
"type": "comment",
"z": "4f4c115b.b9b8c",
"name": "Envoi d'un tweet",
"info": "Le bouton envoit un tweet avec le hastag #redled et un timestamp",
"x": 277.5,
"y": 174,
"wires": []
},
{
"id": "3ad4c9d0.ae9486",
"type": "comment",
"z": "4f4c115b.b9b8c",
"name": "Réception d'un tweet",
"info": "A la réception d'un tweet avec le hashtag #redled la LED rouge s'allume et le buzzer s'enclenche",
"x": 287.5,
"y": 338,
"wires": []
}
]

2.8. Lab Picam Photobooth


https://github.com/zimchaa/auto-raspi-camera/blob/master/simple-cam.py

2.9. Lab Appel SIP


Ce Lab s'intègre au déploiement de raspbx et relève juste de la preuve de concept.

Sur le raspberry pi avec la carte pibrella, installer linphone :

sudo apt-get update


sudo apt-get install linphone-nogtk

Créer un script dans /home/pi/sipcall.sh

#!/bin/bash
proc=$(ps aux | egrep "linphonec --pipe" | awk '{print $2}') ; kill -9 ${proc}
/usr/bin/linphonecsh init
sleep 3
/usr/bin/linphonecsh register --host raspbx00 --username 3303 --password test1234
sleep 3
/usr/bin/linphonecsh dial "sip:2202@raspbx00"
sleep 3
proc=$(ps aux | egrep "linphonec" | awk '{print $2}') ; kill -9 ${proc}

Dans Node-Red, le flux suivant exécute le script et allume la LED rouge pendant 9 secondes.

92
Labs Pibrella

Figure 10 : Flux bouton rouga / appel SIP

[{"id":"28c50c57.cc9684","type":"exec","z":"7cf14d54.8b0744","command":"sudo bash -x /home/pi/sipcall.sh","addpay":true,"append":


"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":580.5,"y":273.5,"wires":[["12af2c1a.dfde14"],[],[]]},{"id":"f574d105.
ad4be","type":"rpi-pibrella in","z":"7cf14d54.8b0744","name":"","pin":"Red Button","read":false,"x":135.5,"y":243,"wires":[["8b71
2ca5.fc59f","f2adcc8.a55a33"]]},{"id":"12af2c1a.dfde14","type":"debug","z":"7cf14d54.8b0744","name":"","active":true,"tosidebar":
true,"console":false,"tostatus":false,"complete":"false","x":815.5,"y":260,"wires":[]},{"id":"8b712ca5.fc59f","type":"trigger","z
":"7cf14d54.8b0744","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"1","extend":false,"units":"s","reset":"","byt
opic":"all","name":"","x":332.5,"y":274,"wires":[["28c50c57.cc9684"]]},{"id":"66aca6b.a723458","type":"rpi-pibrella out","z":"7cf
14d54.8b0744","name":"","pin":"Red LED","set":false,"level":"0","out":"out","x":507.5,"y":199,"wires":[]},{"id":"f2adcc8.a55a33",
"type":"trigger","z":"7cf14d54.8b0744","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"9","extend":false,"units":
"s","reset":"","bytopic":"all","name":"","x":331.5,"y":200,"wires":[["66aca6b.a723458"]]}]

Le destinataire sonne ...

Pour des scripts de communication SIP, il est préférable d'utiliser la librairie PJSIP.

...

2.10. Lab Node-RED HTTP


...

93
Labs GrovePi

Labs GrovePi
1. Description
2. Super capteur
Mise en place
Node Red
Scripts Python
Node-RED
MQTT (+ Dashboard)
Questions / Améliorations
Filtrage des Topics MQTT
Notes
Report et graphes sur Initialstate
Bluemix
Emoncms
Plateformes IoT
Twitter
ibeacons

1. Description
La carte d'extension grovepi permet de faciliter la connexion de composants électroniques de prise de mesure et d'interaction
utilisateur avec un Raspberry Pi B (GrovePi+) ou Rasperry Pi Zero (GrovePi Zero). Elle fonctionne avec un contrôleur ATmega328 qui
embarque nativement un convertisseur analogique / digital (A/D) 6 canaux. Elle existe aussi pour Arduino (Seeduino) et sans
contrôleur à interfacer directement avec Arduino. Les composants sont disponibles sous forme de modules facilement enfichables
sur la carte.

94
Labs GrovePi

95
Labs GrovePi

Sources :

https://www.dexterindustries.com/grovepi/
http://www.dexterindustries.com/grovepi-tutorials-documentation/
https://www.dexterindustries.com/GrovePi/engineering/port-description/
http://wiki.seeedstudio.com/GrovePi_Plus/

Descriptif :

7 Ports digitaux
3 Ports analogiques
3 Ports I2C
1 Port Serial (GrovePi)
1 Port Serial (Raspberry Pi)

2. Super capteur
Source

Ports Capteurs Image

96
Labs GrovePi

Air Quality
A0
Sensor

A1 Light Sensor

Sound
A2
Sensor

97
Labs GrovePi

D4 Green LED

D8 Buzzer

Temperature
D7 & Humidity
Sensor

Barometer
I2C-1 (High
Accuracy))

98
Labs GrovePi

I2C-2 LCD RGB

Mise en place
Commencer Labs Raspberry Pi : Mise en place

http://www.dexterindustries.com/GrovePi/get-started-with-the-grovepi/setting-software/

Ne pas installer la carte.

sudo apt-get update && apt-get -y upgrade


sudo apt-get install emacs git -y
cd /home/pi/Desktop
sudo git clone https://github.com/DexterInd/GrovePi
cd /home/pi/Desktop/GrovePi/Script
sudo chmod +x install.sh
sudo ./install.sh
sudo reboot

Le script install.sh offre le message suivant :

_____ _
| __ \ | |
| | | | _____ _| |_ ___ _ __
| | | |/ _ \ \/ / __/ _ \ '__|
| |__| | __/> <| || __/ |
|_____/ \___/_/\_\__\___|_| _ _
|_ _| | | | | (_)
| | _ __ __| |_ _ ___| |_ _ __ _ ___ ___
| | | '_ \ / _` | | | / __| __| '__| |/ _ \/ __|
_| |_| | | | (_| | |_| \__ \ |_| | | | __/\__ \
|_____|_| |_|\__,_|\__,_|___/\__|_| |_|\___||___/

Welcome to GrovePi Installer.

Requirements:
1) Must be connected to the internet
2) This script must be run as root user

Steps:
1) Installs package dependencies:
- python-pip alternative Python package installer
- git fast, scalable, distributed revision control system
- libi2c-dev userspace I2C programming library development files
- python-serial pyserial - module encapsulating access for the serial port
- python-rpi.gpio Python GPIO module for Raspberry Pi
- i2c-tools This Python module allows SMBus access through the I2C /dev
- python-smbus Python bindings for Linux SMBus access through i2c-dev
- python3-smbus Python3 bindings for Linux SMBus access through i2c-dev
- arduino AVR development board IDE and built-in libraries
- minicom friendly menu driven serial communication program
2) Clone, build wiringPi in GrovePi/Script and install it

99
Labs GrovePi

3) Removes I2C and SPI from modprobe blacklist /etc/modprobe.d/raspi-blacklist.conf


4) Adds I2C-dev, i2c-bcm2708 and spi-dev to /etc/modules
5) Installs gertboard avrdude_5.10-4_armhf.deb package
6) Runs gertboard setup
- configures avrdude
- downloads gertboard known boards and programmers
- replaces avrsetup with gertboards version
- in /etc/inittab comments out lines containing AMA0
- in /boot/cmdline.txt removes: console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1
- in /usr/share/arduino/hardware/arduino creates backup of boards.txt
- in /usr/share/arduino/hardware/arduino creates backup of programmers.txt

Special thanks to Joe Sanford at Tufts University. This script was derived from his work. Thank you Joe!

Raspberry Pi wil reboot after completion.

Et puis, une mise à jour de l'installation.

bash /home/pi/Desktop/GrovePi/Script/update_grovepi.sh

Une mise à jour du firmware de la carte

cd /home/pi/Desktop/GrovePi/Firmware
sudo ./firmware_update.sh

Redémarrer et installer les librairies.

sudo pip install grovepi


sudo shutdown -h now

Placer la carte sur le Raspberry Pi et alimenter.

sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: 03 04 -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- 62 -- -- -- -- -- -- -- -- -- -- -- -- --
70: 70 -- -- -- -- -- -- --

Node Red
Pour installer ou mettre à jour en utilisant la commande de script de mise à niveau Node-RED.

bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)


sudo systemctl enable nodered.service

Installation des noeuds GrovePi

cd ~/.node-red
npm install node-red-contrib-grovepi
npm install node-red-grovepi-nodes

Redémarrage du système.

sudo reboot

Scripts Python
Script air.py

#!/usr/bin/env python
import time
import grovepi

100
Labs GrovePi

# Connect the Grove Air Quality Sensor to analog port A0


# SIG,NC,VCC,GND
air_sensor = 0

grovepi.pinMode(air_sensor,"INPUT")

while True:
try:
# Get sensor value
sensor_value = grovepi.analogRead(air_sensor)

if sensor_value > 700:


print ("High pollution")
elif sensor_value > 300:
print ("Low pollution")
else:
print ("Air fresh")

print("sensor_value =", sensor_value)


time.sleep(.5)

except IOError:
print ("Error")

Script baro.py , à condition de copier le module python à côté du script cp

/home/pi/Desktop/GrovePi/Software/Python/grove_barometer_sensors/high_accuracy_hp206c_barometer/hp206c.py ./ .

#!/usr/bin/env python
import hp206c
h= hp206c.hp206c()

temp=h.ReadTemperature()
pressure=h.ReadPressure()
altitude=h.ReadAltitude()
print('{"temperature":%.2f,"pressure":%.2f,"altitude":%.2f}' %(temp,pressure,altitude))

Script dht.py

#!/usr/bin/env python
import grovepi
import math
while True:
try:
[temp,humidity] = grovepi.dht(7,0)
if math.isnan(temp) == False and math.isnan(humidity) == False:
print("temp = %.02f C humidity =%.02f%%"%(temp, humidity))
break

except IOError:
print ("Error")

Script light.py

#!/usr/bin/env python
import time
import grovepi

# Connect the Grove Light Sensor to analog port A0


# SIG,NC,VCC,GND
light_sensor = 1

# Connect the LED to digital port D4


# SIG,NC,VCC,GND
led = 4

# Turn on LED once sensor exceeds threshold resistance


threshold = 10

grovepi.pinMode(light_sensor,"INPUT")
grovepi.pinMode(led,"OUTPUT")

while True:
try:
# Get sensor value
sensor_value = grovepi.analogRead(light_sensor)

# Calculate resistance of sensor in K

101
Labs GrovePi

resistance = (float)(1023 - sensor_value) * 10 / sensor_value

if resistance > threshold:


# Send HIGH to switch on LED
grovepi.digitalWrite(led,1)
else:
# Send LOW to switch off LED
grovepi.digitalWrite(led,0)

print("sensor_value = %d resistance = %.2f" %(sensor_value, resistance))


time.sleep(.5)

except IOError:
print ("Error")

Node-RED
Créer un dossier de travail /home/pi/grove-sensors et y copier la librairie python qui permet d'exploiter la puce HP206C du baromètre.

cd
pwd
mkdir grove-sensors
cd grove-sensors
cp /home/pi/Desktop/GrovePi/Software/Python/grove_barometer_sensors/high_accuracy_hp206c_barometer/hp206c.py ./

Pour exploiter les différents capteurs, on peut passer un script python qui rend un message formaté en json. On nomme ce script
sensors.py .

#!/usr/bin/env python
import hp206c
h= hp206c.hp206c()
import grovepi
temperature=h.ReadTemperature()
pressure=h.ReadPressure()
altitude=h.ReadAltitude()
[temp,humidity] = grovepi.dht(7,0)
grovepi.pinMode(0,"INPUT")
air = grovepi.analogRead(0)
print('{"temperature": %.2f,"pressure": %.2f,"altitude": %.2f,"humidity": %.2f,"air": %.2f}' %(temperature,pressure,altitude,humi
dity,air))

Toutes les dix secondes, le script /home/pi/grove-sensors/sensors.py est appelé pour générer une charge (msg.payload) formatée en
JSON en tant que ligne de texte (string), le noeud JSON le transforme en objet nodejs que l'on manipule avec le noeud change (par
exemle, msg.payload.temperature remplace le msg.payload final).

[{"id":"fcfdb194.824ff","type":"exec","z":"fa434de1.2acb7","command":"sudo python /home/pi/grove-sensors/sensors.py","addpay":tru


e,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":290,"y":440,"wires":[["e8a85407.929048"],[],[]]},{"id":"e
d247023.9e707","type":"debug","z":"fa434de1.2acb7","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"co
mplete":"payload","x":1070,"y":80,"wires":[]},{"id":"e8a85407.929048","type":"json","z":"fa434de1.2acb7","name":"","property":"pa
yload","action":"obj","pretty":false,"x":390,"y":220,"wires":[["9e8bc0be.a9bc3","f6c8dc7f.8a2da","edc9bbba.127cd8","1444df5e.6117

102
Labs GrovePi

81","b579a0ba.dc1de","9adc05b9.6e2b48"]]},{"id":"9e8bc0be.a9bc3","type":"change","z":"fa434de1.2acb7","name":"temperature","rules
":[{"t":"set","p":"payload","pt":"msg","to":"payload.temperature","tot":"msg"}],"action":"","property":"","from":"","to":"","reg"
:false,"x":850,"y":80,"wires":[["ed247023.9e707"]]},{"id":"f6c8dc7f.8a2da","type":"change","z":"fa434de1.2acb7","name":"humidity"
,"rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.humidity","tot":"msg"}],"action":"","property":"","from":"","to":"","
reg":false,"x":840,"y":180,"wires":[["43f5f3e8.52d2dc"]]},{"id":"43f5f3e8.52d2dc","type":"debug","z":"fa434de1.2acb7","name":"","
active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":1070,"y":180,"wires":[]},{"id":"edc9bbba
.127cd8","type":"change","z":"fa434de1.2acb7","name":"altitude","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.altitu
de","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":840,"y":280,"wires":[["d35a2bae.c08498"]]},{"id":"d
35a2bae.c08498","type":"debug","z":"fa434de1.2acb7","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"c
omplete":"payload","x":1070,"y":280,"wires":[]},{"id":"1444df5e.611781","type":"change","z":"fa434de1.2acb7","name":"pressure","r
ules":[{"t":"set","p":"payload","pt":"msg","to":"payload.pressure","tot":"msg"}],"action":"","property":"","from":"","to":"","reg
":false,"x":840,"y":380,"wires":[["a4ec38ce.02e228"]]},{"id":"a4ec38ce.02e228","type":"debug","z":"fa434de1.2acb7","name":"","act
ive":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":1070,"y":380,"wires":[]},{"id":"83db99e7.fb
8e08","type":"inject","z":"fa434de1.2acb7","name":"","topic":"","payload":"","payloadType":"date","repeat":"10","crontab":"","onc
e":false,"onceDelay":0.1,"x":150,"y":220,"wires":[["fcfdb194.824ff"]]},{"id":"b579a0ba.dc1de","type":"change","z":"fa434de1.2acb7
","name":"air","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.air","tot":"msg"}],"action":"","property":"","from":"",
"to":"","reg":false,"x":830,"y":480,"wires":[["c4cf7399.524d2"]]},{"id":"c4cf7399.524d2","type":"debug","z":"fa434de1.2acb7","nam
e":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":1070,"y":480,"wires":[]},{"id":"9
adc05b9.6e2b48","type":"debug","z":"fa434de1.2acb7","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"co
mplete":"false","x":630,"y":60,"wires":[]}]

MQTT (+ Dashboard)
Dashboard Node-RED.

cd ~/.node-red
npm install node-red-dashboard
cd
systemctl restart nodered

Voir Protocole MQTT

MQTT Broker gratuit : https://github.com/mqtt/mqtt.github.io/wiki/public_brokers

address test.mosquitto.org
port 1883, 8883 (SSL), 8884 (SSL), 80 (WebSockets)
type mosquitto

Installation des clients MQTT (Rpi).

sudo apt-get update && sudo apt-get -y upgrade


sudo apt-get -y install mosquitto mosquitto-clients

MQTT Publisher

103
Labs GrovePi

[{"id":"e819c6c.6c0dd38","type":"ui_button","z":"c7685c61.851e6","name":"","group":"9f2bafea.b8a12","order":0,"width":"2","height
":"2","passthru":false,"label":"On","color":"","bgcolor":"green","icon":"","payload":"1","payloadType":"num","topic":"","x":160,"
y":120,"wires":[["ceecf606.6f0798"]]},{"id":"7d2871b2.48632","type":"ui_button","z":"c7685c61.851e6","name":"","group":"9f2bafea.
b8a12","order":0,"width":"2","height":"2","passthru":false,"label":"Off","color":"","bgcolor":"red","icon":"","payload":"0","payl
oadType":"num","topic":"","x":170,"y":200,"wires":[["ceecf606.6f0798"]]},{"id":"ceecf606.6f0798","type":"mqtt out","z":"c7685c61.
851e6","name":"","topic":"feg/rix/office/led","qos":"","retain":"","broker":"a4abff2a.b8d37","x":410,"y":160,"wires":[]},{"id":"d
dc8cdd5.188e4","type":"debug","z":"c7685c61.851e6","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"com
plete":"payload","x":400,"y":120,"wires":[]},{"id":"ce110a6e.207358","type":"mqtt out","z":"c7685c61.851e6","name":"","topic":"fe
g/rix/office/temperature","qos":"","retain":"","broker":"a4abff2a.b8d37","x":1050,"y":340,"wires":[]},{"id":"4cef2e63.6beae","typ
e":"mqtt out","z":"c7685c61.851e6","name":"","topic":"feg/rix/office/humidity","qos":"","retain":"","broker":"a4abff2a.b8d37","x"
:1040,"y":440,"wires":[]},{"id":"f95602cf.53896","type":"mqtt out","z":"c7685c61.851e6","name":"","topic":"feg/rix/office/altitud
e","qos":"","retain":"","broker":"a4abff2a.b8d37","x":1040,"y":540,"wires":[]},{"id":"8752d248.fbdce","type":"mqtt out","z":"c768
5c61.851e6","name":"","topic":"feg/rix/office/pressure","qos":"","retain":"","broker":"a4abff2a.b8d37","x":1040,"y":640,"wires":[
]},{"id":"64d89a7a.ad6a64","type":"exec","z":"c7685c61.851e6","command":"sudo python /home/pi/grove-sensors/sensors.py","addpay":
true,"append":"","useSpawn":"false","timer":"","oldrc":true,"name":"","x":370,"y":320,"wires":[["a3d59b20.ad1e28"],[],[]]},{"id":
"234c8292.76fdce","type":"inject","z":"c7685c61.851e6","name":"","topic":"","payload":"1","payloadType":"num","repeat":"10","cron
tab":"","once":false,"onceDelay":0.1,"x":90,"y":320,"wires":[["64d89a7a.ad6a64"]]},{"id":"593f1b39.c5c6c4","type":"debug","z":"c7
685c61.851e6","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":1010,"y":400,"w
ires":[]},{"id":"a3d59b20.ad1e28","type":"json","z":"c7685c61.851e6","name":"","property":"payload","action":"obj","pretty":false
,"x":570,"y":540,"wires":[["5233f0da.27bde","3727d9f2.d2faf6","d2649992.613898","aec8ab5f.d93be8","ebaf2496.495118"]]},{"id":"650
819bc.aa7408","type":"debug","z":"c7685c61.851e6","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"com
plete":"payload","x":1010,"y":500,"wires":[]},{"id":"f9035163.38563","type":"debug","z":"c7685c61.851e6","name":"","active":false
,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":1010,"y":600,"wires":[]},{"id":"6e0c3221.ab287c","typ
e":"debug","z":"c7685c61.851e6","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","
x":1010,"y":700,"wires":[]},{"id":"ced00baf.63f158","type":"debug","z":"c7685c61.851e6","name":"","active":false,"tosidebar":true
,"console":false,"tostatus":false,"complete":"payload","x":1010,"y":800,"wires":[]},{"id":"861ddccb.427d6","type":"mqtt out","z":
"c7685c61.851e6","name":"","topic":"feg/rix/office/air","qos":"","retain":"","broker":"a4abff2a.b8d37","x":1020,"y":740,"wires":[
]},{"id":"5233f0da.27bde","type":"change","z":"c7685c61.851e6","name":"temperature","rules":[{"t":"set","p":"payload","pt":"msg",
"to":"payload.temperature","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":770,"y":400,"wires":[["ce110
a6e.207358"]]},{"id":"3727d9f2.d2faf6","type":"change","z":"c7685c61.851e6","name":"humidity","rules":[{"t":"set","p":"payload","
pt":"msg","to":"payload.humidity","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":760,"y":500,"wires":[
["4cef2e63.6beae"]]},{"id":"d2649992.613898","type":"change","z":"c7685c61.851e6","name":"altitude","rules":[{"t":"set","p":"payl
oad","pt":"msg","to":"payload.altitude","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":760,"y":600,"wi
res":[["f95602cf.53896"]]},{"id":"aec8ab5f.d93be8","type":"change","z":"c7685c61.851e6","name":"pressure","rules":[{"t":"set","p"
:"payload","pt":"msg","to":"payload.pressure","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":760,"y":7
00,"wires":[["8752d248.fbdce"]]},{"id":"ebaf2496.495118","type":"change","z":"c7685c61.851e6","name":"air","rules":[{"t":"set","p
":"payload","pt":"msg","to":"payload.air","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":750,"y":800,"
wires":[["861ddccb.427d6"]]},{"id":"9f2bafea.b8a12","type":"ui_group","z":"","name":"LED","tab":"ecf36f3d.f281","disp":true,"widt
h":"3","collapse":false},{"id":"a4abff2a.b8d37","type":"mqtt-broker","z":"","name":"","broker":"test.mosquitto.org","port":"1883"
,"clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"
","birthTopic":"","birthQos":"0","birthPayload":""},{"id":"ecf36f3d.f281","type":"ui_tab","z":"","name":"Office","icon":"dashboar
d"}]

MQTT Subscriber

104
Labs GrovePi

[{"id":"482a1d7c.38fcd4","type":"grove digital output","z":"9ba6dc7c.f8c9","name":"","board":"a733887b.bf2b58","pin":"4","x":550,


"y":120,"wires":[]},{"id":"856c46f9.8ba2d8","type":"mqtt in","z":"9ba6dc7c.f8c9","name":"","topic":"feg/rix/office/led","qos":"2"
,"broker":"a4abff2a.b8d37","x":230,"y":120,"wires":[["482a1d7c.38fcd4"]]},{"id":"47731099.a6ec6","type":"mqtt in","z":"9ba6dc7c.f
8c9","name":"","topic":"feg/rix/office/temperature","qos":"2","broker":"a4abff2a.b8d37","x":250,"y":380,"wires":[["75c4bf25.a0ad7
","c5b599b.0804768","a22a4e5c.97bc7"]]},{"id":"75c4bf25.a0ad7","type":"debug","z":"9ba6dc7c.f8c9","name":"","active":true,"toside
bar":true,"console":false,"tostatus":false,"complete":"false","x":530,"y":320,"wires":[]},{"id":"a1074724.69b8d8","type":"mqtt in
","z":"9ba6dc7c.f8c9","name":"","topic":"feg/rix/office/humidity","qos":"2","broker":"a4abff2a.b8d37","x":240,"y":460,"wires":[["
a20a030f.779cf","ae6254a2.a94d78","520679df.e2cb18"]]},{"id":"a20a030f.779cf","type":"debug","z":"9ba6dc7c.f8c9","name":"","activ
e":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":530,"y":460,"wires":[]},{"id":"2306fc43.c869a4"
,"type":"mqtt in","z":"9ba6dc7c.f8c9","name":"","topic":"feg/rix/office/temperature","qos":"2","broker":"a4abff2a.b8d37","x":250,
"y":540,"wires":[["1fc47543.0bd4bb"]]},{"id":"1fc47543.0bd4bb","type":"debug","z":"9ba6dc7c.f8c9","name":"","active":false,"tosid
ebar":true,"console":false,"tostatus":false,"complete":"false","x":530,"y":540,"wires":[]},{"id":"e8848635.ed3288","type":"mqtt i
n","z":"9ba6dc7c.f8c9","name":"","topic":"feg/rix/office/temperature","qos":"2","broker":"a4abff2a.b8d37","x":250,"y":600,"wires"
:[["a55bf2b5.b3f7c"]]},{"id":"a55bf2b5.b3f7c","type":"debug","z":"9ba6dc7c.f8c9","name":"","active":false,"tosidebar":true,"conso
le":false,"tostatus":false,"complete":"false","x":530,"y":600,"wires":[]},{"id":"19c156ba.a676c9","type":"mqtt in","z":"9ba6dc7c.
f8c9","name":"","topic":"feg/rix/office/air","qos":"2","broker":"a4abff2a.b8d37","x":220,"y":680,"wires":[["556b5c39.38f1f4"]]},{
"id":"556b5c39.38f1f4","type":"debug","z":"9ba6dc7c.f8c9","name":"","active":false,"tosidebar":true,"console":false,"tostatus":fa
lse,"complete":"false","x":530,"y":680,"wires":[]},{"id":"c5b599b.0804768","type":"ui_chart","z":"9ba6dc7c.f8c9","name":"","group
":"ddc5be14.690cb","order":0,"width":0,"height":0,"label":"Temperature graph 12h °C","chartType":"line","legend":"true","xformat"
:"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"","ymax":"","removeOlder":"36","removeOlderPoints":"","removeOl
derUnit":"3600","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#
9467bd","#c5b0d5"],"useOldStyle":false,"x":580,"y":280,"wires":[[],[]]},{"id":"a22a4e5c.97bc7","type":"ui_gauge","z":"9ba6dc7c.f8
c9","name":"","group":"ddc5be14.690cb","order":0,"width":0,"height":0,"gtype":"gage","title":"Temperature gauge","label":"°C","fo

105
Labs GrovePi

rmat":"{{value}}","min":"-20","max":"50","colors":["#0040b5","#47e603","#ca5800"],"seg1":"0","seg2":"25","x":550,"y":220,"wires":
[]},{"id":"520679df.e2cb18","type":"ui_chart","z":"9ba6dc7c.f8c9","name":"","group":"a6a5a120.a71a3","order":0,"width":0,"height"
:0,"label":"Humidity graph 12h %","chartType":"line","legend":"true","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot
":true,"ymin":"","ymax":"","removeOlder":"36","removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"col
ors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":560,"y":
420,"wires":[[],[]]},{"id":"ae6254a2.a94d78","type":"ui_gauge","z":"9ba6dc7c.f8c9","name":"","group":"a6a5a120.a71a3","order":0,"
width":0,"height":0,"gtype":"gage","title":"Humidity gauge","label":"%","format":"{{value}}","min":"0","max":"100","colors":["#b5
b019","#47e603","#ca5800"],"seg1":"0","seg2":"25","x":540,"y":380,"wires":[]},{"id":"a733887b.bf2b58","type":"board-config","z":"
","board":"GrovePi"},{"id":"a4abff2a.b8d37","type":"mqtt-broker","z":"","name":"","broker":"test.mosquitto.org","port":"1883","cl
ientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","b
irthTopic":"","birthQos":"0","birthPayload":""},{"id":"ddc5be14.690cb","type":"ui_group","z":"","name":"Temperature","tab":"ecf36
f3d.f281","disp":true,"width":"12","collapse":false},{"id":"a6a5a120.a71a3","type":"ui_group","z":"","name":"Humidity","tab":"ecf
36f3d.f281","disp":true,"width":"12","collapse":false},{"id":"ecf36f3d.f281","type":"ui_tab","z":"","name":"Office","icon":"dashb
oard"}]

Dashboard sur http://<ip_address>:1880/ui/ .

Questions / Améliorations
Format de publication MQTT

Correction envoyer les charges MQTT en JSON

Consommation de ressources

Communication de données
Stockage des données
charge (autonomie)

Sécurité

confidentialité
authentification

Qualité de service

Filtrage des Topics MQTT

Notes
Report et graphes sur Initialstate

106
Labs GrovePi

A lire : http://www.networkworld.com/article/3093434/internet-of-things/data-driven-farming-how-iot-delivers-hyperlocal-weather-
information-affordably.html

https://initialstate.com/
https://github.com/InitialState/pi-health-dashboard
https://github.com/InitialState/grovepi

Bluemix
http://thethingbox.io/docs/Bluemix.html
https://github.com/TheThingBox/iot-nodered
https://www.ibm.com/blogs/research/2016/05/building-weather-app-watson-bluemix/

Emoncms
https://blog.openenergymonitor.org/2015/10/emonpi-nodered-and-mqtt/
https://blog.openenergymonitor.org/2016/02/outdoor-temperature-data-from-weather/
https://github.com/emoncms/emoncms/blob/master/docs/RaspberryPi/readme.md
http://thethingbox.io/docs/BtcEmonCms.html
http://thethingbox.io/docs/BtcXively.html

Plateformes IoT
Voir Ressources.

Twitter

ibeacons
http://thethingbox.io/docs/iBeacon-tsa.html

107
Labs GrovePi

108
Labs Z-Wave

Labs Z-Wave
1. Technologie Z-Wave
2. Protocole Z-Wave
3. Matériels fabriquants Z-Wave testés
Logiciels

1. Technologie Z-Wave

2. Protocole Z-Wave

3. Matériels fabriquants Z-Wave testés


Razberry
Aeotec Z-Wave USB Adapter
Capteurs et switches Fibaro et Aetec :
1 X Aeonlab MultiSensor 6
1 X Fibaro Systems Motion Sensor
1 X Aeonlab Smart Switch 6
1 X Fibaro Systems Wall Plug
1 X Aeonlab Door/Window Sensor

Logiciels
Node, red-node, librairie, logiciel contrôleur : OpenHAB, Z-way

http://thethingbox.io/docs/ZwaveUI.html

109
Labs Réseau

Labs Réseau
1. Passerelle Internet
2. Controlleur Wi-Fi

1. Passerelle Internet
Choix d'une distribution
Routeur IPv4/IPv6
Passerelle Ovpn
Services DHCP, DHCPv6, RA, DNS
Pare-feu IPv4/IPv6
Client DDNS
Routeur dynamique RIP/OSPF
Routeur inter-VLAN
Client 802.1x/EAP/Radius
Serveur Radius
Serveur de partage Windows
Serveur torrent

2. Controlleur Wi-Fi
http://openwisp.org/whatis.html
https://packetfence.org/
https://wiki.openwrt.org/doc/recipes/dumbap

110
Labs Cluster

Labs Cluster
Kit Cluster :

Sources :

http://blog.hypriot.com/post/let-docker-swarm-all-over-your-raspberry-pi-cluster/
https://github.com/hypriot/flash

Kit Cluster :
10 X Rpi B+
Mikrotik CRS125-24G-1S-2HnD-IN

111
Labs RaPBX

Labs RasPBX

1. Raspbx
1.1. Documentation générale du projet
http://www.raspberry-asterisk.org/documentation/
http://www.raspberry-asterisk.org/faq/#asteriskonly

1.2. Téléchargement et gravure de l'image


Télécharger l'image à partir de http://www.raspberry-asterisk.org/downloads et la graver sur la carte SD.

https://www.raspberrypi.org/documentation/installation/installing-images/linux.md
https://www.raspberrypi.org/documentation/installation/installing-images/mac.md
https://www.raspberrypi.org/documentation/installation/installing-images/windows.md

2. Préparation du serveur
2.1. SSH
Télécharger le logiciel Putty
Installer un serveur X afin de lancer wireshark sur le PBX à partir de Windows. Documentation :
https://www.google.fr/#q=xming+avec+putty+x+forwarding
Lancer une session SSH

2.2. Mise à jour du système


En console lancer la commande :

raspi-config

Choisir et confugurer :

1 Change User Password


2 Network Options/N1 Hostname
2 Network Options/N2 Wi-fi
4 Localisation Options/I2 Change Timezone
7 Advanced Options/A1 Expand Filesystem

Finish/reboot

Après redémarrage, exécuter en console :

rpi-update
reboot

De nouveau, après redémarrage, exécuter en console :

raspbx-upgrade
apt-get install tcpdump tshark wireshark ntpdate

2.3. Installation des sons locaux français


Cette étape devient accessoire si l'on passe par FreePBX (Admin/Sound Languages)

Créer un script astpbx_fr.sh:

112
Labs RaPBX

Accorder des droits d’exécution

chmod u+x astpbx_fr.sh

Exécution du script

./astpbx_fr.sh

2.4. Configuration du PBX


http://wiki.freepbx.org/display/PPS/FreePBX+Distro+First+Steps+After+Installation

3. Configuration des modules


http://wiki.freepbx.org/display/FPG/Standard+Modules

1. Mise à jour des modules

2. Installation de nouveaux modules :

3. Languages (voir plus haut)

4. Endpoint Manager
5. Time Conditions
6. Ring Groups

Paramètres avancés et paramètres SIP

http://wiki.freepbx.org/display/FPG/Advanced+Settings

Adresse : Static
Adresse IP publique
Réseau local

http://wiki.freepbx.org/display/FPG/Asterisk+SIP+Settings

Changer éventuellement "Strong Passwords"

4. Connectivité
4.1. Ajout des extensions
Softphones SIP/IAX

Zoiper
Linphone
Ekiga
Jitsi
Yate
3CX Phone
SJPhone
Voir https://fr.wikipedia.org/wiki/Liste_des_logiciels_SIP#Clients_SIP

Matériel VoIP

Polycom SoundPoint IP 321 (3)


Cisco SPA508G (3)
Cisco SPA504G (2)
Cisco SPA922 (6)
ATA Cisco PAP2T (2)
Power and Network Devices
PoE FS108P (4)
Cisco PoE SF300-24P (1)

113
Labs RaPBX

Nomenclature des numéros internes

Nom de serveur Extensions

raspbx01 1101, 1102, 1103, 1104

raspbx02 1201, 1202, 1203, 1204

raspbx03 1301, 1302, 1303, 1304

raspbx04 1401, 1402, 1403, 1404

raspbx05 1501, 1502, 1503, 1504

raspbx06 1601, 1602, 1603, 1604

raspbx07 1701, 1702, 1703, 1704

raspbx08 1801, 1802, 1803, 1804

raspbx09 1901, 1902, 1903, 1904

raspbx0a 2001, 2002, 2003, 2004

raspbx0b 2101, 2102, 2103, 2104

raspbx0c 2201, 2202, 2203, 2204

2301, 2302

http://wiki.freepbx.org/display/F2/Extensions+Module+-+SIP+Extension

Application / Extension / Add a SIP Extension


User Extension
Display Name
Devices Options / Secret
Voicemail : Enabled ...

4.2. Configuration du compte Anveo


Numéros de téléphone en format 322XXXXXXX

https://www.anveo.com/faq.asp?code=sip_freepbx

Localized
32 Belgium
00

4.3. Configuration du Trunk SIP


1. Menu Connectivity / Trunks / Add A SIP Trunk
2. Trunk name : Anveo
3. Outbound CallerID : 32XXXXXXXX
4. Trunk name : Anveo
5. Outgoing Settings -> PEER Details, remplacer par le numéro de compte et le mot de passe :
type=friend
host=sip.de.anveo.com
port=5010
username=ACCOUNT_NUMBER
secret=SIP_PASSWORD
insecure=port,invite
disallow=all
allow=ulaw
context=from-trunk

6. Register String : ACCOUNT_NUMBER:SIP_PASSWORD@sip.de.anveo.com:5010

7. Submit

114
Labs RaPBX

4.4. Route sortante


Pour les numéros fixes et cellulaires :

1. Connectivity / Outbound Routes


2. Route Name : Anveo
3. Dial patterns :

0XXXXXXXX

0XXXXXXXXX

Submit

4.5. Route entrante


Par numéro de téléphone routé sur le PBX :

1. Connectivity / Inbound Routes


2. DID Number : 32XXXXXXXX
3. Set Destinations
4. Submit

5. Francisation
Voir téléchargement des scripts français

Modules Administration/Download and install Languages/Apply Config

Asterisk SIP Settings/Advanced General Settings/Language = fr/Apply

6. Boîtes vocales
apt-get remove exim4
apt-get install postfix

installation satellite ou Internet smarhost : serveur SMTP par exemple, smtp.colt.net, relay.skynet.be

http://wiki.freepbx.org/display/F2/Voicemail

7. IVR
Admin / Feature Codes

http://wiki.freepbx.org/display/F2/System+Recordings+Module

http://wiki.freepbx.org/display/F2/IVR+Module

8. Trunk IAX2 intersites


Solution fonctionnelle à travers les pare-feux. Les adresses IP publiques des systèmes téléphoniques doivent être connus.

http://wiki.freepbx.org/pages/viewpage.action?pageId=4161588

9. Sécurité
Activité sous Windows

http://www.oxid.it/cain.html

115
Labs RaPBX

1. Mise en place d’une Attaque MitM ARP Poison Routing entre un PBX et deux téléphones.

2. Capture et reconstitution d’un appel

3. Capture et crack de mot de passe SIP

Activité sous Linux

http://www.backtrack-linux.org/wiki/index.php/Pentesting_VOIP

10. Fail2ban

11. Support du Fax

116
Labs Pi Zero

Labs Pi Zero
En préparation

La plateforme Pi Zero : https://www.raspberrypi.org/magpi/pi-zero-w/


Le kit Octocam : https://shop.pimoroni.com/products/octocam-pi-zero-w-project-kit
Assemblage de Octocam : https://learn.pimoroni.com/tutorial/sandyj/assembling-octocam
Démarrage du Pi Zero : https://learn.pimoroni.com/tutorial/sandyj/motioneye-os-on-your-octocam
Wiki du système MotionEyeOS : https://github.com/ccrisan/motioneyeos/wiki
Lier MotionEyeOS à IFTTT via Maker Webhooks : https://www.pi-supply.com/make/adding-push-notifications-motioneyeos-
formerly-motionpie/

117
Labs BLE

Labs BLE ZigBee RFID


1. Protocole Bluetooth Low Energy

1. Protocole Bluetooth Low Energy


..

118
Labs Mini-Drone Controller

Labs Mini-Drone Controller


Matériel
Connectivité
Capteurs
Batterie
Poids/dimension
Autres
Présentation
Hacking
Connexion HTTP
Connexion Telnet
Shell
CPU
RAM
Points de montage
Noyau Linux
Modules du noyau
Scripts
Script de démarrage
Transférer le système de fichiers localement
Découverte et connexion en BLE
Contrôle en node.js
Capture de trafic BLE
Contrôle de plusieurs minidrones
Contrôle via cylon
Autopilotage
Interface web de contrôle

Matériel

Source : https://www.youtube.com/watch?v=74ssfS2vyyE

119
Labs Mini-Drone Controller

(https://ms01.parrot.com/760-large_parrot/motherboard-rolling-spider.jpg)

CPU : http://elinux.org/ARM926EJ-S
RAM : 32 Mo
Flash : 4 Mo

Connectivité
Bluetooth Smart technology, Bluetooth V4.0 BLE (Bluetooth Low Energy).

Capteurs
capteur ultrasons
un gyroscope 3 axes et un accéléromètre 3 axes
une caméra verticale
un capteur de pression

Batterie
Lithium-Polymer et amovible avec une autonomie de 8 minutes (6 minutes avec les roues) et recharge complète en 90 minutes.

Poids/dimension
Poids : 55g (65g avec les roues)
Diamètre du Rolling Spider : 140 mm
Diamètre des hélices : 55mm
Espacement moteur : 85 mm

Autres
Deux LEDs bi-couleurs
4 moteurs

Présentation
Présentation générale, application IOS/Android, BLE
Hacking Hardware
Hacking Software

Hacking
Inspiré de https://lawlorcode.wordpress.com/2015/08/12/parrot-rolling-spider-uav-hacking-dumping-the-filesystem/

En connectant directant le rolling spider en USB à une station Linux, on constate le montage d'un nouveau disque et la création d'une
interface réseau USB avec une adresse 192.168.2.2/24 :

# df -h | grep media
/dev/sdb1 33M 3,6M 29M 11% /run/media/root/Parrot_RS

# ip add show ens35u2


8: ens35u2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 2e:87:eb:ab:c8:3c brd ff:ff:ff:ff:ff:ff
inet 192.168.2.2/24 brd 192.168.2.255 scope global dynamic ens35u2
valid_lft 863557sec preferred_lft 863557sec
inet6 fe80::2c87:ebff:feab:c83c/64 scope link
valid_lft forever preferred_lft forever

Quelle est l'adresse joignable sur cette nouvelle interface ?

# arp-scan -I ens35u2 192.168.2.0/24


Interface: ens35u2, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.8.4 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
192.168.2.1 12:ca:c7:0e:87:b3 (Unknown)

120
Labs Mini-Drone Controller

1 packets received by filter, 0 packets dropped by kernel


Ending arp-scan 1.8.4: 256 hosts scanned in 2.021 seconds (126.67 hosts/sec). 1 responded

Un scan ARP découvre l'adresse 192.168.2.1 . Quels sont les services à l'écoute sur cette adresse ?

# nmap 192.168.2.1

Starting Nmap 6.40 ( http://nmap.org ) at 2016-06-08 22:00 CEST


Nmap scan report for 192.168.2.1
Host is up (0.0032s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
21/tcp open ftp
23/tcp open telnet
80/tcp open http
MAC Address: 12:CA:C7:0E:87:B3 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 5.77 seconds

Les ports TCP 21 (FTP), 23 (Telnet) et 80 (HTTP) répondent.

Connexion HTTP
On vérifie le port TCP 80 :

# curl http://192.168.2.1
<!DOCTYPE html>
<html>
<body>
<h1>### Parrot Dragon Firmware ###</h1>
<p>TARGET_PRODUCT = delos </p>
<p>BUILD_DATE = 2015-03-06 </p>
<p>BUILD_TIME = 17h51m20s </p>
<p>BUILD_COMPILER = alexandregondeu </p>
<p>BUILD_COMPUTER = ERIC_THE_T-REX </p>
<p>BUILD_MYKONOS3_MAIN_SHA1 = eddcb97ce362380ccdc86c9592c9dad271e44505 </p>
<p>BUILD_DRAGON_VERSION = 1.99.2</p>
</body>
</html>

Connexion Telnet
Que donne une tentative de connexion Telnet ?

# telnet 192.168.2.1
Trying 192.168.2.1...
Connected to 192.168.2.1.
Escape character is '^]'.

BusyBox v1.20.2 (2015-03-06 17:53:39 CET) built-in shell (ash)


Enter 'help' for a list of built-in commands.

------------------------------------
HW Status :
------------------------------------
> Acc/Gyros MPU6050 :OK
> Temp/Press MS5607 :OK

[Delos] $

Shell
On obtient un shell ! On constate l'usage de ces ports TCP via le fichier /etc/inetd.conf .

[Delos] $ cat /etc/inetd.conf


21 stream tcp nowait root ftpd ftpd -w /data/video
5551 stream tcp nowait root ftpd ftpd -w /update
80 stream tcp nowait root busybox httpd -h /www -i

121
Labs Mini-Drone Controller

CPU

$ cat /proc/cpuinfo
Processor : ARM926EJ-S rev 5 (v5l)
BogoMIPS : 207.66
Features : swp half thumb fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5

Hardware : Delos sip6 board


Revision : 2105
Serial : 0000000000000000

RAM

[Delos] $ free -hm


total used free shared buffers
Mem: 28736 17764 10972 0 0
-/+ buffers: 17764 10972
Swap: 0 0 0

Points de montage

[Delos] $ df -h
Filesystem Size Used Available Use% Mounted on
ubi1:system 26.3M 13.0M 11.9M 52% /
tmp 14.0M 64.0K 14.0M 0% /tmp
dev 14.0M 0 14.0M 0% /dev
ubi0:factory 4.8M 116.0K 4.4M 3% /factory
ubi2:update 13.2M 28.0K 12.5M 0% /update
ubi2:data 46.6M 32.9M 11.3M 74% /data

[Delos] $ cat /proc/mounts


rootfs / rootfs rw 0 0
ubi1:system / ubifs rw,relatime 0 0
tmp /tmp tmpfs rw,relatime 0 0
proc /proc proc rw,relatime 0 0
dev /dev tmpfs rw,relatime 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
sys /sys sysfs rw,relatime 0 0
ubi0:factory /factory ubifs ro,relatime 0 0
ubi2:update /update ubifs rw,sync,relatime 0 0
ubi2:data /data ubifs rw,relatime 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0

Noyau Linux

[Delos] $ uname -a
Linux (none) 2.6.36 #1 PREEMPT Fri Mar 6 17:53:21 CET 2015 armv5tejl GNU/Linux

Modules du noyau

[Delos] $ lsmod
Module Size Used by Tainted: G
g_multi 64811 2
fsl_usb2_udc 12792 1 g_multi
usb_storage 37531 0
uvcvideo 62896 0
usbcore 120019 2 usb_storage,uvcvideo
ultra_snd 9017 0

Scripts

[Delos] $ ls /bin/*.sh

122
Labs Mini-Drone Controller

/bin/DragonDebug.sh /bin/create_btconfig.sh /bin/delos_shell.sh /bin/init_motors.sh


/bin/reboot.sh
/bin/DragonStarter.sh /bin/create_imgdisk.sh /bin/delos_shutdown.sh /bin/initsalsa.sh
/bin/reset_config.sh
/bin/activate_coredump.sh /bin/debug_lib.sh /bin/delos_slip.sh /bin/kmemleak.sh
/bin/reset_settings.sh
/bin/blink_led_greenleft.sh /bin/delos_camera.sh /bin/demo_global.sh /bin/login.sh
/bin/set_led_greenleft.sh
/bin/blink_led_orangeleft.sh /bin/delos_devmem_2.sh /bin/detect_data.sh /bin/meminfo.sh
/bin/set_led_orange_both.sh
/bin/bnep_setup.sh /bin/delos_flightmode_start.sh /bin/device_monitoring.sh /bin/memory_check.sh
/bin/set_led_orangeleft.sh
/bin/cgroup.sh /bin/delos_flightmode_stop.sh /bin/dragon_shell.sh /bin/mount_imgdisk.sh
/bin/switch_usb_mode.sh
/bin/check_and_reset_etron.sh /bin/delos_fvt6.sh /bin/etron_checker.sh /bin/mount_usb.sh
/bin/umount_imgdisk.sh
/bin/check_update_demos.sh /bin/delos_gadgetmode_start.sh /bin/etron_setup.sh /bin/nfs.sh
/bin/wifi_setup.sh
/bin/ckcmd_file.sh /bin/delos_gadgetmode_stop.sh /bin/factory_check.sh /bin/nfs_usb.sh
/bin/ckcmd_redirect.sh /bin/delos_lsusb.sh /bin/freeflight_monitoring.sh /bin/pairing_setup.sh
/bin/ckcmd_tcp.sh /bin/delos_monitor_vbus_script.sh /bin/gdbsalsa.sh /bin/parallel-stream.sh
/bin/common_check_update.sh /bin/delos_reset_factory.sh /bin/init_gpios.sh /bin/post.sh

Par exemple :

[Delos] $ cat /bin/blink_led_greenleft.sh


#!/bin/sh

# temp behaviour : red light right on


gpio 33 -d ho 1
# temp behaviour : red light left off
gpio 30 -d ho 0

#green light off


gpio 31 -d ho 0
gpio 32 -d ho 0

while [ 1 ];
do
gpio 32 -d ho 0
usleep 100
gpio 32 -d ho 1
usleep 100
done
[Delos] $ /bin/blink_led_greenleft.sh

^C
[Delos] $

Script de démarrage

[Delos] $ cat /etc/init.d/rcS


#!/bin/sh

# IP_ADDR - this target IP address using CIDR notation:


# <target-ip>/<target-bitmask>
#
# For example:

echo init started...

source /bin/delos_shell.sh

/bin/mount -t tmpfs tmp /tmp


/bin/mount -t proc proc /proc
/bin/mount -o remount,rw /
/bin/mount -t tmpfs dev /dev
/bin/mkdir -p /dev/shm /dev/pts
/bin/mount -t devpts devpts /dev/pts
/bin/mount -t sysfs sys /sys

# Add a symbolic link for each I2C sensor


ln -s /dev/i2c-0 /dev/i2c-akm8963
ln -s /dev/i2c-0 /dev/i2c-mpu6050
ln -s /dev/i2c-0 /dev/i2c-ms5607

#don't allow overcommit (allocate more memory that the physical one)

123
Labs Mini-Drone Controller

echo 2 > /proc/sys/vm/overcommit_memory


echo 90 > /proc/sys/vm/overcommit_ratio

#in case of unaligned access print a message and send a SIGBUS


echo 5 > /proc/cpu/alignment

#reboot after 1s after a panic


echo 1 > /proc/sys/kernel/panic

#panic when an oops or BUG is encountered


#disable this for developer
echo 1 > /proc/sys/kernel/panic_on_oops

echo -1 > /proc/sys/kernel/sched_rt_runtime_us

echo "/sbin/mdev" > /proc/sys/kernel/hotplug


/sbin/mdev -s

mount -t usbfs none /proc/bus/usb

/bin/mkdir -p /update
/bin/mkdir -p /factory
/bin/mount -a

#create groups of priorities


mkdir /dev/cpuctl
mount -t cgroup -ocpu none /dev/cpuctl
#mkdir /dev/cpuctl/video
# reserve most cpu for video tasks
#touch /dev/cpuctl/video/cpu.shares
#echo "2048" > /dev/cpuctl/video/cpu.shares
# group others
mkdir /dev/cpuctl/others
touch /dev/cpuctl/others/cpu.shares
echo "10000" >/dev/cpuctl/others/cpu.shares
touch /dev/cpuctl/others/tasks
for task in $(cat /dev/cpuctl/tasks)
do
echo $task > /dev/cpuctl/others/tasks
done

# Init all LEDs GPIOS


/usr/bin/gpio 30 -d ho 1
/usr/bin/gpio 31 -d ho 0
/usr/bin/gpio 32 -d ho 0
/usr/bin/gpio 33 -d ho 1

# Create mount point for the virtual USB key


mkdir -p ${DELOS_MOUNT_PATH}
# Make it read-only by default
chmod 400 ${DELOS_MOUNT_PATH}

# Load the Ultrasound driver early, it fails otherwise


modprobe ultra_snd

# Be sure we have a config file


if [ ! -s /data/dragon.conf ]
then
cp /etc/default-dragon.conf /data/dragon.conf
fi

if [ ! -s /data/system.conf ]
then
cp /etc/default-system.conf /data/system.conf
fi

# Check the data in /factory, create default values if necessary


# BT config requires dragon.conf to exist
/bin/factory_check.sh
/bin/create_btconfig.sh

/usr/bin/gpio 53 -d i
# Init the EtronTech USB<->Camera chip
/usr/bin/gpio 58 -d ho 1

# Create the FVT6 flash report at first boot


/bin/create_imgdisk.sh ${DELOS_USBDISKIMG_PATH} ${DELOS_MOUNT_PATH} 33 "Parrot_RS"
/bin/delos_fvt6.sh

# Check if an update is available


echo "Check if update is necessary ..."

124
Labs Mini-Drone Controller

if [ -e ${DELOS_MOUNT_PATH} ]; then
# if usb image disk contains a PLF file, move it to the update partition
mount_imgdisk.sh ${DELOS_USBDISKIMG_PATH} ${DELOS_MOUNT_PATH} ${DELOS_PRODUCT_MEDIA_PATH}
/bin/updater/updater_scan.sh ${DELOS_MOUNT_PATH}
/bin/check_update_demos.sh
# unmount_imgdisk.sh ${DELOS_MOUNT_PATH}
fi
/bin/updater/updater_process.sh

# enabling 5V power supply


#/usr/sbin/gpio 89 -d ho 0

if [ -e /etc/hostname ]; then
/bin/hostname -F /etc/hostname
fi
/sbin/ifconfig lo 127.0.0.1 up
/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo

#
# Start permanent TCP/IP services
# Available during flight via BT or via USB
#
inetd

#
# Start telnet deamon
#
telnetd -l /bin/login.sh

init_motors.sh &

modprobe uvcvideo

# Start the ON/OFF button daemon


(/usr/bin/delos_button_onoff)&

# Make a backup of old navdata files


if [ -f /data/navdata_blackbox.bin ]; then mv /data/navdata_blackbox.bin /data/navdata_blackbox_old.bin; fi

# Start UDev
udevd.sh

# Debug management
DragonDebug.sh

#
# Start Bluetooth
#
(BLEproxy $(cat /etc/BLEproxy.args 2>/dev/null) >/dev/null 2>/dev/null) &

#
# Start the main soft
#
echo "Launching Dragon" | logger -s -t "rcS" -p user.info
DragonStarter.sh -out2null &

# Start the FSM managing USB Modes


(delos_monitor_vbus_script.sh)&

echo end init...

Transférer le système de fichiers localement


Sur le rolling spider, [^p][^y] évitant /proc et /sys :

tar cpf - [^p][^y]* | nc -l -p 1234

Sur la station connectée :

nc 192.168.2.1 1234 > rootfs.tar

Découverte et connexion en BLE


http://wiki.paparazziuav.org/wiki/Rolling_Spider#Connect_with_Bluetooth

125
Labs Mini-Drone Controller

Contrôle en node.js
https://github.com/voodootikigod/node-rolling-spider

Capture de trafic BLE

Contrôle de plusieurs minidrones


https://github.com/voodootikigod/node-rolling-spider/blob/master/eg/swarm.js
https://github.com/search?p=2&q=rolling+spider&type=Repositories&utf8=%E2%9C%93

Contrôle via cylon


https://cylonjs.com/
https://github.com/ChrisTheBaron/cylon-rolling-spider

Autopilotage
https://wiki.paparazziuav.org/wiki/Main_Page
http://wiki.paparazziuav.org/wiki/Rolling_Spider

Interface web de contrôle


https://github.com/goffinet/spider-web

126
Labs Parrot Flower Power

Labs Parrot Flower Power


http://www.parrot.com/fr/produits/flower-power/
http://www.parrot.com/fr/support/parrot-flower-power/
https://myflowerpower.parrot.com/
http://developer.parrot.com/products.html
http://developer.parrot.com/docs/FlowerPower/
https://github.com/parrot-flower-power/parrot-flower-power-api-example
https://github.com/parrot-flower-power/node-flower-power-cloud
https://github.com/search?p=2&q=parrot+power+flower&ref=searchresults&type=Repositories&utf8=%E2%9C%93

127
Labs Arduino

Labs Arduino

128

Vous aimerez peut-être aussi