2021年1月6日水曜日

ESP32-POE-ISOとNETGEAR GS305Pで配線すっきり

 ESP32とW5500で有線LANで接続することはできました。ただ、これだと電源とLANケーブルの2本を引きずり回すことになってちょっと面倒です。

実はPoEでネットワーク経由で電源も供給できれば1本で取り廻すことができるなというのは以前から考えていました。ESP32をPoE化している方もネットでは見受けられましたが、できれば製品として提供されている方が現場で利用する場合にも簡単・安心です。

ネットを検索したところESP32-POE-ISOという製品が見つかったので早速取り寄せてみました。

ESP32-POE-ISO仕様


仕様について詳細は英文ではありますがこちらを参照していただければと思います。
概要としては
  • ESP32-WROOM-32
  • Micro USBコネクタ(ESP32-DevKiCと同様にプログラムのアップロードもこれでOK)
  • MicroSD card(GPIOを3つ使用、カードスロットは背面に装着済)
  • LiPo battery(コネクタ有)
となかなかの優れものです。
LiPo batteryが接続できるので、PoEで充電しつつ電源断(=ネットワーク断)となった場合にはLiPo batteryから電源を取ってMicro SDカードにデータを保存しネットワークが復旧したら(電源も復旧になりますね)その間のデータをアップロードするといったシステムもこれ一つで構築できます。

ただ欠点は機能が豊富な分、ユーザが利用できるGPIOの数が少なくなっているという点でしょうか。利用できるGPIOは以下の通りです。

EXT1
  • 5V
  • 3.3V
  • GND
  • ESP_EN
  • GPIO0
  • GPIO1
  • GPIO2(MicroSD cardで使用)
  • GPIO3
  • GPIO4
  • GPIO5
EXT2
  • GPIO39(入力専用)
  • GPIO36(入力専用)
  • GPIO35(入力専用)
  • GPIO34(入力専用)
  • GPIO33
  • GPIO34
  • GPIO16
  • GPIO15(MicroSD cardで使用)
  • GPIO14(MicroSD cardで使用)
  • GPIO13

開発環境


VSCode + PlatformIOで開発していますが、ボードとして「OLIMEX ESP32-PoE-ISO」を指定可能になっています。サンプルプログラムも標準的なものは用意されているので、サンプルを参考に開発も簡単にできそうです。

サンプルはESP32-POE用ですが、ESP32-POEとESP32-POE-ISOの違いはアイソレーション(insulation:絶縁)がされているか、いないかです。この辺りは電気的なお話なので私も詳しくは理解していませんが、ハブ側とESP32側が電機的に直接接続されているか、間接的なのかの違いです。安全性の面から絶縁されていた方が良いのですが、ESP32-POEを使うときはそのあたりは自分で考えてねということになります。

さて、platformio.iniは

[env:esp32-poe-iso]
platform = espressif32
board = esp32-poe-iso
framework = arduino
monitor_speed = 115200

プログラムはESP32_PoE_Ethernet_Arduinoを参考にすればOKです。
使用しているETHはWiFiをベースに開発されているのでESPmDNSがそのまま利用できます。

            // Get server ip address by mDNS
            if (!MDNS.begin(client_name)) {
                Serial.println("Error setting up MDNS(ETH) responder!");
                while(true) { 
                    delay(1000);
                }
            }
            mqtt_server_address = MDNS.queryHost(MQTT_SERVER);

            Serial.print("Server");
            Serial.print("(");
            Serial.print(MQTT_SERVER);
            Serial.print(") IP address : ");
            Serial.println(mqtt_server_address);

プログラムを書込み後、USB接続を外してから、この為に購入したNETGEAR GS305Pに接続すると問題なくサーバ側でデータを受信することができました。

これからの目論見


ESP32を
  1. Wi-Fiでネットワークに接続+AC電源(一般的な利用方法)
  2. 有線LANでネットワークに接続+AC電源(Wi-Fiが不安定な場合)
  3. PoEでネットワークに接続&電源
という3種類の設置方法が確認できました。

現在製造業におけるIoTの導入支援をお手伝いしていますが、サーバー側を含めて標準的なベースシステムを作っていければなと考えています。ある程度形になった所でソースも公開したいと思いますのでしばらくお待ちください。

