2016-12-14 2 views
0

J'essaye d'envoyer JSON à un module Arduino avec un ESP8266. J'ai un serveur web simple, qui attend JSON avec SSID et mot de passe où le périphérique doit se connecter.ESP8266 Demande de codage de contenu Arduino

ESP8266WebServer server(80); 
server.on("/config", HTTP_POST, configHandle); 
server.begin(); 

void handleConfig() { 
    String payload = server.arg("plain"); 
    //convert JSON to char[] 
    //parse using jsmn lib 
} 

Que se passe-t-il si le mot de passe contient des caractères non ASCII? Comment puis-je gérer le contenu demande de mettre cette arguments à la méthode:

WiFi.begin(ssid, pass); 

Edit:

Exemple: Si j'envoie JSON comme:

{"pass": "test+test"} 

Puis, lorsque j'imprime cette charge utile Je n'obtiens pas de signe + (mais il s'agit d'un signe ASCII)

Demande (wireshark):

enter image description here

Char charge utile de tableau de bord:

enter image description here

Répondre

2

La bibliothèque ESP8266WebServer décode + dans un caractère d'espace.

Vous devez encoder l'URL de la chaîne JSON avant de l'envoyer.

Dans JavaScript vanilla vous devez utiliser encodeURIComponent.
N'utilisez pas encodeURI, car il n'encode pas +.
Quoi que vous utilisiez, assurez-vous que le caractère + est codé en %2b.

Cela vous évitera également des problèmes potentiels, impliquant ?, & et = à l'intérieur de votre JSON.

+0

JSON est envoyé dans la méthode POST de charge utile de requête. Donc, je devrais vraiment encoder ce contenu en utilisant la méthode d'encodage URI? Pourquoi la bibliothèque change + en caractère d'espace, et comment empêcher cette solution? – kris14an

+0

[Les données POST doivent également être codées] (https://en.wikipedia.org/wiki/POST_ (HTTP) #Use_for_submitting_web_forms) –

+0

ok, lors de l'encodage de ce json, fonctionne bien, mais est une méthode pour lire ces données du client flux de connexion en utilisant des octets originaux? – kris14an