L’Internet des Objets
11.2 La gateway BLE
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.