ESP8266のSmartPlugを試す

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;

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です