2021年1月5日火曜日

ESP32をW5500で有線LAN接続してmDNSしてみた

 最近はESP32で遊んでいますがWi-Fiの環境が不安定な場合、有線LANで接続できるとうれしいかなということでW5500を積んだボードを見つけて早速やってみました。

ESP32にセンサーをつないでMQTTでサーバへデータを投げるんですが、Wi-Fiでつなげた場合はmDNSを使ってサーバーのhostnameで接続できるんですが、有線LANでちょっとトラブったので覚書としてアップしておきます。

開発環境


Windows10
VSCode + PlatformIO
ESP32-DevkitC

platformio.iniは
[env:esp32doit-devkit-v1]
platform = espressif32
board = esp32doit-devkit-v1
framework = arduino


有線LANの接続


W5500についてはAmazonでW5500イーサネット ネットワークモジュールを購入しました。W5500は3.3V駆動なんですがこのボードは5Vでも動くようにDCDCコンバータが搭載されているのが特徴でしょうか。
  • 5V = 5V
  • GND = GND
  • RST = GPIO4
  • MISO = GPIO19
  • MOSI = GPIO23
  • SCS = GPIO5
  • SCLK = GPIO18 

ネットで検索するとESP32でW5500を使って有線LANを行っている記事は多数みうけられますが、基本はSPI接続をすればライブラリがあるのでそれ程戸惑うことはないと思います。
ポイントとしてはEthernetライブラリではなくEthernet2ライブラリを使用することでしょうか。
後、多くの記事ではリセットピンについては接続していないようですが、ESP32がリセットされた場合にW5500側もリセットした方がいいかなと思い接続してみました。

プログラムはこんな感じです。
    byte mac[] = { 0xDE0xAD0xBE0xFE0xFE0x01 };    
    pinMode(4OUTPUT);
    digitalWrite(40);
    delay(25);
    digitalWrite(41);
    delay(500);
    Ethernet.init(5);
    Ethernet.begin(mac);
    Serial.print("IP address: ");
    Serial.println(Ethernet.localIP());

後はMQTTライブラリでサーバに接続すれば完了です。


mDNSでサーバーのIPアドレスを取得する


ここまでは問題なかったのですが、Wi-Fiで接続しているときはサーバーのIPアドレスはESPmDNSを利用して取得していました。問題はESPmDNSはWi-Fi接続を前提として作成されているのでW5500(Ethernet2 )では利用できません。
そこでW5500でmDNSを利用できるMDNS_Genericを使用することにしました。
PlatformIOでライブラリをインストールすればサンプルにResolvingHostNamesもあるので簡単かなと・・・

まずはREADMEのLibraries' Patchesの「4. To fix Ethernet2 library」の指示に従いEthernet2のソースにパッチ(ファイルの置き換えと追加)を当てます。
後はサンプルを参考にソースをちょいちょいと作成してコンパイルすると「beginMulticast」の未定義エラーになってしまいました。
ソースを眺めてみると確かにパッチを当てたEthernetUdp2.cppにbeginMulticastはあります。

問題はMDNS_Generic.hにありました。

MDNSクラスのプライベート変数として_udpがUDPクラスの変数として定義されていますが、beginMulticastはEthernetUDP2.hで定義されているEthernetUDPクラスのメソッドとして定義されています。サンプルでもEthernetUDPクラスのインスタンスをMDNSのコンストラクタで渡しています。EthernetUDPクラスはUDPクラスを継承しているのでエラーになりませんが、beginMulticastメソッドを使うところでUDPクラスでは未定義になってしまいます。

ということでMDNS_Generic.hの以下の2か所の修正を行います。

class MDNS
{
  private:
    EthernetUDP*              _udp;

