Raspberry PiでMRAAを使えるようにする for Node.js

前々から、Node-REDで使えるGroveノードを作りたいなーと思っている話を先日のNode-RED UG Tokaiで話したところ、

www.slideshare.net

わりと「いいんじゃね?」という感じだったので、Johnny-FiveとMRAAを比較して、

www.slideshare.net

よっしゃMRAAでやろう!となり、Raspberry PiにMRAA入れるところで盛大に苦労したので、ブログに書いておこうと思う。

f:id:matsujirushix:20191109115036p:plain

やりたいこと

Raspberry Piで、Node-REDから(Node.jsから)呼び出しできるようMRAAをインストールする。

もやもや

apt install mraaみたいにサクッとインストールを期待していたのですが、、、MRAAのパッケージ無い。

Debian -- Package Search Results -- mraa

npmでMRAAありましたが、Node.js 7以降は未サポートorz

mraa - npm

SeeedのパッケージリポジトリにMRAAありましたが、Node.js入っていないっぽい。&バージョン古いっぽい。

GitHub - Seeed-Studio/pi_repo: Package Repository for Raspberry Pi

仕方ないので、ここを見ながらソースをコンパイルし始めたのだが、、、まぁ、コンパイルが通らないわけです。

Build failure with Node.js 12.x · Issue #969 · intel-iot-devkit/mraa · GitHub

SWIG support for NodeJS v12 · Issue #1520 · swig/swig · GitHub

Node.jsのバージョンを変え、SWIGのバージョンを変え、SWIGにパッチ当てたり当てなかったりと、あれこれ試した結果、下記手順で動かすことができました。

Raspberry PiでMRAAを使えるようにする for Node.js

OSイメージは現時点最新の2019-09-26-raspbian-buster-lite.img
とりあえず、パッケージを最新にしておきます。

sudo apt update
sudo apt upgrade

nodesourceで、Node.js v10をインストールします。(参考
最新のv12はダメ。SWIGが対応していない。
aptで入れるのはダメ。nodesourceで入れておかないと、Raspberry Pi用Node-REDスクリプトでアンインストールされてしまうので。

sudo sh -c 'curl -sL https://deb.nodesource.com/setup_10.x | bash -'
sudo apt-get install -y nodejs

この時点の、nodeとnpmのバージョンはこれでした。

$ node -v
v10.17.0
$ npm -v
6.11.3

MRAAのコンパイルに必要なパッケージをインストールします。(参考
nodejs-devは無くてOK。(busterだとlibnode-devなんだけど、あえて入れなくても大丈夫だった。)

sudo apt-get install git build-essential swig3.0 python-dev cmake libjson-c-dev python3-dev

この時点の、SWIGは3.0.12-2。

$ dpkg -l | grep swig3.0
ii  swig3.0                        3.0.12-2                            armhf        Generate scripting interfaces to C/C++ code

SWIGに、Node.js V7以降のパッチを適用します。

wget https://git.yoctoproject.org/cgit.cgi/poky/plain/meta/recipes-devtools/swig/swig/0001-Add-Node-7.x-aka-V8-5.2-support.patch
cd /usr/share/swig3.0
sudo patch -p2 <~/0001-Add-Node-7.x-aka-V8-5.2-support.patch
cd

MRAAをコンパイル

git clone https://github.com/intel-iot-devkit/mraa
cd mraa
mkdir build
cd build
cmake ..
make

MRAAをインストール。
共有ライブラリが増えたので、ldconfigも実行します。

sudo make install
sudo ldconfig

Node.jsから使えるようにシンボリックリンクを作成します。

mkdir ~/node_modules
ln -s /usr/include/node/lib/node_modules/mraa ~/node_modules/mraa