2017-03-20 5 views
0

Je jouais avec xxd -i ce week-end pour convertir des fichiers binaires en arrays char non signés, pensant que je pourrais l'utiliser pour intégrer de petits fichiers binaires dans le code arduino pour la transmission sur mini web et autres services . Le problème est, il semble que les fonctions dans les bibliothèques existantes attendent des types de données const char *, string ou File. (et bien sûr, les tableaux de chars non signés ne sont pas vraiment des tableaux de chars donc ils ne se convertissent pas bien en chaînes)ESP8266 WebServer comment streamer unsigned char

N'étant pas quelqu'un de familier du C++ en profondeur (apprenant encore) Je me demande s'il y a un moyen facile pour diffuser le tableau char non signé créé à partir de xxd sur le code serveur ESP ou quelque chose de similaire? Et/ou existe-t-il un meilleur moyen d'encoder un fichier binaire pour l'envoi de la même chose? Je cherche essentiellement à construire principalement des périphériques esp basés sur le 'repos', mais je voulais avoir une sorte d'interface html/js très rudimentaire pour se connecter directement et configurer les fonctionnalités de base ou récupérer la télémétrie de base des périphériques. Ma pensée était que, avec un codage html/js très rationalisé combiné avec un minify suivi d'un gzip, je pourrais mettre ces interfaces primitives de base directement dans le code dans un tableau binaire pour être servi en cas de besoin. Pour les périphériques plus complexes, le serveur Web de la carte SD fonctionne correctement, mais je préfère ne pas avoir à utiliser des cartes SD pour toutes les applications. Avant de revenir sur le contenu html dans des chaînes énormes ou des appels de fonctions remplis de concaténations/impressions, je voudrais essayer de faire fonctionner cela comme une autre option. Toute aide est appréciée.

--- --- ÉDITÉ Exemple de xxd -i

unsigned char index_htm_gz[] = { 
    0x1f, 0x8b, 0x08, 0x08, 0x25, 0x38, 0xcf, 0x58, 0x02, 0x03, 0x69, 0x6e, 
    0x64, 0x65, 0x78, 0x2e, 0x6d, 0x69, 0x6e, 0x2e, 0x68, 0x74, 0x6d, 0x00, 
    0x5d, 0x8d, 0xb1, 0x6a, 0xc4, 0x30, 0x10, 0x44, 0x7b, 0x7d, 0xc5, 0xe6, 
    0x03, 0xce, 0x4a, 0xc0, 0x98, 0x14, 0x2b, 0x35, 0x97, 0x40, 0xba, 0x4b, 
    0x61, 0x08, 0x29, 0x65, 0x7b, 0x2d, 0x2d, 0xb7, 0xb2, 0x8d, 0xb4, 0xc9, 
    0x91, 0xbf, 0x8f, 0x42, 0xba, 0x83, 0x61, 0x18, 0x1e, 0x33, 0x0c, 0x3e, 
    0xbc, 0x5c, 0xce, 0xe3, 0xe7, 0xfb, 0x2b, 0x24, 0xcd, 0xe2, 0xf1, 0xcf, 
    0x41, 0xc2, 0x16, 0x1d, 0x6d, 0x1e, 0x33, 0x69, 0x80, 0x39, 0x85, 0x52, 
    0x49, 0xdd, 0x97, 0xae, 0xa7, 0x67, 0x8f, 0xca, 0x2a, 0xe4, 0xdf, 0x48, 
    0x64, 0x07, 0xf3, 0xb1, 0x17, 0x59, 0xd0, 0xfe, 0x33, 0x14, 0xde, 0xae, 
    0x90, 0x0a, 0xad, 0x6e, 0xae, 0xd5, 0xe6, 0xc0, 0x5b, 0xd7, 0x02, 0x14, 
    0x12, 0x57, 0xf5, 0x47, 0xa8, 0x26, 0x22, 0x6d, 0x1f, 0x4f, 0x77, 0xf3, 
    0x06, 0xf0, 0xf0, 0x63, 0xe2, 0x0a, 0x4d, 0x01, 0x6e, 0x34, 0xc1, 0x11, 
    0x22, 0x75, 0x68, 0x0f, 0x8f, 0x9c, 0x23, 0x4c, 0x7b, 0x59, 0xa8, 0xb8, 
    0x47, 0x48, 0xc4, 0x31, 0xa9, 0x1b, 0x7a, 0x30, 0xb5, 0xcc, 0x8e, 0x73, 
    0xab, 0x55, 0xfb, 0x3d, 0x45, 0xda, 0x87, 0xbe, 0x8b, 0xbc, 0xc2, 0x8d, 
    0x17, 0x4d, 0xad, 0xe0, 0x8d, 0xf9, 0x05, 0x3d, 0x2a, 0xb3, 0xe0, 0xdd, 
    0x00, 0x00, 0x00 
}; 
unsigned int index_htm_gz_len = 207; 

Comme mentionné dans les commentaires, une chose que j'ai essayé commutait le type de unsigned char const char à courir puis par les moyens suivants:

void sendCompressed(String content_type, const char * content, unsigned int len) { 
    webServer.setContentLength(len); 
    webServer.sendHeader("Content-Encoding", "gzip"); 
    webServer.send(200, content_type, String(content)); 
} 

Dans ce cas, ma fonction handleRoot appellerait la sendCompressed avec les données de l'en-tête:

void function handleRoot() { 
    sendCompressed("text/html", index_htm_gz, index_htm_gz_len); 
} 

Il compilé sans erreurs, mais ne génère rien. Je m'attendrais aussi à ce que ce ne soit pas idéal car les données String sont généralement à 7 bits et, évidemment, les données compressées binaires ne le sont pas.

+1

Est-ce que la signature compte vraiment? Ce sont les mêmes données de toute façon –

+0

Je ne sais pas - comme je l'ai dit, toujours vert à C++. J'essayais de trouver une bonne référence sur les types. Cela semble être ce que xxd éteint. La seule chose que j'ai trouvée à ce sujet était que c'était essentiellement des données binaires (et pas simplement des caractères). – Scott

+0

J'ai essayé de passer les déclarations à const char au lieu de char non signé (piquer aveuglément sur le code) et compilé sans erreurs si j'ai enveloppé la variable dans une chaîne (contenu) lors de son passage. Mais rien ne sort du service web. – Scott

Répondre

0

Ce binaire SERVIR a fonctionné pour moi:

const char favicon[1344] = { 
    0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 
... // (way shortened) 
0x44, 0xae, 0x42, 0x60, 0x82 
}; 


void handleFavicon() { 
    server.send_P(200, "image/x-icon", favicon, sizeof(favicon)); 
} 


server.on("/favicon.ico", handleFavicon); // in setup() or something like it 

vous pourriez avoir besoin d'ajuster votre tête gzip, mais cette méthode de plongement contenu binaire fonctionne assez pour afficher l'icône de droite, je serais l'image d'une des œuvres de flux gzip de la même manière ...

+0

doux, merci. J'ai fini par utiliser le code sur le lien que j'ai ajouté dans les commentaires avec quelques modifications. Il vaut la peine de vérifier ce que j'ai fait pendant que je faisais un script Perl pour copier un arbre Web et le convertir en fichier d'en-tête. – Scott

+0

(Je vais jouer avec ça plus tard, car j'ai besoin d'apprendre ces astuces de casting en C++) – Scott