RaspberryPiにNode.js

Node.jsとは、JavaScriptの一種で、サーバーが構築できる言語。

「リアルタイムweb」とは、ほぼタイムラグなしにブラウザ上情報の更新を反映する、FacebookのメッセージやGoogleDocsなどの感じ。

Nodeには「ページに新しい情報が来たよ!」と教えてくれる機能があり、Socket.IOというパッケージにて実装できる。

間隔を開けてサーバにポーリングなどいらない分、サーバの負担が軽減てき、より多数のブラウザが接続できる。

環境構築

まず、Node.jsのバージョンを管理するためのマネージャをまずインストールする

chen@juno ~ $ curl -L git.io/nodebrew | perl – setup
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
0     0    0     0    0     0      0      0 –:–:– –:–:– –:–:–     0
0     0    0     0    0     0      0      0 –:–:–  0:00:02 –:–:–     0
100 22630  100 22630    0     0   5045      0  0:00:04  0:00:04 –:–:– 14432
fetching nodebrew…
install nodebrew in $HOME/.nodebrew

========================================
Add path:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================

chen@juno ~ $ vi .bashrc
chen@juno ~ $ source .bashrc

 

Node.jsのインストール

Node.jsをバイナリからインストール。参考サイトの言われたままに、Raspberry Pi向け(arm-pi)の最新版バイナリが用意されていないため、v0.10.28を使用。

chen@juno ~ $ nodebrew install-binary 0.10.28
fetch: http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-arm-pi.tar.gz
######################################################################## 100.0%
Install successful
chen@juno ~ $ nodebrew use 0.10.28
use v0.10.28
chen@juno ~ $ node -v
v0.10.28
chen@juno ~ $ npm -v
1.4.9
chen@juno ~ $

Hello Worldの表示

以下のコードをapp.jsというファイル名で保存して、Node.jsで実行してみよう。

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Worldn');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://192.168.0.207:1337/');

実行して見る:

chen@juno ~ $ node app.js
Server running at http://192.168.0.207:1337/

ブラウザから確認:

image

Raspberry Pi にWordPressを動かすまで(Lighttpd編)

Raspberry PiのApacheから、軽いLighttpdに切り替えた記録。

Raspberry Pi は2台購入して、一台目はメモリ256Mのみ、2台目のメモリは512Mに増強した。そのため一台目最初からLighttpdで運用し、2台目余裕があると思って、最初はApacheで運用したが、いろいろ用途が増やすとやはりメモリ不足に落ち、Lighttpdに切り替えた。

# /etc/init.d/apache2 stop
# dpkg -l | grep apache

ii  apache2-mpm-prefork                   2.2.22-12                          armhf        Apache HTTP Server – traditional non-threaded model
ii  apache2-utils                         2.2.22-12                          armhf        utility programs for webservers
ii  apache2.2-bin                         2.2.22-12                          armhf        Apache HTTP Server common binary files
ii  apache2.2-common                      2.2.22-12                          armhf        Apache HTTP Server common files
ii  libapache2-mod-php5                   5.4.4-14+deb7u3                    armhf        server-side, HTML-embedded scripting language (Apache 2 module)

# apt-get –purge remove apache2.2
# apt-get –purge remove libapache2-mod-php5
# apt-get install lighttpd
# lighty-enable-mod fastcgi
# lighty-enable-mod fastcgi-php
# vi /etc/lighttpd/lighttpd.conf  // 設定を確認
# lighty-enable-mod ssl
# /etc/init.d/lighttpd force-reload
# lighty-enable-mod ssl

WordPressのリダイレクト設定は、Apacheと違うので結構ネットぐぐったけど、試行錯誤で下記の設定がOKでした。

url.rewrite-if-not-file = (
“^/{$rewrite_path}(wp-.+).*/?” => “$0”,
“^/{$rewrite_path}.*?(?.*)?$” => “/{$rewrite_path}index.php$1”
)

マルチドメインの場合、さらに複雑なり、下記の書き方がいいらしい。

