Category Archives: 未分類

今時で高速なWordPressを楽に構築する(CentOS7 + HTTP/2 + Let’s Encrypt + HSTS + PHP7)

速度的に欲を言えばNginxの方が良さそう?なのですが
利便性(やっぱりhtaccessは使いたい)を考えてApacheにしています。

下手にソースコードをビルドするとその後に脆弱性が見つかったなどでアップデートするのが面倒になったりするのですが、既にそんなことせずとも何とかなりそうだったのでメモしておきます。

リポジトリ(epel + IUS)を追加

$ sudo yum -y install epel-release
$ sudo rpm -ivh https://centos7.iuscommunity.org/ius-release.rpm 

Apache2.4(HTTP/2対応)のインストール

$ sudo yum -y install httpd24u httpd24u-devel httpd24u-mod_ssl

設定方法は Webサーバー構築(Apache) (CentOSで自宅サーバー構築様) を参照

マルチプロセッシングモジュール (MPM)の確認

ApacheでHTTP/2を実現するためにはMPMがEVENTになっている必要がある。
以下の設定ファイルを開きMPMがEVENTになっているのを確認する。

$ sudo vi /etc/httpd/conf.modules.d/00-mpm.conf
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
LoadModule mpm_event_module modules/mod_mpm_event.so

HTTP/2用の設定ファイルを作成

設定ファイルを新規追加する。

パラメータ

  • h2(TLS接続)
  • h2c(非暗号接続)
  • H2Direct(HTTP/2でのダイレクト接続の許容の可否)
$ sudo vi /etc/httpd/conf.d/http2.conf
<IfModule http2_module>
    Protocols h2 h2c http/1.1
    H2Direct on
</IfModule>

MariaDBのインストール

$ sudo yum -y install mariadb-server

設定方法は データベースサーバー構築(MariaDB) (CentOSで自宅サーバー構築様) を参照

PHP7.1のインストール(PHP-FPM)

$ sudo yum -y install php71u-mysqlnd php71u-fpm-httpd \
  php71u-cli php71u-mcrypt php71u-gd php71u-xml \
  php71u-mbstring php71u-json php71u-devel php71u-pdo \
  php71u-process

PHP-FPMの設定

実行ユーザ、グループを適切なものに変更します。

実行ユーザをユーザ毎に変えたい(suPHPの様な事をしたい)場合は、その度に設定ファイルを追加してPHP-FPMを再起動してやる必要がありそうです(未確認)。

$ sudo vi /etc/php-fpm.d/www.conf
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = apache
group = apache
$ sudo systemctl start php-fpm.service
$ sudo systemctl enable php-fpm.service

Apache24への設定反映

基本はデフォルトで特に問題ないはずです。

$ sudo cat /etc/httpd/conf.d/php-fpm.conf
# This configuration requires httpd 2.4 with support for UDS (Unix domain
# sockets).  This was added upstream in version 2.4.10, and was also backported
# to 2.4.6 in EL7.

# The following lines prevent .user.ini files from being viewed by Web clients.
<Files ".user.ini">
    Require all denied
</Files>

# Allow php to handle Multiviews.
AddType text/html .php

# Add index.php to the list of files that will be served as directory indexes.
DirectoryIndex index.php

# Enable http authorization headers.
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1

<FilesMatch \.php$>
    SetHandler "proxy:fcgi://127.0.0.1:9000"
    #SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>

Let’s Encryptで証明証を発行するためのコマンドをインストール

$ sudo yum -y install certbot python-certbot-apache

証明書発行時に利用する公開ディレクトリの作成と設定

Let’s Encryptがドメイン保有者からの発行依頼であることを確認するためにアクセスしにくるファイルを設置する公開ディレクトリを、サーバ内で共通の場所を使用するようにする(バラバラでも良いが、何かと面倒なので共通化)。

$ sudo mkdir -p /var/www/letsencrypt/.well-known
$ sudo vi /etc/httpd/conf.d/letsencrypt.conf
Alias /.well-known /var/www/letsencrypt/.well-known

証明書の発行と自動更新

証明書を発行する
途中、色々聞かれるが特に難しい事は無い

$ sudo certbot certonly --webroot -w /var/www/letsencrypt/ -d example.net -d www.example.net

証明書を自動で更新するためにcronに以下のように設定を追加する

$ sudo vi /etc/cron.d/certbot
0 5 * * * root certbot renew --quiet

