2018年7月29日日曜日

営業

齢を重ねる毎に脳の機能は低下していき、記憶を司るノートの白紙部分もどんどん減っていく気がしています。

で、そういった貴重な記憶領域が浪費させられることに強い憤りを禁じえません。
杉田水脈
この一風変わった名前や、思想以前に”生産性”という語を誤用した売文が引き起こした騒動のために自分の脳細胞が費消されていると思うと、憤慨以外に言葉が見つかりません。

この騒動によって、恰も”生産”、”生産性”といった語を否定するかのようなコメントが巷間で出回り始めています。”生産性”の語意が謬って捉えられ、ネガティブな語としてその使用を控えさせようとする空気が醸成されてしまうことを懸念せざるを得ません。

本来の意味で”生産性”語を用いようとしても憚られる状態は、圧力の発生であり自由の制限に他なりません。

まともな文を綴る力を欠く偏向議員による、語義を捻じ曲げた駄文が、そういった端緒になりかねない騒ぎを引き起こしたわけです。語義を貶めた責任は極めて重いと指弾します。

2018年7月6日金曜日

翻弄

一つ問題が解決したので備忘録として。随分時間を要しました。

記録、見守り、遠隔監視、防犯用途を想定してRaspberry Pi(ラズパイ)を弄っているわけですが、ドライブレコーダのように、ネットに接続しない/できない環境でラズパイ ゼロとカメラを使う状況を想定します。



このような環境では、最初に撮影条件や動画の保存スペースの制御、動体検知の感度等を設定しておいて、電源投入で自動起動させればいいわけです。

ただ、やはりカメラの設置位置、角度を決めたり初期動作の確認のためにモニターと接続できないわけにはいきません。

そのためには使用現場で一時的にでもノートPC、タブレット、スマホなどから、ルータを介さずラズパイに接続できる状態を確立しておく必要があります。

継続的なモニタリングならば小型LCDを接続したり、電源が確保できるならば有線でデスクトップPCと接続しても構いませんが、遠隔モニタリング、電源のない屋外使用、ラズパイ内のシステム変更という観点から、上記モバイル機器の利用が好適かと。

以前のエントリで修理し、ラズパイとのssh接続が確認できたAmazon Kindle Fire HD8ならこの用途にうってつけ、と考えた次第です。

未だ進行中で右往左往していますが、これまでの嵌った部分を記しておこうかと。

下図が目標としている接続状態です。屋外⇔屋内で動的に切り換わるのが理想です。外付けの無線LANアダプタ取り付けと再起動程度で切り換わって欲しい処です。

屋内部分は既に実現できていますから、屋外使用時の設定を追加していけばいいのですが....

苦難が続いています。

屋外使用時の設定は、ラズパイにKindle Fire HD8から直接接続できる設定ということになります。これは両機器間にアドホック通信を確立するか、若しくは、ラズパイにアクセスポイント(AP)機能を付与することで実現できます。

取り敢えずKindle Fire HD8の代替として、ssh接続でラズパイの設定に使用しているノートPCを用いてラズパイとの直接接続を試みました。

当初の目論見ではラズパイにアクセスポイント(AP)化するつもりでした。新たなパッケージをインストールして様々な設定を行う必要があるものの、多くの方々がAP化を既に実現済みでネットから豊富な情報を入手できる、ノートPC、Kindle Fire HD8側の設定を弄る必要がない、といった理由からで、まぁ、なんとかなるかな、と安易に考えていました。

ところが、無線LANアダプタにAP機能を付与するhostapdのインストールでいきなり躓きました。
$ sudo apt-get install hostapd
でhostapdがインストールできない、というかシステムであるraspbianのサイトに存在しない(?)ようでした(hostap+Tabキーで何も現れず)。

やむを得ず、アドホック通信へと方針を変更しつつ、しばらく放置...



