Iot
Iot
Préface 1.1
2
Préface
Préface
Ce document est un support de formation sur le sujet de l'Internet des Objets (IoT).
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
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.
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.
Source : https://iot-analytics.com/10-internet-of-things-applications/
6
L'Internet des Objets
Le marché est ici divisé selon le type de clientèle "grand public" et "Entreprise".
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
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
2. Plateformes IoT
MIPS
ARM
X86
PowerPC
Processeurs
ARM Intel/AMD
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
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.
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
...
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
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
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.
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.
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 :
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.
[Diagramme]
L'élément fondamental dans le modèle "pub/sub" est la dissociation des clients publisher et subscriber.
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 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.
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
5. Topics MQTT
6. Qualité de Service
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
4. Authorization
5. TLS / SSL
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
1. Graphes
https://emoncms.org/
Xively
Google charts
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
type mosquitto
field value
address test.mosquitto.org
type mosquitto
field value
address dev.rabbitmq.com
20
Architectures IoT
port 1883
type rabbitmq
field value
address broker.mqttdashboard.com
type HiveMQ
field value
address q.m2m.io
port 1883
type m2m.io
field value
type mosquitto
info requires signup/username and password, pricing (free plan available), documentation
field value
address mqtt.simpleml.com
type SimpleML
field value
address mqtt.kgbvax.net
type mosquitto
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.
21
Architectures IoT
4. Node-Red
Logiciels :
Node-RED : https://en.wikipedia.org/wiki/Node-RED, https://nodered.org/docs/
...
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
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
26
Labs OpenWRT
Firewall
Diagnostics
8. Activités étendues
1. Matériel nécessaire
1.1. 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
27
Labs OpenWRT
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.
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é.
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
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
32
Labs OpenWRT
pscp.exe
plink.exe
WinSCP
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
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
Procédure
Etape 1 : Identification de la version du matériel
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.
Mise à jour du firmware. Le routeur est accessible par défaut en HTTP sur l’adresse 192.168.0.1.
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.
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
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.
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
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/about/latest,
http://openwrt.org/doc/howto/generic.sysupgrade,
http://openwrt.org/doc/techref/sysupgrade
Première Option
Directement à partir du routeur avec vérification d’intégrité (connexion WAN nécessaire), veuillez adapter les URLs :
ar71xx-generic-tl-wr841n-v9-squashfs-sysupgrade.bin
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
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/
4. Vérification du réseau
Sources et compléments : http://openwrt.org/doc/uci/network
ifconfig -a
35
Labs OpenWRT
route
route -A inet6
traceroute www.google.com
ping www.google.com
ping 8.8.8.8
ping 192.168.1.1
cat /etc/resolv.conf
cat /tmp/resolv.conf.auto
Résolution de nom :
nslookup www.google.com
/etc/init.d/network restart
cat /etc/sysctl.conf
5. Fichiers de configuration
5.1. Services
ps
top
ps | grep uhttpd
ps | grep dropbear
36
Labs OpenWRT
ls -l /etc/config/
cat /etc/config/wireless
less /etc/config/network
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
passwd
Vérification
38
Labs OpenWRT
reboot
vi /etc/config/system
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
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
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
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.
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.
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
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
cd $MIRABUILD/linux-stable
git checkout v4.14.16
git checkout -b v4.14.16-mirabox
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
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
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
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).
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
cd $MIRABUILD/linux-stable
make ARCH=arm modules
sudo make ARCH=arm INSTALL_MOD_PATH=$MIRABUILD/debian_armhf_stretch modules_install
If you've already created an initial ramdisk and need to update, use this instead:
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
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.
Add the configuration file for fw_printenv and fw_setenv so the u-boot configuration and be modified from the operating system.
Set the root password so we can login the first time we boot.
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
44
Debian Cross-Compilation for Mirabox
Don't worry about the warning issued by mkfs.vfat, it won't affect the Mirabox.
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
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.
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
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
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 :
48
Labs Littlebits
2. Circuits simples
49
Labs Littlebits
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
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
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.
Source : http://hackerboards.com/tiny-linux-sbc-taps-plug-and-play-iot-modules/
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
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 :
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.
#!/bin/bash
DEVICE_ID=put_your_device_id
TOKEN=put_your_device_token
# 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
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
}
5. Automation IFTT
https://ifttt.com/
60
Labs Cloudbits
6. Cloudbits hacking
61
Labs Cloudbits
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.
NOTO: If I can get permission from LittleBits I will provide access to a CloudBit image that already has SSHD running and ready..
Open terminal
connect sdcard to Mac
type sudo dd if=/dev/disk1s3 of=/tmp/backupfile.img
Mount FileSystem
Remove SD card from the CloudBit
Use Spotlight to open Disk Utility
One line form: mkdir /Volumes/little && sudo fuse-ext2 -o force /dev/disk1s3 /Volumes/little && cd /Volumes/little
edit /Volumes/little/etc/ssh/sshd_config
change UsePAM yes to UsePAM no
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 .
Linux Access
62
Labs Cloudbits
Shadow file
Generate password: openssl passwd -1 -salt bit cloud
Other Info
netstat -an
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]#
63
Labs Cloudbits
Query ADC
Other commands
[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/
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
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
$ sudo rpi-update
Installation de Node-Red
!!! à réviser !!!
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.
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. :)
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.
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!
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:
Raspberry Pi Documentation by the Raspberry Pi Foundation is licensed under a Creative Commons Attribution 4.0 International
License.
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)
73
Labs 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.
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
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)
#time.sleep(20)
signal.pause()
# Exit!
76
Labs Pibrella
Source : http://pibrella.com/#projects
sudo python -i
import pibrella
pibrella.buzzer.fail()
pibrella.light.pulse(0.2)
En terminer.
quit()
sudo python -i
def alarm(pin):
pibrella.buzzer.fail() # make some noise
pibrella.light.pulse() # flash lights
def reset(pin):
pibrella.light.stop() # reset alarm
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)
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
pibrella.light.red.on()
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()
pibrella.light.on()
pibrella.light.red.blink(ON_TIME, OFF_TIME)
Par pulsation.
pibrella.light.red.pulse(0, 0, 1, 1)
pibrella.light.red.blink(1, 1)
pibrella.output.e.on()
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.
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".
my_value = pibrella.input.a.read()
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.
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 )
pibrella.buzzer.fail()
pibrella.buzzer.success()
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()
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.
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
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:
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.
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.
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.
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 !
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é.
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
Source : https://github.com/johnblackmore/pibrella-adventures
82
Labs Pibrella
# 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]
]
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)
cd ~/pibrella/examples
sudo python react.py
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.
84
Labs Pibrella
cd ~/.node-red
npm install node-red-{example node name}
cd ~/.node-red
npm install node-red-node-pibrella
sudo reboot
[
{
"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": []
}
]
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": []
}
]
#!/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
Pour des scripts de communication SIP, il est préférable d'utiliser la librairie PJSIP.
...
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
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
Mise en place
Commencer Labs Raspberry Pi : Mise en place
http://www.dexterindustries.com/GrovePi/get-started-with-the-grovepi/setting-software/
_____ _
| __ \ | |
| | | | _____ _| |_ ___ _ __
| | | |/ _ \ \/ / __/ _ \ '__|
| |__| | __/> <| || __/ |
|_____/ \___/_/\_\__\___|_| _ _
|_ _| | | | | (_)
| | _ __ __| |_ _ ___| |_ _ __ _ ___ ___
| | | '_ \ / _` | | | / __| __| '__| |/ _ \/ __|
_| |_| | | | (_| | |_| \__ \ |_| | | | __/\__ \
|_____|_| |_|\__,_|\__,_|___/\__|_| |_|\___||___/
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
Special thanks to Joe Sanford at Tufts University. This script was derived from his work. Thank you Joe!
bash /home/pi/Desktop/GrovePi/Script/update_grovepi.sh
cd /home/pi/Desktop/GrovePi/Firmware
sudo ./firmware_update.sh
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.
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
grovepi.pinMode(air_sensor,"INPUT")
while True:
try:
# Get sensor value
sensor_value = grovepi.analogRead(air_sensor)
except IOError:
print ("Error")
/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
grovepi.pinMode(light_sensor,"INPUT")
grovepi.pinMode(led,"OUTPUT")
while True:
try:
# Get sensor value
sensor_value = grovepi.analogRead(light_sensor)
101
Labs GrovePi
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).
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
address test.mosquitto.org
port 1883, 8883 (SSL), 8884 (SSL), 80 (WebSockets)
type mosquitto
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
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"}]
Questions / Améliorations
Format de publication MQTT
Consommation de ressources
Communication de données
Stockage des données
charge (autonomie)
Sécurité
confidentialité
authentification
Qualité de service
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.
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
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
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
raspi-config
Choisir et confugurer :
Finish/reboot
rpi-update
reboot
raspbx-upgrade
apt-get install tcpdump tshark wireshark ntpdate
112
Labs RaPBX
Exécution du script
./astpbx_fr.sh
4. Endpoint Manager
5. Time Conditions
6. Ring Groups
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
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
113
Labs RaPBX
2301, 2302
http://wiki.freepbx.org/display/F2/Extensions+Module+-+SIP+Extension
https://www.anveo.com/faq.asp?code=sip_freepbx
Localized
32 Belgium
00
7. Submit
114
Labs RaPBX
0XXXXXXXX
0XXXXXXXXX
Submit
5. Francisation
Voir téléchargement des scripts français
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
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.
http://www.backtrack-linux.org/wiki/index.php/Pentesting_VOIP
10. Fail2ban
116
Labs Pi Zero
Labs Pi Zero
En préparation
117
Labs BLE
118
Labs Mini-Drone Controller
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
120
Labs Mini-Drone Controller
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
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 '^]'.
------------------------------------
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 .
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
RAM
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
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
Par exemple :
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
source /bin/delos_shell.sh
#don't allow overcommit (allocate more memory that the physical one)
123
Labs Mini-Drone Controller
/bin/mkdir -p /update
/bin/mkdir -p /factory
/bin/mount -a
if [ ! -s /data/system.conf ]
then
cp /etc/default-system.conf /data/system.conf
fi
/usr/bin/gpio 53 -d i
# Init the EtronTech USB<->Camera chip
/usr/bin/gpio 58 -d ho 1
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
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 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 &
125
Labs Mini-Drone Controller
Contrôle en node.js
https://github.com/voodootikigod/node-rolling-spider
Autopilotage
https://wiki.paparazziuav.org/wiki/Main_Page
http://wiki.paparazziuav.org/wiki/Rolling_Spider
126
Labs Parrot Flower Power
127
Labs Arduino
Labs Arduino
128