チラシの裏の電子工作

電子工作、PC関係の備忘録というか、チラシの裏

ESP-WROOM-02 WebServerで長いCSVなどを返す

Arduino1.6.7+esp8266-2.1.0

ESP8266WebServerで、センサーから得たデータをcsvなんかで表示する場合、例えば

String text="";
for(int i=0;i<RECORD_LENGTH;i++){
  text+=temp[i]+","+hum[i]+","+baro[i]+"\r\n";
}
webServer.send(200,"text/plain",text);

こんな感じで処理すればいいわけだけど、当然レコードが結構長くなるとメモリ不足に陥る。
何かいい方法ないかなー、、と、ESP8266WebServer.cppを眺めてた。

どうやらhttpヘッダから直接自分で作って送ってしまえば行けそうな感じだったので、試してみた。

String header;
header ="HTTP/1.1 200 OK\r\n";
header+="Content-Type: text/plain\r\n";
header+="Content-Length: "+String(contentLength)+"\r\n";
header+="Connection: close\r\n";
header+="Access-Control-Allow-Origin: *\r\n";
header+="\r\n";
webServer.sendContent(header);

String text="";
for(int i=0;i<RECORD_LENGTH;i++){
  text=temp[i]+","+hum[i]+","+baro[i]+"\r\n";
  webServer.sendContent(text);
}

こんなことをやれば、1レコードずつ送信できるのでメモリ不足を回避できた。
ただ、1行ごとにsendすると非常に遅いので、何行かバッファして纏めてsendした方がいいかも。

例えばこんな感じ。

String text="";
for(int i=0;i<RECORD_LENGTH;i++){
  text+=temp[i]+","+hum[i]+","+baro[i]+"\r\n";
  if(i % 50 ==0){
    webServer.sendContent(buff);
    text="";
  }
}
webServer.sendContent(text);

ここまで書いて、contentLengthの存在を忘れてた。
レコードを固定長にして、レコード数と掛け算してcontentLengthを計算するようにした方がいいかも。


んで、出力URLをjavascriptのグラフライブラリに食わせたら、割と簡単にグラフ化できる。
espgraph.png  
今回使ったのはDygraphs。
特にこのグラフライブラリが優れてるわけではなく、過去に使ったことがあるって理由で採用したので、今はもっと良いのがあるかも。


スポンサーサイト

カテゴリ:未分類

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://nax9800.blog.fc2.com/tb.php/119-60a67cfb
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad