Configurez le Wi-Fi du Raspberry Pi via Bluetooth pour ensuite envoyer des données à Ubidots

Au moins une fois dans votre vie, vous avez eu du mal à configurer les informations d'identification Wi-Fi d'un Raspberry Pi simplement parce que vous n'aviez pas de moniteur avec vous pour le moment.

Dans ce guide, je vais décrire comment configurer un Raspberry Pi avec un AP (Access Point) via une application Android portable. Vous ne parvenez pas à brancher un câble Ethernet simplement parce que vous êtes dans un nouvel emplacement ? Ne vous inquiétez pas - Après avoir suivi ce guide, vous pourrez utiliser votre Pi dans n'importe quel endroit, il vous suffit de scanner le réseau, de choisir le réseau souhaité avec lequel établir la connexion, d'écrire les informations d'identification et vous êtes connecté !

J'ai déployé un outil simple qui permet de définir le SSID et le PSK du Wi-Fi Raspberry pi via la communication Bluetooth. Pour le moment, c'est super basique : il vous suffit d'avoir préalablement couplé votre téléphone Android avec votre Raspberry Pi et j'ai écrit une application Android basique.

Personnellement, je pense que c'est vraiment utile pour ceux qui sont avec leur Raspberry Pi, le déplaçant d'un atelier à un autre, l'emportant de la maison à l'école, sans oublier tous les cas possibles que vous avez en tête en ce moment... Maintenant, sans en discuter davantage, commençons à construire des choses sympas, en commençant par l'installation du script python qui va s'exécuter dans notre Raspberry Pi.

