Wio Terminal:Wi-Fi接続してHTTPSでデータ取得!(失敗)

せっかくのIoT機器なので、Wi-Fi接続を試してみます。

Network Overview
https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/

Wi-Fi 接続する前に、Wi-FiチップRTL8720のファームウェアのアップデートをする必要があります。

Wio Terminal に、ファームウェア書き換え用のプログラムを書き込み。 PCからシリアルでデータを受け取り、それをそのままチップのファームウェアに書き込むプログラムです。(PC側のプログラムは、現状はWindows用しか用意されてないみたいです。)

  1. Chip Select で AmebaD(8721D)を選択
  2. 接続しているシリアルポートを選択
  3. Address に 0x08000000 , Size に 2048 KB を設定して Erase 実行
  4. ファームウェアの3つのファイルを選択。
  5. それらのチェックボックスをチェックしてDownlaod実行!

Successfullyが出れば完了です!チェックボックス忘れずに。
僕は最初忘れてて、Wi-Fi動作せずでした…。再度ファームウェアアップデートで解決!


ファームウェアアップデートが完了したら、ドライバーをインストールします。

  1. Seeed_Arduino_atWiFi
  2. Seeed-Arduino-FreeRTOS
  3. Seeed_Arduino_atUnified
  4. Seeed-Studio/esp-at-lib
  5. Seeed_Arduino_mbedtls
  6. Seeed_Arduino_atWiFiClientSecure

6つ。多いですねー。Wi-Fi使うためにこれだけ必要とは。全部zipで取得して手動インストールする必要あります。このあたり、もうちょっとすっきり改善していくといいですね。


インストール終わった後の実際の使い方はこちらに。

Wi-Fi Connectivity
https://wiki.seeedstudio.com/Wio-Terminal-Wi-Fi/

Scanning Wi-Fi Network Example Code で、アクセスポイントのスキャン。

Connecting to Specified Network Example Code で、指定したアクセスポイントへの接続ですね。M5Stackでは非対応だった5GHz帯にも対応してるのが良いですね。

WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(2000);
WiFi.begin(ssid, password);

いったんdisconnect呼ぶのがコツなのでしょうか。M5Stackもそうでしたが…。


Webサイト接続して、データ取得してみます。とはいえ、最近のWebサイトはほぼ全部 https 対応してて、http だと接続させてくれないんですよね。どうせやらないといけないので、最初から WiFiClientSecure.h 使って、https で接続してみます。

M5Atomでニュース速報出力した時に使った、Googleトレンド取得を行ってみました。

ほぼ、サンプル通りです。CAは設定してないです。

#include <WiFiClientSecure.h>;

const char* ssid     = "yourNetworkName";     // your network SSID
const char* password = "yourNetworkPassword"; // your network password

const char*  server = "trends.google.co.jp";  // Server URL
 
// You can use x.509 client certificates if you want
//const char* test_client_key = "";   //to verify the client
//const char* test_client_cert = "";  //to verify the client
 
WiFiClientSecure client;
 
void setup() {
    //Initialize serial and wait for port to open:
    Serial.begin(115200);
    while(!Serial); // Wait for Serial to be ready
    delay(1000);
 
    Serial.print("Attempting to connect to SSID: ");
    //Serial.println(ssid);
    WiFi.begin(ssid, password);
 
    // attempt to connect to Wifi network:
    while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        // wait 1 second for re-trying
        delay(1000);
    }
    Serial.print("Connected");
    //Serial.println(ssid);
 
    //client.setCACert(test_root_ca);
    //client.setCertificate(test_client_key); // for client verification
    //client.setPrivateKey(test_client_cert); // for client verification
 
    Serial.println("\nStarting connection to server...");
    if (!client.connect(server, 443)) {
        Serial.println("Connection failed!");
    } else {
        Serial.println("Connected to server!");
        // Make a HTTP request:
        client.println("GET /trends/trendingsearches/daily/rss?geo=JP HTTP/1.0");
        client.println("Host: trends.google.co.jp");
        client.println("Connection: close");
        client.println();
 
        while (client.connected()) {
            String line = client.readStringUntil('\n');
            if (line == "\r") {
                Serial.println("headers received");
                break;
            }
        }
        // if there are incoming bytes available
        // from the server, read them and print them:
        while (client.available()) {
            char c = client.read();
            if (c == '\n') {
                Serial.write('\r');
            }
            Serial.write(c);
        }
        client.stop();
    }
}
 
void loop() {
    // do nothing
}

実行してみると…

あれ?名前解決に失敗してつながらない…。プログラム変更なしに、何度か再起動すると…

つながった!データ取得もできてる!

が、エラーで途中までしか読んでくれてない…。上の記事、まだ2つめの記事ですね。全然読めてない。うーん、これは厳しい。


というか、こんな大量のデータ(巨大HTML全文とか)を読ませるのは想定外かもしれないですね。短いデータのやり取りならうまくいきそうな気がします。とはいえ、実際に試したわけではないので、気がするだけです…w