esp_wifi_repeaterを使ってみる

WiFi Repeater機能


今回は、esp_wifi_repeaterのルーター機能を紹介します。
ファームを書き込んだESP8266以外に、もう1台のESP8266を用意し、以下のスケッチを書き込みます。
このスケッチでは、esp_wifi_repeaterからIPアドレスを取得したのち、「broker.hivemq.com」にコネクトしま す。
#include <ESP8266WiFi.h>
#include <PubSubClient.h> // https://github.com/knolleary/pubsubclient

#define INTERVAL        10
//#define MQTT_SERVER     "192.168.10.40"
//#define MQTT_SERVER     "broker.mqtt-dashboard.com"
#define MQTT_SERVER     "broker.hivemq.com"
#define MQTT_PORT       1883
#define MQTT_TOPIC      "nopnop2002" // You can change
#define MQTT_WILL_MSG   "I am leaving..." // You can change

const char* SSID = "MyAP";
const char* PASSWORD = "";

WiFiClient espClient;
PubSubClient client(espClient);

unsigned long lastMillis;

IPAddress localIP;

void errorDisplay(char* buff) {
  Serial.print("Error:");
  Serial.println(buff);
  while(1) {
    delay(200);
  }
}

void setup() {
  delay(1000);Serial.begin(9600);
  Serial.print("Wait for WiFi...");
  WiFi.begin(SSID, PASSWORD);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("subnetMask: ");
  Serial.println(WiFi.subnetMask());
  Serial.print("gatewayIP: ");
  Serial.println(WiFi.gatewayIP());
  localIP = WiFi.localIP();
 
  client.setServer(MQTT_SERVER, MQTT_PORT);

  char clientid[20];
  sprintf(clientid,"ESP8266-%06x",ESP.getChipId());
  Serial.print("clientid=");
  Serial.println(clientid);
  Serial.print("Attempting MQTT connection...");
  // Attempt to connect
  if (strlen(MQTT_WILL_MSG)) {
//    Serial.println("WILL");
    if (!client.connect(clientid,MQTT_TOPIC,0,0,MQTT_WILL_MSG)) {
      errorDisplay("connect Fail");
    }
  } else {
//    Serial.println("NOT WILL");
    if (!client.connect(clientid)) {
      errorDisplay("connect Fail");
    }
  }
  Serial.println("connected");
  lastMillis = millis();
}

void loop() {
  static int counter=0;
  static int value = 0;
  char msg[50];

  if (Serial.available() > 0) {
    char inChar = Serial.read();
    Serial.println("KeyIn");
    client.disconnect();
    Serial.println("Publish end");
    while(1) { }
  }

  if (!client.connected()) {
    errorDisplay("not connect");
  }
  client.loop();

  long now = millis();
  if (now - lastMillis > 1000) {
    lastMillis = now;
    counter++;
    if (counter > INTERVAL) {
      ++value;
      snprintf (msg, 75, "hello world #%ld", value);
      Serial.print("loalIP:");
      Serial.print(localIP);
      Serial.print(" Publish message: ");
      Serial.println(msg);
      if (!client.publish(MQTT_TOPIC, msg)) {
        errorDisplay("publish fail");
      }
      counter=0;
    }
  }
}

スケッチを実行すると以下の表示となります。
esp_wifi_repeaterから192.168.4.3のアドレスが払い出されますが、外部の「broker.hivemq.com」に コネクトできません。


これは、esp_wifi_repeaterに外部と繋がるルーター(インターネットと接続しているuplink AP)への接続情報が登録されていないためです。
そこで、esp_wifi_repeaterにtelnetで接続し、uplink APの情報を登録します。
最後にconnectコマンドでuplink APに接続します。
CMD>set ssid aterm-e625c0-g →  uplinkルーターの SSID

CMD>set password xxxxxxxxxxxxx → uplinkルーターのパスワー ド

CMD>save

CMD>connect
Trying to connect to ssid aterm-e625c0-g, password: xxxxxxxxxxxx
CMD>scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 14
cnt

connected with aterm-e625c0-g, channel 11
dhcp client start...
connect to ssid aterm-e625c0-g, bssid c0:25:a2:ac:cb:ba, channel 11
ip:192.168.10.175,mask:255.255.255.0,gw:192.168.10.1
ip:192.168.10.175,mask:255.255.255.0,gw:192.168.10.1,dns:192.168.10.1