その後、放置中に試してみた処、インストールできました。RaspbianがJessieからStretchへとバージョンアップした際、インターフェイス名としてMacアドレスを使うように変わり、eth0やwlan0といったネットワークインターフェイス名がなくなたようです。しかしながら、その使い難さから再び元の方式に戻った模様。おそらく、その辺りのネットワーク接続の様式変更で過渡的にhostapがインストールできなかったのでは、と推測しています。

で、ネットからの情報を元にhostapdとisc-dhcp-serverをインストールしてAP化へと弄り始めました。この時点では結果として上手くいきませんでしたので概略のみ記します。

ラズパイゼロWにUSB接続の無線LANアダプタを接続して、まず/etc/dhcpcd.confを


#denyinterfaces wlan0

interface wlan0
static ip_address=192.168.1.11/24
static routers=192.168.1.13
static domain_name_servers=192.168.1.13

interface wlan1
static ip_address=192.168.0.10/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
としました(一部抜粋)。wlan0が屋外でKindle Fire HD8と直接通信し、wlan1は屋内でルータを介してPC他と通信するインターフェイスと想定しています。ラズパイを再起動してifconfigでwlan0 、wlan1を確認すれば各々192.168.1.11と192.168.0.10のIPアドレスが割り当てられていました。通信はwlan1が使われてルータ経由でPCと通信している状態です。

次に/etc/dhcpcd.confを
denyinterfaces wlan0

#interface wlan0
#static ip_address=192.168.1.11/24
#static routers=192.168.1.13
#static domain_name_servers=192.168.1.13

interface wlan1
static ip_address=192.168.0.10/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
としました。wlan0のIPアドレス固定化を/etc/dhcpcd.confから外し、/etc/network/interfacesに担わせることを意図してのことです。

/etc/network/interfacesは、
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static 
address 192.168.1.11
netmask 255.255.255.0
static routers=192.168.1.13
static domain_name_servers=192.168.1.13

記述。

autoとallow-hotplugの併記もおかしい気がしますがwlan0とwlan1の内蔵、外付け無線LANアダプタへの割り当てられ方と共に後で考えようかなと。

次いで/etc/hostapd.conf、/etc/dhcp/dhcpd.confを取り敢えず適当に設定して再起動した処...
$ sudo reboot
ssh接続ができなくなってしまいました。
ssh: connect to host 192.168.0.10 port 22: No route to host
ルータ経由でラズパイゼロWにwlan1(外付け無線LANアダプタ)で接続する腹づもりでした。接続できないことを全く想定しなかったものですから、ssh接続でラズパイにアクセスする手段を失ってしまいした。ssh接続でpcから上記各設定ファイルを修正することのみならず、再起動、源オフですら不可となってしまったわけです...

にっちもさっちも行かない状態に陥りました。強制的な電源オフ、即ちACアダプタのスイッチ遮断とか電源ケーブルを抜く以外なす術がない状態です。

強制的な電源オフをを余儀なくされ、さて、ssh接続できなくなったラズパイゼロWをどうするか...ラズパイにモニタとキーボードを接続して/etc/dhcpcd.conf、/etc/network/interfaces他のファイルを修正するのが常套的な方法ですが、ここではラズパイからマイクロSDカードを取り外しPCにマウントして変更前の状態に戻しました。単にこの方が手っ取り早かったというのが理由です。

こうなるとhostapdやisc-dhcp-serverの設定の適否という話以前の問題です。一旦、/etc/dhcpcd.confの内容を元に戻し、/etc/network/interfacesの内容を全てコメントアウトしてssh接続を復旧させた後、取り敢えずラズパイ-PC間のアドホック接続の確立を図りました。

以降、数度ほどssh接続して/etc/dhcpcd.confと/etc/network/interfacesを編集→再起動でssh接続不可→強制電源オフ→マイクロSDカードを取り外しPCで元の状態に書き換えて復旧、を繰り返しました。が、事態は全く好転せず...

