はじめに
OpenBlocks IoTはぷらっとホーム株式会社が提供するIoTゲートウェイです。センサーなどのIoTデバイスからデータを受信し、クラウドやデータセンターなどのバックエンドシステムに送信します。またその逆に、バックエンドシステムからIoTデバイスにデータを送信して制御することもできます。Linuxベースで高い汎用性を持つため、送受信前にデータの前処理や分析を行うエッジコンピューティングも可能です。
なお、今回使用したモデルとは違いますが、OpenBlocks IDMシリーズ( https://www.plathome.co.jp/product/openblocks-idm/ )にはプロンプト・Kの開発しているRealboardが搭載されています。ソフトウェア・ハードウェア一体型のIoT専用サーバーであり、プログラミングなしに、収集したデータの統合・グラフ化を自由自在に行うことができます。
UECS(ユビキタス環境制御システム)は、日本で開発された植物の施設生産のための環境制御システムです。産官学の枠を超えて施設園芸の自動化・IT化を目指して活動するユビキタス環境制御システム研究会(UECS研究会)によって詳細情報が公開されています。通信規約も公開されているため、他のシステムとの連携が可能です。
今回はOpenBlocks IoTでUECS規約に基づいたデータを受信する方法を、シンプルなプログラムを使って紹介します。
使用した機材
OpenBlocks IoT VX2
OpenBlocks IoT VX2を使用しました。有線インターフェイスとして2つのイーサネットポートとUSBポートを持ち、無線インターフェイスとしてWi-FiとBluetoothを搭載しています。また通信用のSIMカードを挿入することで、LTE通信も利用できます。IoTデバイスとの接続が容易で、設定もブラウザを通じたWebUIで行えます。
Arsprout Pi
Arsprout Piは、アルスプラウト株式会社が開発したUECS対応の汎用環境計測制御ボードです。Raspberry Pi上で動作し、気温、湿度、CO2濃度、照度などの施設園芸に求められる各種センサーを接続できます。また、UECS規約に基づいたデータ送受信が可能です。
Arsprout Piの起動
Arsprout Piを起動し、まずは開発用PCに接続してデータが受信できていることを確認します。Arsprout Piと開発用PCをLANケーブルで接続します。UECSデータはUDP通信で送信されます。UECSデータは特定のIPアドレスに送信するのではなく、ブロードキャストに送信されています。16520番ポートを使用するため、もし開発用PC側でブロックする設定になっている場合はポートを開放してください。
例としてGo言語で書かれたUECSデータ受信用のプログラムを使って、データを受信します。
go mod init uecs
uecsは任意の名前です。go mod init コマンドでモジュールを初期化します。
次に main.go というファイルを作成し、以下のコードを記述します。
package main
import (
"encoding/json"
"fmt"
"net"
)
func main() {
// UDP通信を開始
// IPアドレスを指定せず全てのインターフェースの16520番ポートで待ち受けます
addr, err := net.ResolveUDPAddr("udp", "0.0.0.0:16520")
if err != nil {
fmt.Println(err)
return
}
// ポートを開きます
conn, err := net.ListenUDP("udp", addr)
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
for {
// 受信用に1024バイトのバッファを用意
// UECSの規約でパケットは480バイト以下と規定されています
buf := make([]byte, 1024)
// データを受信
n, _, err := conn.ReadFromUDP(buf)
if err != nil {
fmt.Println(err)
return
}
// 受信したデータをテキストのまま出力
fmt.Println(string(buf[:n]))
}
}
これでUDPから送られてくるデータが
<?xml version="1.0"?>
<UECS ver="1.00-E10">
<DATA type="InAirTemp" room="1" region="1" order="1" priority="29">23.0</DATA>
<IP>192.168.1.64</IP>
</UECS>
のようなテキストなのが確認できます。
OpenBlocks IoT VX2の設定
OpenBlocks IoT VX2を電源に接続し、開発用PCとWi-Fiで接続します。初期設定ではSSIDは iotfamily_”本体シリアル番号 、パスワードは openblocksです。ブラウザで http://192.168.254.254:880 にアクセスするとWebUIが表示されます。初回ログイン時にユーザー名とパスワードを設定するようになります。
OpenBlocks IoTはデフォルトでは16520番ポートが開放されていません。UECSデータを受信するためには、ポートを開放する必要があります。WebUIの「システム」→「フィルター」から「フィルター開放設定」にチェックを入れます。
「拡張フィルタ設定ファイル編集」が表示されるので、下記を追記します
/sbin/iptables -A INPUT -p udp --dport 16520 -j ACCEPT
設定すると再起動を求められます。これで毎回再起動時にこの設定が読み込まれ、16520番ポートが開放されます。
OpenBlocks IoT VX2をネットワークに接続する
OpenBlocks IoT VX2をネットワークに接続します。Wi-FiはWebUIのために使用することとし、有線インターフェイスを使用します。UECSデータを受信するためには、OpenBlocks IoT VX2に固定IPアドレスを設定することをお勧めします。WebUIの「ネットワーク」→「基本」から「サービスネットワーク(Ethernet)」を確認します。 `eth0` にArsprout Piを接続することとし、IPアドレスに例えば `192.168.253.254/24` を設定します。`eth1` はインターネット接続用として使用することとし、DHCPでIPアドレスを取得します。設定すると再起動を求められます。
OpenBlocks IoT VX2のEther0ポートとArsprout PiをLANケーブルで接続します。Ether1ポートはルーターなどに接続します。
OpenBlocks IoT VX2でDockerを使ってUECSデータを受信する
Dockerの設定
OpenBlocks IoT VX2にはGo言語の実行環境が含まれていないため、先述のコードを実行するには実行環境の構築が必要です。今回はDockerを使用します。VX2はDockerがインストールされているため(WebUIはDockerで動作しているようです)、Dockerfileを用意することで実行環境が構築できます。
下記はDockerfileの例です。
# マルチステージビルドしています
# ビルドステージです
FROM golang:1.21-alpine AS builder
WORKDIR /usr/src
COPY go.mod go.sum ./
RUN go mod download && go mod verify
COPY . .
RUN go build -ldflags="-w -s" -o app
# 実行用ステージです
FROM alpine:3.14.3
WORKDIR /usr/app
COPY --from=builder /usr/src/app .
CMD ["app"]
docker-compose.yamlの例です
version: '3'
services:
app:
build: .
ports:
- "16520:16520/udp"
# VX2の再起動時に自動起動します
restart: always
docker-composeを使う場合、udpを受信するためのポートは16520:16520/udpのように/udpを記述します。
開発PCからOpenBlocks IoT VX2にファイルを送信する
開発PCからOpenBlocks IoT VX2にファイルを送信する方法として、シリアル通信経由でファイルを送信するlrzszが便利です。まず開発用PCとOpenBlocks IoT VX2のconsoleポートをUSBケーブルで接続します。
VX2にはデフォルトでlrzszがインストールされているのでVX2でのインストールは必要ありません。
開発用PCとしてMacOSを使っている場合、ターミナルを開いてlrzszをインストールできます。
brew install lrzsz
次にシリアル通信でVX2に接続します。
ls /dev/tty.*
を実行し、/dev/tty.usbserial-XXXXXXXX のようなデバイス名を確認します。
screen /dev/tty.usbserial-XXXXXXXX 115200
115200は「ボーレート(Baud rate)」といってデータ通信で使用される単位で、1秒間に何ビットのデータが送信されるかを示します
OpenBlocks IoT VX2のログイン画面が表示されたら、ユーザー名とパスワードを入力します。デフォルトのユーザー名は `root` 、パスワードは `0BSI0T` です。作業用に別途ユーザーを作成することをおすすめします。
sudo adduser USERNAME
sudo usermod -aG sudo USERNAME
上記で管理者権限をもつユーザーを作成できます。パスワードの設定やユーザーの情報を求められるので適切に入力してください
Ctrl-dでいったんログアウトし、作成したユーザーでログインし直します
そしてファイルを転送したいディレクトリに移動し、ファイルの転送を行います。
screenでは Ctrl-a を押した後に : を押すとコマンド実行モードに入ります。
:exec !! sz FILENAME
このように入力すると、ファイルが転送されます。
Dockerを使ってUECSデータを受信する
ファイルを転送したら、Dockerコンテナを起動してUECSデータを受信します。
docker-compose up -d
コンテナが起動し、UECSデータを受信する準備が整います。docker-compose logs -f でログを確認し、UECSデータが受信されているか確認しましょう。
screenを終了するにはCtrl-aを押した後にkを押します。
Comments