WordPressのインストール
インストール方法は ブログサイト構築(WordPress) (CentOSで自宅サーバー構築様) を参照

※ php-mysqlインストールとApacheの設定は不要

WordPressを公開するVirtual Hostの設定
HTTPで接続してきた場合はHTTPSになるようにリダイレクトします。

HSTSを指定しているので、ブラウザが覚えて常にHTTPSで接続するようになります。

$ sudo vi /etc/httpd/conf.d/virtualhost-01.www.conf
<VirtualHost *:80>
    ServerName example.net
    ServerAlias www.example.net

    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    </IfModule>
</VirtualHost>

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.net/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.net/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/example.net/chain.pem

    ServerName example.net
    ServerAlias www.example.net
    DocumentRoot "/var/www/html"

    Header set Strict-Transport-Security "max-age=31536000"
</VirtualHost>

Apache24を再起動します。

$ sudo systemctl restart httpd.service

参考サイト

Raspberry Pi 3 Raspbian Jessie で Waveshare 3.5インチ タッチ液晶を動かす

Raspberry Pi3のついでにWaveshare 3.5インチ タッチパネル付き液晶を購入したのですが動作させるのに結構苦戦したので手順を残すためにメモしておきます。

このタッチパネル付き液晶モデル(3.2インチ版も含む)の使用方法を紹介しているサイトの多くは
メーカー?が提供しているISOを使ったりLCD-show.tar.gzを使っていたりしますがPi3では起動しなくなるようです・・・

Raspbian JessieのインストールはNOOBSを使いました。
インストール後はLANへの接続と日本語フォントの追加とSSHが有効であるかの確認を行っています。

SPIの有効化とBOOT時のGUIの無効化(CUI+自動ログイン)に変更します。

$ raspi-config

必要なパッケージ群をインストール。

$ sudo apt-get install xinput evtest libts-bin
$ sudo apt-get install fbi

タッチパネル付き液晶への出力設定

何も設定していない場合はfb0しか無いはずです。

$ ls -al /dev/fb*
crw-rw---- 1 root video 29, 0  4月  2 12:41 /dev/fb0

FBTFT関連のカーネルモジュールをロードさせます。
以前は自力で導入する必要があったようですが、現在は標準で含まれているようです。

$ sudo modprobe flexfb width=320 height=480 regwidth=16 init=-1,0xb0,0x0,-1,0x11,-2,250,-1,0x3A,0x55,-1,0xC2,0x44,-1,0xC5,0x00,0x00,0x00,0x00,-1,0xE0,0x0F,0x1F,0x1C,0x0C,0x0F,0x08,0x48,0x98,0x37,0x0A,0x13,0x04,0x11,0x0D,0x00,-1,0xE1,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0xE2,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0x36,0x28,-1,0x11,-1,0x29,-3
$ sudo modprobe fbtft_device debug=3 rotate=90 name=flexfb speed=16000000 gpios=reset:25,dc:24

カーネルモジュールをロードするとデバイスファイルが増えるはずです。

$ ls -al /dev/fb*
crw-rw---- 1 root video 29, 0  4月  2 12:41 /dev/fb0
crw-rw---- 1 root video 29, 1  4月  2 12:41 /dev/fb1

後から追加されたfb1がタッチパネル付き液晶なので試しに画像を表示してみます。

$ wget https://kernel.org/theme/images/logos/tux.png
$ sudo fbi -d /dev/fb1 -T 1 -a tux.png

image3

起動時に自動でモジュールを読み込むように指定します。

$ sudo vi /etc/modules-load.d/waveshare.conf
spi-bcm2835
flexfb
fbtft_device

$ sudo vi /etc/modprobe.d/waveshare.conf
options flexfb width=320 height=480 regwidth=16 init=-1,0xb0,0x0,-1,0x11,-2,250,-1,0x3A,0x55,-1,0xC2,0x44,-1,0xC5,0x00,0x00,0x00,0x00,-1,0xE0,0x0F,0x1F,0x1C,0x0C,0x0F,0x08,0x48,0x98,0x37,0x0A,0x13,0x04,0x11,0x0D,0x00,-1,0xE1,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0xE2,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0x36,0x28,-1,0x11,-1,0x29,-3
options fbtft_device debug=3 rotate=90 name=flexfb speed=16000000 gpios=reset:25,dc:24

起動時からフォントを指定してfb1に出力させるように行末へ以下を追記します。
何だろうと少し調べてみましたが、このfbcon=map:1の役割はcon2fbmapコマンドと同じようですね。

