Difference between revisions of "SmartCampus2014/Tutoriels"

From air
Jump to navigation Jump to search
Line 13: Line 13:
 
* Pour Debian/Ubuntu et dérivés: [http://mosquitto.org/2013/01/mosquitto-debian-repository/]
 
* Pour Debian/Ubuntu et dérivés: [http://mosquitto.org/2013/01/mosquitto-debian-repository/]
 
* Ensuite télécharger le client en ligne de commande:
 
* Ensuite télécharger le client en ligne de commande:
  +
<pre>
 
  +
<source lang="bash">
 
sudo apt-get install mosquitto python-mosquitto
 
sudo apt-get install mosquitto python-mosquitto
 
sudo apt-get install mosquitto-clients
 
sudo apt-get install mosquitto-clients
</pre>
+
</source>
   
 
== Exemple de communication ==
 
== Exemple de communication ==
 
* Dans un premier terminal on lance le broker :
 
* Dans un premier terminal on lance le broker :
  +
<source lang="bash">
<pre>
 
 
>mosquitto
 
>mosquitto
 
1391181009: mosquitto version 1.2.3 (build date 2013-12-04 21:22:55+0000) starting
 
1391181009: mosquitto version 1.2.3 (build date 2013-12-04 21:22:55+0000) starting
Line 26: Line 27:
 
1391181009: Opening ipv4 listen socket on port 1883.
 
1391181009: Opening ipv4 listen socket on port 1883.
 
1391181009: Opening ipv6 listen socket on port 1883.
 
1391181009: Opening ipv6 listen socket on port 1883.
</pre>
+
</source>
 
Sur certaines distributions, mosquitto peut se trouver dans /usr/sbin/.
 
Sur certaines distributions, mosquitto peut se trouver dans /usr/sbin/.
   
 
* Dans un second terminal on crée un topic "toto" sur lequel on publie des messages.
 
* Dans un second terminal on crée un topic "toto" sur lequel on publie des messages.
  +
<source lang="bash">
<pre>
 
 
mosquitto_sub -d -t toto
 
mosquitto_sub -d -t toto
</pre>
+
</source>
   
 
* Dans un dernier terminal on publie sur le topic "toto".
 
* Dans un dernier terminal on publie sur le topic "toto".
  +
<source lang="bash">
<pre>
 
 
mosquitto_pub -t toto -m "Hello world "
 
mosquitto_pub -t toto -m "Hello world "
</pre>
+
</source>
   
 
* Pour communiquer entre différents devices, il faut lancer le broker sur chacun d'eux, puis indiquer lors du subscribe l'adresse IP du publisher.
 
* Pour communiquer entre différents devices, il faut lancer le broker sur chacun d'eux, puis indiquer lors du subscribe l'adresse IP du publisher.
 
Par exemple :
 
Par exemple :
  +
<source lang="bash">
<pre>
 
 
mosquitto_sub -d -h 192.168.0.1 -t toto
 
mosquitto_sub -d -h 192.168.0.1 -t toto
</pre>
+
</source>
   
   
Line 54: Line 55:
   
 
Ajouter l'URL du broker dans le fichier de configuration d'openHAB (e.g. openhab.cfg) :
 
Ajouter l'URL du broker dans le fichier de configuration d'openHAB (e.g. openhab.cfg) :
  +
<source lang="java">
<pre>
 
 
mqtt:mosquitto.url=tcp://localhost:1883
 
mqtt:mosquitto.url=tcp://localhost:1883
</pre>
+
</source>
   
 
== Subscribe ==
 
== Subscribe ==
 
Lier un item à un topic en indiquant l'alias du broker, le type des messages transmis, et l'action effectuée sur openHAB sur réception des messages :
 
Lier un item à un topic en indiquant l'alias du broker, le type des messages transmis, et l'action effectuée sur openHAB sur réception des messages :
  +
<source lang="java">
<pre>
 
 
{ mqtt="<[<broker>:<topic>:<type>:<transformation>]" }
 
{ mqtt="<[<broker>:<topic>:<type>:<transformation>]" }
</pre>
+
</source>
 
où <type> est soit "command" soit "state" (pour l'update), et où <transformation> est "default".
 
où <type> est soit "command" soit "state" (pour l'update), et où <transformation> est "default".
   
 
Par exemple :
 
Par exemple :
  +
<source lang="java">
<pre>
 
 
Number Temperature_GF_Corridor "Temperature [%.1f °C]" <temperature> (Temperature, GF_Corridor) { mqtt="[mosquitto:temperature:state:default]" }
 
Number Temperature_GF_Corridor "Temperature [%.1f °C]" <temperature> (Temperature, GF_Corridor) { mqtt="[mosquitto:temperature:state:default]" }
</pre>
+
</source>
   
 
On peut alors publier avec "mosquitto_pub" sur le topic défini (e.g. "temperature") et voir le changement dans l'interface openHAB.
 
On peut alors publier avec "mosquitto_pub" sur le topic défini (e.g. "temperature") et voir le changement dans l'interface openHAB.
Line 76: Line 77:
 
Le principe est relativement semblable. On lance "mosquitto_sub" sur le topic voulu (e.g. "light").
 
Le principe est relativement semblable. On lance "mosquitto_sub" sur le topic voulu (e.g. "light").
 
Lier un item à un topic en indiquant l'alias du broker, le type des messages transmis, le déclencheur de l'envoi de message, et la transformation :
 
Lier un item à un topic en indiquant l'alias du broker, le type des messages transmis, le déclencheur de l'envoi de message, et la transformation :
  +
<source lang="java">
<pre>
 
 
{ mqtt=">[<broker>:<topic>:<type>:<trigger>:<transformation>]" }
 
{ mqtt=">[<broker>:<topic>:<type>:<trigger>:<transformation>]" }
</pre>
+
</source>
   
 
Par exemple :
 
Par exemple :
  +
<source lang="java">
<pre>
 
 
Switch Light_Outdoor_Garage "Garage" (Outdoor, Lights) { mqtt=">[mosquitto:light:command:ON:1],>[mosquitto:light:command:OFF:0]" }
 
Switch Light_Outdoor_Garage "Garage" (Outdoor, Lights) { mqtt=">[mosquitto:light:command:ON:1],>[mosquitto:light:command:OFF:0]" }
</pre>
+
</source>
 
Ici, lorsque l'interrupteur de la lumière du garage est actionné, le subscriber Mosquitto reçoit 0 ou 1.
 
Ici, lorsque l'interrupteur de la lumière du garage est actionné, le subscriber Mosquitto reçoit 0 ou 1.
   
Line 98: Line 99:
 
* Créer un nouveau sketch :
 
* Créer un nouveau sketch :
   
  +
<source lang="c">
<pre>
 
 
void setup() {
 
void setup() {
 
// put your setup code here, to run once:
 
// put your setup code here, to run once:
Line 109: Line 110:
 
// put your main code here, to run repeatedly:
 
// put your main code here, to run repeatedly:
 
}
 
}
</pre>
+
</source>
   
 
Attention, il faut garder la boucle ''loop'' dans le code, même vide, pour ne pas avoir d'erreur. Dans cet exemple, nous lançons le service Telnet mais si on utilise seulement SSH, cette ligne n'est pas nécessaire.
 
Attention, il faut garder la boucle ''loop'' dans le code, même vide, pour ne pas avoir d'erreur. Dans cet exemple, nous lançons le service Telnet mais si on utilise seulement SSH, cette ligne n'est pas nécessaire.
Line 116: Line 117:
   
 
* Configurer le PC en mode routeur (en root sous Linux) :
 
* Configurer le PC en mode routeur (en root sous Linux) :
  +
<source lang="bash">
<pre>
 
 
sysctl net.ipv4.ip_forward=1
 
sysctl net.ipv4.ip_forward=1
</pre>
+
</source>
   
 
* Activer le NAT sur le PC (en root sous Linux) :
 
* Activer le NAT sur le PC (en root sous Linux) :
  +
<source lang="bash">
<pre>
 
 
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
 
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
 
iptables -A FORWARD -i wlan0 -o eth0:avahi -m state --state RELATED,ESTABLISHED -j ACCEPT
 
iptables -A FORWARD -i wlan0 -o eth0:avahi -m state --state RELATED,ESTABLISHED -j ACCEPT
 
iptables -A FORWARD -i eth0:avahi -o wlan0 -j ACCEPT
 
iptables -A FORWARD -i eth0:avahi -o wlan0 -j ACCEPT
</pre>
+
</source>
   
 
* Sur Galileo, si la résolution d'adresse ne fonctionne pas (e.g. ping www.google.com ne marche pas), configurer le DNS en ajoutant à /etc/resolv.conf :
 
* Sur Galileo, si la résolution d'adresse ne fonctionne pas (e.g. ping www.google.com ne marche pas), configurer le DNS en ajoutant à /etc/resolv.conf :
  +
<source lang="bash">
<pre>
 
 
domain grenet.fr
 
domain grenet.fr
 
search grenet.fr
 
search grenet.fr
 
nameserver 130.190.190.4
 
nameserver 130.190.190.4
</pre>
+
</source>
 
<i><b>Attention</b> : les domaines ci-dessus sont valables seulement pour un PC connecté à wifi-campus. Sur un autre réseau, il suffit (sur un système UNIX) de copier le contenu de /etc/resolv.conf</i>
 
<i><b>Attention</b> : les domaines ci-dessus sont valables seulement pour un PC connecté à wifi-campus. Sur un autre réseau, il suffit (sur un système UNIX) de copier le contenu de /etc/resolv.conf</i>
   
Line 139: Line 140:
 
* Sur windows la connexion se fera automatiquement, mais sur Linux il faut changer l’adresse IP de la carte Ethernet pour être sur le même réseau que le Galileo :
 
* Sur windows la connexion se fera automatiquement, mais sur Linux il faut changer l’adresse IP de la carte Ethernet pour être sur le même réseau que le Galileo :
   
  +
<source lang="bash">
<pre>
 
 
sudo ifconfig eth0 169.254.1.2 up
 
sudo ifconfig eth0 169.254.1.2 up
</pre>
+
</source>
   
 
* Faire un ping vers l’adresse ip 169.254.1.1 pour vérifier que la connexion fonctionne (si cela ne marche pas, il peut être judicieux de déconnecter la prise secteur de la carte et de la rebrancher).
 
* Faire un ping vers l’adresse ip 169.254.1.1 pour vérifier que la connexion fonctionne (si cela ne marche pas, il peut être judicieux de déconnecter la prise secteur de la carte et de la rebrancher).
Line 147: Line 148:
 
* Lorsque le ping fonctionne, il est possible de se connecter en root à la carte Galileo, soit en utilisant un client SSH de type PuTTY, ou via la commande :
 
* Lorsque le ping fonctionne, il est possible de se connecter en root à la carte Galileo, soit en utilisant un client SSH de type PuTTY, ou via la commande :
   
  +
<source lang="bash">
<pre>
 
 
ssh root@169.254.1.1
 
ssh root@169.254.1.1
</pre>
+
</source>
   
 
= Mis en place d'une base de donnée mongodb (en locale) =
 
= Mis en place d'une base de donnée mongodb (en locale) =
Line 161: Line 162:
   
 
Pour accéder au contenu d'une collection de votre base de donnée, lancer la base de donnée en utilisant la commande :
 
Pour accéder au contenu d'une collection de votre base de donnée, lancer la base de donnée en utilisant la commande :
  +
<source lang="bash">
<pre>
 
sudo mongod --rest
+
sudo mongod --rest
</pre>
+
</source>
   
 
puis dans votre navigateur, accéder à l'URL :
 
puis dans votre navigateur, accéder à l'URL :
Line 171: Line 172:
   
 
Pour ajouter une base de donnée lancer mongo en version shell :
 
Pour ajouter une base de donnée lancer mongo en version shell :
  +
<source lang="bash">
<pre>
 
 
mongo
 
mongo
</pre>
+
</source>
 
Pour visualiser l'ensemble des bases de données :
 
Pour visualiser l'ensemble des bases de données :
  +
<source lang="bash">
<pre>
 
 
show dbs
 
show dbs
</pre>
+
</source>
 
Afin de créer une base de donnée ou se connecter à l'une d'elle :
 
Afin de créer une base de donnée ou se connecter à l'une d'elle :
  +
<source lang="bash">
<pre>
 
 
use nomBD
 
use nomBD
</pre>
+
</source>
   
 
= Mis en place NodeJs Mongoose =
 
= Mis en place NodeJs Mongoose =
Line 189: Line 190:
 
Effectuer le point précédent
 
Effectuer le point précédent
 
Lancer les commandes :
 
Lancer les commandes :
  +
<source lang="bash">
<pre>
 
 
npm install mongoose
 
npm install mongoose
 
npm install express
 
npm install express
 
npm install express-restify-mongoose
 
npm install express-restify-mongoose
</pre>
+
</source>
   
 
== Connexion à la BD ==
 
== Connexion à la BD ==
Line 199: Line 200:
 
Afin de se connecter à la BD réalisée précédemment :
 
Afin de se connecter à la BD réalisée précédemment :
   
  +
<source lang="javascript">
<pre>
 
 
//Connection to the a mongodb database path localhost:port/nameOfDB
 
//Connection to the a mongodb database path localhost:port/nameOfDB
 
mongoose.connect("mongodb://localhost:27017/Client", function(err) {
 
mongoose.connect("mongodb://localhost:27017/Client", function(err) {
Line 206: Line 207:
 
}
 
}
 
});
 
});
</pre>
+
</source>
   
 
On définit le schéma d'une collection en définissant son id et un champs
 
On définit le schéma d'une collection en définissant son id et un champs
   
  +
<source lang="javascript">
<pre>
 
 
//Definition of a schema
 
//Definition of a schema
 
var Temperature = new Schema({
 
var Temperature = new Schema({
Line 216: Line 217:
 
temp: Number
 
temp: Number
 
});
 
});
</pre>
+
</source>
   
 
Création du modèle
 
Création du modèle
   
  +
<source lang="javascript">
<pre>
 
 
var TemperatureModel = mongoose.model('temperature', Temperature);
 
var TemperatureModel = mongoose.model('temperature', Temperature);
   
 
//Creation of an object which respect the model define before
 
//Creation of an object which respect the model define before
 
var myTemperatureModel = new TemperatureModel({_id: 1473, temp: 16});
 
var myTemperatureModel = new TemperatureModel({_id: 1473, temp: 16});
</pre>
+
</source>
   
 
Ajout d'un élèment dans la base de donnée.
 
Ajout d'un élèment dans la base de donnée.
   
  +
<source lang="javascript">
<pre>
 
 
//saved the temperature in the mongodb database
 
//saved the temperature in the mongodb database
 
myTemperatureModel.save(function(err){
 
myTemperatureModel.save(function(err){
if (err) { throw err; }
+
if (err) { throw err; }
console.log('Commentaire ajouté avec succès !');
+
console.log('Commentaire ajouté avec succès !');
// On se déconnecte de MongoDB maintenant
+
// On se déconnecte de MongoDB maintenant
mongoose.connection.close();
+
mongoose.connection.close();
});
+
});
  +
</source>
 
</pre>
 
   
 
= Mis en place NodeJs Mongoose MQTT =
 
= Mis en place NodeJs Mongoose MQTT =
Line 245: Line 245:
   
 
Installation de mqtt
 
Installation de mqtt
  +
<source lang="bash">
<pre>
 
 
npm install mqtt
 
npm install mqtt
</pre>
+
</source>
   
 
== Utilisation ==
 
== Utilisation ==
Line 253: Line 253:
 
On fait appel à la librairie mqtt :
 
On fait appel à la librairie mqtt :
   
  +
<source lang="javascript">
<pre>
 
 
var mqtt = require('mqtt')
 
var mqtt = require('mqtt')
</pre>
+
</source>
  +
 
Connexion au broker sur le port 1883 :
 
Connexion au broker sur le port 1883 :
   
  +
<source lang="javascript">
<pre>
 
 
client = mqtt.createClient(1883, 'localhost');
 
client = mqtt.createClient(1883, 'localhost');
</pre>
+
</source>
   
 
On subscribe au topic 'temperature', et à chaque réception de ce topic on affiche ce qui a été reçu dans la console:
 
On subscribe au topic 'temperature', et à chaque réception de ce topic on affiche ce qui a été reçu dans la console:
  +
<source lang="javascript">
<pre>
 
 
client.subscribe('temperature');
 
client.subscribe('temperature');
 
client.on('message', function (topic, message) {
 
client.on('message', function (topic, message) {
 
console.log(message);
 
console.log(message);
 
});
 
});
<pre>
+
<source>
   
 
On peut également publier sur le topic 'light' l'info 'On' :
 
On peut également publier sur le topic 'light' l'info 'On' :
  +
<source lang="javascript">
<pre>
 
 
client.publish('light', 'On');
 
client.publish('light', 'On');
</pre>
+
</javascript>
 
 
En lançant ces commandes le texte 'On' devrai apparaitre sur votre console.
+
En lançant ces commandes le texte 'On' devrait apparaître sur votre console.
   
 
= Utilisation de NodeJS Mongoose MQTT et Mosquitto =
 
= Utilisation de NodeJS Mongoose MQTT et Mosquitto =
Line 289: Line 290:
 
Dans le .js Node ajouter le code suivant :
 
Dans le .js Node ajouter le code suivant :
   
  +
<source lang="javascript">
<pre>
 
 
var http = require('http');
 
var http = require('http');
 
var express = require('express');
 
var express = require('express');
Line 349: Line 350:
 
console.log("Express server listening on port 4242");
 
console.log("Express server listening on port 4242");
 
});
 
});
  +
