ESP8266のESP-TOUCHというか、SmartConfigというか、その辺のしくみを見ていく。
参考にするドキュメントは、これだ。
実は、以前も調べたことがあるのだが、深くは追っていなかったのだ。
hiro99ma blog: [esp8266]SmartConfig == ESP-TOUCH
まず、ESP-TOUCHとSmartConfigの関係だが、
- Espressif's ESP-TOUCH protocol
- Smart Config technology
ということで、Smart Configというのが方式の名前で、そこで使っているプロトコルがESP-TOUCHということらしい。
Espressif's、とあるので、ESP-TOUCHはEspressif独自だと思って良いだろう。
AirKissというプロトコルも使えるので、Smart ConfigではESP-TOUCHかAirKissが使える、ということになるのか。
今回はESP-TOUCHのみ見ていく。
APIは開始と中断、あとはタイムアウト時間設定とバージョン取得くらいか。
プロトコルでどれを使うのかを設定するAPIもあり、開始前に呼んでおくとのこと。
サンプルは設定していないので、デフォルトはおそらくSC_TYPE_ESPTOUCH_AIRKISSだ。
smartconfig_start()すると、あとはコールバックで進んでいく。
ESP8266のアプリとしては、SC_STATUS_LINKでwifi_station_set_config()するくらいしかやることがない。
起動してWiFi APと接続できなかったらSmartConfigモードになる、とか、ボタン押したらSmartConfigモードになる、というのが望ましいか。
さて、start()すると、ステータスはFIND_CHANNELまでは進むのだが、Nexus5をテザリングさせたままやると、次に進めなかった。
通信できなかったからだとは思うのだが、そもそもどうやってAndroidアプリと通信しているのだろうか?
ドキュメントでは、UDPを使っていると書かれている。
説明図は、こうなっていた。
このパケットは、本で調べるとIEEE802.3フレーム形状というもののようだ。
UDPかどうかは"DATA"の部分に載ると思うので、ESP-TOUCHとしてはEthernetパケットに載せているのだろうか?
あるいは、UDPのデータとしてこれが入っているのだろうか。
IEEE802.11標準だとアドレスが4つくらい入っているようだから、データ部に載せる・・・?
いや、Interface誌2012/11月号を読むと、送信側はアドレスとして「自分・AP・相手」を必要とするが、APはそれを受け取って流すときは「自分・相手」だけにしてしまうようだ。
ということは、SmartConfigアプリが自分をAPとして送信する?
そもそも、何も設定していない状態でどうやって希望する無線を見つけ出すのだろうか。
WPSで設定できるのだから、何か手段はあるはずだ。
ただ、なんとなくだが、Androidアプリからそんな深いパケットは制御できないような気がするのだ。
うーーーん。。。。
動かしながらやった方が早そうだ。
おそらく、AndroidアプリのConfirmボタンを押して送信開始するのは、ここだ。
違ってたら、済まん。
データを見てみると、0x31をひたすら送っている。
プリアンブルか?
ログでは"send gc code"となっている。ソースのコメントは"send guide code"となっていた。
https://github.com/EspressifApp/EsptouchForAndroid/blob/master/src/com/espressif/iot/esptouch/protocol/EsptouchGenerator.java#L30
gcがguide code、dcはdata codeを指しているようだ。
guide codeを流し続けて、相手が応答したらdata codeを流すのかと思ったが、どうもguide codeとdata codeを交互に流しているようだ。
- WiFi AP接続中で偽パスワードだと、UDP受信しない
- WiFi AP接続中で空パスワードだと、UDP受信しない
- WiFi AP接続中で正しいパスワードだと、UDP受信する
という動きをしたので、ESP8266が応答したらデータを投げるのではなく、とにかくデータを投げ続けて、ESP8266が設定できたら何か送信するので応答できる、という作りのようだ。
ということは、テザリングしているときは相手が受け取れていないか、自分がうまく送信できていないかのどちらかだろう。
ドキュメントを読むと、ESP8266はSniffer modeを使っているらしい。
Sniffer modeは使ったこと無いのだけど、無線が出ていたら読み取ってくれるようになってるのではなかろうか。
UDPの送信先は、IPアドレスが"234.xx.xx.xx"(xxはカウント値で毎回変わる)、ポート番号は7001になっている。
これが出ていないのか、受け取れていないのか。
そもそも、テザリングで作ったアクセスポイントをWiFiのアクセスポイントと一緒にして良いものなのか。。。
うーん、Sniffer_DEMOを動かしてみた方が良いのか。
長くなってきたので、今回はここで打ち切ろう。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。