$ sudo vi /boot/cmdline.txt
fbcon=map:1 fbcon=font:ProFont6x11 # 行末に追記します

image1

デスクトップをfb1に出力させながら起動するとタッチパネル付き液晶に表示されるはずです。

$ sudo FRAMEBUFFER=/dev/fb1 startx

image2

デスクトップの出力先をfb1に変更すると再起動後もタッチパネル付き液晶に表示されるようになるのですが
この方法だと、画面が小さすぎて色々と辛いのとHDMIが表示されなくなるので変更しない方法を探しました。

$ sudo vi /usr/share/X11/xorg.conf.d/99-fbturbo.conf
# This is a minimal sample config file, which can be copied to
# /etc/X11/xorg.conf in order to make the Xorg server pick up
# and load xf86-video-fbturbo driver installed in the system.
#
# When troubleshooting, check /var/log/Xorg.0.log for the debugging
# output and error messages.
#
# Run "man fbturbo" to get additional information about the extra
# configuration options for tuning the driver.

Section "Device"
        Identifier      "Allwinner A10/A13 FBDEV"
        Driver          "fbturbo"
        Option          "fbdev" "/dev/fb0" # <- fb0からfb1に変更する方法もあるけど今回はそのまま

        Option          "SwapbuffersWait" "true"
EndSection

色々と調べてみたんですが
フレームバッファをコピーするfbcpコマンドをインストールすることにより
fb0(HDMI)をfb1(タッチパネル付き液晶)に映せる事が分かったので利用することにしました。

これにより、HDMIに接続して起動しても画面が真っ暗って事もなく
ウインドウ幅が小さすぎて操作が困難という問題を解消できます。

$ sudo apt-get install cmake
$ git clone https://github.com/tasanakorn/rpi-fbcp
$ cd rpi-fbcp/
$ mkdir build
$ cd build/
$ cmake ..
$ make
$ sudo install fbcp /usr/local/bin/fbcp

起動時に実行させる方法で少し悩んだのですが
とりあえず安直にrc.localへ追記しておきます・・・

$ sudo vi /etc/rc.local
su -l pi -c fbcp &

最初で設定したのと逆にraspi-configでデスクトップに自動でログインするように設定を直すと
起動が完了するとタッチパネル付き液晶にデスクトップが映るようなります。

image2(1)

タッチパネルの有効化

このままだとタッチパネルが使えないので設定します。

マウスとキーボードをRaspberry Piに接続している場合は以下のようになっているはずです。

$ ls -al /dev/input/event*
crw-rw---- 1 root input 13, 64  4月  2 14:13 /dev/input/event0
crw-rw---- 1 root input 13, 65  4月  2 14:13 /dev/input/event1

以前はads7846_deviceだったらしいですがads7846に変わったようなので以下のように追記します。

$ sudo vi /boot/config.txt
# 末尾に追加
dtoverlay=ads7846,cs=1,penirq=17,penirq_pull=2,speed=1000000,keep_vref_on=1,swapxy=1,pmax=255,xohms=60,xmin=200,xmax=3900,ymin=200,ymax=3900

キャリブレーションの設定を行うついでに、画面長押しで右クリックになるように追記しておきます。

$ sudo vi /usr/share/X11/xorg.conf.d/99-calibration.conf
Section "InputClass"
    Identifier "calibration"
    MatchProduct "ADS7846 Touchscreen"
    Option "Calibration" "3873 272 236 3868"
    Option "SwapAxes"    "1"
    # Enable press and hold for right-clicking
    Option "EmulateThirdButton" "1"
    Option "EmulateThirdButtonTimeout" "750"
    Option "EmulateThirdButtonMoveThreshold" "30"
EndSection

ちなみに、waveshare35a-overlay.dtbというデバイスツリーを設置する方法も紹介されていたりいますが
特に設置せずとも動いているようなので私の環境では設置しておりません。

再起動するとタッチパネルを認識してデバイスファイルが増えており、タッチ操作が可能になっていると思います。

$ ls -al /dev/input/event*
crw-rw---- 1 root input 13, 64  4月  2 14:13 /dev/input/event0
crw-rw---- 1 root input 13, 65  4月  2 14:13 /dev/input/event1
crw-rw---- 1 root input 13, 66  4月  2 14:13 /dev/input/event2

image1(2)

その他、スクリーンキーボードのインストール等ありますが、そこら辺は割愛します。。。。

