Où sommes nous ?

Retour

Répéteur WiFi

Les murs sont les gros ennemis du WiFi. Alors, même si un (faible) signal est détecté par notre tablette au fond du jardin, force est de constater qu'il n'est pas suffisant pour domotiser notre poulailler situé à une 15e de mètres : connexions instables, délais très longs pour établir la liaison, coupures fréquentes ... bref, pas bon pour la durée de vie des batteries de ces objets distants.
Il existe dans le commerce des répéteurs WiFi qui, comme le nom le laisse présager, répètent le signal pour étendre la zone de couverture. C'est relativement cher et totalement fermé : comme s'assurer dès lors de la sécurité ?

Ce billet propose une solution à base d'ESP-01 qui ne coutera que quelques €uros et sur lequel vous gardez entièrement la main.

Côté logiciel

Les ESP8266 ont l'avantage de pouvoir ouvrir simultanément 2 réseaux WiFi :

La limitation apparait quand on se rend compte que le firmware ne permet pas de router les trames d'un réseau à l'autre (pas de forward).

martin-ger nous propose 2 solutions pour résoudre ce problème

esp_wifi_repeater

Il s'agit d'un routeur NAT qui permettra aux clients de son réseau privé de se connecter au réseau domestique. L'avantage est que pour eux, c'est totalement transparent ; un peu moins pour les applications à l'autre bout pour qui tous les dits clients proviendront de la même IP, différenciés par leurs seuls ports. Ça ne gène absolument pas : c'est même sans doute la méthode utilisée par votre box pour connecter toutes vos machines à Internet.
Les sources et une docs se trouvent ici.

Du fait des limitations de l'ESP, seuls 8 clients pourront se connecter simultanément.

esp_uMQTT_broker

Grâce à esp_uMQTT_broker, l'ESP devient un petit système domotique contenant :

Bref, une mini centrale domotique ! Mini car les ressources de l'ESP étant limitées, les possibilités de ce broker aussi : peu de clients concurrents, taille des messages réduite et les règles ne peuvent être que simples. Idéale pour publier des données vers une plateforme de cloud ou pour communiquer avec une Box domotique qui sera chargée des automatismes, mais trop limité pour une domotique comme la mienne.

Mon choix

Installer un second broker aurait été totalement redondant avec mon installation existante et uMQTT est trop limité pour prendre en charge tous mes messages. D'un autre côté, mon besoin est surtout d'augmenter la portée de mon WiFi : très pratique quand même de pouvoir connecter sa tablette de l'autre côté du jardin lors des tests. Bref, c'est parti pour esp_wifi_repeater ...

Installation de esp_wifi_repeater

On récupère les fichiers 0x00000.bin et 0x10000.bin depuis le github et on les grave

esptool.py --port /dev/ttyS2 write_flash 0x00000 0x00000.bin
esptool.py --port /dev/ttyS2 write_flash 0x10000 0x10000.bin

l'adresse 0x10000 dependra de la mémoire sur l'ESP : lire la doc.

Une fois le flashage terminé, l'ESP reboote même si je rajoute l'option

--after no_reset

Il m'a fallu le redémarré à chaque fois électriquement pour qu'il repasse en mode programmation.

Ça ne marche pas : sec fd error

Mon premier essai n'a pas fonctionné

epeater V1.5 starting

Config found and loaded
Starting Console TCP Server on port 7777
Starting Web Config Server on port 80
mode : sta(5c:cf:7f:15:74:b6) + softAP(5e:cf:7f:15:74:b6)
add if0
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100
mode: 0 -> 2
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 2
cnt

connected with xxxx, channel x
sec fd error
Fatal exception 0(IllegalInstruc�ionCause):
epc1=0xc0138c8e, ep�2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x0�000000
ets Jan 8 2013,rst cause:4, boot mode:(3,7)

En cherchant sur le web, c'est parce que le firmware de l'ESP est trop ancien : j'ai récupéré le dernier ici puis

esptool.py --port /dev/ttyS2 write_flash 0xfc000 esp_init_data_default.bin

l'adresse 0xfc000 dependra de la mémoire sur l'ESP (un classic 1Mo pour le mien) : lire la doc.

Configuration (minimale)

L'étape suivante est de configurer les réseaux en entrant les commandes suivantes dans sa console.