</source>
 
</pre>
 
   
 
Lancer ceci avec Node.
 
Lancer ceci avec Node.
   
 
Lancer mosquitto et publier sur le topic 'light' :
 
Lancer mosquitto et publier sur le topic 'light' :
  +
<source lang="bash">
<pre>
 
 
mosquitto
 
mosquitto
 
mosquitto_pub -t temperature -m "25"
 
mosquitto_pub -t temperature -m "25"
</pre>
+
</source>
   
 
Par la suite, vous devriez voir le message "25°C" dans la console.
 
Par la suite, vous devriez voir le message "25°C" dans la console.
 
De plus, à l'adresse http://localhost:28017/Client/temperatures/ vous devriez apercevoir l'ajout d'un objet JSON contenant en paramètre 'temp' à 25.
 
De plus, à l'adresse http://localhost:28017/Client/temperatures/ vous devriez apercevoir l'ajout d'un objet JSON contenant en paramètre 'temp' à 25.
  +
  +
= Intégrer une carte Google et fixer ses limites =
  +
  +
<source lang="xml">
  +
<!DOCTYPE html>
  +
<html>
  +
<head>
  +
<style type="text/css">
  +
html { height: 100% }
  +
body { height: 100%; margin: 0; padding: 0 }
  +
#map-canvas { height: 100% }
  +