  public:
    MDNS(EthernetUDP& udp);

さらにMDNS_Generic_Impl.hも以下の2か所の修正を行います。

//#include <Udp.h> <-コメントアウト
#include <EthernetUDP2.h>

MDNS::MDNS(EthernetUDPudp)
{

これで無事にコンパイルは通りました。


hostnameの長さが固定?


コンパイルも無事に通り実行してみると、なぜかリブートを繰り返します。
仕方がないのでソースを眺めてみると、検索に失敗した場合に発生しているようです。

検索結果を返すコールバック関数を呼び出すメソッド_finishedResolvingNameメソッドでアドレス例外が発生しているようです。検索できなかった場合、IPアドレスがNULLで_finishedResolvingNameが呼び出されるのですが、それが原因でした。文字列のIPアドレスをIPAddressクラスのインスタンスに変換してコールバックを呼び出していますが、ここで文字列がNULLなのでアドレス例外が発生していました。

    this->_nameFoundCallback((const char*)nameipAddr == NULL ? INADDR_NONE : IPAddress(ipAddr));

これでリブートは収まりましたがまだ検索できていないようです。

    #define _MDNS_LOGLEVEL_ 4
    #include <Ethernet2.h>
    #include <MDNS_Generic.h>

とするとデバッグログをSerialに出力してくれるのでログを確認すると、アドレス解決ははできているようですが、なぜか解決不可となってしまいます。

またソースを見る羽目に・・・
本当にデバッグしてあるのかな?

                  //KH, to report name Resolve only UDP packet has corect size of 48
                  if (48 == udp_len)
                  {
                    // KH debug
                    MDNS_LOGINFO1("::_processMDNSQuery: to report IP, buf ="String((uint8_tbuf[0]));
                  
                    this->_finishedResolvingName((char*)this->_resolveNames[0], (const byte*)buf);
                  }

とudp_lenが48バイト固定の判定している部分が原因でした。
応答のUDPパケットのサイズを48バイト固定にしているので、hostnameの長さが14バイト(ドメインは.localで固定)でないと駄目なようです。

ということでパケットサイズのチェックは以下のように修正しました。

                  uint16_t l = sizeof(DNSHeader_t) + (strlen((const char *)this->_resolveNames[0])+2) + 4 + 6 + dataLen;
                  if (l == udp_len)
                  {
                    // KH debug
                    MDNS_LOGINFO1("::_processMDNSQuery: to report IP, buf ="String((uint8_tbuf[0]));
                  
                    this->_finishedResolvingName((char*)this->_resolveNames[0], (const byte*)buf);
                  }


ちなみにdataLenはIPアドレスの長さですが、これも4バイト固定(この部分の少し上でチェックしていました)になっているのでIPv4限定となります。いまのところIPv4も割り当てているのでこれで良しとしました。

2020年8月23日日曜日

ESP32-Dev-KitCで不明なUSBデバイス(デバイス記述子要求の失敗)

ESP32の開発環境を新しいWindows10ノートに構築しようとしたら出たエラーです。

結論から申し上げるとUSBケーブルが悪かったようです。
よくある電源専用ケーブルではなくデータ通信も可能なUSBケーブルでしたが、USBケーブルを変更したら問題なく認識してくれました。

こちらのサイトに行き当たりましたが、どうやらUSB供給の電圧が5V未満になると認識に失敗するようです。USBケーブルの品質が問題になるのかな?

2020年8月17日月曜日

Raspberry PiでMariaDBをインストールしたらまず行うこと

ESP32で収集したセンサーデータを保存する為にRaspberry PiにMariaDBをインストールしてそこに保存しようと考えていますが、久々にMariaDB(MySqlでも同じですが)をインストールしたのでインストール直後に行うセキュリティ対策をメモして置きます。

STEP1:インストール

MariaDBはRaspberry PiのGUI画面のメニューで

設定>Add/Remove Software

から

「Mariadb」で検索して、

MariaDB database client(metapackage depending on the latest version)
MariaDB database server(metapackage depending on the latest version)

にチェックしてサーバーとクライアントのバイナリインストールができます。

インストール直後にはサーバも起動されているのが確認することができます。(hostnameはiotserverに変更してあります)

pi@iotserver:~ $  systemctl status mariadb.service
* mariadb.service - MariaDB 10.3.23 database server
   Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2020-08-17 13:01:03 JST; 1h 41min ago
     Docs: man:mysqld(8)
           https://mariadb.com/kb/en/library/systemd/
 Main PID: 2268 (mysqld)
   Status: "Taking your SQL requests now..."
    Tasks: 30 (limit: 2065)
   CGroup: /system.slice/mariadb.service
           `-2268 /usr/sbin/mysqld
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: Phase 6/7: Checking and upgrading tables
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: Running 'mysqlcheck' with connection arguments: --socket='/var/run/mysqld/mysqld.sock' --host='localhost' --socket='/var/run/mysqld/mysqld.sock' --host='
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: # Connecting to localhost...
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: # Disconnecting from localhost...
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: Processing databases
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: information_schema
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: performance_schema
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: Phase 7/7: Running 'FLUSH PRIVILEGES'
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: OK
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2362]: Triggering myisam-recover for all MyISAM tables and aria-recover for all Aria tables


STEP2:インストール直後に行う事

他のサイトでもよく紹介されいる

pi@iotserver:~ $ sudo /usr/bin/mysql_secure_installation

を行ってrootにパスワードの設定を行います。(ルートの新パスワード以外はEnterで進めて問題ありません)

ただ、この状態では

pi@iotserver:~ $ mariadb
ERROR 1698 (28000): Access denied for user 'pi'@'localhost'
pi@iotserver:~ $ mariadb -u root -p
Enter password:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
pi@iotserver:~ $ sudo mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 63
Server version: 10.3.23-MariaDB-0+deb10u1 Raspbian 10


Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


MariaDB [(none)]> 

のようにrootがパスワード無しでログインできてしまいます。これはrootのユーザ認証にunix_socket認証プラグインが使われている為で


MariaDB [(none)]> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A


Database changed
MariaDB [mysql]> select host,user,password,plugin from user;
+-----------+------+-------------------------------------------+-------------+
| host      | user | password                                  | plugin      |
+-----------+------+-------------------------------------------+-------------+
| localhost | root | *A764549B3367FB60049727C812C20114B39D834E | unix_socket |
+-----------+------+-------------------------------------------+-------------+
1 row in set (0.001 sec)

次のSQLコマンドでpluginを無効化します。


MariaDB [mysql]> update user set plugin='' where user='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

MariaDB [mysql]> select host,user,password,plugin from user;
+-----------+------+-------------------------------------------+--------+
| host      | user | password                                  | plugin |
+-----------+------+-------------------------------------------+--------+
| localhost | root | *A764549B3367FB60049727C812C20114B39D834E |        |
+-----------+------+-------------------------------------------+--------+
1 row in set (0.001 sec)

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.001 sec)

rootでのログインにパスワードが必須となります。


pi@iotserver:~ $ sudo mariadb
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
pi@iotserver:~ $ mariadb -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 69
Server version: 10.3.23-MariaDB-0+deb10u1 Raspbian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>quit
pi@iotserver:~ $ sudo mariadb -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 72
Server version: 10.3.23-MariaDB-0+deb10u1 Raspbian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

2020年8月9日日曜日

node-red-node-pisrfでのピン番号

自作のIoT教育用ボードのテストを行っています。

Raspberry Pi Zero WHでNode-REDを使ってテスト用プログラムを作成していますが、超音波距離センサーHC-SR04のテストでnode-red-node-pisrfを使った時のメモです。

node-red-node-pisrfはSRF04 又はSRF05用なんですがネットで調べるとHC-SR04でも使えることが分かりました。早速インストールして使って見ましたが上手く動きませんでした。

設定としてはtriggerピンとechoピンの番号指定するだけなんですが、この番号がBCMではなくBOARDだったという落ちでした。


2020年7月8日水曜日

LineageOS 16.0 (Android 9) for Raspberry Pi 4をインストールしてみた

前回Raspberry PiにLineageOSをインストールしてから1年以上が経過してRaspberry Piも4に進化しましたが、LineageOSも今年の2月にはRaspberry Pi 4用のLineageOS 16.0(Android 9)がリリースされていました。

前回はScratch JrをRaspberry Piで動かすことが目的でしたが、残念ながらScratch Jrについてはマウスで操作ができなかったので断念した経緯があります。新しいバージョンではどうかも含めて再度トライすることにしました。

Google appsのインストールも前回同様用意されていました。多少スクリプト名が変更になっていたり、TWRPの画面がちょっと変わったりしてしていましたが、作業は前回と全く同じでした。
注意点としてはGoogle appsのインストール後、起動設定変更作業前にパーティションのマウントを行いますが、この時に「boot」にもチェックを入れないとエラーが発生します。/bootに書き込みに行っているのが原因だと思います。


今回改善されていた点

  • インストール時に言語選択で日本語が選択できるようになっていました。頑張って下の方までスクロールして下さい。インストール後すぐに日本語環境になっています。
  • Raspberry Pi 4の威力でしょうか、前回と違って設定などですぐに落ちることはなくなりました。そこそこのレスポンスで作業ができるようになっていました。

やっぱり問題が

  • Scratch Jrはやはり使えません。画面は表示されますが、マウスで操作ができませんでした。
  • Play Storeでのインストールは保留中となって先に進みませんが、そのまま再起動するとインストールされるようです。
  • インストールもそうですが、ネットワーク周りでおかしな動作が見受けられます。

前回同様にadbでもテストしてみましたが、adbでマウスイベントを発生させると動作するのですが、実際のマウスでは動作しないという現象が発生します。adbの場合は直接イベントを発生させているので、実際のマウスの場合はOS側の動作が違うのでしょうか?

Scratch JrはAndroidとiOSで動作するように、基本部分はJavaScriptで作成されていてOSに関わる部分だけをそれぞれのネイティブな言語で作成してあります。
Androidの場合はWebViewでJavaScriptを有効にして、handleTouchStartとhandleTouchEndで処理しているようです。

私が公開しているアプリは問題なくインストールできて動作も確認できました。ただこのアプリはAndroidネイティブなのでWebViewを使ったアプリではありません。
時間があれば簡単なアプリでテストをしたいと思いますが、今回はここまでとしたいと思います。

2020年6月13日土曜日

Raspberry Piのhostnameを起動時に変更したい

半年以上立っていますね。(T . T)
やはり物書きには向いてないようです。^ ^

・・・

最近IoT関連のハンズオンとかやる機会が増えてきています。
参加者はパソコン持参ですが、Raspberry Pi Zero Wを使う場合にちょっと困っています。
ネットワーク用のコネクタが付いていないのでWiFi接続となりますが、ディスプレイやキーボード、マウスを用意するのも大変です。

sshの設定とWiFiのSSID、PSK(Pre-Shared Key)の設定についてはブート時に自動設定する方法がこちらに書いてあります。

/bootフォルダに「ssh」という空ファイルを作成しておくとsshが自動的にONになりますし、「wpa_supplicant.conf」というファイルにWiFiの設定をしておけば自動的にWiFiに接続することができます。

wpa_supplicant.confはこんな感じです。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
 ssid="<Name of your wireless LAN>"
 psk="<Password for your wireless LAN>"
}

ここでWiFiの接続先に注意してください。
Raspberry Pi Zero Wがサポートしているのは「802.11 b/g/n」だけなので2.4GHzしかサポートされていません。NECとかBuffaloのルータを使っている場合、SSIDは大体「A」「G」がついたSSIDが2.4GHzのはずです。

2020/09/08 訂正: Aは5HzでGが2.4GHzでした。正確にはご自分のルータの設定を確認してください。

あと私のハマった点は、Raspberry Pi Zero Wが立ち上がったかを確認するのに「ping raspberrypi.local」でまずは確認するのですが、Zeroconfが割と遅いということでしょうか?
あれ、pingが通らないや!と勘違いしないでちょっと時間を置いてみて再度確認して下さい。これで2回程SDカードの初期化からやり直してしまいました。

と、ここまではあちこちのサイトで紹介されています。

Windowsパソコンで作業している場合でも、SDカードへrasbianのイメージを書き込んだあと/bootがマウントできるのでWindowsだけで作業ができます。

ただ、ここで問題なのはセミナーのハンズオンなどで同時に複数台の設定を行う場合です。
WiFi接続がDHCPでも1台だけのセットアップならRaspberry Pi Zero Wのhostnameが「raspberrypi」固定なので
ssh pi@raspberrypi.local
でssh接続が可能です。

ところが複数の参加者が同じWiFiに接続するとhostnameが被ってしまいます。
それぞれのSDカードで別のhostnameにするか、IPアドレスを固定にするかで回避できますが、
残念ながらどちらも初回ブート時に設定する方法は無いようです。

そこでこちらのサイトで回答のあったサービスを利用する方法を応用して初回ブート時にhostnameを変更するイメージを作成することにしました。

こうすることで、SDカードにイメージを書き込んだ後に、Windowdsパソコンでssh、wpa_supplicant.conf、hostnameの3つのファイルを用意することで、参加者各自が任意のhostnameのRaspberry Piを立ち上げることができます。(実際にはsshは設定済みのイメージになるので、会場のWiFiに併せたSSID/pskとhostnameの設定を行います)


STEP1:rasbianのイメージを書き込んだSDカードの用意


こちらのサイトから必要なrasbianのイメージファイルをダウンロードします。本家は遅い場合がありますので、その場合はこちらのサイトも試してみてください。
私はSDカードへの書き込みはSD Memory Card Formatterでフォーマット後に、balenaEtcherを使用しています。


STEP2:/booにsshとwpa_supplicant.confを作成


上で説明したようにrasbianのイメージを書き込んだ後、SDカードを抜き差しすると/bootがWindowsでもマウントされて見えるようになります。ここでsshとwpa_supplicant.confをbootフォルダに作成します。

この時に、ちょっと工夫をしておくことで後でimgファイルを作成する時間が短縮できます。

それは、最近のrasbianではパーティションの拡張作業が初回boot時に自動で行われるようになっているので、そのまま再起動してしまうとパーティションサイズがSDカードいっぱいになってしまいます。後でイメージファイルを作成する時にSDカード全体をイメージファイルにすることになって時間がかかりますし、SDカードにイメージファイルを焼く時間も長くなります。

/boot/cmdline.txtの
init=/usr/lib/raspi-config/init_resize.sh
init=/sbin/init
に書き換えておきます。init_resize.shがパーティションの拡張を行なっているシェルスクリプトです。


STEP3:Raspberry Pi Zero Wを起動


SDカードをRaspberry Pi Zero Wに挿し、電源を入れて下さい。しばらくしてからパソコンからsshで接続できれば、無事にWiFiに接続できています。
この時はまだhostnameは「raspberrypi」のままです。


STEP4:hostname変更サービスの登録


以下の作業で、起動時にhostnameを変更するサービスを追加します。
$ sudo vi /etc/systemd/system/change-hostname.service
[Unit]
Description=Change hostname from sd
ConditionPathExists=/boot/hostname
Before=dhcpcd.service

[Service]
Type=oneshot
ExecStartPre=/bin/bash -c 'CURRENT_HOSTNAME=$(/bin/cat /etc/hostname | /usr/bin/tr -d "\t\n\r");NEW_HOSTNAME=$(/bin/cat /boot/hostname | /usr/bin/tr -d "\t\n\r");/bin/sed -i "s/127.0.1.1.*$CURRENT_HOSTNAME/127.0.1.1\t$NEW_HOSTNAME/g" /etc/hosts'
ExecStart=/bin/mv /boot/hostname /etc/hostname
ExecStartPost=/sbin/reboot

[Install]
WantedBy=multi-user.target

$ sudo systemctl enable change-hostname.service

STEP5:imgファイルの作成


以上で、起動時に/boot/hostnameが存在する場合、hostnameを変更してWiFIで接続してssh可能なrasbianが出来ました。

後は
  1. /boot/cmdline.txtのinitを元に戻す。(パーティション拡張の自動処理)
  2. /etc/wpa_supplicant/wpa_supplicant.confからnetworkを削除(SSID、psk消去)
  3. rm ~/.bash_history(コマンド履歴の削除)
を行なってから電源を切って、SDカードのイメージを作成すれば完了です。

私はSDカードのイメージ作成にはWin32 Disk Imagerを使っているので、「Read Only Allocated Partitions」にチェックを入れて作成されるイメージファイルを小さくしています。

ESP32-POE-ISOとNETGEAR GS305Pで配線すっきり

 ESP32とW5500で有線LANで接続することはできました。ただ、これだと電源とLANケーブルの2本を引きずり回すことになってちょっと面倒です。 実はPoEでネットワーク経由で電源も供給できれば1本で取り廻すことができるなというのは以前から考えていました。ESP32をPoE化...