ラズパイで weaved を試す (web)

weaved は、ラズパイなどの小型コンピュータボードを IoT化するためのサービスです。

ラズパイでは下記のインターネット・ポートを利用できます。
– SSH on port 22
– Web (http) on port 80
– VNC on port 5901
– A custom TCP service on your port of choice

ラズパイで weaved を試す (ssh) に続いて、Web (http) on port 80 を試してみます。

技術的には ポートフォワード を使っているものと思われます。

設定
ssh と同じです。
Protocol Selection Menu で 2 を選択します。

$ sudo weavedinstaller

*********** Protocol Selection Menu ***********                                         
*    1) SSH on default port 22                
*    2) Web (HTTP) on default port 80         
*    3) VNC on default port 5901              
*    4) Custom (TCP)                          
*    5) Return to previous menu               
***********************************************
Please select from the above options (1-5): <== 2

動作確認
ssh とほぼ同じです。
(1) 利用可能なサービスの一覧から、サービス名をクリックします。
20160520_weaved_web_service_list

(2) web 画面が表示されれば、OKです。
この例では、OctoPrint を表示しています。
20160520_weaved_web_pi

ラズパイで weaved を試す (ssh)

weaved は、ラズパイなどの小型コンピュータボードを IoT化するためのサービスです。
インターネット上のサーバーから、ローカルネット内のラズパイにアクセスすることができます。
ラズパイの他には、BeagleBone Black や Intel Edison などに対応しています。
有償のサービスですが、無料で利用できるプランも用意されています。

ラズパイでは下記のインターネット・ポートを利用できます。
– SSH on port 22
– Web (http) on port 80
– VNC on port 5901
– A custom TCP service on your port of choice
Installation Instructions for Raspberry Pi

技術的には ポートフォワード を使っているものと思われます。

アカウントの取得
weaved のサイト にて、メールアドレスとパスワードを登録します。

インストール
(1) ラズパイにログインする
(2) weaved をインストールする

$ sudo apt-get update
$ sudo apt-get install weavedconnectd

設定

$ sudo weavedinstaller

Please enter your Weaved Username (email address): <== メールアドレス
Please enter your password: <== パスワード

********************** Main Menu ************************                                                    
*       1) Attach/reinstall Weaved to a Service         
*       2) Remove Weaved attachment from a Service      
*       3) Exit                                         
*********************************************************
Please select from the above options (1-3): <== 1

*********** Protocol Selection Menu ***********                                         
*    1) SSH on default port 22                
*    2) Web (HTTP) on default port 80         
*    3) VNC on default port 5901              
*    4) Custom (TCP)                          
*    5) Return to previous menu               
***********************************************
Please select from the above options (1-5): <== 1

You have selected: 1. 
Would you like to continue with the default port assignment? [y/n]  <== y

Enter a name for this Service Attachment (e.g. SSH-Pi). 
This name will be shown in your Weaved Device List.
<== ssh-pi

(下記のように一覧に表示されます)
Protocol	Port	Service		Weaved Name
=================================
SSH		22	sshd       	ssh-pi

********************** Main Menu ************************                                                    
*       1) Attach/reinstall Weaved to a Service         
*       2) Remove Weaved attachment from a Service      
*       3) Exit                                         
*********************************************************
Please select from the above options (1-3): <== 3

動作確認
(1) weaved のサイトに、ログインします。
(2) 利用可能なサービスの一覧が表示されます。上記で設定した ssh−pi が表示されれば、OKです。
20160520_weaved_service_list

(3) サービス名の ssh−pi をクリックします。
(4) ssh の情報が表示されます。
20160520_weaved_ssh

(5) MACにて、下記のように ssh コマンドを実行します。

$ ssh -l pi *** -p 30493

(6) ターミナルに、ログイン画面が表示されれば、OKです。
20160520_weaved_ssh_login

