L’Internet des Objets

L’Internet des Objets

11.2 La gateway BLE

Page précédente Page suivante

Notre Gateway va récupérer des informations par BLE, pour cela nous allons écrire (ou récupérer) un petit script python qu’il faudra (pour le moment) exécuter en root (c’est mal !).

Pour commencer, il est possible d’utiliser un shebang qui dira à Linux qu’il s’agit d’un script Python :

#! /usr/bin/env python3

Ensuite, nous allons importer quelques librairies python qu’il faudra éventuellement installer, de préférence avec le système de paquets Debian (par exemple : python3-paho-mqtt). La librairie bluepy ne dispose pas d’un support Debian. L’installation par pip impose de disposer du paquet libglib2.0-dev.

Pour bluepy, une façon sale (cela ouvre la porte aux supply chain attacks)pour l’installer consiste à l’installer à partir des sources :

$ sudo apt-get install git build-essential libglib2.0-dev
$ git clone https://github.com/IanHarvey/bluepy.git
$ cd bluepy
$ python setup.py build
$ sudo python setup.py install

Nous commençons donc par les imports :

from bluepy import btle
from bluepy.btle import Scanner, DefaultDelegate
import time
import binascii
import datetime
import sys
import paho.mqtt.client as mqtt

Nous devons définir une fonction qui sera appelée lors de la réception d’une annonce BLE. La partie utile se trouve dans la fonction handleDiscovery qui récupère la chaîne annoncée dans la variable value. Cette chaîne peut alors être gérée par Python. Dans notre exemple, nous extrayons les valeurs de température et humidité que nous publions en MQTT.

class ScanDelegate(DefaultDelegate):
    def __init__(self):
        DefaultDelegate.__init__(self)

   def handleDiscovery(self, dev, isNewDev, isNewData):
       if isNewData:
           print ("Received new data from", dev.addr)
           for (adtype, desc, value) in dev.getScanData():
               print( "Got %s = %s" % (desc, value))
               if( desc == "Complete Local Name"):
                   print(adtype)
                   print(desc)
                   print(value)
                   objet, temp, humi = value.split("|")
                   print("Message de " + objet + " :")
                   print(" - Température : " + temp + "°C")
                   print(" - Humidité : " + humi + "%")
                   today = datetime.datetime.today()
                   tempspresent=today.strftime("%y-%m-%d %H:%M:%S")
                   client.publish("sensor/temperature/chambre",
                                  tempspresent +" " + temp)
                   client.publish("sensor/humidite/chambre",
                                  tempspresent +" " + humi)




   def handleNotification(cHandle, data):
       print ("Not: ",data)

Le programme principal permet d’abord de se connecter au serveur MQTT :

client = mqtt.Client(client_id='publisher-1')
client.username_pw_set("sushi","sushipwd")
client.connect("10.3.30.3", 1883, 60)

Puis on lance un scan pendant 1963 secondes.

scanner = Scanner().withDelegate(ScanDelegate())
devices = scanner.scan(1963.0)

La gateway communique avec le serveur MQTT en IP, il faut donc que la liaison soit possible.

Page précédente Page suivante