</style>
  +
<script type="text/javascript"
  +
src="http://maps.google.com/maps/api/js?sensor=false"></script>
  +
</script>
  +
<script type="text/javascript">
  +
function initialize() {
  +
var mapOptions = {
  +
center: new google.maps.LatLng(45.19091427, 5.76828361), // centrer sur le campus de SMH
  +
zoom: 15,
  +
mapTypeId: google.maps.MapTypeId.ROADMAP
  +
};
  +
var map = new google.maps.Map(document.getElementById("map-canvas"),
  +
mapOptions);
  +
  +
// bounds of the desired area
  +
var allowedBounds = new google.maps.LatLngBounds( // limites du campus
  +
new google.maps.LatLng(45.18575736, 5.75114965),
  +
new google.maps.LatLng(45.20112086, 5.78054667)
  +
);
  +
var boundLimits = {
  +
maxLat : allowedBounds.getNorthEast().lat(),
  +
maxLng : allowedBounds.getNorthEast().lng(),
  +
minLat : allowedBounds.getSouthWest().lat(),
  +
minLng : allowedBounds.getSouthWest().lng()
  +
};
  +
  +
var lastValidCenter = map.getCenter();
  +
var newLat, newLng;
  +
google.maps.event.addListener(map, 'center_changed', function() {
  +
center = map.getCenter();
  +
if (allowedBounds.contains(center)) {
  +
// still within valid bounds, so save the last valid position
  +
lastValidCenter = map.getCenter();
  +
return;
  +
}
  +
newLat = lastValidCenter.lat();
  +
newLng = lastValidCenter.lng();
  +
if(center.lng() > boundLimits.minLng && center.lng() < boundLimits.maxLng){
  +
newLng = center.lng();
  +
}
  +
if(center.lat() > boundLimits.minLat && center.lat() < boundLimits.maxLat){
  +
newLat = center.lat();
  +
}
  +
map.panTo(new google.maps.LatLng(newLat, newLng));
  +
});
  +
}
  +