以下、参考サイト
raspberry pi LCDシールド(3.5) [RPiLCD035TP] [3.5inch RPi LCD (A)] 導入 waveshare – Qiita
3.5inch RPi LCD (A) – Waveshare Wiki
Home · notro/fbtft Wiki · GitHub
Raspberry Pi2 3.5inchタッチスクリーンディスプレイの設定 | 猫から星まで
Waveshare3.2インチLCDのセットアップ
Raspberry Piの小さな液晶のPiTFTを仮想画面スクロールで広く使いたかったけど挫折 | matoken’s meme
Raspberry Pi 2にディスプレイをつないでみた! | TONGARISM.COM
千石の4inchタッチディスプレイをRaspberryPi 2 につなぐ – yuki-sato.com
I am getting "FATAL: Module ads7846_device not found." · Issue #260 · notro/fbtft · GitHub
Adafruit customer service forums • View topic – [SOLVED ! ] 3.5" PiTFT resistive Touchscreen – Right-click a

ESXi5.1 APC Smart UPS 連携 メモ

前回のアップデートESXi5.1を623860から914609へアップデートするにより、”vmware-autohalt.sh”を使用しなくてもゲストOSを自動でシャットダウンできるようになったため連携の仕方が若干変わった。

USP連携についてはあまり触れているところは少ないため大まかながらメモしておく。

無料版ESXi5.1のホスト方ではUSP連携に対応していないためゲストを利用してUPSと連携する。
※ 方法は色々あるようで”VMware vSphere Management Assistant”と呼ばれる物を導入する方法もあるようだが今回はゲストにCentOS5を使用して実現する。

使用するゲストにシリアルポートを認識させる。
WS000043

ゲストにApcupsdをインストールする。
インストールの方法は色々と紹介されているので他サイトを参照。

シリアルポートのディバイスファイルの設定が正しいか確認する。
# cat /etc/apcupsd/apcupsd.conf | grep “DEVICE”

# You must also specify a DEVICE, sometimes referred to as a port.
# For USB UPSes, please leave the DEVICE directive blank. For
# UPSTYPE   DEVICE           Description
# usb       <BLANK>          Most new UPSes are USB. A blank DEVICE
DEVICE /dev/ttyS0

Apcupsdを起動する。
# service apcupsd start

ゲスト側でUPSが認識されているか確認するために下記のコマンドを実行する。
# apcaccess

APC      : 001,051,1246
DATE     : 2013-05-28 13:06:07 +0900
HOSTNAME : UPS-SERVER
VERSION  : 3.14.10 (13 September 2011) redhat
UPSNAME  : UPS_IDEN
CABLE    : Custom Cable Smart
DRIVER   : APC Smart UPS (any)
UPSMODE  : Stand Alone
STARTTIME: 2013-05-28 12:33:37 +0900
MODEL    : SMART-UPS 1000
STATUS   : ONLINE
LINEV    : 101.4 Volts
LOADPCT  :  15.6 Percent Load Capacity
BCHARGE  : 100.0 Percent
TIMELEFT :  93.0 Minutes
MBATTCHG : 30 Percent
MINTIMEL : 10 Minutes
MAXTIME  : 1200 Seconds
MAXLINEV : 102.0 Volts
MINLINEV : 099.4 Volts
OUTPUTV  : 101.4 Volts
SENSE    : High
DWAKE    : 000 Seconds
DSHUTD   : 180 Seconds
DLOWBATT : 02 Minutes
LOTRANS  : 090.0 Volts
HITRANS  : 110.0 Volts
RETPCT   : 000.0 Percent
ITEMP    : 40.0 C Internal
ALARMDEL : 5 seconds
BATTV    : 28.3 Volts
LINEFREQ : 50.0 Hz
LASTXFER : Line voltage notch or spike
NUMXFERS : 0
TONBATT  : 0 seconds
CUMONBATT: 0 seconds
XOFFBATT : N/A
SELFTEST : NO
STESTI   : 336
STATFLAG : 0x07000008 Status Flag
DIPSW    : 0x00 Dip Switch
REG1     : 0x00 Register 1
REG2     : 0x00 Register 2
REG3     : 0x00 Register 3
MANDATE  : 02/04/99
SERIALNO : WS9906012897
BATTDATE : 02/04/99
NOMOUTV  : 100 Volts
NOMBATTV :  24.0 Volts
EXTBATTS : 0
FIRMWARE : 60.12S.A
END APC  : 2013-05-28 13:06:46 +0900