参考
Installation Instructions for Raspberry Pi – weaved
ACCESS YOUR RASPBERRY PI OVER THE INTERNET – raspberrypi.org
Raspberry Piの設定【Weaved – IoT Kit による外部ネットークからのSSH接続】
ルーターを超えてリモートホストに接続できる Weaved を使って Raspberry Pi、Intel Edison を IoT エッジにする方法

Linux: ポートフォワード (web)

ポートフォワード ssh に引き続いて、web のポートフォワードを設定します。
ポートフォワードは、本来はポート22の ssh 用ですが、ポートやプロトコルに関係なく、何でも転送できます。

ラズパイの設定
リモートホストのポート 10080 をラズパイの http ポート 80 に接続します。

$ autossh -M 0 -N -f -R 10080:127.0.0.1:80 foobar@example.com

ブート時にコマンドを実行するには、
テンプレート を元に /etc/init.d/autossh を作成します。

$ sudo chmod 755 /etc/init.d/autossh

パソコンから
WEBブラウザから、リモートホストを経由して、ラズパイに接続します。

http://example.com:10080

ラズパイのWEB画面が表示されれば、OKです。

Linux: ポートフォワード (autossh )

ポートフォワード ssh に続いて、ポートフォワードを設定します。
前回の設定では、不便なことがあります。
(1) いったんリモートホストにログインしてから、ラズパイにログインするという、2段階になる。
(2) 毎回ラズパイから手動で設定する必要がある。

リモートホストの設定
(1) ポートフォワード用のユーザを設定します。

# useradd -m foobar
# passwd foobar

(2) 直接 ラズパイにログインできるようにする
/etc/ssh/sshd_config を編集して、GatewayPorts yes にします。

# vi /etc/ssh/sshd_config

#GatewayPorts  no
GatewayPorts  yes

sshd を再起動する

# /etc/init.d/sshd restart

ラズパイの設定
(1) ユーザ
リモートホストと同様に、ポートフォワード用のユーザを設定した方が望ましいのですが。
今回は、用途が限定されているので、デフォルトの pi を使います。

(2) パスフレーズなしの暗号鍵を作る

$ ssh-keygen -t rsa

Enter file in which to save the key (/home/pi/.ssh/id_rsa): <== このままリターン
Enter passphrase (empty for no passphrase):  <== このままリターン
Enter same passphrase again:  <== このままリターン

(3) 暗号鍵をリモートホストに転送する

$ ssh-copy-id -i ~/.ssh/id_rsa.pub foobar@example.com 

(4) ssh セッションの監視をする
.ssh/config を作成して、30秒毎にアライブを送って、3回でタイムアウトするようにします。

$ cd ~/.ssh/
$ vi config

ServerAliveInterval   30
ServerAliveCountMax   3

(5) autossh をインストールする
ssh は、いったんセッションが切れると、終了します。
autossh は、自動的にセッションをつなぎ直します。

$ sudo apt-get install autossh

(6) リモートホストに接続する

$ autossh -M 0 -N -f -R 10022:127.0.0.1:22 foobar@example.com 

パソコンから
リモートホストを経由して、ラズパイにログインします。
ホスト名はリモートホスト (example.com) ですが、ユーザ名はラズパイ (pi) です。
前回は、いったんリモートホストにログインしてから、ラズパイにログインするという、2段階になりましたが。
今回は、リモートホストに接続すると、そのままラズパイに転送され、ラズパイのログイン画面になります。

$ ssh pi@example.com -p 10022

pi@example.com's password: <== ラズパイのパスワード(raspberry)
pi@rapberrypi ~ $ 

ログイン出来れば、OK

ラズパイの設定
ブート時に自動的にコマンドを実行するようにします。
テンプレート を元に /etc/init.d/autossh を作成します。

$ sudo chmod 755 /etc/init.d/autossh
$ sudo insserv autossh

これで、電源投入時、あるいはリブート時に、自動的にラズパイからリモートホストに接続します。