その後、やむを得ずラズパイをHDMIケーブルで液晶テレビと、キーボードも接続してスタンドアローンでラズパイを制御できる状態にしました。ssh接続が不可でも強制電源オフすることなく、キーボードからラズパイを制御可能な、安心して失敗できる環境です。ssh接続ができなくなった時、その時のwlan0の状態もifconfigやiwconfigコマンドで確認できます。

まず、/etc/dhcpcd.confを
denyinterfaces wlan0

#interface wlan0
#static ip_address=192.168.1.11/24
#static routers=192.168.1.13
#static domain_name_servers=192.168.1.13

interface wlan1
static ip_address=192.168.0.10/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
として、/etc/network/interfacesを
auto wlan0
iface wlan0 inet static 
address 192.168.1.11
netmask 255.255.255.0
static routers=192.168.1.13
static domain_name_servers=192.168.1.13
wireless-channel 6
wireless-mode ad-hoc
wireless-essid zero-w3-ad
とした場合です。$sudo rebootで再起動するとssh接続は不可となりました。キーボードからifconfigコマンドを入力して確認するとwlan0には192.168.1.11のIPアドレスが割り当てられているものの、wlan1には192.168.0.10の割り当てはありませんでした。wlan0 のESSIDはzero-w3-APとなっていることはiwconfigで確認しました。ただ、PC側からpingを打っても通らない状態です。

/etc/network/interfaces内の
iface wlan0 inet static
iface wlan0 inet manual
にすればwlan1でssh接続はできましたが、iwconfigで確認するとwlan0には192.168.1.11のIPアドレスが割り当てられていませんでした。

/etc/network/interfaces内の記述を全てコメントアウトしてみると、当然ですが同様にwlan0には192.168.1.11のIPアドレスが割り当てられていませんでした。wlan1でssh接続はできました。

次に/etc/network/interfaces内の記述は上記のまま、/etc/dhcpcd.conf内の
denyinterfaces wlan0を、
#denyinterfaces wlan0
とコメントアウトしてみるとwlan0には192.168.0.8のIPアドレスが割り当てられていました。これはルータのDHCP機能による自動割り当てです。

どうもwlan0の固定IPアドレスの割り当てが正常ではないように思われました。/etc/dhcpcd.confと/etc/network/interfacesが適切に連携していないのでは、と推測しました。

/etc/network/interfaces内の記述を全てコメントアウトして/etc/dhcpcd.confのみで
denyinterfaces wlan0

interface wlan0
static ip_address=192.168.1.11/24
static routers=192.168.1.13
static domain_name_servers=192.168.1.13

interface wlan1
static ip_address=192.168.0.10/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
とすればwlan0のIPアドレス固定化は可能なんでしょうが、ではアドホックモードの設定
wireless-channel 6
wireless-mode ad-hoc
wireless-essid zero-w3-ad
は何処に記述すればいいのか....

並行してネット上の情報を集めてみると、/etc/network/interfacesにwlan0の内容を記述した数多くの例がありました。しかしながら、これらの事例をよく見てみるとRaspbian(Debian)のバージョンがJessieの場合ばかりでした。最新バージョンであるStretchでは、上手く動作しなかった例が散見されました。
Raspbian stretchのインターフェース設定に苦戦中です
Pi 3をWifi AccessPoint化(Raspbian stretch Lite 2018)
【Raspberry Pi 2 Model B】USB Wi-fiドングルを複数接続したときの設定
どうもRaspbianのJessieからstretchへのバージョンアップに伴い、eth0、wlan0といったインターフェイス名の名付け規則の変更があり、若干の迷走もあったようです。その影響で/etc/dhcpcd.confと/etc/network/interfacesの二つのファイルへの併記が正常な動作を阻んでいるんじゃないかと、これは推測です。で、/etc/dhcpcd.confの内容を全てコメントアウトして/etc/network/interfacesのみを使う事例もありました。