url.rewrite-if-not-file = (
“^/(.*/)?files/$” => “/index.php”,
“^/(.*/)?files/(.*)” => “/wp-includes/ms-files.php?file=$2”,
“^(/wp-admin/.*)” => “$1”,
“^/({_0}+/)?(wp-.*)” => “/$2”,
“^/({_0}+/)?(.*.php)$” => “/$2”,
“^/(.*)/?$” => “/index.php/$1”
)

RASPBERRY PIで無線ルーターの復帰

いつの間にか、RASPBERRY PIで無線ルーターを作る,で作った無線ルータが信号がなくなった。試行錯誤で辛うじて復帰した記録。

インストール手順から見直しと、hostapd がおかしい。

root@juno:/etc/network# hostapd -d /etc/hostapd/hostapd.conf

random: Trying to read entropy from /dev/random
Configuration file: /etc/hostapd/hostapd.conf
Line 2: invalid/unknown driver ‘rtl871xdrv’
1 errors found in configuration file ‘/etc/hostapd/hostapd.conf’

まずUSBでWLAN Adapter認識されたかを確認する

chen@juno ~ $ sudo lsusb

[sudo] password for chen:
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter

WLAN Adapterが普通に認識された模様。すると、デバイス・ドライバーが正しくインストールされない?

いつか、aptitude upgradeで、正しくインストールしたデバイス・ドライバー壊れたかも。まずRaspberry Pi firmware updateする。

chen@juno /home/www/html $ sudo rpi-update

*** If no errors appeared, your firmware was successfully updated to a32baf52832725b3fe2ebda0f4acf398b04ef105
*** A reboot is needed to activate the new firmware
chen@juno /home/www/html $ sudo reboot

それでも直らない。いろいろ調べて分かったことは、Update hostapdドライバが8192cuの場合、apt-getでインストールされるhostapdはこのデバイスに対応してない。確かに、adafruitからダウンロードして、オリジナルのバイナリを置き換えた痕跡があった。

おそらく、aptitude upgradeする際、置き換えたhostapdまた最新版のオリジナルのバイナリに戻された。

再度http://www.adafruit.com/downloads/adafruit_hostapd.zip からバイナリをダウンロードし、それでオリジナルのバイナリを置き換えると、hostapd 動くようになった。

無線ルーターが無事復帰できた。

Raspberry Pi に液晶表示盤

AliExpress.comでRaspberry Pi 用液晶表示盤発見。送料無料8ドルで早速注文。約8日で東京自宅に届きました。

見た目右に3つ黒いピクセルがあるが、使用上支障がない模様。

Raspberry-Pi-LCD

Attached new LCD for Raspberry Pi

早速取り付けて、電源ONして、バックライト点灯したが、画面当然何も表示しない。

wiringPiのGitから取得とbuild

415  cd
416  git clone git://git.drogon.net/wiringPi
417  cd wiringPi/
418  ./build

RaspberryPiの/libraries/c/をGitから、pcd8544_test、pcd8544_test2、を実行。

419  cd
423  git clone https://github.com/binerry/RaspberryPi.git
425  cd RaspberryPi/libraries/c/PCD8544/
437  cp -p ../PCD8544.h ./
438  cc -o pcd8544_test pcd8544_test.c ../PCD8544.c  -L/usr/local/lib -lwiringPi
439  sudo ./pcd8544_test
440  cc -o pcd8544_test2 pcd8544_test2.c ../PCD8544.c  -L/usr/local/lib -lwiringPi
441  sudo ./pcd8544_test2

立ち上げ時間、CPU利用率と空きメモリの表示サンプル

442  cc -o pcd8544_rpi pcd8544_rpi.c ../PCD8544.c  -L/usr/local/lib -lwiringPi
443  sudo ./pcd8544_rpi
444  top
445  sudo ./pcd8544_rpi
446  sudo ./pcd8544_rpi &

バックグラウンド実行も可能。

Raspberry Piで無線ルーターを作る