ESi5.1ホストマシンでシェルの使用とSSHでの接続を有効にする。
WS000044

※これらを有効にするとサマリで警告が表示されるが特に問題は無いので気にしない。

SSHを鍵を使い、パスワードなしでログインできるようにする。
SSHの鍵作成については過去記事ESXi5 SSH 公開鍵暗号化方式 作製を参照。

ゲストに秘密鍵を下記のパスになるようにコピーする。
/root/.ssh/esxi_id_rsa.pub

ESXi5.1ホストマシンに鍵を使ったSSHでパスワードなしでログインできることを確認する。
# ssh -i /root/.ssh/esxi_id_rsa.pub root@<ESXi5.1ホストマシンのIPアドレス>

ゲストでESXi5.1ホストマシンをシャットダウンするシェルスクリプトを作成する。
# vi /usr/local/bin/esxi_shutdown.sh

#!/bin/sh
ssh -i /root/.ssh/esxi_id_rsa.pub root@<ESXi5.1ホストマシンのIPアドレス> "/bin/halt"

実行権を与える。
# chmod 700 /usr/local/bin/esxi_shutdown.sh

実際に実行してESXi5.1ホストマシンがゲストからシャットダウンできるか確認する。
# /usr/local/bin/esxi_shutdown.sh

Apcupsdがシャットダウン時に実行するコマンドを書き換える
# vi /etc/apcupsd/apccontrol

#SHUTDOWN=/sbin/shutdown
SHUTDOWN=/root/bin/esxi_shutdown.sh

Apcupsdを再起動する。
# service apcupsd restart

最後にUPSの電源を引きぬいてESXi5.1ホストマシンが自動でシャットダウンされるか確認する。

参考サイト
ESXi 4.1 から ESXi 5.0 へアップグレード | SS-NET サポート
VMware ESXi 5.0 + vMA 5.0で電源管理 (3) – apcupsdの導入 « RootLinks Co., Ltd.
自宅サーバ構築じぶんめも SSH設定編 | ken39rajima

ArduinoでRELET(FeliCa電子マネー残高照会機)モドキを作ろう

作ろうと考えるようになったいきさつ

以前、家電量販店を歩いてるとSuicaやEdyなどの電子マネーの残高を確認できる電子マネービュアー「リレット」EV10 | KING JIMが販売されており思わず『買いたい』と思いましたが、値札を見たらお値段が・・・・。度々家電量販店に行くも今度買おうと自分に言い聞かせてたらいつの間にか生産中止になってしまたようで・・・・・。仕方ないから自分で自由に機能を拡張できるFeliCa電子マネー残高照会機を作ろうと思い立ちました。

初代残高照会機(Arduino UNO + PaSoRi)

実は、以前にも同様の目的でFeliCaの残高照会機を作った事があったのですが、想像よしていたものより大きく据え置きにするしかなかったため今回これよりも遥かに小さい物を作成しようと考えました。

道具の準備

・ハンダ線
・ハンダ吸い取り線
・フラックス
・熱収縮チューブ
・ハンダこて
・こて台
・こて拭き
・精密ピンセット
・カッターナイフ

電子工作をする上でとくに特別な物はないですが、結構細かい部品をハンダ付けするため精密ピンセットとフラックスがあるといいかもしれません。

部品の準備

・FeliCa リーダー・ライター RC-S620S
・FeliCa RC-S620S ピッチ変換基板のセット(フラットケーブル付き)
・Arduino Pro mini 5V
・SB0802GN
・AS1322A/V2
・Polymer Lithium Ion Battery – 110mAh
・JST-PHオスコネクター
・タクトスイッチ
・1μF積層セラミックチップコンデンサ 2個
・1μF積層セラミックコンデンサ 1個
・10kΩチップ抵抗 2個
・ビニール線

・FT232RL搭載小型USB-シリアルアダプタ 5V
・LiPo Charger Basic – Micro-USB

 今回手軽に持ち運べるよう小型化するために、Arduino Pro miniを選択しましたが、通常8Mhzな3.3V版では115200bpsの転送レートに対応していないためRC-S620/Sと通信することが出来ないので5V版を準備してください。
 なお、同じく軽量化小型化のためにLCD液晶にStrawberryLinux製のミニI2C液晶モジュールを使用しました。このパーツを使用すると一部チップ部品のハンダ付けが必要となりますが、I2C通信を利用する事により使用するピンを劇的に減らすことが可能になります。

ハードウェアの作成

