Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
NaotoSakai
Advisor
Advisor
この記事は 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

上で色を変えた部分を <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にデータを送ってみようと思います。