uplink APからは192.168.10.175のIPアドレスが払い出されます。
設定情報を確認すると以下の様に、uplink APの情報を確認することができます。
これでesp_wifi_repeater経由でuplink APに接続することができます。


同じスケッチを再度実行すると、今度はちゃんと外部の「broker.hivemq.com」にコネクトできます。


さらにもう1台、ESP8266を追加して同じスケッチを書き込んでみました。
ちゃんと外部のサーバーに繋がりました。


このような感じでインターネットにつながります。



Linuxマシンを使用してWiFiのパフォーマンスを調べてみました。
使用したLinuxマシンはOrangePi-PCで、MT7601UのUSB-WiFiとspeedtestツールを使いました。
どちらも親機にはAterm PA-WG2600HSを使っています。
こちらがNECのAterm WR8165N(300Mbps)経由で、親機に接続している状態でのパフォーマンスです。
orangepi@orangepipc:~$ speedtest --simple
Ping: 57.313 ms
Download: 13.38 Mbit/s
Upload: 6.26 Mbit/s
orangepi@orangepipc:~$ speedtest --simple
Ping: 55.69 ms
Download: 13.85 Mbit/s
Upload: 6.55 Mbit/s
orangepi@orangepipc:~$ speedtest --simple
Ping: 67.225 ms
Download: 13.87 Mbit/s
Upload: 5.69 Mbit/s

こちらがesp_wifi_repeater経由で、親機に接続したときのパフォーマンスです。
パフォーマンスはかなり落ちることが分かります。
Linuxマシンでは、パッケージアップデートなどで多量のデータをダウンロードするので、この環境で使うのはちょっと無理が有りそうです。
orangepi@orangepipc:~$ speedtest --simple
Ping: 55.979 ms
Download: 1.52 Mbit/s
Upload: 4.77 Mbit/s
orangepi@orangepipc:~$ speedtest --simple
Ping: 54.665 ms
Download: 1.20 Mbit/s
Upload: 4.20 Mbit/s
orangepi@orangepipc:~$ speedtest --simple
Ping: 48.133 ms
Download: 1.19 Mbit/s
Upload: 4.14 Mbit/s



ESP-01にATファームを書き込んで、esp_wifi_repeaterに接続しました。
こちらで紹介している ATファームの自動アップデートも問題なく動きます。
ATファーム経由で使う分には、それほどパフォーマンスが必要ないので、この環境で使うことができます。
(前略)

ready
WIFI CONNECTED
WIFI GOT IP
AT+GMR
AT version:1.5.0.0(Oct 24 2017 12:03:18)
SDK version:2.1.0(ace2d95)
compile time:Oct 24 2017 15:48:02
Bin version(Wroom 02):1.5.1
OK
AT+CWMODE=1

OK
AT+CIUPDATE
+CIPUPDATE:1
+CIPUPDATE:2
+CIPUPDATE:3
+CIPUPDATE:3
+CIPUPDATE:4

OK
WIFI DISCONNECT

(中略)

ready
WIFI CONNECTED
WIFI GOT IP
AT+GMR
AT version:1.6.2.0(Apr 13 2018 11:10:59)
SDK version:2.2.1(6ab97e9)
compile time:Jun  7 2018 19:34:27
Bin version(Wroom 02):1.6.2
OK



mqttのPubkisherとSubscriberを書き込んで、しばらく放置してみました。
esp_wifi_repeater経由で1秒毎にMQTTのメッセージを送受信します。
13時間程度動き続けていますが全く問題ないです。






最近、WiFiルーターには同時接続台数の上限があることを知りました。
我が家には常時7台のRaspberryPi/OrangePiと、4台のESP8266がWiFiに接続しているので、
もっと接続台数の大きなルーターへの交換を考えていました。

esp_wifi_repeaterのドキュメントによると、1台のesp_wifi_repeaterで最大8台まで接続が可能です。
それほどWiFiのパフォーマンスが必要ない環境では、esp_wifi_repeater側に接続することでしばらく様子を見ようと思います。

続く...