Raspberry Piを使った簡易無線LANルータの作成

ルータ_1634570166.webp
目次

はじめに

Raspberry Piを使って簡易的な無線LANルータを作成したいというニーズがあります。この記事では、Linuxコマンドを組み合わせて、Go言語で制御するプログラムを作成する方法を解説します。

やってることはLinuxコマンドを順番に並べているのでShell Scriptの方が適切な気もしますが、進めていきましょう。

起動時にランダムなパスワードでWi-Fiスポットを建てる

ランダムな文字列を取得する関数

よくある方法ですが、引数に入った桁数分だけ静的な文字列を並べています。

func MakeRandomStr(l uint32) (string, error) {
    const let = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    b := make([]byte, l)
    if _, err := rand.Read(b); err != nil {
        return "", errors.New("unexpected error...")
    }

    var result string
    for _, v := range b {
        result += string(let[int(v)%len(let)])
    }
    return result, nil
}

コマンドプロンプトを実行できる関数

引数に入れられたコマンドをsudoで実行しています。 Run()というのをOutput()に変えて戻り値を2つ並べると、出力結果を得ることができます。 argsには、引数に入ってくるコマンドを分割して良い感じに並べるようにしています。

func commonExecution(exe string) {
    args := strings.Fields(exe)
    err := exec.Command("sudo", args...).Run()
    if err != nil {
        log.Fatal(err)
    }
}

hostapdの設定をする関数

sedコマンドでhostapdの設定ファイル内のwpa_passphraseを取得した文字列で書き換えています。 その後systemctlで動かしているhostapdを落として、再起動しています。 これで起動ごとにランダムなパスワードでWi-Fiスポットを立ち上げることができますね。

func hostapdSetting() string {
    pass, err := MakeRandomStr(15)

    if err != nil {
        fmt.Println(err)
    }

    commonExecution("sed -i -e s/wpa_passphrase=.*/wpa_passphrase=" + pass + "/g /etc/hostapd/hostapd.conf")
    commonExecution("systemctl unmask hostapd")
    commonExecution("systemctl enable hostapd")
    commonExecution("systemctl start hostapd")
    commonExecution("service hostapd restart")

    return pass
}

main

コード全文を載せておきます。 動作確認してないですが、hostapd動く環境なら使えるでしょう。

import (
    "crypto/rand"
    "errors"
    "fmt"
    "os"
    "os/exec"
    "strings"
)

func hostapdSetting() string {
    pass, err := MakeRandomStr(15)

    if err != nil {
        fmt.Println(err)
    }

    commonExecution("sed -i -e s/wpa_passphrase=.*/wpa_passphrase=" + pass + "/g /etc/hostapd/hostapd.conf")
    commonExecution("systemctl unmask hostapd")
    commonExecution("systemctl enable hostapd")
    commonExecution("systemctl start hostapd")
    commonExecution("service hostapd restart")

    return pass
}

func commonExecution(exe string) {
    args := strings.Fields(exe)
    err := exec.Command("sudo", args...).Run()
    if err != nil {
        log.Fatal(err)
    }
}

func MakeRandomStr(l uint32) (string, error) {
    const let = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    b := make([]byte, l)
    if _, err := rand.Read(b); err != nil {
        return "", errors.New("unexpected error...")
    }

    var result string
    for _, v := range b {
        result += string(let[int(v)%len(let)])
    }
    return result, nil
}

func main() {
  hostapdSetting()
}

まとめ

今回の記事では、Raspberry Piを使用して、起動時にランダムなパスワードでWi-Fiスポットを立ち上げる方法をGo言語で実装しました。Linuxコマンドを使うことで、簡単にプログラムを作成できることがわかりました。実際には、このWi-Fiスポットに接続できるQRコードを生成して表示する機能も追加していきます。

プログラムを勉強し始めた頃は、知ってしまうと簡単に書けるようなプログラムでもどうやって実現してんだろうかって思ってたんですが、Linuxコマンドが使えると大体組み合わせれば実現できるんですよね。偉大だなぁ。

Related Post

> Raspberry Piを使った簡易無線LANルータの作成
Raspberry Pi 4を使ってWi-Fiスポットを作成する方法
> Raspberry Piを使った簡易無線LANルータの作成
シェルワンライナーノック160問に挑戦
> Raspberry Piを使った簡易無線LANルータの作成
Raspberry PiのSDカードバックアップ方法
> Raspberry Piを使った簡易無線LANルータの作成
Raspberry PiとOpenCVで遭遇したバグと対処法
> Raspberry Piを使った簡易無線LANルータの作成
Raspberry Pi 4でVue.jsを使ったGUIを構築する方法
> Raspberry Piを使った簡易無線LANルータの作成
OpenCV4でGstreamerからの入力を受け取り表示する方法

おすすめの商品

>