Skip to Content
Technical Articles
Author's profile photo Naoto Sakai

Raspberry PIへの Internet of Things Edge Platform のセットアップ

この記事は SAP IoT services for SAP BTP for the Cloud Foundry EnvironmentのEdge PlatformをRaspberry PIにセットアップしたときの備忘録です。

はじめに

Internet of Things Edge PlatformをRaspberry PIにセットアップする場合、メモリが2GB以上ないとgatewayを起動させることが出来ないことに注意が必要です。つまり、Raspberry PI4のメモリが大きめのモデルでないと動作させることが出来ません。Raspberry PI 3やZEROなどではメモリの問題で動作させることが出来ませんでした。
今回は私は以下のバージョンのOSを使用しています。
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 5.10.17-v7l+ #1403 SMP Mon Feb 22 11:33:35 GMT 2021 armv7l GNU/Linux
注意1:私はRaspberry PI 4の4GBメモリモデルを使用しています。2GBモデルでも動作すると思うのですが、テストはしていません。
注意2:ひょっとしたら様々なパラメータや後から入れるメモリ関連のパッケージを駆使することでメモリ2GB以下のRaspberry PIでも動作させることが可能かもしれません。

 

JREのインストール

Edgeゲートウェイの動作にはJavaの実行環境が必要です。
Raspberry PIをネットワークに接続し、ターミナル、あるいはSSH等でログインします。
まず一応パッケージリストを更新するほうが良いでしょう。
pi@raspberrypi:~ $ sudo apt-get update
その後
pi@raspberrypi:~ $ sudo apt-get install openjdk-8-jre
としてJREをインストールします。openjdk-8-jdkとしてJDKをインストールしても良いでしょう。
正常にインストールできたか確認してください。
pi@raspberrypi:~ $ java -version
openjdk version “1.8.0_212”
OpenJDK Runtime Environment (build 1.8.0_212-8u212-b01-1+rpi1-b01)
OpenJDK Client VM (build 25.212-b01, mixed mode)
ここまでできれば後はgatewayのセットアップです。

 

Edgeゲートウェイのセットアップ

ここではRESTのEdge gatewayをセットアップしてみます。
まずRaspberry PI上にIOTCHCPXX_X-XXXXXXXX.ZIPを転送し、展開します。私が使用したのはIOTCHCP69_0-70002561.ZIPです。
私はIOTCHCPというディレクトリを作成し、そこに展開しました。
pi@raspberrypi:~ $ mkdir IOTCHCP
pi@raspberrypi:~ $ cd IOTCHCP
pi@raspberrypi:~/IOTCHCP $ unzip ../IOTCHCP69_0-70002561.ZIP
Archive:  ../IOTCHCP69_0-70002561.ZIP
   creating: documentation-4.69.0/
  inflating: documentation-4.69.0/all-4.69.0-fortify.pdf  
  inflating: documentation-4.69.0/common-4.69.0-fortify.pdf  
  inflating: documentation-4.69.0/iot.cf.edge.platform.coap.pdf  
  inflating: documentation-4.69.0/iot.cf.edge.platform.file.pdf  
  inflating: documentation-4.69.0/iot.cf.edge.platform.modbus.pdf  
  inflating: documentation-4.69.0/iot.cf.edge.platform.mqtt.pdf  
  inflating: documentation-4.69.0/iot.cf.edge.platform.opc.ua.pdf  
  inflating: documentation-4.69.0/iot.cf.edge.platform.rest.pdf  
  inflating: documentation-4.69.0/iot.cf.edge.platform.sigfox.pdf  
  inflating: documentation-4.69.0/iot.cf.edge.platform.snmp.pdf  
  inflating: gateway-4.69.0.zip      
  inflating: sdk-4.69.0.zip          
  inflating: SIGNATURE.SMF
pi@raspberrypi:~/IOTCHCP $

このディレクトリに更にgatewayというフォルダを作り、その中にgateway-4.69.0.zipを展開します。