google.maps.event.addDomListener(window, 'load', initialize);
  +
</script>
  +
</head>
  +
<body>
  +
<div id="map-canvas"/>
  +
</body>
  +
</html>
  +
</source>

Revision as of 14:41, 18 February 2014

Liens

Mosquitto

Mosquitto est une implémentation de MQTT, un protocole de M2M de type publish-subscribe.

Installation

  • Documentation officielle : [1]
  • Pour Debian/Ubuntu et dérivés: [2]
  • Ensuite télécharger le client en ligne de commande:
sudo apt-get install mosquitto python-mosquitto
sudo apt-get install mosquitto-clients

Exemple de communication

  • Dans un premier terminal on lance le broker :
>mosquitto
1391181009: mosquitto version 1.2.3 (build date 2013-12-04 21:22:55+0000) starting
1391181009: Using default config.
1391181009: Opening ipv4 listen socket on port 1883.
1391181009: Opening ipv6 listen socket on port 1883.

Sur certaines distributions, mosquitto peut se trouver dans /usr/sbin/.

  • Dans un second terminal on crée un topic "toto" sur lequel on publie des messages.
mosquitto_sub -d -t toto
  • Dans un dernier terminal on publie sur le topic "toto".
mosquitto_pub  -t toto -m "Hello world "
  • Pour communiquer entre différents devices, il faut lancer le broker sur chacun d'eux, puis indiquer lors du subscribe l'adresse IP du publisher.