参考
autossh
Automatically restart SSH sessions and tunnels

SSHD_CONFIG – 日本語マニュアルページ
GatewayPorts (ポート中継の許可)
リモートホストがクライアント側に転送されたポートに接続することを許可するかどうか指定します。
いかなるアドレスからも利用可能にしたい場合は”yes”に。

SSH_CONFIG – 日本語マニュアルページ
ServerAliveInterval (サーバ生存確認の間隔)
一定期間サーバからデータが送られてこないときに、タイムアウトする秒数を設定します。

ServerAliveCountMax (サーバ生存カウント最大値)
ssh がサーバからの返答を確認するまでに、サーバ生存確認メッセージ を何回まで送るかを指定します。

ssh – 日本語マニュアルページ
-f
ssh がコマンドを実行する直前に、バックグラウンドに移行するよう指示します。

-N
リモートコマンドを実行しません。これはポート転送のみをおこないたい場合に便利です。

-p ポート
リモートホストに接続するポートを指定します。

Linux: ポートフォワード (ssh)

ポートフォワード (port forward) とは、ローカルコンピュータの特定のポートに送られてきたデータを、別に用意した通信経路を用いてリモートコンピュータの特定ポートに送信する技術手法です。
インターネット上のサーバー(リモートホスト)から、ローカルネット内のコンピュータにアクセスすることができます。

リモートホストを example.com、ユーザ名を user とします。
今回は、ローカルネット内のコンピュータとして、Raspberry Pi (以下、ラズパイと称す) を使用します。
デフォルトのユーザ名は pi で、パスワードは raspberry です。

ラズパイの設定
リモートホストのポート 10022 をラズパイの ssh ポート 22 に接続します。
直接 ラズパイにログインします。

$ ssh pi@rapberrypi.local

ラズパイにログインしたら、リモートホストに接続します。

$ ssh user@example.com -R 10022:127.0.0.1:22 

user@example.com's password: <== リモートのパスワード
~ $ 

プロンプトが表示されたら、そのままにします。

リモートホストの設定
リモートホストにログインする

$ ssh user@example.com 

リモートホストにログインしたら、ラズパイにログインする

$ ssh pi@localhost -p 10022 

pi@localhost's password: <== ラズパイのパスワード(raspberry)
pi@rapberrypi ~ $ 

ログイン出来れば、OK

参考
ssh – 日本語マニュアルページ
-p ポート
リモートホストに接続するポートを指定します。

-R リモートポート:リモートホスト:ホスト側ポート
与えられたリモートホスト上のポートが、与えられたローカルホスト上のポートに転送されるよう指定します。リモート→ローカルのポート転送。

ラズパイ ブート時にコマンドを実行する ( .bashrc )

ラズパイ(Linux)で、ブート時にコマンドを実行するには、大きく3つ方法があります。
1. サービスデーモンを記述する
2. /etc/rc.local に記述する
3. ユーザ毎の .bashrc を記述する

今回は、3. ユーザ毎の .bashrc を記述する 方法です。

注意
ブート時以外にも、ログインすると、実行されます。
複数回実行されると、不都合なものには、適しません。

/etc/inittab を編集して、ブート時に特定のユーザ (pi) にログインするようにします。

$ sudo nano /etc/inittab

(この行をコメントにして)
# 1:2345:respawn:/sbin/getty --noclear 38400 tty1
(この行を追加する)
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1>/dev/tty1 2>&1

.bashrc を編集して、ログイン時に特定にコマンドを実行するようにします。

$ cd ~
$ nano  .bashrc
(一番最後に実行するコマンドを記述する)
*** &

これで、電源投入時、あるいはリブート時に、特定のコマンドを実行します。

参考
.BASHRC AND .BASH_ALIASES – raspberrypi
ドットファイル

ラズパイ pip

ラズパイで pip コマンドで pip 自身を更新しても、バージョンが変わらない。

現象
更新前