pi@raspberrypi:~/IOTCHCP $  mkdir gateway

pi@raspberrypi:~/IOTCHCP $ cd gateway
pi@raspberrypi:~/IOTCHCP/gateway $ unzip ../gateway-4.69.0.zip
pi@raspberrypi:~/IOTCHCP/gateway $ ls
adapters                       gateway-upgrade.jar   plugins
build.bat                      merge.bat             upgrade.bat
build.sh                       merge.sh              upgrade.sh
config                         migrate.bat           version.json
configuration                  migrate.sh
gateway-upgrade-migration.jar  org.eclipse.osgi.jar
pi@raspberrypi:~/IOTCHCP/gateway $

そしてBuildを行います。今回はRESTゲートウェイを使用しますので下記のように

pi@raspberrypi:~/IOTCHCP/gateway $ ./build.sh REST
Build script … starting
PARAMETRS: REST
Merge script … starting
WARN: Custombundles dir is NOT present in system
Plugin configuration … starting
Removing unnecessary files … starting
pi@raspberrypi:~/IOTCHCP/gateway $

build.shの引数にRESTを指定してビルドします。

次にconfigディレクトリの下にあるconfig_gateway_rest.xmlを編集します。
これは毎回ややこしいなあと思うのですが、覚えていただくしか無いです。
まずはIoTコックピットにアクセスして必要な情報をメモしましょう。ログインして使用するテナントを選択してください。
ブラウザのURL欄を確認します。以下のようになっているはずです。
https://xxxxxxx-xxxx-xxxxx-xxxx-xxxxxx.xxxx.cp.iot.sap/yyyyyy-yyyyyy-yyyyyy-yyyyyy-yyyyyyyyyy/iot/cockpit/#/tenant/zzzzzzzzzz
これを展開して

https://xxxxxxx-xxxx-xxxxx-xxxx-xxxxxx.xxxx.cp.iot.sap/yyyyyy-yyyyyy-yyyyyy-yyyyyy-yyyyyyyyyy/iot/cockpit/#/tenant/zzzzzzzzzz

上で色を変えた部分を <HOSTNAME>,<INSTANCENAME>,<TENANTNAME>とします。

<HOSTNAME> = xxxxxxx-xxxx-xxxxx-xxxx-xxxxxx.xxxx.cp.iot.sap
<INSTANCENAME> = yyyyy-yyyyyy-yyyyyy-yyyyyy-yyyyyyyyy
<TENANTNAME> = zzzzzzzzzz

(今後の説明で上記を使用します。)
最低限必要な部分ですが

まず9行目のcnf:connectionStringの部分の部分の127.0.0.1を<HOST_NAME>で置換します。

