iPhone X RasPiで外出先で使える高機能なモバイルルーターを自作する

この記事は Akerun Advent Calendar 2021 - Qiita の20日目の記事です。

ハードウェアグループの石井 @ishturk です

弊社フォトシンスが提供しているAkerun入退室管理システム

  • オフィス
  • プライベートサロン
  • シェアスペース
  • 無人のフィットネスジム
  • etc...

と、いろいろなところで使われています。安定したサービスを提供するべく開発部・カスタマーサクセス部で協力しています。

顧客から問い合わせがあった場合、設置先に出向いて調査することもしばしば発生します。

そんなときに使える便利ネットワークデバイスがあったらいいのにな ((=^♀^=))

f:id:photosynth-inc:20211221003203j:plain

こんなこといいな

( ³з³):PCをインターネットに繋げられて、設置している弊社機器に同一ネットワークになるといいな

( ³з³):あ、ネットワークはWi-Fiと有線どっちも

( ³з³):会社の携帯がiPhoneだからiPhoneテザリングがいい

( ³з³):電源とれないこともあるので電池じゃないと

( ³з³):客先に行くのはエンジニアじゃないこともあるから、スクリプト仕込めるといい

レシピ

できたらいいな

RasPiのiPhoneテザリング

Wi-FiはPCからの接続に使用したいので、USBテザリングを選択します。 Apple公式には iTunes が必要と書いています。が、ありがたいことにLinux向けにパッケージ開発されているので、それを使用します。

sudo apt-get install ipheth-utils libimobiledevice-utils ifuse usbmuxd
sudo mkdir /media/iphone
sudo ifuse /media/iphone

何度か抜き挿ししているとiPhone側に 「信頼する」のポップアップが出てくるので選択

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.20.10.3  netmask 255.255.255.240  broadcast 172.20.10.15
        inet6 fe80::b3a4:f864:f44a:cbe  prefixlen 64  scopeid 0x20<link>

eth1 として認識されました!

WiFi設定・ルーティング設定

hostapd と dnsmasq をインストール

sudo apt install hostapd dnsmasq

ポートフォワーディング、IPマスカレードなどを設定 このあたりは情報充実しているのでそのあたりを参照ください 有線とWiFiをどちらも使うためにハマりました。その記事はまたどこかで、、、、

www.itmedia.co.jp

qiita.com

また、ルーターとして機能させてるのであれば OpenWrtという選択も良いと思います。RaspberrPi向けにもイメージが配布されており、GUIで設定するだけでネットワークルーターを立ち上げることができます。

[OpenWrt Wiki] Welcome to the OpenWrt Project

今回は、サポート作業用のスクリプトを実行したいという事情があったため、より汎用的なRaspberryPiOSを採用しました。

シャットダウン機能

RaspberryPiは物理スイッチがついておらず、通電で起動しますが、シャットダウンする機能はハードウェア提供されていません。 電源ぶちぎりでもよいのですが、こはちゃんと作りましょう。

今回はスイッチとパイロットランプで実現します。LEDは5Vそのままではとても眩しかったのでPWMで輝度を落としてます。 スイッチは内部プルアップでアクティブロー(スイッチ押下で0)にしてます。

f:id:photosynth-inc:20211221003210p:plain

#!/usr/bin/env python3

import RPi.GPIO as GPIO
import time
import os
from multiprocessing import Process, Condition

gpio_led = 18
gpio_sw = 24

GPIO.setmode(GPIO.BCM)

# LEDピンを出力に設定
GPIO.setup(gpio_led, GPIO.OUT)
GPIO.setup(gpio_sw, GPIO.IN, pull_up_down=GPIO.PUD_UP)
c = Condition()
def led():
    pin = GPIO.PWM(gpio_led, 2000)
    pin.start(0)
    pin.ChangeDutyCycle(5)
    c.acquire()
    c.wait()
    c.release()
def sw():
    while True:
       sw = GPIO.input(gpio_sw)
       if sw == 0 :
          c.acquire()
          c.notify()
          c.release()
          break
       time.sleep(1)

if __name__ == '__main__':
    p1 = Process(target=led)
    p2 = Process(target=sw)
    p1.start()
    p2.start()
    p1.join()
    p2.join()
GPIO.cleanup(gpio_led)
GPIO.cleanup(gpio_sw)
os.system( "sudo shutdown -h now" )
time.sleep(1000)

完成

f:id:photosynth-inc:20211221003203j:plain

LEDとスイッチがぷらんぷらんしているので、このままではまだ持っていくのは難しいですね。 社内に3Dプリンタ(form3)が2台あるので、いい感じにケースを自作しても良さそうです。

https://formlabs.com/jp/


株式会社フォトシンスでは、一緒にプロダクトを成長させる様々なレイヤのエンジニアを募集しています。 hrmos.co

Akerun Proの購入はこちらから akerun.com