サン電子のゲートウェイRoosterにHULFT IoT(Agent)を入れてみた

こんにちは、よろず相談担当 すぎもん :yum: です。

前回は、Linuxゲートウェイ機器であるサン電子Rooster(NSX7000)にHULFT IoT EdgeStreamingのパッケージを作成してみました。（[前記事](https://qiita.com/sugimon/items/da74096f11cb58cc6454)）
今回は、第2弾として、HULFT IoT Agentのパッケージ作成についてもブログにまとめてみました。


皆さまの課題を解決する糸口があるかもしれませんので、是非ご一読いただければ、と思います。

# NSX7000 への HULFT IoT Agent パッケージ作成手順

## はじめに
サン電子Rooster(NSX7000)とは、サン電子株式会社のIoT/M2M向けルーターRoosterシリーズの機器となります。NSX7000は、マルチキャリア対応 LTE通信対応Linuxゲートウェイと位置づけられております。

- NSX7000機器情報

機器の詳細については、下記リンクをご参照ください。
[NSX7000機器情報] (https://www.sun-denshi.co.jp/sc/nsx7000/)


- 作業の流れ
 
HULFT IoT Agentをインストールするには、事前にパッケージ作成環境を準備する必要があります。実際にパッケージの作成をやってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/c4b56420-61e7-30c2-0aab-6f18e9fd2e19.png)


## 事前準備

以下を準備してください。

- HULFT IoT 

  - 製品本体が含まれる zip ファイルを指定のサイトから[ダウンロード](https://www.hulft.com/download?&_ga=2.188013544.1972116588.1573457228-475003281.1503981102#anc_24)し、展開します
  - xxxは製品のバージョンです
  - HULFT IoT に関する用語や操作などについては zip ファイルに含まれる「readme.html」か[オンラインマニュアル](https://www.hulft.com/help/ja-jp/IoT/index.htm?_ga=2.188153064.1972116588.1573457228-475003281.1503981102)を参照してください

    ```
    hulftiot_vxxx/
    +-- Agent/
    |    |
    |    +-- HULFT IoT Agent のインストールモジュール
    |
    +-- Agent UpdateModule/
    |    |
    |    +-- HULFT IoT Agent のアップデートモジュール
    |
    +-- License/
    |    |
    |    +-- ライセンスファイル
    |
    +-- Manager/
    |    |
    |    +-- HULFT IoT Manager のインストールモジュール
    |
    +-- Manual/
    |    |
    |    +-- HULFT IoT のマニュアル
    |
    +-- readme.html
    ```

- NSX7000 パッケージ作成環境（※開発環境を別途準備します）
　[NSX7000マニュアル](http://www.sun-denshi.co.jp/sc/nsx7000/manual/)
  パッケージ作成環境の構築手順については以下のマニュアルを参照します
    - Add-onアプリケーション開発-パッケージ作成マニュアル.pdf
    - Add-onアプリケーション開発-環境構築マニュアル.pdf




## Manager 環境の構築
[HULFT IoTマニュアル](https://www.hulft.com/help/ja-jp/IoT/index.htm?_ga=2.253737929.1972116588.1573457228-475003281.1503981102)
HULFT IoT のマニュアルに従い、Manager 環境の構築を行います



## パッケージ化するモジュールの準備
注意：以降の手順はrootユーザで実行します

1.　NSX7000 パッケージ作成環境の任意のディレクトリに以下のファイルをコピーします

   - hulftiot_vxxx/Agent/HULFT_IoT_Agent_Linux_AArch32_Vxxx.tar.gz

2.　コピーしたファイルを展開します

   ```sh
   tar zxf HULFT_IoT_Agent_Linux_AArch32_Vxxx.tar.gz
   ```

3.　コマンドを実行すると、以下のファイルが展開されます

   ```
   iot_agent/
   +-- modules/
   |    +-- huliotcore
   |    +-- huliotinfo
   |    +-- huliotsend
   |    +-- huliotservice
   |
   +-- defaultsettings.ini
   |
   +-- huliotsetup
   |
   +-- huliotsetup.ini
   ```



## 設定ファイルの編集

HULFT IoT Agent の設定ファイルを編集します。


1.　agent.conf の作成

   以下のテキストをコピーして、agent.conf というファイル名で任意のディレクトリに保存します

   ```
   devicename = 
   server_hostname = 
   proxy = 
   proxy_user = 
   protocol = 0
   cert_verification = 0
   activation_key = 
   first_conn_retry_interval = 3600
   remarks_file = 
   ```

2.　作成した agent.conf の以下の項目を設定します

   - devicename
     - Manager にアクティベートした際に表示されるAgentの名前を指定します
     - 省略時はホスト名を採用します
   - server_hostname
     - Manager のサーバ名、または IP アドレスとポート番号を `: (コロン)` 区切りで指定します
   - proxy
     - プロキシサーバ名、または IP アドレスとポート番号を `: (コロン)` 区切りで指定します
     - Agent がプロキシ環境下にいる場合に指定します
   - proxy_user
     - プロキシ認証が通るユーザ名とパスワードを `: (コロン)` 区切りで指定します
   - activation_key
     - 構築した Manager からアクティベーションキーを取得して設定します

   

   ※その他の項目の説明については、マニュアルを参照してください。

   ```
   devicename = nsx7000
   server_hostname = server:8765
   proxy = 
   proxy_user = 
   protocol = 0
   cert_verification = 0
   activation_key = 11e1400a-0989-4699-9703-88f85c653c35
   first_conn_retry_interval = 3600
   remarks_file = 
   ```



## パッケージの作成

NSX7000 パッケージ作成環境で HULFT IoT Agent のパッケージを作成します。
各種ファイルのパラメータについては以下の[マニュアル](http://www.sun-denshi.co.jp/sc/nsx7000/manual/)を参照します。

- Add-onアプリケーション開発-パッケージ作成マニュアル.pdf



1.　規定のディレクトリを作成します

   ```
   トップ・ディレクトリ/
   |
   +-- object/
   +-- rpk/
   |    |
   |    +-- CONTROL/
   |    |      |
   |    |      +-- control ファイル
   |    |      +-- postrm スクリプト
   |    |
   |    +-- appctl スクリプト
   |
   +-- Makefile
   
   ```

2.　以下のファイルを object ディレクトリにコピーします

   - agent.conf
   - iot_agent/modules/huliotcore
   - iot_agent/modules/huliotinfo
   - iot_agent/modules/huliotsend
   - iot_agent/modules/huliotservice
   - iot_agent/defaultsettings.ini

3.　control ファイルの作成します

   わたしは、以下の通り作成してみました。

   ```
   Package: hulftiot-agent
   Version: 2.0.0
   Depends: 
   Runtime-Depends: 
   Maintainer: Company
   Architecture: nsx7000
   Provides: 
   Replaces: 
   Description: 
   ```

4.　postrm スクリプトを作成します

   ```sh
#!/bin/sh
   
   PATH=/usr/sbin:/sbin:$PATH
   export PATH
   : ${ROOSTER_OS_LOG_STDERR:=yes}
   : ${ROOSTER_OS_LOG_FACILITY:=user}
   
   . /lib/functions.sh
   include /lib/functions/rooster-os/base
   include /lib/functions/rooster-os/rpkg
   
   PACKAGE_NAME=hulftiot-agent
   
   on_remove() {
     rm -rf /app/var/${PACKAGE_NAME}
     return 0
   }
   
   case "$1" in
     *)
       if [ $PKG_ROOT = "/" ]; then
         on_remove
       fi
       ;;
   esac
   
   exit 0
   ```
   
5.　appctl スクリプトを作成します

   わたしは、以下の通り作成してみました。

   ```sh
   #!/bin/bash
   
   PACKAGE_NAME=hulftiot-agent
   PACKAGE_DIR=/app/package
   
   EXEC_DIR=/app/var/${PACKAGE_NAME}
   WORK_DIR=${EXEC_DIR}/work
   LOG_DIR=${EXEC_DIR}/log
   
   HASH_CMD=sha1sum
   HASH_FILE=huliot.sha1
   IOT_FILE=("huliotcore"  "huliotinfo"  "huliotsend"  "huliotservice")
   
   
   make_hash() {
       if [ -e ${EXEC_DIR}/${HASH_FILE} ]; then
           rm -f ${EXEC_DIR}/${HASH_FILE}
       fi
   
       for ((i = 0; i < ${#IOT_FILE[@]}; i++)) {
           ${HASH_CMD} ${PACKAGE_DIR}/${PACKAGE_NAME}/bin/${IOT_FILE[i]} >> ${EXEC_DIR}/${HASH_FILE}
       }
   }
   
   start_app() {
       if [ ! -d ${EXEC_DIR} ]; then
           mkdir -p ${EXEC_DIR}
           mkdir -p ${WORK_DIR}
           mkdir -p ${LOG_DIR}
           cp -p ${PACKAGE_DIR}/${PACKAGE_NAME}/bin/* ${EXEC_DIR}
           echo "workfile_path = ${WORK_DIR}" >> ${EXEC_DIR}/agent.conf
           echo "logfile_path = ${LOG_DIR}"  >> ${EXEC_DIR}/agent.conf
           make_hash
       else
           ${HASH_CMD} -c ${EXEC_DIR}/${HASH_FILE} > /dev/null 2>&1
           if [ $? -ne 0 ]; then
               cp -pf ${PACKAGE_DIR}/${PACKAGE_NAME}/bin/huliot* ${EXEC_DIR}
               make_hash
           fi
       fi
       ${EXEC_DIR}/huliotservice
   }
   
   stop_app() {
       ${EXEC_DIR}/huliotservice --stop
   }
   
   case "$1" in
       start)
           start_app
           ;;
       stop)
           stop_app
           ;;
       restart)
           stop_app
           start_app
           ;;
       *)
           ;;
   esac
   
   exit 0
   
   ```

6.　Makefile を作成します

   わたしは、以下の通り作成してみました。

   ```sh
   ROOSTER_TOP_DIR ?= $(HOME)/RoosterOS-SDK
   
   ADD_ON_PKG_NAME := hulftiot-agent
   ADD_ON_PKG_VERSION := 2.0.0
   ADD_ON_PKG_MAINTAINER := Company
   ADD_ON_PKG_DESCRIPTION := 
   
   include $(ROOSTER_TOP_DIR)/mk/add-on-package.mk
   
   OBJ_DIR=./object
   
   hulftiot-agent:
   
   contents: $(ROOSTER_PACKAGE_ADD_ON_CONTENTS_DIR) hulftiot-agent
   	mkdir -p $(ROOSTER_PACKAGE_ADD_ON_CONTENTS_DIR)/bin
   	cp $(OBJ_DIR)/huliot* $(ROOSTER_PACKAGE_ADD_ON_CONTENTS_DIR)/bin
   	cp $(OBJ_DIR)/agent.conf $(ROOSTER_PACKAGE_ADD_ON_CONTENTS_DIR)/bin
   	touch $(ROOSTER_PACKAGE_ADD_ON_CONTENTS_PREPARED)
   
   $(eval $(DefaultTarget))
   
   ```

7.　以下のコマンドを実行してパッケージを作成します

   ```sh
   make rpk
   ```

8.　コマンドを実行すると以下のファイルが作成されます

   - hulftiot-agent_2.0.0.rpk

後は、この作成したパッケージファイルをRooster上に持っていき、下記のマニュアルを参考にインストールすることで使用可能です。
    
   - Add-onアプリケーション開発-環境構築マニュアル.pdf

## まとめ

いかがでしたでしょうか。
今回は、HULFT IoT Agentパッケージの作成を実施してみました。手順は多くありますが、マニュアルに従って、着実に対応するとしっかり最後までやり切れました！

このブログでは、今後も技術の「よろず相談窓口」で相談を受けた内容や、誕生したワザをご紹介していけたらな、と思っています。

これからも是非チェックいただき、宜しければフォローをお願いします。

それでは、また！