Arduinoにシリアル通信用の足をハンダ付けし、裏面にプルアップ抵抗用にチップ抵抗(10kΩ)を2個ハンダ付けします。

StrawberryLinux製のミニI2C液晶モジュールはコンデンサを3個ハンダ付けしなければならないので、表面にチップコンデンサ(1μF)を2個、裏にコンデンサ(1μF)を1個ハンダ付けします。

StrawberryLinux製の昇圧型DC-DCコンバータモジュールは5V引き出す場合ハンダジャンパーが必要になるのでハンダでショートさせます。

最後にこのような配線になるように各種パーツをハンダ付けしていきます。バッテリーは使い切ると外して充電器に接続し充電します。
※ 当初、CR2032で動かす予定でしたが大電流放電が苦手なようでうまく動きませんでした。
※ RC-S620/Sは配線を間違うと一瞬で壊れます。私は試作の時にうっかり2台も壊してしまいまいした・・・・
※ 今回何となく不安でRAWに昇圧モジュールのOUTを繋いでいますが電圧を5Vに調整しているのでVCCに繋いでも一応動いたりします。

これでハードは完成です。

ライブラリの準備

Arduino向けRC-S620/S制御ライブラリ
I2C液晶ライブラリ – Okiraku Programming

それぞれのライブラリをダウンロードしlibrariesフォルダーに入れ、RC-S620/S制御ライブラリ“RCS620S.cpp”を開き#include “WProgram.h”を#include “Arduino.h”に書き換えて上書き保存します。I2C液晶ライブラリも“LCD_I2C.h”の中身を下記から次のように通り書き換えます。
※ 実は、“LCD_I2C.h”の書き換えは#include “Arduino.h”じゃなくて#include <wiring_private.h>でもよかったり?

書き換え前

#ifndef LCD_I2C_h
#define LCD_I2C_h
extern "C" {
#include <math.h>
#include <wiring.h>
}
#include <Wire.h>

書き換え後

#ifndef LCD_I2C_h
#define LCD_I2C_h
#include <math.h>
#include "Arduino.h"
#include <Wire.h>

ソフトウエアの作成

アトリエのどか様の公開されているスケッチを参考に実際にSuica、PASMO、Edy、nanaco、waonなどのFeliCa電子マネーの残高を表示させるように記述しました。

※ Arduino Pro miniではRC-S620/Sを接続しているとスケッチをArduinoに書き込めないという問題が発生しました。スケッチを書き込む場合は一度ArduinoとRC-S620/Sを繋ぐフレキケーブルを外しておく必要があります。

#include <Wire.h>
#include <LCD_I2C.h>
#include <RCS620S.h>

// Circuit
// RESET    - 1 RST
// Analog 5 - 2 SCL (internally pulled up)
// Analog 4 - 3 SDA (internally pulled up)
// GND      - 4 VSS
// 5V       - 5 VDD

// RCS620S
#define COMMAND_TIMEOUT               400
#define POLLING_INTERVAL              500
#define RCS620S_MAX_CARD_RESPONSE_LEN 30

// FeliCa Service/System Code
#define CYBERNE_SYSTEM_CODE           0x0003
#define COMMON_SYSTEM_CODE            0xFE00
#define PASSNET_SERVICE_CODE          0x090F
#define EDY_SERVICE_CODE              0x170F
#define NANACO_SERVICE_CODE           0x564F
#define WAON_SERVICE_CODE             0x680B

RCS620S rcs620s;

void setup(){
  LCD.begin(5);
  Serial.begin(115200);
}