CMD>set ssid réseau_de_la_maison
SSID set (auto_connect = 1)
CMD>set password MdP_pour_la_maison

CMD>set ap_ssid nouveau_réseau
CMD>set ap_password MdP_nouveau_réseau

CMD>save
CMD>reset

On reboote et ... ça marche.

MQTT

L'ESP peut aussi agir en tant que client MQTT, publier quelques statistiques et accepter des commandes.

Grace au port de commande déclaré par mqtt_command_topic, on peut envoyer des ordres comme lorsque nous étions connecté par la console. Les réponses sont reçues par le topic .../responses.
Ainsi

$ mosquitto_pub -t 'monESP/command' -m 'help'

renvoie

$ mosquitto_sub -v -t 'monESP/#'
monESP/command help
monESP/response show [config|stats|mqtt]
set [ssid|password|auto_connect|ap_ssid|ap_password|ap_on|ap_open|ap_mac|sta_mac|ssid_hidden] <val>
set [network|dns|ip|netmask|gw] <val>
set [speed|status_led|config_port|config_access|web_port] <val>
portmap [add|remove] [TCP|UDP] <ext_port> <int_addr> <int_port>
save [config|dhcp]
reset [factory] | lock | unlock <password> | quit
scan
set phy_mode [1|2|3]
sleep
set [vmin|vmin_sleep] <val>
monitor [on|off] <portnumber>
set [upstream_kbps|downstream_kbps] <val>
acl [from_sta|to_sta] clear
acl [from_sta|to_sta] [IP|TCP|UDP] <src_addr> [<src_port>] <dest_addr> [<dest_port>] [allow|deny|allow_monitor|deny_monitor]
set [mqtt_host|mqtt_port|mqtt_user|mqtt_password|mqtt_id|mqtt_prefix|mqtt_command_topic|mqtt_interval] <val>

Il faut bien sûr que ce topic ait été autorisé par la directive mqtt_mask. Je l'ai mis dans mon cas à 207B ce qui correspond à

Conclusion du 1er test

