とりあえず、問題点となるポイントが絞れてきました。
設定を終えて、再度起動するときに以下のようになります。
deep sleep 60s þárl.l|.là|.....lì.b|.ì.rb.bònnlnnâì.b.plrlrlpònà.....l......b.nâ|.ll..bònnî.ll`...nn.l`...nrn...l.lpònà....râà....b.nâ|..à.bònnî...l`...nnll`...nrn..r`.`òn...àbnl.ònnî...lpònà....râàl..b.nâ|.ìììbònnî.l.l`...nnll`...nrn..òl`..rn..òl`.är.Datasource http://192.168.1.17/server/espbm.php mode : sta(18:fe:34:9b:99:a3) add if0 scandone add 0 aid 4 pm open phy_2,type:2 0 0 cnt connected with JunkHackAP, channel 6 dhcp client start... ip:192.168.1.24,mask:255.255.255.0,gw:192.168.1.1 Wdt. This takes too long. Go to sleep. rm match pm close 7 0 0/19987670 deep sleep 60s .árl.l|.là|.....lì.b|.ì.rb.bònnlnnâì.b.plrlrlpònà.....l......b.nâ|.ll..bònnî.ll`...nn.l`...nrn...l.lpònà....râà....b.nâ|..à.bònnî...l`...nnll`...nrn..r`.`òn...àbnl.ònnî...lpònà....râàl..b.nâ|.ìììbònnî.l.l`...nnll`...nrn..òl`..rn..òl`.är.Datasource http://192.168.1.17/server/espbm.php mode : sta(18:fe:34:9b:99:a3) add if0 scandone add 0 aid 4 pm open phy_2,type:2 0 0 cnt connected with JunkHackAP, channel 6 dhcp client start... ip:192.168.1.24,mask:255.255.255.0,gw:192.168.1.1 Wdt. This takes too long. Go to sleep. rm match pm close 7 0 0/19987656 deep sleep 60s þá
これは、DHCP でIP を取得するまえに、データソースのURL をフェッチしにいっているようで、WiFi のコネクトチェックがアボートしているので、URLにコネクトしていない状況です。どういうタイミングかはわかりませんが、極まれに以下のようになるときがあります。
deep sleep 60s .árl.l|.là|.....lì.b|.ì.rb.bònnlnnâì.b.pìlrlrlpònà.....l......b.nâ|.ìllbònnî.ll`...nn.l`...nrn..l.lpònà....râà....b.nâ|..bònnî...l`...nnll`...nrn...l`òn...àbnl.ònnî...lpònà....râàl..b.nâ|.ìl.à.bònnî.l.l`...nnll`...nrn..ò..l.rn..ò..lärlDatasource http://192.168.1.17:8266/server/espbm.php mode : sta(18:fe:34:9b:99:a3) add if0 scandone reconnect scandone reconnect scandone reconnect scandone reconnect scandone reconnect scandone reconnect scandone reconnect scandone reconnect scandone add 0 aid 4 pm open phy_2,type:2 0 0 cnt connected with JunkHackAP, channel 6 dhcp client start... No heap available, failed to malloc 440 No heap available, failed to malloc 440 Wdt. This takes too long. Go to sleep. rm match pm close 7 0 0/10213903 No heap available, failed to malloc 440 del if0 usl sul 0 0 deep sleep 60s .á
現在までで、SDK はとりあえず以下で調査しました。
SDK Version | make可否 | make問題点 | 実際の挙動 | 備考 |
0.9.2 | X | |||
0.9.3 | X | |||
0.9.5 | O | なし | URL フェッチしない | |
0.9.6_b1 | X | unknown type name ‘uint32_t’ unknown type name ‘uint16_t’ unknown type name ‘uint8_t’ |
cgiwifi.c io.h |
|
1.0.0 | X | 同上 | ||
1.0.1b1 | X | 同上 | ||
1.0.1b2 | X | 同上 | ||
1.0.1 | O | なし | ||
1.1.0 | X | eink.c で使われている os_update_cpu_frequency がこのSDKにない |
v1.1.0_15_05_26 | |
1.1.1 | X | unknown type name ‘uint**_t’ conflicting types for ‘os_random’ |
user/cgiwifi.c user/io.h include/espmissingincludes.h |
|
1.1.2 | X | 同上 | 同上 | |
1.2.0 | X | 同上 | 同上 | |
1.3.0 | X | |||
1.4.0 | X |
※随時、更新予定。
SDK のバージョンがあがるごとに、廃止されたファンクションがあったり、引数が変わったりしたものがあったりと、それなりに対応が必要そうです。作者はおそらく、推測ですが0.9.5 あたりで作成しているかと思います。
esp-open-sdk の makefile を見ると以下のようにあり、まだ試すバージョンがあります。
VENDOR_SDK_ZIP_1.3.0 = esp_iot_sdk_v1.3.0_15_08_08.zip VENDOR_SDK_DIR_1.3.0 = esp_iot_sdk_v1.3.0 VENDOR_SDK_ZIP_1.2.0 = esp_iot_sdk_v1.2.0_15_07_03.zip VENDOR_SDK_DIR_1.2.0 = esp_iot_sdk_v1.2.0 VENDOR_SDK_ZIP_1.1.2 = esp_iot_sdk_v1.1.2_15_06_12.zip VENDOR_SDK_DIR_1.1.2 = esp_iot_sdk_v1.1.2 VENDOR_SDK_ZIP_1.1.1 = esp_iot_sdk_v1.1.1_15_06_05.zip VENDOR_SDK_DIR_1.1.1 = esp_iot_sdk_v1.1.1 VENDOR_SDK_ZIP_1.1.0 = esp_iot_sdk_v1.1.0_15_05_26.zip VENDOR_SDK_DIR_1.1.0 = esp_iot_sdk_v1.1.0 # MIT-licensed version was released without changing version number #VENDOR_SDK_ZIP_1.1.0 = esp_iot_sdk_v1.1.0_15_05_22.zip #VENDOR_SDK_DIR_1.1.0 = esp_iot_sdk_v1.1.0 VENDOR_SDK_ZIP_1.0.1 = esp_iot_sdk_v1.0.1_15_04_24.zip VENDOR_SDK_DIR_1.0.1 = esp_iot_sdk_v1.0.1 VENDOR_SDK_ZIP_1.0.1b2 = esp_iot_sdk_v1.0.1_b2_15_04_10.zip VENDOR_SDK_DIR_1.0.1b2 = esp_iot_sdk_v1.0.1_b2 VENDOR_SDK_ZIP_1.0.1b1 = esp_iot_sdk_v1.0.1_b1_15_04_02.zip VENDOR_SDK_DIR_1.0.1b1 = esp_iot_sdk_v1.0.1_b1 VENDOR_SDK_ZIP_1.0.0 = esp_iot_sdk_v1.0.0_15_03_20.zip VENDOR_SDK_DIR_1.0.0 = esp_iot_sdk_v1.0.0 VENDOR_SDK_ZIP_0.9.6b1 = esp_iot_sdk_v0.9.6_b1_15_02_15.zip VENDOR_SDK_DIR_0.9.6b1 = esp_iot_sdk_v0.9.6_b1 VENDOR_SDK_ZIP_0.9.5 = esp_iot_sdk_v0.9.5_15_01_23.zip VENDOR_SDK_DIR_0.9.5 = esp_iot_sdk_v0.9.5 VENDOR_SDK_ZIP_0.9.4 = esp_iot_sdk_v0.9.4_14_12_19.zip VENDOR_SDK_DIR_0.9.4 = esp_iot_sdk_v0.9.4 VENDOR_SDK_ZIP_0.9.3 = esp_iot_sdk_v0.9.3_14_11_21.zip VENDOR_SDK_DIR_0.9.3 = esp_iot_sdk_v0.9.3 VENDOR_SDK_ZIP_0.9.2 = esp_iot_sdk_v0.9.2_14_10_24.zip VENDOR_SDK_DIR_0.9.2 = esp_iot_sdk_v0.9.2
0.9.5 ~ 1.3.0 の間にまだあるので、それらをとりあえず全部試してみようかと。
コードの調査している部分は、
---- user_main.c :: httpclientFetch(myConfig.url, httpclientCb, httpclientHdrCb); einkDisplay(24*1024, tcpEinkNeedData, einkDoneCb); ::
です。古典的に、デバックにはシリアルプリントと delay を入れているんですが、コネクトしている部分がよくわからず、一体どこで、アクセスポイントに接続して、dhcp してIP をもらっているのかが良くわかっていません。このあたりは、C のデバックデックニックのスキルだと思いますが、もっと効率的なものはないでしょうかね。
原理的に、deep sleep から復帰したら、まずアクセスポイントにコネクトし、IP をゲットするまで delay させてからフェッチしたいんですが、そのdelay を入れるところがよくわかりません。
もう少し、簡単なアクセスポイントに接続するコードを書いて試してみようかと思います。部品とプリント基板を発注しようと考えていたんですが、もう少しソースコードを調査しないと動作しなさそうなので、来週以降に発注は持ち越しになりそうです。httpのtcp 経由じゃなく、ローカルのファイルシステム(espfs)に含まれる.bm ファイルは表示されている感じなので、表示することはできそうかなと思います。
さぁ、どこまで根気が続くかです。hack とは根気がいるものですね。推理と実験を繰り返し、1つづつ問題を把握しないといけませんが、問題を分解するのにスキルが足りていない部分は都度、勉強しながらとなるので、時間がかかります。
今のところ、このhack で勉強になったのは、基板を設計しお値打ちに作成する方法、open-sdk というものがあること、esptool にはpython 版と C 版があるということです。
▼まとめ
・作者はおそらく、0.9.5 か 1.0.1のSDK を使っていたと推測。
・esphttpd は、オリジナルがおそらく以下
https://github.com/OLIMEX/ESP8266/tree/master/esphttpd
・そして、最新のSDKなどにあわせて新しくなったものが以下にある
https://github.com/izhak2/esphttpd
・この単体をまず試してみようと思う。特に、新しいesphttpd は Makefile の書き方が参考になるし、新しいSDKにも対応しているようなので。