$ pip -V
pip 1.5.6 from /usr/lib/python2.7/dist-packages (python 2.7)

更新

$ sudo pip install --upgrade pip
Downloading pip-8.1.1-py2.py3-none-any.whl (1.2MB): 1.2MB downloaded

更新後
あれっ! 変わらないぞ。

$ pip -V
pip 1.5.6 from /usr/lib/python2.7/dist-packages (python 2.7)

対応
実は pip は2つインストールされてます。

$ which pip
/usr/bin/pip /usr/local/bin/pip

(1) /usr/bin/pip は apt-get でインストールされたもの

$ dpkg -S /usr/bin/pip
python-pip: /usr/bin/pip

$ dpkg -L python-pip
/usr/lib/python2.7/dist-packages/pip
/usr/bin/pip

(2) /usr/local/bin/pip は今回の更新でインストールされたもの

python-pip を削除します。

$ sudo apt-get remove python-pip
Removing python-pip (1.5.6-5) ...

無事、新しいバージョンが表示されました。

$ pip -V
pip 8.1.1 from /usr/local/lib/python2.7/dist-packages (python 2.7)

ラズパイのシェルは dash

ラズパイの shell (シェル) は bash ではなく dash です。

シェルのバージョンを確認しようと思ったら、エラーになった。

$ sh --version
sh: 0: Illegal option --

あれっ! と思って、bash にしたら、問題なし。

$ bash --version
GNU bash, version 4.3.30(1)-release (arm-unknown-linux-gnueabihf)

どうなっているんだろうと、現状を調べてみると。
sh は dash にリンクされています。

$ which sh
/bin/sh
$ ls -la /bin/sh
lrwxrwxrwx 1 root root 4 Jan 21  2014 /bin/sh -> dash

dash で何? と、調べてみると。
Debian lenny から使われているシェルのようです。
Ubuntu や Raspbian も変更になっています。

bash と dash は互換性に問題があるようで、ubuntu wiki にてbash に戻す方法も紹介されています。
・shebang を #!/bin/sh から #!/bin/bash に書き換える
・環境変数の SHELL を /bin/sh から /bin/bash に書き換える
・sudo dpkg-reconfigure dash を実行して /bin/sh を bash にかえる

なお、冒頭のシェルのバージョンを確認する方法ですが。
dash にはコマンドオプションがないようです。
ask ubuntu に、下記の方法が紹介されてました。

$ apt-cache policy dash
Installed: 0.5.7-4

参考
Ubuntuの/bin/shはbashではなくdash
Bash – wikipedia
Debian Almquist shell – wikipedia
Dash as /bin/sh – ubuntu
How to find the version of the Dash shell on Ubuntu /bin

ラズパイ PythonでLED点滅

P11とP6(GND)の間に、LEDと1kΩの抵抗を直列に入れます。
20160510_raspi_led

led_blink.py

import RPi.GPIO as GPIO
import time
PIN = 11
INTERVAL = 1
GPIO.setmode(GPIO.BOARD)
GPIO.setup(PIN, GPIO.OUT)
try:
	while True:
		GPIO.output(PIN, GPIO.LOW)
		time.sleep(INTERVAL)
		GPIO.output(PIN, GPIO.HIGH)
		time.sleep(INTERVAL)	
except KeyboardInterrupt:
	pass
GPIO.cleanup()

GPIO.setwarnings
すでにGPIOを使っている場合に、下記のようなワーニングが出力されます。

RuntimeWarning: This channel is already in use, continuing anyway.

TESTING A CONNECTED LED IN PYTHON にある GPIO.setwarnings(False) は、これを出力しないように抑止する設定です。
なくても、ワーニングが出るだけなので、気にしない。

参考
CONNECTING AN LED WITHOUT A BREADBOARD
TESTING A CONNECTED LED IN PYTHON
RPi.GPIO basics 3 – How to Exit GPIO programs cleanly, avoid warnings and protect your Pi