Ni écran, ni clavier : configurer le Wi-Fi et un jeton sur 12 nœuds de laboratoire ESP32-C3
Traduit de English par IA ·
ok alors c’est pour un projet universitaire, désolé si ce n’est pas le bon sous-forum. Nous construisons 12 petits nœuds de qualité de l’air (ESP32-C3 SuperMini + SCD41 + un PMS5003) qui seront installés dans différents laboratoires du campus et enverront leurs données à notre organisation Hermetry via MQTT. Ils n’ont pas d’écran et le seul bouton est BOOT.Actuellement, le SSID, le mot de passe et le jeton d’accès de l’appareil sont tous des #define dans le sketch, donc chaque nœud nécessite sa propre compilation. C’était acceptable pour 2 prototypes, mais pas pour 12, et les techniciens de laboratoire qui déplaceront les nœuds ne peuvent pas utiliser l’IDE.Ce que je veux : flasher un firmware identique sur tous, puis sur place, quelqu’un connecte un téléphone au nœud, saisit le Wi-Fi du laboratoire, et le nœud obtient d’une manière ou d’une autre ses propres identifiants Hermetry. J’ai trouvé WiFiManager et la partie portail captif fonctionne sur le banc d’essai. La partie jeton, je n’ai aucune idée. Existe-t-il une méthode courante pour faire cela, ou tout le monde code-t-il les valeurs en dur ?
ok so this is for a uni project, sorry if it’s the wrong sub-forum. We’re building 12 little air quality nodes (ESP32-C3 SuperMini + SCD41 + a PMS5003) that go into different labs across campus and report to our Hermetry org over MQTT. They have no display and the only button is BOOT.
Right now the SSID, password and the device access token are all #defines in the sketch, so every node gets its own build. That was fine for 2 prototypes, it’s not fine for 12, and the lab techs who’ll move them around can’t run the IDE.
What I want: flash one identical firmware on all of them, then on site someone joins a phone to the node, types the lab Wi-Fi, and the node gets its own Hermetry credential somehow. I found WiFiManager and the captive portal part works on the bench. The token part I have no idea. Is there a normal way people do this, or does everyone just hardcode?
Traduit de English par IA ·
C’est peut-être une question bête, mais pourquoi ne pas simplement mettre le Wi-Fi une seule fois dans le code, si c’est le même campus ?
Possibly a dumb question but why not just put the Wi-Fi in the code once, if it’s all the same campus?
Traduit de English par IA ·
Malheureusement, ce n’est pas le même réseau partout. Deux bâtiments sont sur un SSID IoT séparé, un laboratoire a son propre routeur, et les mots de passe sont renouvelés à chaque semestre. De plus, les tokens doivent de toute façon être différents pour chaque nœud.
Not the same network everywhere sadly. Two buildings are on a separate IoT SSID, one lab has its own router, and the passwords get rotated each term. Plus the tokens have to be different per node anyway.
Traduit de English par IA ·
WPS ? Maintenir BOOT pendant 3 s, appuyer sur le bouton du routeur, et voilà. Je l’ai fait il y a des années sur des scanners d’entrepôt.
WPS? Hold BOOT for 3 s, press the button on the router, done. Did that on some warehouse scanners years ago.
Traduit de English par IA ·
Le WPS est désactivé sur à peu près tous les réseaux gérés que j’ai vus, je ne compterais pas dessus dans une université. Vous utilisez le core Arduino ou ESP-IDF ? IDF propose un composant de provisioning via SoftAP ou BLE, plus agréable qu’un portail captif.
WPS is switched off on pretty much every managed network I’ve seen, I wouldn’t count on it at a uni. Are you on the Arduino core or ESP-IDF? IDF has a provisioning component over SoftAP or BLE that’s nicer than a captive portal.
Traduit de English par IA ·
Cœur Arduino 2.0.14 dans PlatformIO. Je veux bien rester sur WiFiManager pour la partie Wi-Fi, c’est le jeton Hermetry qui me bloque. Je ne veux pas non plus ouvrir la console pour créer 12 appareils et copier 12 jetons dans 12 portails, si je peux l’éviter.
Arduino core 2.0.14 in PlatformIO. Happy to stay with WiFiManager for the Wi-Fi bit, it’s the Hermetry token I’m stuck on. I don’t want to open the console and create 12 devices and copy 12 tokens into 12 portals either if I can avoid it.
Traduit de English par IA ·
Vous n’avez pas du tout besoin de tokens par appareil dans le firmware. Séparez le problème en deux.Wi-Fi : conservez WiFiManager. Ajoutez un champ personnalisé dans le portail si vous voulez un nom d’appareil convivial, sinon utilisez l’adresse MAC.Token : laissez le nœud demander le sien. Dans le profil de l’appareil, ouvrez l’onglet Provisioning, réglez la stratégie sur Allow creating new devices, enregistrez, puis cliquez sur Create key et copiez le secret (il n’est affiché qu’une seule fois). Cette clé et ce secret sont identiques pour les 12 builds. Au premier démarrage, le nœud se connecte avec le nom d’utilisateur provision et un mot de passe vide, s’abonne à v1/provision/res et publie sa demande. La réponse contient son token d’accès ; vous le stockez dans la NVS, et ensuite il se connecte normalement.
// first boot only, after Wi-Fi is up
mqtt.setServer(host, 8883); // WiFiClientSecure, TLS
mqtt.connect(clientId, "provision", "");
mqtt.subscribe("v1/provision/res", 1);
String req = String("{"deviceName":"aq-") + mac6 +
"","provisionDeviceKey":"pk_xxx","provisionDeviceSecret":"ps_xxx"}";
mqtt.publish("v1/provision/req", req.c_str());
// in the callback: parse credentialsValue when status == "SUCCESS",
// prefs.putString("tok", value); then reconnect with the token as username
Deux points nous ont posé problème sur un site pharmaceutique. Les nouveaux appareils créés de cette façon atterrissent en quarantaine : ils se connectent, mais leurs données sont rejetées tant qu’un administrateur ne les a pas activés. Prévenez donc le responsable de l’organisation de les chercher. Et le nom doit être unique : une seconde demande avec le même nom renvoie device_exists, car elle ne délivre jamais deux fois un identifiant. Ne effacez donc pas la NVS à la légère. Les détails figurent sur Adding and claiming devices.
You don’t need per-device tokens in the firmware at all. Split it in two problems.
Wi-Fi: keep WiFiManager. Add one custom field in the portal if you want a friendly device name, otherwise use the MAC.
Token: let the node ask for its own. On the device profile open the Provisioning tab, set the strategy to Allow creating new devices, save, then Create key and copy the secret (it’s shown once). That key + secret is the same for all 12 builds. On first boot the node connects with username provision and an empty password, subscribes to v1/provision/res and publishes its request. The answer carries its access token, you store that in NVS and from then on it logs in normally.
// first boot only, after Wi-Fi is up
mqtt.setServer(host, 8883); // WiFiClientSecure, TLS
mqtt.connect(clientId, "provision", "");
mqtt.subscribe("v1/provision/res", 1);
String req = String("{"deviceName":"aq-") + mac6 +
"","provisionDeviceKey":"pk_xxx","provisionDeviceSecret":"ps_xxx"}";
mqtt.publish("v1/provision/req", req.c_str());
// in the callback: parse credentialsValue when status == "SUCCESS",
// prefs.putString("tok", value); then reconnect with the token as username
Two things bit us on a pharma site. New devices created this way land in quarantine, they connect but their data is dropped until an admin activates them, so tell whoever owns the org to look for them. And the name must be unique, a second request with the same name gets device_exists because it never hands out a credential twice. So never wipe NVS casually. Details are on Adding and claiming devices.
Traduit de English par IA ·
Ça a marché, les 12 sont opérationnels. J’ai tout de suite rencontré le problème device_exists car j’avais effacé la flash du nœud 3 pendant le débogage ; il était déjà enregistré sous aq-3c84a1. J’ai supprimé cet appareil dans la console et il a été reprovisionné sans problème. Je les ai tous activés depuis la quarantaine ce matin. Il a aussi fallu que j’échappe correctement les guillemets : ma première version envoyait du JSON invalide et je ne recevais rien en retour.
That worked, all 12 are up. I did hit the device_exists thing straight away because I’d erased flash on node 3 while debugging, it had already registered as aq-3c84a1. Deleted that device in the console and it provisioned again fine. Activated them all from quarantine this morning. Also had to escape the quotes properly, my first version sent broken JSON and just got nothing back.
Traduit de English par IA ·
Nous faisons la même chose sur nos capteurs de ligne. Un conseil du terrain : imprimez le nom de l’AP de configuration sur une étiquette collée sur le boîtier. Personne ne se souvient six mois plus tard de quel nœud est « ESP-3C84A1 ».
We do the same on our line sensors. One tip from the floor: print the setup AP name on a sticker on the case. Nobody remembers which node is « ESP-3C84A1 » six months later.
Traduit de English par IA ·
+1 pour l’autocollant. Par ailleurs, si certains de ces laboratoires n’ont que du Wi-Fi d’entreprise avec une connexion par utilisateur, un simple portail captif ne suffira pas : il faudrait des champs identifiant/nom d’utilisateur et du WPA2-Enterprise dans le firmware. Demandez plutôt à l’informatique un réseau IoT en PSK, bien moins contraignant.
+1 to the sticker. Also if any of those labs only has enterprise Wi-Fi with a per-user login, a plain captive portal can’t do it, you’d need identity/username fields and WPA2-Enterprise in the firmware. Ask IT for a PSK IoT network instead, much less pain.
- Vous devez être connecté pour répondre à ce sujet.
Rejoignez la discussion
Connectez-vous pour poser et répondre à des questions, aimer les messages utiles et marquer la réponse qui a résolu votre problème. Chaque contribution rapporte des points et des niveaux.