Et bien, cela marche plutôt pas mal : j'ai maintenant un signal fort et clair dans le jardin. Comme sur n'importe quel NAT, il est possible d'ouvrir des ports du réseau STATION (la maison) vers l'interne (l'AP) et donc un canal vers les objets connectés.

On peut gérer le WiFi par un simple telnet ... mais aussi par MQTT : une fois le répéteur installé, il n'est même plus besoin de se connecter physiquement dessus.
Il y a évidemment quelques limitations : par exemple, impossible de désactiver le DHCP sur le réseau AP, je verrai à l'usage l'impacte sur la batterie de mes objets connectés.

Par contre, j'ai un peu galéré lorsque le signal STATION était un peu faible : je pensais au début à un bug, mais non, c'est juste que l'ESP tirait trop sur l'alimentation ce qui le faisait planter. Un gros condo à ses bornes a résolu le pb.
Je pensais l'alimenter par des cellules solaires mais ... ça risque d'être compromis s'il ne peut sortir de lui-même de son plantage. Pour plus tard ...

Mise en situation

Le réseau de ma Freebox étant un peu faiblard au niveau de mon poulailler, j'ai sécurisé cet ESP-01 contre les crashes intempestifs et l'ai alimenté par le 5v de mon réseau 1-wire.

Soudé le GPIO-16/XPD et la broche reset n'a pas été une partie de plaisir ... à la limite du masochisme tellement la puce est petite et les broches proches. Pour ce genre d'utilisation, un modèle exposant ce GPIO comme l'ESP-201 est beaucoup plus adapté. Et comme en plus j'avais besoin d'un régulateur 5V - 3,3v, un NodeMCU aurait été idéal (mais bon, j'avais l'ESP-01 sous la main).

Avec son régulateur, il tire environ 60mA sur l'Alim de mon bus.


Visitez :
La liste de nos voyages
Nos sorties Ski et rando
Copyright Laurent Faillie 2001-2024
N'oubliez pas d'entrer le mot de passe pour voir aussi les photos perso.
Contactez moi si vous souhaitez réutiliser ces photos et pour les obtenir avec une plus grande résolution.
Visites durant les 7 derniers jours Nombre de visites au total.

Vous pouvez laissez un commentaire sur cette page.

  Le Vendredi 30 Avril 2021,"Karl" a écrit à propos de cette page  

Bonjour Dominique, 


voici le code plus simple (meme si il reste tout de meme compliqué)
Il suffit de modifier les ligne 5, 6, 7 .


voici le code;


#if LWIP_FEATURES && !LWIP_IPV6

#define HAVE_NETDUMP 0

#ifndef STASSID
#define STASSID   "SSID" //preciser ici le nom de votre wifi parent
#define STAPSK    "PASS" //preciser ici le mot de pass de votre wifi
#define REPETEUR  "Nouveau nom" //preciser ici le nom du wifi visible (le nom du répéteur)
#endif

#include <ESP8266WiFi.h>
#include <lwip/napt.h>
#include <lwip/dns.h>
#include <dhcpserver.h>

#define NAPT 1000
#define NAPT_PORT 10

#if HAVE_NETDUMP

#include <NetDump.h>

void dump(int netif_idx, const char* data, size_t len, int out, int success) {
  (void)success;
  Serial.print(out ? F("out ") : F(" in "));
  Serial.printf("%d ", netif_idx);

  // optional filter example: if (netDump_is_ARP(data))
  {
    netDump(Serial, data, len);
    //netDumpHex(Serial, data, len);
  }
}
#endif

void setup() {
  pinMode(16, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);
  Serial.begin(115200);
  Serial.printf("

NAPT Range extender
");
  Serial.printf("Heap on start: %d
", ESP.getFreeHeap());

#if HAVE_NETDUMP
  phy_capture = dump;
#endif

  // first, connect to STA so we can get a proper local DNS server
  WiFi.mode(WIFI_STA);
  WiFi.begin(STASSID, STAPSK);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    digitalWrite(4, HIGH);
    delay(250);
    digitalWrite(4, LOW);
    delay(250);
  }
  Serial.printf("
STA: %s (dns: %s / %s)
",
                WiFi.localIP().toString().c_str(),
                WiFi.dnsIP(0).toString().c_str(),
                WiFi.dnsIP(1).toString().c_str());

  // give DNS servers to AP side
  dhcps_set_dns(0, WiFi.dnsIP(0));
  dhcps_set_dns(1, WiFi.dnsIP(1));

  WiFi.softAPConfig(  // enable AP, with android-compatible google domain
    IPAddress(172, 217, 28, 254),
    IPAddress(172, 217, 28, 254),
    IPAddress(255, 255, 255, 0));
  WiFi.softAP(REPETEUR, STAPSK);
  Serial.printf("AP: %s
", WiFi.softAPIP().toString().c_str());

  Serial.printf("Heap before: %d
", ESP.getFreeHeap());
  err_t ret = ip_napt_init(NAPT, NAPT_PORT);
  Serial.printf("ip_napt_init(%d,%d): ret=%d (OK=%d)
", NAPT, NAPT_PORT, (int)ret, (int)ERR_OK);
  if (ret == ERR_OK) {
    ret = ip_napt_enable_no(SOFTAP_IF, 1);
    Serial.printf("ip_napt_enable_no(SOFTAP_IF): ret=%d (OK=%d)
", (int)ret, (int)ERR_OK);
    if (ret == ERR_OK) {
    }
  }
  Serial.printf("Heap after napt init: %d
", ESP.getFreeHeap());
  if (ret != ERR_OK) {
    Serial.printf("NAPT initialization failed
");
    
  }
  
}

#else

void setup() {
  Serial.begin(115200);
  Serial.printf("

NAPT not supported in this configuration
");
}

#endif

void loop() {
  
}


  Le Jeudi 14 Mai 2020,"Dominique" a écrit à propos de cette page  

Bonjour, c’est un article très intéressant mais auriez vous la version pour les nul ?


J’ai fait quelque montage avec sonde de température sur esp wemos D1 en glanant sur des sites des informations à ma portés (les frères poulain sur youtube etc..) mais je suis juste technicien automobile et pour la programmation (arduino) je fais du copier collé et quand c’est assez simple j’essai de faire fais quelque modifs.


Ce qui me freine pour réaliser votre projet de répéteur wifi c’est les termes techniques que je ne comprend pas. Je sais que votre article date et que cela prend du temps de créer et de répondre.


Mais si vous avez une version avec un langage plus terre à terre pour vrai débutant(photo), je suis preneur.



Très cordialement Dominique.