ESP8266_IOT_PLATFORMに含まれるSmartPlugを試してみた。
装置の各種設定をWEBページで行えるようにしたいのだが、ゼロから作るのは大変なのでSmartPlugが使えないかと考えた。
結論から言うと、バグを直せば使えそうである。
解凍したままでは、WEBページが正しく表示されないバグがある。
1つ目は、ESP8255_RTOS_SDK内でIPを実装しているlwipのマルチスレッド対応部分のうち、closeを行う部分で状態をSHUTODOWN_NONE状態に戻さないバグ。
closeを実行した後にselectで同期を取ろうとすると返り値が継続的に-1になってしまい、全てのソケット通信を続けられなくなってしまう。
socket_mt.c 351行目付近 SOCK_MT_SET_SHUTDOWN(s, SOCK_MT_STATE_NONE); が抜けている。
2つ目は、espfsが扱うファイルイメージが4バイト境界に整列する前提であるにも関わらず、特に指定がなされていないため4バイト境界に整列しない場合があるバグ。
一つの直し方を下記に示す。
espfsというセクションを新設し4バイト境界に整列させる考え方。
ESP8266_IOT_PLATFORM\libesphttpd\Makefile 150行目付近 【修正前】 $(Q) $(OBJCOPY) -I binary -O elf32-xtensa-le -B xtensa --rename-section .data=.irom0.literal \ 【修正後】 $(Q) $(OBJCOPY) -I binary -O elf32-xtensa-le -B xtensa --rename-section .data=.espfs \
ESP8266_RTOS_SDK\ld\eagle.app.v6.common.ld 113行目付近 【修正前】 *(.irom0.literal .irom.literal .irom.text.literal .irom0.text .irom.text) .data=.irom0.literal \ 【修正後】 *(.irom0.literal .irom.literal .irom.text.literal .irom0.text .irom.text) . = ALIGN (4); *(.espfs)
この2つを修正すれば、ちゃんと動くようになる。
実害は無いが、ESP8266_IOT_PLATFORM内のHTTPサーバを実装する部分で、ポート番号とIPアドレスを保持する部分に抜けがあり、接続先のIPアドレスとポート番号を保持できない部分がある。代入されたconnData[index].remote_portとconnData[index].remote_ipはどこでも使われていないため問題は顕在化しない。
httpd.c 706行目付近 struct sockaddr name; int len = sizeof(name); getpeername(connData[index].conn->sockfd, (socklen_t *)&len); ~~~~~~~~ struct sockaddr_in *piname=(struct sockaddr_in *)&name; connData[index].remote_port = piname->sin_port; connData[index].remote_ip=piname->in_addr.s_addr;