void loop(){
  uint32_t balance;
  uint8_t buf[RCS620S_MAX_CARD_RESPONSE_LEN];
  
  rcs620s.timeout = COMMAND_TIMEOUT;
  
  // サイバネ領域
  if(rcs620s.polling(CYBERNE_SYSTEM_CODE)){
    // Suica PASMO
    if(requestService(PASSNET_SERVICE_CODE)){
      if(readEncryption(PASSNET_SERVICE_CODE, 0, buf)){
        // Little Endianで入っているPASSNETの残高を取り出す
        balance = buf[23];                  // 11 byte目
        balance = (balance << 8) + buf[22]; // 10 byte目
        // 残高表示
        printBalanceLCD("PASSNET", &balance);
      }
    }
  }
  
  // 共通領域
  else if(rcs620s.polling(COMMON_SYSTEM_CODE)){
    // Edy
    if(requestService(EDY_SERVICE_CODE)){
      if(readEncryption(EDY_SERVICE_CODE, 0, buf)){
        // Big Endianで入っているEdyの残高を取り出す
        balance = buf[26];                  // 14 byte目
        balance = (balance << 8) + buf[27]; // 15 byte目
        // 残高表示
        printBalanceLCD("Edy", &balance);
      }
    }
    
    // nanaco
    if(requestService(NANACO_SERVICE_CODE)){
      if(readEncryption(NANACO_SERVICE_CODE, 0, buf)){
        // Big Endianで入っているNanacoの残高を取り出す
        balance = buf[17];                  // 5 byte目
        balance = (balance << 8) + buf[18]; // 6 byte目
        balance = (balance << 8) + buf[19]; // 7 byte目
        balance = (balance << 8) + buf[20]; // 8 byte目
        // 残高表示
        printBalanceLCD("nanaco", &balance);
      }
    }
    
    // waon
    if(requestService(WAON_SERVICE_CODE)){
      if(readEncryption(WAON_SERVICE_CODE, 1, buf)){
        // Big Endianで入っているWaonの残高を取り出す
        balance = buf[17];                  // 21 byte目
        balance = (balance << 8) + buf[18]; // 22 byte目
        balance = (balance << 8) + buf[19]; // 23 byte目
        balance = balance & 0x7FFFE0;       // 残高18bit分のみ論理積で取り出す
        balance = balance >> 5;             // 5bit分ビットシフト
        // 残高表示
        printBalanceLCD("waon", &balance);
      }
    }
  }
  
  // デフォルト表示
  else{
    LCD.clear();
    LCD.move(0);
    LCD.print("Touch");
    LCD.move(0x44);
    LCD.print("Card");
  }
  
  rcs620s.rfOff();
  delay(POLLING_INTERVAL);
}

// request service
int requestService(uint16_t serviceCode){
  int ret;
  uint8_t buf[RCS620S_MAX_CARD_RESPONSE_LEN];
  uint8_t responseLen = 0;
  
  buf[0] = 0x02;
  memcpy(buf + 1, rcs620s.idm, 8);
  buf[9] = 0x01;
  buf[10] = (uint8_t)((serviceCode >> 0) & 0xff);
  buf[11] = (uint8_t)((serviceCode >> 8) & 0xff);

  ret = rcs620s.cardCommand(buf, 12, buf, &responseLen);
  
  if(!ret || (responseLen != 12) || (buf[0] != 0x03) ||
      (memcmp(buf + 1, rcs620s.idm, 8) != 0) || ((buf[10] == 0xff) && (buf[11] == 0xff))) {
    return 0;
  }

  return 1;
}

int readEncryption(uint16_t serviceCode, uint8_t blockNumber, uint8_t *buf){
  int ret;
  uint8_t responseLen = 0;
  
  buf[0] = 0x06;
  memcpy(buf + 1, rcs620s.idm, 8);
  buf[9] = 0x01; // サービス数
  buf[10] = (uint8_t)((serviceCode >> 0) & 0xff);
  buf[11] = (uint8_t)((serviceCode >> 8) & 0xff);
  buf[12] = 0x01; // ブロック数
  buf[13] = 0x80;
  buf[14] = blockNumber;

  ret = rcs620s.cardCommand(buf, 15, buf, &responseLen);

  if (!ret || (responseLen != 28) || (buf[0] != 0x07) ||
      (memcmp(buf + 1, rcs620s.idm, 8) != 0)) {
    return 0;
  }

  return 1;
}

void printBalanceLCD(char *card_name, uint32_t *balance){
  char result[8];
  sprintf(result, "%u", *balance);
  LCD.clear();
  LCD.move(0);
  LCD.print(card_name);
  LCD.move(0x40);
  LCD.print(0xE6);
  LCD.print(0x20);
  LCD.print(result);
  return;
}

作成過程

Arduino Pro miniとチップ抵抗のハンダ付けが終わった写真

ミニI2C液晶モジュールとチップコンデンサのハンダ付けが終わった写真

ミニI2C液晶モジュールとコンデンサのハンダ付けが終わった写真

全ての組立終わり、スケッチの書き込みの準備中の写真

作成例

作成したハードにスケッチを書き込み、調度よさそうな大きさのケースに格納してみました。



機能拡張のヒント

地方の各種交通機関のFeliCaカードに対応させても良いかもしれません。
残高と一緒に経由駅を表示させたり購入履歴を表示できるようにしても良いかもしれません。
おさいふケータイなどの三者間通信に対応しても面白いかもしれません。