<cnf:connectionString>failover:(nio+ssl://<HOST_NAME>:61616?daemon=true&amp;soTimeout=60000&amp;verifyHostName=true)?initialReconnectDelay=5000</cnf:connectionString>

次は23行目付近、<cnf:coreconnetion>タグで囲まれた中の<cnf:address>タグの記述を変更します。

ここはちょっとややこしいです。
<cnf:address>https:/<HOSTNAME>/<INSTANCENAME>/iot/core/api/v1/tenant/<TENANTNAME></cnf:address>
と直します。
最後に56行目です。
ここで、<cnf:gateway>タグを編集してゲートウェイのAlternate IDを指定します。この値はコックピット上のゲートウェイ一覧に表示されます。
Edgeはゲートウェイの一部です。そしてエッジはその特性上は複数使用する可能性がありますからコックピット上でどのエッジデバイスかわかるようにわかりやすいものにしたほうが良いです。
<cnf:gateway gatewayAlternateId=”EDGERESTGATEWAYONRPI”>
これで編集は完了です。
また、今回はEdgeゲートウェイはEdgeデバイス専用の、安全なネットワーク内に設置すると仮定し、センサーデバイスからEdgeゲートウェイ間の通信は証明書による認証なしで行うこととします。
ゲートウェイを展開したディレクトリ下にある/gateway/config/services/sap.NettyConfiguration,cfgファイルを編集します。
pi@raspberrypi:~/IOTCHCP/gateway/config/services $ vi sap.NettyConfiguration.cfg
# Enables a Netty server
enabled = true
# Host name or IP address to identify a specific network interface on which to listen
host = localhost
# TCP/IP port on which the server listens for connections
port = 8699
# Expose service on https
enableSSL = false
enableSSLはディフォルトではtrueとなっていますのでfalseに変更します。
もう一つ、sap.RestAdapterConfiguration.cfgも編集します。
pi@raspberrypi:~/IOTCHCP/gateway/config/services $ vi sap.RestAdapterConfiguration.cfg
# Enable/Disable the device authorization checks
useDeviceAuth = false
ここのuseDeviceAuthもディフォルトではtrueになっていますのでfalseにします。
平文で送る設定となりますので実際の使用の上では注意してください。
最後にOnboarding Certificateをダウンロードして配置します。
Onboarding Certificateはコックピットのページからダウンロードできます。
ダウンロードしたら必ずファイル名を「gateway-registration-certificate.json」に変更してください。この名前のファイルをgatewayは読み込むようになっています。
このファイルはgatewayディレクトリ下のconfig/certificatesディレクトリに配置します。
certificatesディレクトリが存在しない場合は下記の様に作成してからOnboarding Certificateを配置してください。
pi@raspberrypi:~/IOTCHCP/gateway/config $ mkdir certificates
pi@raspberrypi:~/IOTCHCP/gateway/config/certificates $ cd certificates
pi@raspberrypi:~/IOTCHCP/gateway/config/certificates $ mv $HOME/gateway-registration-certificate.json ./
これで準備は完了です。

Edgeゲートウェイの起動

ここまで行うとようやくゲートウェイを起動できるようになります。
gateway.shを実行します。
pi@raspberrypi:~/IOTCHCP/gateway $ ./gateway.sh
(中略)
234 18:12:43,986 [Start Level: Equinox Container: 073cb859-f660-4e54-bafe-1bb28ccef272] INFO  (KeepAliveStarter:64) – *** BUNDLE 2 EVENT for com.sap.iotservices.gateway.command-cache-service_4.69.0[239] – ID=239
234 18:12:44,279 [DiscoveryManager] INFO  (DiscoveryManager:62) – Initialization successfully finished, start loading API endpoint
234 18:12:44,280 [DiscoveryManager] INFO  (DiscoveryManager:71) – API endpoint loaded, start network configuration
234 18:12:44,280 [DiscoveryManager] INFO  (DiscoveryManager:75) – Network configuration performed, retrieving the network nodes
234 18:12:44,280 [DiscoveryManager] INFO  (DiscoveryManager:78) – Nodes successfully retrieved, start node configuration
234 18:12:44,280 [DiscoveryManager] INFO  (DiscoveryManager:642) – +————– Gateway Initialization Complete ———————+
IoTコックピットでゲートウェイ一覧を確認します。登録したゲートウェイが表示されていれば成功です。

 

オプション:エッジゲートウェイを自動起動にする

エッジはその名の通りネットワークの末端です。
この末端に置くシステムというのはエンタープライズのシステムと違い、管理者が常時近くにいるわけではないということがほとんどかと思います。私は元々組み込みシステムのエンジニアでもあったのですが、このような環境のシステムで求められるのは、問題が発生したときに現地にいるあまりコンピューターに詳しくない方でも対応できることでした。ただし、詳しくない方ができることというのは限られます。特にLinuxを操作しろというのは難しいでしょう。ただ、電源ボタンを押して再起動してくださいということくらいはできるはずです。
ということで、Raspberry PIの電源を入れたときに自動的にエッジゲートウェイが起動するように設定します。
Raspberry PIでは自動起動させる方法がいくつかありますが、今回はsystemdを使用します。
まず下記のようなファイルを作成します。私はiotedgegateway.serviceという名称で下記のファイルを作成します。
[Unit]
Description=SAP IoT Edge Gateway(REST)
After=syslog.target[Service]
Type=simple
WorkingDirectory=/home/pi/IOTCHCP/gateway
ExecStart=/home/pi/IOTCHCP/gateway/gateway.sh
TimeoutStopSec=5
StandardOutput=null[Install]
WantedBy = multi-user.target

*Working DirectoryとExecStartは環境に応じて書き換える必要があります。

このファイルを/etc/systemd/systemにコピーします。これはsudoで行う必要があります。
そしてサービス一覧をリロードして、まずは手動で起動させます。( sudo systemctl start iotedgegateway)

pi@raspberrypi:~ $ sudo mv iotedgegateway.service /etc/systemd/system

pi@raspberrypi:~ $ sudo systemctl daemon-reload

pi@raspberrypi:~ $ sudo systemctl start iotedgegateway

pi@raspberrypi:~ $ sudo systemctl status iotedgegateway
● iotedgegateway.service – SAP IoT Edge Gateway(REST)
Loaded: loaded (/etc/systemd/system/iotedgegateway.service; enabled;
Active: active (running) since Thu 2021-05-13 16:55:57 JST; 10s ago
Main PID: 989 (gateway.sh)
Tasks: 25 (limit: 3860)
CGroup: /system.slice/iotedgegateway.service
├─989 /bin/bash /home/pi/IOTCHCP/gateway/gateway.sh
└─990 java -Dorg.apache.activemq.UseDedicatedTaskRunner=fals

2021-05-13 16:55:57 raspberrypi systemd[1]: Started SAP IoT Edge Gateway(R

pi@raspberrypi:~ $ sudo systemctl stop iotedgegateway

正常に起動できたかは sudo systemctl status iotedgegateway で確認できます。

動作していることが確認できたら一旦停止させます。これはsudo systemctl stop iotedgegatewayで行います。

これでサービス化は出来ましたが、自動起動にはなっていません。自動起動に設定するには

pi@raspberrypi:~ $ sudo systemctl enable iotedgegateway

を実行します。Raspberry PIを再起動させてsudo systemctl status iotedgegatewayを実行して確認してみましょう。Activeになっていれば成功です。

 

まとめとポイント

 RESTのEdge gatewayをRaspberry PIにセットアップし、動作させてみました。

ここでゲートウェイの選択のポイントをご紹介します。

RESTゲートウェイとMQTTゲートウェイはCloud側にも用意されています。そしてEdge側にも同じMQTTゲートウェイとRESTゲートウェイが用意されています。これには違いが有り、Cloud上のゲートウェイはすべてクライアント証明書による認証が必須です。対してEdge側のゲートウェイは認証方法を選択することが可能で、認証なしということも可能です。これはEdgeゲートウェイはそれなりにセキュリティが確保された同一ネットワーク上に存在する機器からアクセスされるという前提があるためです。それに対しCloudゲートウェイはインターネット上へのアクセスとなるためセキュリティ担保に何らかの機構が必要となり、それでクライアント証明書によるアクセスを要求しています。
Edgeゲートウェイは使用するセンサー、接続する機器が通信機能を有しているものの、証明書を使用した通信が機能的に出来ないという場合に有用です。実際にIoTサービスに接続するのはEdgeゲートウェイであり、それはOnboarding Certificateにより機器の認証がされている状態となります。Edgeゲートウェイ間とセンサー・機器の間のセキュリティを担保すれば良いのです。プライベートな無線LANネットワークで良い場合もありますし、そこにもクライアント証明書による認証を使用するかは要件や機器の仕様次第です。

次回はひょんなことから触ることになったIchigo Jam(+Mix Juice)をこのRaspberryPI上のRESTゲートウェイを介してSAP IoT services for SAP BTP for the Cloud Foundry Environmentにデータを送ってみようと思います。

Assigned Tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.