Par exemple :

mosquitto_sub -d -h 192.168.0.1 -t toto


Comment utiliser openHAB avec Mosquitto ?

Requis

Il faut en premier lieu ajouter le bundle MQTT bindings (disponible ici) dans le dossier "addons" du runtime openHAB.

Ne pas oublier de lancer le broker Mosquitto (commande mosquitto).

Ajouter l'URL du broker dans le fichier de configuration d'openHAB (e.g. openhab.cfg) :

mqtt:mosquitto.url=tcp://localhost:1883

Subscribe

Lier un item à un topic en indiquant l'alias du broker, le type des messages transmis, et l'action effectuée sur openHAB sur réception des messages :

{ mqtt="<[<broker>:<topic>:<type>:<transformation>]" }

où <type> est soit "command" soit "state" (pour l'update), et où <transformation> est "default".

Par exemple :

Number Temperature_GF_Corridor 	"Temperature [%.1f °C]"	<temperature>	(Temperature, GF_Corridor) { mqtt="[mosquitto:temperature:state:default]" }

On peut alors publier avec "mosquitto_pub" sur le topic défini (e.g. "temperature") et voir le changement dans l'interface openHAB.

Publish

Le principe est relativement semblable. On lance "mosquitto_sub" sur le topic voulu (e.g. "light"). Lier un item à un topic en indiquant l'alias du broker, le type des messages transmis, le déclencheur de l'envoi de message, et la transformation :

{ mqtt=">[<broker>:<topic>:<type>:<trigger>:<transformation>]" }

Par exemple :

Switch Light_Outdoor_Garage "Garage" (Outdoor, Lights)  { mqtt=">[mosquitto:light:command:ON:1],>[mosquitto:light:command:OFF:0]" }

Ici, lorsque l'interrupteur de la lumière du garage est actionné, le subscriber Mosquitto reçoit 0 ou 1.

Pour plus d'informations, voir le wiki officiel ici.

Comment se connecter en SSH à la carte Galileo

Voir le tutoriel officiel d'Intel : Galileo_GettingStarted.pdf

Configuration de la carte Galileo

  • Avant tout, il est important de toujours alimenter la carte Galileo avant de la brancher à l’ordinateur !
  • Connecter le Galileo à l’ordinateur avec le câble USB (port USB client de la carte).
  • Lancer l'IDE Arduino et sélectionner le port série (Outils > Port série). Si le port série n'est pas reconnu, essayez de relancer l'IDE en Administrateur.
  • Updater le firmware via l’IDE Arduino (Aide > Firmware Update). Cette étape est primordiale pour pouvoir se connecter en SSH. Il est aussi important de ne pas lancer de sketchs avant ou pendant la mise à jour.
  • Créer un nouveau sketch :
void setup() {
  // put your setup code here, to run once:
  system("telnetd -l /bin/sh");
  system("ifconfig eth0 169.254.1.1 netmask 255.255.0.0 up"); //adapter l’adresse ip et le masque
  system("route add default gw 169.254.1.2"); // le PC devient passerelle par défaut
}

void loop() {
  // put your main code here, to run repeatedly: 
}

Attention, il faut garder la boucle loop dans le code, même vide, pour ne pas avoir d'erreur. Dans cet exemple, nous lançons le service Telnet mais si on utilise seulement SSH, cette ligne n'est pas nécessaire.

  • Flasher ce code sur la carte Galileo.
  • Configurer le PC en mode routeur (en root sous Linux) :
sysctl net.ipv4.ip_forward=1
  • Activer le NAT sur le PC (en root sous Linux) :
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -A FORWARD -i wlan0 -o eth0:avahi -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0:avahi -o wlan0 -j ACCEPT
  • Sur Galileo, si la résolution d'adresse ne fonctionne pas (e.g. ping www.google.com ne marche pas), configurer le DNS en ajoutant à /etc/resolv.conf :
domain grenet.fr
search grenet.fr
nameserver 130.190.190.4

Attention : les domaines ci-dessus sont valables seulement pour un PC connecté à wifi-campus. Sur un autre réseau, il suffit (sur un système UNIX) de copier le contenu de /etc/resolv.conf

Connexion en SSH

  • Relier le Galileo à l’ordinateur avec le câble Ethernet.
  • Sur windows la connexion se fera automatiquement, mais sur Linux il faut changer l’adresse IP de la carte Ethernet pour être sur le même réseau que le Galileo :
sudo ifconfig eth0 169.254.1.2 up
  • Faire un ping vers l’adresse ip 169.254.1.1 pour vérifier que la connexion fonctionne (si cela ne marche pas, il peut être judicieux de déconnecter la prise secteur de la carte et de la rebrancher).
  • Lorsque le ping fonctionne, il est possible de se connecter en root à la carte Galileo, soit en utilisant un client SSH de type PuTTY, ou via la commande :
ssh root@169.254.1.1

Mis en place d'une base de donnée mongodb (en locale)

Installation et lancement

Par la suite il est possible d'accéder à différentes informations de votre BD via l'url :

Accéder au contenu

Pour accéder au contenu d'une collection de votre base de donnée, lancer la base de donnée en utilisant la commande :

sudo mongod --rest

puis dans votre navigateur, accéder à l'URL :

Ajouter une base de donnée

Pour ajouter une base de donnée lancer mongo en version shell :

mongo

Pour visualiser l'ensemble des bases de données :

show dbs

Afin de créer une base de donnée ou se connecter à l'une d'elle :

use nomBD

Mis en place NodeJs Mongoose

Prérequis

Effectuer le point précédent Lancer les commandes :

npm install mongoose
npm install express
npm install express-restify-mongoose

Connexion à la BD

Afin de se connecter à la BD réalisée précédemment :

//Connection to the a mongodb database path localhost:port/nameOfDB
mongoose.connect("mongodb://localhost:27017/Client", function(err) {
    if (err) {
        throw err;
    }
});

On définit le schéma d'une collection en définissant son id et un champs

//Definition of a schema
var Temperature = new Schema({
    _id: Number,
    temp: Number
});

Création du modèle

var TemperatureModel = mongoose.model('temperature', Temperature);

//Creation of an object which respect the model define before
var myTemperatureModel = new TemperatureModel({_id: 1473, temp: 16});

Ajout d'un élèment dans la base de donnée.

//saved the temperature in the mongodb database
myTemperatureModel.save(function(err){
  if (err) { throw err; }
  console.log('Commentaire ajouté avec succès !');
  // On se déconnecte de MongoDB maintenant
  mongoose.connection.close();
});

Mis en place NodeJs Mongoose MQTT

Prérequis

Installation de mqtt

npm install mqtt

Utilisation

On fait appel à la librairie mqtt :

var mqtt = require('mqtt')

Connexion au broker sur le port 1883 :

client = mqtt.createClient(1883, 'localhost');

On subscribe au topic 'temperature', et à chaque réception de ce topic on affiche ce qui a été reçu dans la console:

client.subscribe('temperature');
client.on('message', function (topic, message) {
  console.log(message);
});
<source>

On peut également publier sur le topic 'light' l'info 'On' :
<source lang="javascript">
client.publish('light', 'On');
</javascript>
 
En lançant ces commandes le texte 'On' devrait apparaître sur votre console.

= Utilisation de NodeJS Mongoose MQTT et Mosquitto =

== Prérequis ==

Suivre le tuto sur mosquitto, NodeJS Mongoose MQTT et Mosquitto.
Lancer MongoDB.
Ajouter une DB dans mongo "Client" (cf tuto NodeJS Mongoose MQTT).

== Test == 

Dans le .js Node ajouter le code suivant : 

<source lang="javascript">
var http = require('http');
var express = require('express');
var mongoose = require('mongoose');
var mqtt = require('mqtt')
var Schema = mongoose.Schema;
var restify = require('express-restify-mongoose')

///////////////////////////////////
/////// MONGODB  //////////////////
//////////////////////////////////
//Connection to the a mongodb database path localhost:port/nameOfCollection
mongoose.connect("mongodb://localhost:27017/Client", function(err) {
    if (err) {
        throw err;
    }
});

//Definition of a schema
var Temperature = new Schema({
    _id: Number,
    temp: Number
});
//Creation of the model
var TemperatureModel = mongoose.model('temperatures', Temperature);


///////////////////////////////////
/////// MQTT  //////////////////
//////////////////////////////////

client = mqtt.createClient(1883, 'localhost');

client.subscribe('temperature');

var i = 0;
client.on('message', function(topic, message) {
    console.log(message);
    var myTemperatureModel = new TemperatureModel({_id: i++, temp: message});
    myTemperatureModel.save(function(err) {
        if (err) {
            throw err;
        }
        console.log('Température ajouté à la BD avec succès !');
    });
});


var app = express();
app.configure(function() {
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    restify.serve(app, TemperatureModel);
});


//Run the server
http.createServer(app).listen(4242, function() {
    console.log("Express server listening on port 4242");
});

Lancer ceci avec Node.

Lancer mosquitto et publier sur le topic 'light' :

mosquitto
mosquitto_pub  -t temperature -m "25"

Par la suite, vous devriez voir le message "25°C" dans la console. De plus, à l'adresse http://localhost:28017/Client/temperatures/ vous devriez apercevoir l'ajout d'un objet JSON contenant en paramètre 'temp' à 25.

Intégrer une carte Google et fixer ses limites

<!DOCTYPE html>
<html>
    <head>
        <style type="text/css">
            html { height: 100% }
            body { height: 100%; margin: 0; padding: 0 }
            #map-canvas { height: 100% }
        </style>
        <script type="text/javascript"
            src="http://maps.google.com/maps/api/js?sensor=false"></script>
        </script>
        <script type="text/javascript">
            function initialize() {
                var mapOptions = {
                    center: new google.maps.LatLng(45.19091427, 5.76828361), // centrer sur le campus de SMH
                    zoom: 15,
                    mapTypeId: google.maps.MapTypeId.ROADMAP
                };
                var map = new google.maps.Map(document.getElementById("map-canvas"),
                        mapOptions);

                // bounds of the desired area
                var allowedBounds = new google.maps.LatLngBounds( // limites du campus
                  new google.maps.LatLng(45.18575736, 5.75114965),
                  new google.maps.LatLng(45.20112086, 5.78054667)
                );
                var boundLimits = {
                    maxLat : allowedBounds.getNorthEast().lat(),
                    maxLng : allowedBounds.getNorthEast().lng(),
                    minLat : allowedBounds.getSouthWest().lat(),
                    minLng : allowedBounds.getSouthWest().lng()
                };

                var lastValidCenter = map.getCenter();
                var newLat, newLng;
                google.maps.event.addListener(map, 'center_changed', function() {
                    center = map.getCenter();
                    if (allowedBounds.contains(center)) {
                        // still within valid bounds, so save the last valid position
                        lastValidCenter = map.getCenter();
                        return;
                    }
                    newLat = lastValidCenter.lat();
                    newLng = lastValidCenter.lng();
                    if(center.lng() > boundLimits.minLng && center.lng() < boundLimits.maxLng){
                        newLng = center.lng();
                    }
                    if(center.lat() > boundLimits.minLat && center.lat() < boundLimits.maxLat){
                        newLat = center.lat();
                    }
                    map.panTo(new google.maps.LatLng(newLat, newLng));
                });
            }
            google.maps.event.addDomListener(window, 'load', initialize);
        </script>
    </head>
    <body>
        <div id="map-canvas"/>
    </body>
</html>