Exigences

  • Raspberry pi (n'importe quel Raspberry pi avec Wi-Fi)
  • Carte Micro SD chargée dans le système d'exploitation Raspbian
  • Téléphone Android avec système d'exploitation 4.2 Jelly Bean
  • Fichier APK et script d'exécution Python

Étape par étape

  1. Configuration du Bluetooth du Raspberry Pi
  2. Couplage du Raspberry Pi et du téléphone Android
  3. Paramétrage du capteur DHT22 – Matériel
  4. Paramétrage du capteur DHT22 – Logiciel
  5. Envoi/Visualisation de données vers Ubidots

1. Configuration du Bluetooth du Raspberry Pi

Au début, vous aurez besoin d'un moniteur + clavier connecté, d'un accès alternatif au Raspberry Pi via SSH juste pour pouvoir établir toutes les configurations requises via le terminal Raspbian.

Exécutez soigneusement les commandes ci-dessous pour établir les configurations appropriées :

  1. Installez bluez (bibliothèque Bluetooth Python) :
$ sudo apt-get install python-bluez

2. Démarrez le démon Bluetooth en mode de compatibilité. Pour ce faire, éditez /etc/systemd/system/dbus-org.bluez.service , en exécutant la commande ci-dessous :

$ sudo nano /etc/systemd/system/dbus-org.bluez.service

3. Ensuite, modifiez le paramètre ExecStart 

ExecStart=/usr/lib/bluetooth/bluetoothd –C

4. Maintenant, chargez le profil du port série en utilisant la commande ci-dessous :

$ sudo sdptool ajouter SP

5. Pour enregistrer correctement les modifications, redémarrez votre Pi :

$ sudo redémarrage

Après le redémarrage, associons le Bluetooth à notre téléphone Android

2. Couplage du Raspberry Pi et du téléphone Android.

1. Associez votre téléphone Android à votre Raspberry Pi. Pour ce faire, activez le Bluetooth de votre téléphone et exécutez la commande ci-dessous sur votre Pi :

$ Bluetoothctl

Ensuite, une fois le processus d’appairage commencé, insérez les paramètres suivants. (Reportez-vous à l'image pour avoir une meilleure idée du processus de flux)

sous tension détectable lors de l'analyse activée

À ce stade, votre téléphone apparaîtra dans la liste des appareils disponibles. Notez l'adresse de votre téléphone.

confiance<PHONE_ADDRESS> paire<PHONE_ADDRESS>

2. Pour quitter simplement le ctl Bluetooth, écrivez la commande quit :

$ arrêter

3. [OPTIONNEL – CONSEIL DE PRO] Vous pouvez ignorer la configuration ci-dessus en configurant le Bluetooth avec l'interface utilisateur de Raspbian. Appuyez simplement sur l'icône Bluetooth et sélectionnez le Bluetooth de votre téléphone.

4. Après avoir couplé le Bluetooth, ajoutez le script python directement dans Raspbian en tapant la nano et copiez/collez le code source, ou vous pouvez directement copier le fichier run.py.

$ sudo nano run.py

Code source (Copier/Coller) :

#!/usr/bin/env python #Run.py importer le système d'exploitation à partir de l'importation Bluetooth * à partir de la cellule d'importation Wi-Fi, heure d'importation du sous-processus d'importation de schéma wpa_supplicant_conf = "/etc/wpa_supplicant/wpa_supplicant.conf" sudo_mode = "sudo " def wifi_connect(ssid , psk) : # écrire la configuration wifi dans le fichier cmd = 'wpa_passphrase {ssid} {psk} | sudo tee -a {conf} > /dev/null'.format( ssid=str(ssid).replace('!', '\!'), psk=str(psk).replace('!', '\ !'), conf=wpa_supplicant_conf ) cmd_result = "" cmd_result = os.system(cmd) print cmd + " - " + str(cmd_result) # reconfigurer le wifi cmd = sudo_mode + 'wpa_cli -i wlan0 reconfigure' cmd_result = os.system (cmd) print cmd + " - " + str(cmd_result) time.sleep(10) cmd = 'iwconfig wlan0' cmd_result = os.system(cmd) print cmd + " - " + str(cmd_result) cmd = 'ifconfig wlan0 ' cmd_result = os.system(cmd) print cmd + " - " + str(cmd_result) p = subprocess.Popen(['hostname', '-I'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out , err = p.communicate() si out : ip_address = out else : ip_address = "<Not Set> " return ip_address def ssid_discovered() : Cells = Cell.all('wlan0') wifi_info = 'Found ssid : \n' pour le courant dans la plage (len(Cells)) : wifi_info += Cells[current].ssid + "\ n" wifi_info+="!" print wifi_info return wifi_info def handle_client(client_sock) : # get ssid client_sock.send(ssid_discovered()) print "En attente du SSID..." ssid = client_sock.recv(1024) if ssid == ' ' : return print "ssid reçu" print ssid # get psk client_sock.send("waiting-psk!") print "En attente de PSK..." psk = client_sock.recv(1024) if psk == '' : return print "psk reçu" print psk ip_address = wifi_connect(ssid, psk) print "ip address: " + ip_address client_sock.send("ip-address:" + ip_address + "!") return try: while True: server_sock=BluetoothSocket( RFCOMM ) server_sock.bind(("",PORT_ANY)) server_sock.listen(1) port = server_sock.getsockname()[1] uuid = "815425a5-bfac-47bf-9321-c5ff980b5e11"advert_service(server_sock, "Configuration RPi Wifi" , service_id = uuid, service_classes = [ uuid, SERIAL_PORT_CLASS ], profiles = [ SERIAL_PORT_PROFILE ]) print "En attente de connexion sur le canal RFCOMM %d" % port client_sock, client_info = server_sock.accept() print "Connexion acceptée depuis ", client_info handle_client (client_sock) client_sock.close() server_sock.close() # impression de configuration terminée 'Configuration terminée\n' sauf (KeyboardInterrupt, SystemExit) : impression '\nSortie\n'

5. Après l'étape ci-dessus, il est temps de rendre le script exécutable en donnant les autorisations requises :

$ chmod +x run.py

Pour exécuter :

$ sudo ./run.py

6. À ce stade, ouvrez l'application Android et sélectionnez le raspberrypi dans les appareils couplés Bluetooth. Entrez le SSID , le PSK et appuyez sur le Démarrer la configuration . En quelques secondes, le Wi-Fi du Raspberry Pi devrait être connecté, comme le montrent les images ci-dessous.

7. Pour exécuter le script pendant le processus de démarrage du pi, éditez /etc/rc.local et ajoutez la ligne de code suivante :

(dormir 10 ;/chemin/vers/script/./run.py)&

3. Configuration du capteur DHT22 - Matériel

1. Établissez les connexions appropriées, comme indiqué dans le schéma ci-dessous :

4. Configuration du capteur DHT22 - Logiciel

1. Installez les packages requis en exécutant les commandes suivantes :

$ sudo apt-get mise à jour
$ sudo apt-get install build-essential python-dev python-openssl git

2. Chargez la bibliothèque des capteurs. Dans mon cas, j'utilise une bibliothèque Adafruit prédéfinie qui prend en charge une variété de capteurs :

$ git clone https://github.com/adafruit/Adafruit_Python_DHT.git && cd Adafruit_Python_DHT

3. Avec la bibliothèque déjà chargée, exécutez la commande ci-dessous pour créer une bibliothèque Python qui vous permet de réaliser facilement l'intégration pour ce projet et d'autres.

$ sudo python setup.py installer

4. Si tout fonctionne correctement, nous devrions pouvoir lire la température et l’humidité. Le plus simple est d’utiliser d’abord les fichiers de démonstration déjà disponibles dans notre Pi :

Exemples de $ cd

5. Exécutez l'exemple de code suivant. Où le premier paramètre (11) indique quel capteur a été utilisé (22 pour le DHT22) et le second, à quel GPIO il est connecté (pas le numéro de broche, mais le numéro de GPIO). Cela produit une sortie comme celle-ci :

$ sudo ./AdafruitDHT.py 11 4

Résultat attendu :

$ sudo ./AdafruitDHT.py 11 4 Température=24,0* Humidité=41,0 %

5. Envoi de données à Ubidots

1. Créez un script python à l'aide de l'éditeur nano et collez le code ci-dessous dans le terminal. Pour cela, insérez la commande suivante :

$ sudo nano ubidots 3.py

Code source :

import time import request import math import random import sys import Adafruit_DHT sensor = 22 #Sélectionnez votre version DHT pin = 18 #Entrez votre code PIN de DHT22 TOKEN = "…" # Mettez votre TOKEN ici DEVICE_LABEL = "Raspberrypi" # Mettez l'étiquette de votre appareil ici VARIABLE_LABEL_1 = "température" # Mettez votre première étiquette de variable ici VARIABLE_LABEL_2 = "humidité" # Mettez votre deuxième étiquette de variable ici # Essayez de récupérer une lecture du capteur. Utilisez la méthode read_retry qui réessayera jusqu'à 15 fois pour obtenir une lecture du capteur (en attendant 2 secondes entre chaque nouvelle tentative). humidité, température = Adafruit_DHT.read_retry(sensor, pin) # Dé-commentez la ligne ci-dessous pour convertir la température en Fahrenheit. # température = température * 9/5,0 + 32 # Notez que parfois vous n'obtiendrez pas de lecture et # les résultats seront nuls (car Linux ne peut pas # garantir le timing des appels pour lire le capteur). # Si cela se produit, réessayez ! def build_payload(variable_1, variable_2): # Crée deux valeurs aléatoires pour l'envoi des données value_1 = température value_2 = humidité payload = {variable_1: value_1, variable_2: value_2, } return payload def post_request(payload): # Crée les en-têtes pour les requêtes HTTP url = "http: ubidots .com" url = "{}/api/v1.6/devices/{}".format(url, DEVICE_LABEL) headers = {"X-Auth-Token": TOKEN, "Content-Type": "application/json"} # Rend le statut des requêtes HTTP = 400 tentatives = 0 tandis que le statut >= 400 et les tentatives <= 5 : req = requêtes.post(url=url, headers=headers, json=payload) status = req.status_code tentatives += 1 time.sleep(1) # Traite les résultats si l'état >= 400 : print("[ERREUR] Impossible d'envoyer des données après 5 tentatives, veuillez vérifier \ vos informations d'identification de jeton et Internet connection") return False print("[INFO] demande effectuée correctement, votre appareil est mis à jour") return True def main(): payload = build_payload( VARIABLE_LABEL_1, VARIABLE_LABEL_2) print("[INFO] Tentative d'envoi de données") post_request( payload) print("[INFO] terminé") if __name__ == '__main__': while (True): print('Temp={0:0.1f}* Humidity={1:0.1f}%'.format(temperature , humidité)) humidité, température = Adafruit_DHT.read_retry(sensor, pin) main() time.sleep(1) ```

Après avoir collé le code source, vous devez attribuer le TOKEN Ubidots à l'endroit indiqué dans le script python :

$ sudo nano ubidots 3.py

2. Maintenant que tout est configuré, vous pouvez exécuter l'exemple de code pour commencer à transmettre des données à votre compte Ubidots :

$ sudo python ubidots 3.py

À ce stade, si vous vous référez à la section appareils de votre compte Ubidots , vous pourrez voir un nouvel appareil créé appelé « RaspberryPi ».

3. Pour visualiser efficacement vos données, configurons un de Dashboard Ubidots . Pour le créer, rendez-vous dans la Dashboard (Données > Dashboard )

4. Ensuite, appuyez sur « Ajouter un nouveau widget », et sélectionnez votre widget :

5. Sélectionnez la variable que vous souhaitez afficher :

6. Donnez un nom personnalisé au widget et appuyez sur l'icône verte pour terminer la création du widget.

Vous pouvez désormais surveiller les variables à distance depuis n'importe quel endroit grâce à la plateforme de développement d'applications IoT Ubidots :

Articles recommandés :