ただ、その一方でIPアドレスの固定は/etc/dhcpcd.confへの記述が好ましいといった情報も目にしましたし、
Raspbian stretchでは/etc/network/interfacesファイルを使わない方が良いようだ
raspberry Pi3に複数のwifiへ自動接続してもらう
では、/etc/network/interfacesを使うことの問題が指摘され、/etc/dhcpcd.confと/etc/network/interfaces.dディレクトリに作成したファイルを組み合わせる方法が示されていました。

実際、上記リンクに従って/etc/network/interfaces.dディレクトリ内にファイルwlan0を作成し、そこに/etc/network/interfacesに記述していた内容を移すことでようやくラズパイゼロWとPCの、ルータを介さない直接通信が確立できました。

上記エントリを公開してくださった方々に感謝申し上げます。

/etc/network/interfaces.d/wlan0の内容は

auto wlan0

allow-hotplug wlan0

iface wlan0 inet static

address 192.168.1.11

netmask 255.255.255.0

static routers=192.168.1.13
static domain_name_servers=192.168.1.13

wireless-channel 6

wireless-mode ad-hoc

wireless-essid zero-w3-ad

です。$sudo rebootで再起動すれば

wlan1でルータ経由、wlan0ではルータを経由しない直接の、PCからのssh接続が可能となりました。当たり前ですが、ifconfigコマンドで確認するとwlan0には192.168.1.11(Mode:Ad-Hoc)、wlan1には192.168.0.10(Mode:Managed)のIPアドレスが割り当てられていました。

この状態でPC側の接続設定もアドホックモードとしてIPアドレスを例えば192.168.1.13と固定することで192.168.1.xのネットワークとしてPC-ラズパイ間の通信を確認しました。

本来であればこれで当初の目的は達成できたわけですが、192.168.0.x(ルータ経由)と192.168.1.x(ラズパイ直接)へのネットワークインターフェイスを切り換える際、PCの再起動を強いられることが判明しました。192.168.0.xへの接続から192.168.1.xへの接続変更はできるのですが、その逆はいちいちPCを再起動する必要がありました。煩わしさが付き纏います。

加えて、モバイル用途を意識し、Kindle Fire HD8からラズパイに接続しようとした場合、アドホックモードでは容易ではないことも判りました。現在Kindle Fire HD8に搭載されているFire OSでは、Wi-Fi設定においてKindle Fire HD8のIPアドレスは常にDHCPからの自動設定でIPアドレス固定の選択肢が用意されていませんでした。(rootを取ってゴニョゴニョすればできるようですが...)

Kindle Fire HD8からラズパイへのアクセスを可能にするにはラズパイにIPアドレス付与機能、即ちルータ機能を持たせる必要があります。これは最初に躓いたhostapdやisc-dhcp-serverを動かせばいいわけです。

/etc/network/interfacesで足踏みしたことに比べ、こちらは何ら問題なく、/etc/network/interfaces.d/wlan0を、
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.1.11
netmask 255.255.255.0
static routers=192.168.1.13
static domain_name_servers=192.168.1.13
に変更し、
/etc/hostapd/hostapd.conf
/etc/dhcp/dhcpd.conf
/etc/default/hostapd
/etc/default/isc-dhcp-server
の設定変更であっさり動作を確認できました。

下写真はモバイルバッテリーで起動したラズパイと、ラズパイ内蔵カメラの画像を表示させたKindle Fire HD8です。



その後、/etc/network/interfaces.d/wlan0内の、
allow-hotplug wlan0

#allow-hotplug wlan0 
として、Kindle Fire HD8からラズパイへの接続を確立した状態で、外付けの無線LANアダプタを取り付けた所、ルータ経由でラズパイに接続できることも確認しました。wlan1は立ち上がっているようです。

取り敢えず、当初の目的は達成できました。田畑を含む屋外、若しくは屋内であってもルータがなくネットに接続できない環境下でも、防犯カメラとしてラズパイを活用できそうです。

次は車載化を目指します。いずれ、多分、機会があれば...