Raspberry Piを買ってから、いろいろ試した。

Google+でたまたま、Setting up a Raspberry Pi as a WiFi access point記事を目にした。制作にかかった。家にはすでに常時2台無線ルーターが稼働しているので、ただの無線ルーターじゃ面白くないので、そのうえ同じサイトのOnion Pi の記事を参考しながらTor Proxyサーバを立てた。

Proxyサーバが匿名アクセスなどいろいろメリットがあるが、サーバのプロとしての用途もいろいろ、たとえば外から自宅サーバのアクセス性をテストするとか、自宅限定テストサイトが本当に限定されたかとか、自宅からのみアクセスを制限した管理ツールが本当に制限されたとか、自宅以外のIPからのアクセスのテストが時々必要になる。今までわざわざVNCで外にあるサーバの画面を開いてから覗くなり、スマートフォンのWiFiをOFFして、モバイルネットから覗くなりなど対応してた。

既にRaspbianのインストール、USB-WiFiの接続が済んたので、上記のページを参考に進めると、順調に無線ルーターとして機能し、Tor Proxyサーバも立てた。

試しに、iPhoneから立てたRaspberry Pi無線ルーターに接続すると、確かに自宅サーバ以外のIPでウェイブサイトにアクセスすることができた。

詳しい製作過程は、気が向いたらWIKIへ(http://digilib.net/xoops/modules/xpwiki/)まとめる予定。

Raspberry Pi ネットワークカメラを作る

Motivation

RaspberryPiに に Webカメラを接続して動画を配信してみる 定番のストリーミングアプリとして、

  • mjpg-streamer
  • motion
  • ffmpeg

があるらしい。ここはmotionを試す。

Parts List

  • RaspberryPi 本体
  • 内蔵マイクタイプ130万素Webカメラ:UCAM-C0113FBPN[ELECOM(エレコム)]
  • マイク内蔵/FullHD対応オートフォーカス搭載200万画素Webカメラ:UCAM-DLD200BASV[ELECOM(エレコム)]

Webカメラどちらも直結でmotionできた! UCAM-DLD200BASVの方が、内蔵マイクも認識されるので、そのうち音声ストリーミングも試す予定なので、こちらを使って実験を進める。 FireShot Screen Capture #006 - '(JPEG 画像, 320x240 px)' - 192_168_0_201_8081

詳しい製作過程は、WIKIへ(http://digilib.net/xoops/modules/xpwiki/)どうぞ。

My works

  • lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 0c45:7401 Microdia
Bus 001 Device 005: ID 056e:7009 Elecom Co., Ltd   <--- Elecom UVC Webカメラ
  • ls /dev/video0
  • apt-get install motion
  • vi /etc/motion/motion.conf
control_localhost off 
webcam_localhost off
  • motion -n

ブラウザで以下のアドレスにアクセスすると、配信されている画像を確認することができる。 (ご自分のRaspberry PiのIPアドレスに書き換えて)

Add info anchor.png

Raspberry Pi wireless 温度計の制作

RaspberryPiの検索で、たまたまUSB温度計を使ってLinuxから室温を計測する を発見

それから、matoken’s wiki. Linux/Device/サンコーレアモノショップ_USB温度計_AKIBA58で、eBay 日本で買うより安いという情報を頂いたので、買ってみた。

同じの品物ないが、類似したものを一個$6.49で買った。送料無料!(しかし安いものがいっぱいあるからついつい、84ドル超える買い物になった。)

P2190091

届いたら、早速RaspberryPiに刺してみたら、

[702457.972061] usb 1-1.2: new low-speed USB device number 5 using dwc_otg
[702458.078478] usb 1-1.2: New USB device found, idVendor=0c45, idProduct=7401
[702458.078511] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[702458.078528] usb 1-1.2: Product: TEMPerV1.4
[702458.078543] usb 1-1.2: Manufacturer: RDing
[702458.093433] input: RDing TEMPerV1.4 as /devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2:1.0/input/input0
[702458.094931] hid-generic 0003:0C45:7401.0001: input,hidraw0: USB HID v1.10 Keyboard [RDing TEMPerV1.4] on usb-bcm2708_usb-1.2/input0
[702458.104938] hid-generic 0003:0C45:7401.0002: hiddev0,hidraw1: USB HID v1.10 Device [RDing TEMPerV1.4] on usb-bcm2708_usb-1.2/input1

認識された。

こちら(http://hpv.cc/~maty/pukiwiki1/index.php?Linux/Device/サンコーレアモノショップ_USB温度計_AKIBA58)を参考に、ソースコードを取得し、カスタマイズする。

詳しい製作過程は、WIKIへ(http://digilib.net/xoops/modules/xpwiki/)どうぞ。

# apt-get install build-essential libusb-0.1-4 libusb-dev git

一部パッケージが見つからない、失敗に終わった。パッケージ更新する。

# apt-get update

# apt-get install build-essential libusb-0.1-4 libusb-dev git

今度上手く完成した。

temper ソースをgit から。

# git clone git://github.com/bitplane/temper.git

# ls temper

60-temper.rules  log.sh  Makefile  pcsensor.c  pcsensor.h  README  temper.c

# cp -p temper.c temper.c.org

# vi temper.c

# diff temper.c.org temper.c

44c44
<               utc = gmtime(&t);
---
>               utc = localtime(&t);
47c47
<               strftime(dt, 80, "%d-%b-%Y %H:%M", utc);
---
>               strftime(dt, 80, "%Y-%m-%d %H:%M:%S", utc);

# make

# mv temper /usr/local/bin/

# chmod u+s /usr/local/bin/temper

# temper

2013-02-16 03:48:08,30.396763

ちゃんと温度の表示ができた。しかし30度は高いね!USB延長ケーブルを付けて再度計測。

$ temper

2013-02-16 03:55:17,23.710213

23度くらい、室温に近いかも。

運用 anchor.png

PHPでWEBに表示するため、UNIX通算時間の表示、ログの生成、cron に登録、ログの解析が必要。

# vi temper.c

# diff temper.c.org temper.c

44c44
<               utc = gmtime(&t);
---
>               utc = localtime(&t);
47c47
<               strftime(dt, 80, "%d-%b-%Y %H:%M", utc);
---
>               strftime(dt, 80, "%Y-%m-%d %H:%M:%S", utc);
49c49
<               printf("%s,%fn", dt, tempc);
---
>               printf("%ld,%s,%fn", t, dt, tempc);

5分置きに、/var/log/temper.logにログを吐き

*/5 * * * * /usr/local/bin/temper >> /var/log/temper.log

最後は、PHPでWEBに表示する

オーダーした、Webカメラもそろそろ届くので、無線で画像、音声、温度、湿度を送るフィールドサーバみたいなものを作りたいね!

Ref anchor.png

参考:

  1. http://model.job.affrc.go.jp/FieldServer/フィールドサーバ

Raspberry Pi 二台目始動

Raspberry Pi一台目Webサーバとして16GのSDカードを積んで遠方で稼働し始めた。

Raspberry Pi 二台目もそろそろ始動。

P1300012

今回はクリアケースで、8GのSDカード(左側青いもの), USB-WiFi無線通信モジュール(右側白いもの)を装備、ワイアレスの何かを試したいともう。

手元にある http://www.amazon.cn/MERCURY-水星网络-MW150US-超小型150M无线USB网卡/dp/B008FK96QG/ で購入した。 USB-WiFi無線通信モジュール(右側白いもの)を装備した様子

# lsusb — 認識されたことを確認。

Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter <--- これです!
Bus 001 Device 008: ID 0c45:7401 Microdia

ここの Wifiアダプタ(チップセットがRTL8188CUSのもの)のドライバはカーネルにすでに組み込まれているので、非常に簡単なセットアップだ。

# lsmod — カーネルモジュールの読み込み状態で確認

Module                  Size  Used by
snd_bcm2835            10636  0
snd_pcm                60411  1 snd_bcm2835
snd_seq                44988  0
snd_timer              16257  2 snd_pcm,snd_seq
snd_seq_device          4265  1 snd_seq
snd                    41809  5 snd_bcm2835,snd_timer,snd_pcm,snd_seq,snd_seq_device
snd_page_alloc          3176  1 snd_pcm
8192cu                457513  0  <--- これです!
leds_gpio               1920  0
led_class               2329  1 leds_gpio

# iwconfig — ワイヤレス設定から確認

wlan0     unassociated  Nickname:"<WIFI@REALTEK>"
          Mode:Managed  Frequency=2.412 GHz  Access Point: Not-Associated
          Sensitivity:0/0
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality:0  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
lo        no wireless extensions.
eth0      no wireless extensions.
Page Top

設定 anchor.png

# vi /etc/network/interfaces

auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

# vi /etc/wpa_supplicant/wpa_supplicant.conf

network={
 ssid="_SSID_"
 proto=RSN
 key_mgmt=WPA-PSK
 pairwise=CCMP TKIP
 group=CCMP TKIP
 psk="_WPA_SHARED_KEY_"

}

# ifdown wlan0

# ifup wlan0

ioctl[SIOCSIWAP]: Operation not permitted
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument

# ifconfig wlan0

wlan0     Link encap:Ethernet  HWaddr 14:cf:92:0b:91:84
         inet addr:192.168.0.123  Bcast:192.168.0.255  Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:2573 errors:0 dropped:4062 overruns:0 frame:0
         TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:307880 (300.6 KiB)  TX bytes:1871 (1.8 KiB)

運用 anchor.png

サーバとして運用するつもりなので、固定IPの設定を行う

また、eth0はケーブルが抜けると、wlan0も切れてしまうので、いろいろと調べて、ifmetric 導入にした。

# apt-get install resolvconf — chen 2013-02-19 (火) 01:30:55

# apt-get install ifmetric — chen 2013-02-19 (火) 01:31:14

# vi /etc/network/interfaces

auto lo
iface lo inet loopback
# Primary wired network interface [eth0]
auto eth0
iface eth0 inet static
       metric 1
       address 192.168.0.201
       netmask 255.255.255.0
       gateway 192.168.0.1
# DHCP
#iface eth0 inet dhcp
# Wireless interface [wlan0]
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
       metric 0
       address 192.168.0.207
       netmask 255.255.255.0
       gateway 192.168.0.1
       wpa-ssid _SSID_
       wpa-psk _WPA_SHARED_KEY_
       # wpa_roam /etc/wpa_supplicant/wpa_supplicant.conf

# ifdown wlan0

# ifup wlan0

これてeth0はケーブルが抜けでも、wlan0ちゃんと繋ぐ。

Ref anchor.png

Raspberry Pi power on first time

Raspberry Piのケースもそろい、新しい4G容量のSDカードも購入、いよいよ電源を投入。

その前、まずインストール方法を調べた。インターネット接続されてるなら、berrybootが一番楽らしい。小さいファイルを解凍してsd cardに入れるだけ、しかも複数OS入れられる。

P1160876

Piとテレビの間、HDMIケーブルで繋ぎ、LANケーブルでハブにも繋ぎ、手元にある無線マウス、無線キーボードもそれぞれUSBでつなぎ、用意したSDカード挿入、最後5V電源つなった様子。

インストール手順をまとめる:

  1. http://www.berryterminal.com/doku.php/berryboot サイトを開く。
  2. berryboot-20120904.zip をダウンロードする。
  3. カラのsd cardのルートににすべてファイルunzip
  4. sd cardを PIに挿入
  5. ルータと PI にケーブルをつなぐ
  6. PI 電源を入れる
  7. PI 起動、sd cardのフォーマット
  8. OSを選んでインストール (とりあえずDebian)
注意:フォーマットする際、デフォルトの ‘ext4 (no discard)’  ではなく、 ‘ext4’を選ぶ。

P1160879