ESP-WROOMスケッチのSSIDパスワードを変更せずにPCとWifi接続できるSoftAPを使った方法

# Wifiマイコン(ESP-WROOM)をPCのWebブラウザ（javascript）で監視やらコントロールしたい。
正直なところ、WebブラウザでHTML＋javascriptでしかグラフィカルなインターフェイス作るのできないです。
マイコンはシリアル通信が普通ですが、Webブラウザでシリアル通信はHTML標準でないので、簡単にはマイコン制御はできない。。。

しかし、
***ESP-WROOMだとWifiにつながるしPCのWebブラウザと簡単につながりそう。***:grinning:

だが実際にやってみるとWifiのSSIDとかIPアドレスとかが以下のように面倒。

#普通は以下の1~3のいずれかで接続。

1. ESP-WROOMをアクセスポイントモードにして、PCのWifiをESP-WROOMに接続。
>PCがWifiルーターでつながっているのを一旦切って、ESP-WROOMにWifi接続するので、Wifiのネットが利用できなくて困ります。
PCは有線LANでネットとつなげてるという手はありますが…

2. ESP-WROOMをステーションモードにし、スケッチにSSID、パスワード記入してWifiルーターとつなぎ、Wifiルーター経由でPCとESP-WROOMに接続。
>PCのWifiはネットつながったままですが、ESP-WROOMと接続するWifiルーターのSSID,パスワードをスケッチに記入して指定するので、接続するWifiルーターが変わる場合はスケッチを書きかえねばならないです。
使うところがいつも同じ場所であればそのままでいいですが。

3. ESP-WROOMに[WiFiManager](https://github.com/tzapu/WiFiManager)いれて、WebブラウザからSSID、パスワードを指定してWifiルーターとつなぎ、Wifiルーター経由でPCとESP-WROOMに接続。
>最近、[Ambientブログ](https://ambidata.io/examples/weatherstation-1/)をみてWiFiManagerを知りました。
これで万事うまくいくかと思いますが、WiFiManagerにパスワードを入力しなければならない手間はあります。
また、AOSS/WPSのWifiルーターのデフォだとパスワードがやたら長いので…まあコピペすればいいんですが…

#これ以外にPCとつなぐ方法はないもんか？
PCにある一つのWifiデバイスで仮想デバイスなんかで2ヶ所につなげれないかと思って調べていたら、
***WindowsのSoftAP***　てのがあるらしい。
>***SoftAP*** とは
WindowsのPCをWiFiアクセスポイント(WiFiルーター）として動作させられる機能のことです。
一つのWifiデバイスから仮想Wifiデバイスを生成し、WiFiアクセスポイントとしています。

じゃ、SoftAP立ち上げて、そこにつながるんじゃないかと

#SoftAPを使ってESP-WROOMを接続
- ESP-WROOMをステーションモードにし、スケッチに適当なSSID、パスワードを記入。
- PCでESP-WROOMのスケッチに記入したSSID,パスワードと同じSoftAPをコマンドラインから入力して立ち上げ
- ESP-WROOMをリセット、PCのSoftAPにDHCPで接続。
- mDNS対応したWindowsであれば、ESP-WROOMのスケッチに書いた`ホスト名.local` で接続。

***でうまくいきました！***:grin:

面倒なのはPCでSoftAPの設定と立ち上げをしなければならないところですが、以下のようにBatファイルと管理者ショートカット作ればいいです。
>[Ｗindows softAPでWifi接続](http://tabletpcnavi.com/windows10-softap/)

PC電源を切るとSoftAPはなくなってしまいます。
[Windowsのスタートアップ](https://support.microsoft.com/ja-jp/help/4026268/windows-10-change-startup-apps)に置いとけばいいかとおもいます。

#SoftAPの設定と立ち上げ
バッチファイルの内容は以下です。

```
rem ネットワークモードを許可する
netsh wlan set hostednetwork mode=allow

rem 設定するアクセスポイントのSSIDとパスワードを設定します。
rem WPA2-Personal方式のパスワードなので8文字以上で設定
netsh wlan set hostednetwork ssid=wroom-ap key=12345678 keyUsage=persistent

rem アクセスポイントの開始
netsh wlan start hostednetwork

rem ネットワーク接続ウィンドウ表示
ncpa.cpl
```
管理者権限で実行しなければいけません。

#そのほかMACやLinuxでも
SoftAPのような機能があり、検証していませんが可能なようです。
- [MacをWiFiアクセスポイントとして使う方法](https://weekly.ascii.jp/elem/000/000/136/136392/)
- [コマンド一発でLinuxマシンを即席無線LANルーターにできる「create_ap」がすごい便利だった](https://qiita.com/KuwabataK/items/5903c7584657151d576a)
- Androidはテザリング設定かな。



#mDNS使うとESP-WROOMにIPアドレス無しでアクセス、Ajaxで便利

ESP-WROOMは以下のコードです。


```cpp
#include <ESP8266WebServer.h>
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiClient.h>

const char *ssid = "wroom-ap";
const char *password = "12345678";

ESP8266WebServer server(80);

void handleRoot() {
  // HTTPステータスコード(200) リクエストの成功
  server.send(200, "text/plain", "Root Accessed.\n");
}

void setup(void) {
  // WIFI_AP, WIFI_STA, WIFI_AP_STA or WIFI_OFF
  WiFi.mode(WIFI_STA);
  //WiFi.config(ip, gateway, netmask); //ない場合DHCP
  WiFi.begin(ssid, password);
  // Wifi接続ができるまで待機
  Serial.begin(115200);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("IPAddress: ");
  Serial.println(WiFi.localIP());
  server.on("/", handleRoot);
  // ローカルネットワーク内のみ有効のmDNS(マルチキャストDNS)を開始
  // bool MDNSResponder::begin(const char* hostname){}
  if (!MDNS.begin("wroom")) {
    Serial.println("Error setting up MDNS responder!");
    while (1) {
      delay(1000);
    }
  }
  // Start TCP (HTTP) server
  server.begin();
  // Add service to MDNS-SD
  MDNS.addService("http", "tcp", 80);
}

void loop(void) {
  // Webサーバの接続要求待ち
  server.handleClient();
}
```

Windows10の2018年4月版以降や,AppleのBonjourをインストしたWindows7以降でmDNSができました。
私のWindows10の一つはデフォでmDNSきかなかったんで、以下のようにBonjourで実装しました。
[windows10でmDNSの問題を解決する](http://john-rama01.hatenablog.com/entry/2018/06/16/011155)

これで、DHCPでIPアドレス管理せずにつないでも迷子にはなりません。

mDNSのMAC、Windows、Linux、詳しくは以下にありました。
[mDNSを使ってローカルDNSサーバーを廃止する](https://qiita.com/maccadoo/items/48ace84f8aca030a12f1)

AndroidはmDNSがデフォでは使えないようです。

#これでやってみたいこと
PCのブラウザでGoogleMapとGPSデーターを連携したんだけど、GPSとjavascriptでこれで通信したらいいかとおもってます。



#参考にしたサイト

WIFI-TNGとESP-WROOM-02で始めるWIFI Arduino
https://qiita.com/tadfmac/items/17448a2d96bd56373a66

ESP-WROOM-02 ( ESP8266 ) チップ・メモリ・MACアドレス情報確認方法
https://www.mgo-tec.com/blog-entry-chip-info-esp-wroom-02-esp8266.html

ESP8266でmDNS 
https://blog.maripo.org/2018/01/esp8266_mdns/