各種パーツの図の配布

今回Arduino Pro miniやミニI2C液晶モジュールなどの図を作成しましたのでpng形式で提供させて頂きます。
FeliCa残高照会機 パーツ一覧

参考

かお(・v・)もじ SF Checker – アトリエのどか
第四章 低電圧I2C液晶ディスプレイ
felicalib プロジェクト Wiki
ICカードのフォーマット解析
I2C液晶ライブラリ – Okiraku Programming

ぴくぴくダウンローダ for Java(仮) 正式公開

計画していた全ての機能を実装したので正式版として公開します。

新しい機能
・コマンドベースで詳細な条件(日付の指定など)を指定し操作が可能になりました。

推奨環境:Core2Duo以降のデュアルコアCPU搭載のパソコン
動作環境:Windows MacOSX Linux でJavaが動作する環境

Windows 7 での実行の様子

コマンドモードでの実行の様子

Download
こちらのダウンロードページよりダウンロードをお願い致します。

RT58iでVPN接続し外部からWOLを行う

RT58iはデフォルトではLAN外からのMagic Packetを通さないためWOLできない。
調べていたら下記のサイトにて設定が紹介されていたので参考にさせていただいた。

WOL(Wake On Lan)のMagic Packetをルーター越えさせる方法。

下記のコマンドを実行することでMagic Packetを通過できるようになる。
ip lan1 wol relay broadcast

VPNは下記の記事を参考にしてください。
今更ながらRT58iでVPN設定を行なってみた

IDC-BB延長フラットケーブルの自作

マザーボード上のCOMポートをブラケット上にRS-232で提供できるようにするケーブルが裏配線したところ微妙に足りない事が判明したため困っていたところ、下記のサイトで延長ケーブルの自作を行っているサイトがあったのでそれを参考に延長ケーブルの作製を行った。

インテルマザーシリアル延長

すでにIDC-BBは二本手元にあったので一本をぶった切って延長ケーブルに使う事にした。

使用したソケットはF3BD10PD254RMCと呼ばれるヒロセ電機の製品で、秋葉原のマルツパーツ館にて取り扱いがある。

圧着機が手元に無かったため、LANケーブル用の圧着機の柄に挟み圧着した。

完成

接続時の様子

仕様・組み立てマニュアル
中継タイプリボンケーブル用コネクタ(HIF3B中継タイプ)

今更ながらRT58iでVPN設定を行なってみた

まずは普通に下記の通りに簡単設定画面のリンクをクリックして設定する。
「詳細設定と情報」> 「VPN接続の設定」> 「PPTPを使用したパスワード認証のリモートアクセスVPNサーバ(Anonymous)」
※ 基本的には適当に設定して問題ないが”PPTP暗号鍵生成の認証方式”は”MS-CHAP v2で認証する”としておくこと。

ただこのままではなぜかVPNに繋げられないので次のような処理を行う。

次は、下記の簡単設定画面のリンクをクリックしてコマンドを実行する。
「詳細設定と情報」> 「コマンドの実行」

実行するコマンド
pp select anonymous
ppp ipcp msext on
nat descriptor masquerade static 1 1 192.168.100.1 tcp 1723
nat descriptor masquerade static 1 2 192.168.100.1 gre

上二行は名前解決に関するコマンド
下二行はNATの設定に関するコマンド

パラメータは各自自分の環境に合わせてください。
そんな感じで多分接続出来るようになると思います。

参考
iPhone4→RT58i VPN(PPTP)接続のコツ
リモートアクセス(PPTP)で社外から社内LANにアクセスしたい

ぴくぴくダウンローダについてのお知らせ

ぴくぴくダウンローダの開発についてなのですが・・・突然ですが、そろそろ開発を終了しようかと考えております。
最初の頃とは違い他の方々も活発に開発を行なっているようなので何か特別な事や私の気まぐれが無い限りバージョンアップは行わない予定です。

※ 著作権に関しては今後も破棄、譲渡する予定はございません。

今までご利用ありがとうございました。

WordPress広告自動挿入

今までAdmanというプラグインを利用していましたが、最近下記のようなエラーが出ているのを発見したので調べました。

Warning: stripcslashes() expects parameter 1 to be string, array given in /var/www/html/wp-content/plugins/adman/adman.php on line 143

Admanの他に新しくNew Admanというプラグインを同じ開発者が公開していたのでインストールしてみたところエラーも出ず正常に動いているようです。