MotionBoardにはセンサーなどから発生するリアルタイムデータを受けとり、蓄積するリアルタイム連携機能があります。下記の記事では、MotionBoardに対してデータを送るWeb APIの使い方及び可視化の方法について、ブラウザから手動で実施する方法を紹介しました。
本記事では、Windows環境でバッチプログラムおよびPythonからMotionBoardに対してリアルタイムデータを送信する方法を紹介していきます。リアルタイムにグラフが動く様子を見るのも面白いですし、それを手軽に実現できるとよいですね!
実際の機器からは数秒~数分間隔でデータが送られてきます。リアルタイムデータは件数も膨らみがちであり、MotionBoardサーバーが運用に耐えられるかを事前にテストしたいケースもありますよね。その一方、テスト時点で想定した数分のデバイスを用意・設定するのは難しいことも多いです。
そういった場合、センサーデータを送る部分をプログラムで代用することで、より少ないコストでサーバーへの負荷を検証することが可能です。また、プログラムであればリアルに即した形でデータを生成し、かつ高頻度に送信することができるため人的負荷も大きく下げることができます。
※ リアルタイム連携機能には専用のライセンスが必要です。ご利用の環境を確認ください。
事前準備
今回は下記の記事で作成したテンプレートをもとに、データを送るプログラムを紹介するので「設定方法」章-「テンプレートの作成」節まで実施してください。
バッチプログラムで送信
本記事ではWindows環境で簡単に試せるよう、バッチプログラムでご紹介します。メモ帳などで下記スクリプトを貼り付けて「*****.bat」形式で保存します(*****は任意、例では「post.bat」)。実際にWeb APIをリクエストする部分は、cURLというコマンドを使っています。
@echo off
set Template=WebAPI_POST
:roop
set sample_string=abcdefghi
set sample_num=%RANDOM%
set sample_bool=true
curl -X POST -d "Template=%Template%" -d "id=1" -d "sample_string=%sample_string%" -d "sample_num=%sample_num%" -d "sample_bool=%sample_bool%" "http://localhost:8787/motionboard/rest/tracking/data/upload/simple"
echo send data and wait 5 sec.
timeout 5
goto :roop
スクリプトではパラメータ「sample_num」に対してランダムな値を指定し5秒間隔でリクエストを行っています。cURLを使ったWeb APIのリクエストについては下記記事をご覧ください。
その他のパラメータについてはマニュアルを参照ください。cURLコマンドの引数として「-d “パラメータ名=値”」の形式で追加すればOKです。
では、保存したバッチファイルをコマンドプロンプトもしくはPower Shellで実行しましょう!バッチファイルを保存したフォルダに移動し、「.\*****.bat」で実行します。
最後にMotionBoardでデータを確認してみます。「事前準備」章で紹介した記事の「設定方法」章-「データの確認」節と同様に、[system Datasources]-[Realtime]-[LocationAndStatus]-[WebAPI_POST]のデータを描画してみましょう。指定した間隔(5秒)ごとにデータが送られていることが確認できますね!
【番外編】Pythonから送信
Pythonから送信する方法も紹介します。Pythonに限らず、現実に即した疑似データを送りたい場合は、担当者にとって扱いやすいプログラム言語で実施しましょう。「現実に即した疑似データを送る(作る)」というのは例えば、気温のように0~30前後の値を周期的に送る、ノイズを考慮してランダム値を加えるといった処理です。
import requests
import time, string, random
###### user settings ######
URL = "http://localhost:8787/motionboard/rest/tracking/data/upload/simple"
INTERVAL = 1 # データを送る間隔(秒)
STRING_LENGTH = 10 # ランダムに生成する文字列の長さ
NUM_MIN = 0 # ランダムに生成する整数値の最小値
NUM_MAX = 1000000 # ランダムに生成する整数値の最大値
###########################
params = {
"Template" : "WebAPI_POST",
"id" : 1,
"sample_string" : None,
"sample_num" : None,
"sample_bool" : True
}
def gen_random_string(length: int) -> str:
randlst = [random.choice(string.ascii_letters + string.digits) for i in range(length)]
return ''.join(randlst)
def main():
while(True):
params["sample_string"] = gen_random_string(STRING_LENGTH)
params["sample_num"] = random.randint(NUM_MIN, NUM_MAX)
params["sample_bool"] = random.choice([True, False])
print(params)
res = requests.post(url = URL, params=params)
if(res.status_code == 200):
print(f"{res.status_code}: Seccessfully posted. ")
else:
print(f"{res.status_code}: Error. ")
time.sleep(INTERVAL)
if "__main__" == __name__:
main()
「user settings」と書かれた箇所のURLは、環境に合わせて変更ください。
上記のプログラムを実行すると、ランダムなデータを数秒間隔でMotionBoardへ送信できていることが確認できますね!
さいごに
本記事では、バッチおよびPythonからMotionBoardに対してリアルタイムデータを送信する方法を紹介しました。リアルタイムデータは高頻度に大量のデータを送る特性上、事前にサーバーの負荷検証を行いたいことも多いです。そんなとき、デバイスの代用としてプログラムで実施することも可能なので、検討してみてくださいね!
また、複数件のデータをJSONファイルとしてリアルタイムにMotionBoardへ送る方法もありますので、興味があればぜひご覧ください。