m5stackで組込み!!

Arduinoによるm5stack開発のいろいろと...

1X認証のポート設定について

ひとつ前の記事では各種設定をまとめましたが、今回はポートについてまとめました。
https://m5stack-build.hatenablog.com/entry/2023/08/17/112212

ポートの詳細設定について

gs108t_port2
  • ポート制御

各ポートの状態を設定する。1X認証を使用するときは「自動」に設定する。通常のポートとしてしようするなら「認証済み」に設定する。

  • MAB

???

  • ゲストVLAN ID

???

  • ゲストVLAN期間

???

  • 未認証のVLAN ID

???

  • 定期的な再認証

「有効」の場合は再認証期間で設定した時間が経過するとオーセンティケーターから再認証のパケットが送られてくる。

  • 再認証期間

再認証までの時間

  • アイドル期間

アイドル状態の時間。この時間の間はサプリカント、サーバーからの要求は受け付けない。

  • EAPの再送信

EAP送信で応答が返ってこなかったときに再送するまでの時間

  • 最大EAP要求数

EAPの再送最大回数

サプリカント応答タイムアウト時間

サーバーの応答タイムアウト時間

  • 制御方向

「両方」固定

「バージョン1」固定

  • PAE機能

「オーセンティケーター」固定

  • オーセンティケーターPAEの状態

ここは状態によって変化

  • バックエンドの状態

ここは状態によって変化

ポートのモニタリングについて

各ポートの送受信したEPAOLパケットの情報をモニタリングできます。

gs108t_moni

1X認証のオーセンティケーターについて

ひとつ前の記事で1X認証について簡単にまとめました。(備忘録的な)
https://m5stack-build.hatenablog.com/entry/2023/08/15/112023

スイッチハブについて

オーセンティケーターのスイッチハブとしてお手頃なのがNETGEARのGS108Tです。
他にもありますが意外とお値段するんですね。1X認証機能が付いているので高価なんでしょうか。。。

NETGEAR GS108T

NETGEAR GS108Tについて

まずはスイッチハブにアクセスします。
初期のIPアドレスは「192.168.0.239」です。ネットワークに繋げれば動的にIPアドレスは割り振られます。
パスワードは「password」です。ログインできたら変更したほうがいいですね。

gs108t_login

管理画面はこんな感じです。
ここから色々と設定すると1X認証のオーセンティケーターとして機能します。

gs108t_main

各種設定について

まずはポートの認証方法で1X認証を有効にします。

gs108t_enable

8ポートあるので1X認証として使用したいポートは「自動」に設定します。
最低でも1ポートは通常のポートとして残しておきましょう。

gs108t_port

RADIUSサーバの情報を設定します。
IPアドレス、認証ポート、シークレットを設定します。

gs108t_radius

認証リストでRADIUSを指定します。

gs108t_list

これで一通り設定できたと思います。記憶を掘り起こして書いていますので足りていなかったら申し訳ありません。。。

1X認証について

備忘録的な。。。

1X認証とは

IEEE802.1X認証で有線/無線LANにおけるユーザー認証の規格のことです。

構成要素について

サプリカント - オーセンティケーター - RADIUSサーバー」の3要素から構成されている。

サプリカント:クライアントの端末。PCなど。
オーセンティケーター:クライアントとサーバの仲介役。
RADIUS:認証サーバー。

サプリカント - オーセンティケーター」の通信はEAPOLパケット、「オーセンティケーター - RADIUSサーバ」の通信はRADIUSパケットでやり取りを行う。

サプリカントについて

Windowsには標準で1X認証の機能が備わっています。
ネットに機能を有効にする手順がわかりやすく載ってました。
nwengblog.com

RADIUSサーバについて

認証処理を行うサーバです。
FreeRADIUSというオープンソースソフトウェアのRADIUSサーバもあります。
freeradius.org

オーセンティケーターについて

クライアントとサーバの仲介役です。
スイッチハブがオーセンティケーターの役割となります。
オーセンティケーターについてはあまり情報がなかったので実際に触ってまとめようと思います。

GIFって表示できるの?

またまた久しぶりです。
最近は全然組込んでないです。。。

今回は急にGIFって表示できないかなと思ってやってみようと思いました。

hiyokoyarou.com

なんかかわいいサイト見つけたのでこのGIFを表示してみようと思います。
今日はここまでです。。。

SSLメールでメール受信してみた

前回まではメール送信でしたが、今度はメール受信をしてみたいと思います。
ベースにするのはこちらのMailer.hを受信用に書き換えました。
www.kerislab.jp

サンプルコード(Mailer_pop.h)

#pragma once

#include <ssl_client.h>
#include <WiFiClientSecure.h>
#include <base64.h>

class Mailer_pop {
  public:
    Mailer_pop(const char* username, const char* password, const int pop_port, const char* pop_hostname):
      username(username), password(password), pop_port(pop_port), pop_hostname(pop_hostname) {}

    bool receive(void) {
      WiFiClientSecure client;
      String root_ca;
      
      /* ファイルオープン */
      File datFile = SD.open("/set/yahoo_root.cer");  /* 証明書を読みだす */
      if( datFile )
      {
        M5.Lcd.println("Root File open successful");
        Serial.println("Root File open successful");
        /* サイズ分ループ */
        while( datFile.available() )
        {
          root_ca = root_ca + datFile.readString();
        }
        /* ファイルクローズ */   
        datFile.close();
      } 
      else
      {
        M5.Lcd.println("Root File open error");
      }
      client.setCACert(root_ca.c_str()); /* 証明書の設定 */

      M5.Lcd.printf("Connecting to %s\n", pop_hostname);

      Serial.printf("Connecting to %s\n", pop_hostname);
      if (!client.connect(pop_hostname, pop_port)) {
        Serial.println("Could not connect to mail server");
        return false;
      }
      if (!readResponse(client, "+OK")) {
        Serial.println("Connection Error");
        return false;
      }
      client.println("USER " + String(username));
      if (!readResponse(client, "+OK")) {
        Serial.println("USER error");
        return false;
      }
      client.println("PASS " + String(password));
      if (!readResponse(client, "+OK")) {
        Serial.println("PASS error");
        return false;
      }
      client.println("STAT");
      if (!readResponse(client, "+OK")) {
        Serial.println("STAT failed");
        return false;
      }
//      client.println("LIST");
//      if (!readResponse(client, "+OK")) {
//        Serial.println("LIST failed1");
//        return false;
//      }
      client.println("RETR 1");
      if (!readResponse(client, "+OK")) {
        Serial.println("RETR failed2");
        return false;
      }
      client.println("QUIT");
      if (!readResponse(client, "+OK")) {
        Serial.println("QUIT failed");
        return false;
      }
      M5.Lcd.println("Received E-mail Successful");
      Serial.println("Received E-mail Successful");
      return true;
    }

  private:
    const char* username;
    const char* password;
    const int pop_port;
    const char* pop_hostname;

    bool readResponse(WiFiClientSecure &client, const String &target, uint32_t timeout_ms = 10000) {
      uint32_t timeStamp = millis();
      while (1) {
        if (client.available()) break;
        if (millis() > timeStamp + timeout_ms) {
          Serial.println("POP Response TIMEOUT!");
          return false;
        }
        delay(1);
      }
//      String res = client.readStringUntil('\n');
      String res = client.readString();
      res.trim();
      Serial.printf("Response: %s\n", res.c_str());
      if (target != "" && res.indexOf(target) == -1) return false;
      return true;
    }
};

POP形式で受信します。受信するメールはメールサーバで最古のものになります。
ここから削除したり、最新のメールを受信したりしていきたいと思います。