Bonjour a tous ,
J'ai cru comprendre en lisant les sujets de ce forum consacrés à la puce esp8266 que les sockets posaient quelques soucis à certains (quelques dizaines de pages à digérer).
Pour info, voici une façon simple de faire communiquer via les DatagramSockets UDP des esp8266 avec un serveur qui doit traiter les informations des capteurs connectés aux petites puces.
A lire :
http://www.enib.fr/~harrouet/Data/Cours ... ockets.pdf
Avec les DatagramSockets UDP, la conversation est unidirectionnelle (Envoyer ou recevoir).
Pour un conversation bidirectionnelle, il faut utiliser les Sockets TCP.
Voici la douzaine de lignes nécessaire en lua coté client (esp8266) et en python coté serveur (raspberry):
Coté lua
Code : Tout sélectionner
wifi.setmode(wifi.STATION) -- Wifi en mode station
cfg = { ip="192.168.1.157", netmask="255.255.255.0", gatway="192.168.1.1"}
wifi.sta.setip(cfg) -- on force l'adresse IP en dehors de la plage du DHCP
wifi.sta.config("WRT54G_409B","clef wifi")
cu=net.createConnection(net.UDP) -- connexion Socket UDP
cu:connect(5005,"192.168.1.22") -- Port d'écoute 5005 et adresse du serveur
tmr.alarm(0,2000, 1, function() cour=adc.read(0) --envoi toutes les 2 secondes
cu:send("capteur1=" .. cour ) end) -- lecture capteur
-- A la place de l'alarme trm on peut mettre en veille l'esp8266 par dsleep, mais au reveil reboot
-- node.dsleep(60000000) -- reveil dans n microseconds (PIN32(RST) et PIN8(XPD_DCDC) reliées)
print ("En cours") -- le programme continue à s'executer en attente de l'alarme
et coté serveur, un raspberry dans mon cas
Code : Tout sélectionner
import socket
UDP_IP = "192.168.1.22"
UDP_PORT = 5005
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))
while True:
data, addr = sock.recvfrom(1024) # buffer de 1024 bytes
if not data: break
print "Message de l'esp8266 ", data
conn.close() # pour info jamais possible car boucle infinie sur while True
Et voici la trace coté Raspberry
Code : Tout sélectionner
pi@raspberrypi:~/esp8266$ python serveur_udp.py
Message de l'esp8266 capteur1=236
Message de l'esp8266 capteur2=51
Message de l'esp8266 capteur1=65
Message de l'esp8266 capteur2=51
Le serveur python peut écouter plusieurs esp8266 ( dans l'exemple capteur1 et capteur2 sont sur deux esp8266 différents).
Remarque: la ligne adc.read(0)
permet la lecture d'un capteur analogique, attention possible seulement sur certaines puces
Par exemple la carte de tests nodemcu ou la puce ESP-12
En utilisant node.dsleep, on peut mettre l'esp8266 en veille pour qu'il ne consomme pas trop.
Au réveil l'esp8266 effectue un reboot.
Je n'ai pas testé cette possibilité mais d'après la documentation il faut relier les pins PIN32(RST) et PIN8(XPD_DCDC).
Je trouve pour ma part que lua est un langage assez facile à apprendre.
Pour python c'est un poil plus compliqué.
Comme on dispose du code source en C de l'interpréteur lua, il est toujours possible en recompilant le projet nodemcu:
de rajouter des modules accessibles en lua pour disposer d'une puissance de calcul.
Mais ça, c'est une autre histoire.
SMBA38