JINS MEME LoggerのデータをWebSocketServerを立てて取得してみる
新型JINS MEMEが安くておしゃれになっていたので、買ってみました。
JINS MEME、SDKはなくとも WebSocket 経由でリアルタイムにデータを流すアプリは提供されるので、PC連携は困らなそう https://t.co/aUaV7jGS1J
— ミクミンP/Kazuhiro Sasao (@ksasao) 2021年10月6日
ということを、事前に見かけていたので簡単にできるかと思ってやってみたら、本当に簡単にリアルタイムでデータが拾えたので、そのご報告です。
準備
1.新型JINS MEMEを買います。
フレーム形状は4種類、色は2種類、レンズはいろいろから選べます。2.スマホを用意して、JINS MEME Loggerアプリ(¥120 iphone版、Androidは知らず)を購入します。
「JINS MEME Logger」をApp Storeで
JINS MEME Logger - Apps on Google Play
3.スマホとWebSocketServerを立てるPCがつながるローカルのWIFIルータを立てて、それぞれ繋ぎます。
4.WebSocketServerを立てるPCのIPアドレスを調べます。Windowsならcmd.exeを立ち上げてipconfigなど。IPアドレスはメモしておきます。また、データを送るのに使うポートがファイアウォールなどでふさがっていないか確認しておきます。
5.スマホアプリJINS MEME Loggerを起動して、JINS MEMEを接続します。接続後、アプリ中の「ロガー」や「グラフ」上でデータが取れているかどうかを確認して、うまくつながっていたら「設定」を開きます。
「設定」から「WebSocketクライアント」を「追加する」して、適当な「設定名」、「ip address」、「port」、「data type」を埋めたり選択します。
例.
設定名: MEME01
ip address: 192.168.10.17 (WebSocketServerのPCのIPアドレス)
port: 5001 (適度な範囲で適当に)
data_type: currentData (など。ロガーに詳細が出ているので、ほしいものを選ぶ。)
6.PCにPythonを入れて、websocket-serverのライブラリもpipで入れて、コマンドプロンプトからサーバーを実行。
7.スマホアプリの「設定」→「WebSocketクライアント」から登録してある設定を有効にする。うまくつながれば✓のマークが出てデータ送信が始まる。失敗すると×が出て止まる。
サーバー実行
#!/usr/bin/env python3 # reference: https://xp-cloud.jp/blog/2020/09/15/7564/ # pip install git+https://github.com/Pithikos/python-websocket-server from websocket_server import WebsocketServer import time import json import pprint def start(): # Connection event def new_client(client, server): print('New client {}:{} has joined.'.format(client['address'][0], client['address'][1])) # Disconnection event def client_left(client, server): print('Client {}:{} has left.'.format(client['address'][0], client['address'][1])) # Message receive event def message_received(client, server, message): # print(message) d = json.loads(message) # pprint.pprint(d, width=40) # currentData accX = d.get('accX') accY = d.get('accY') accZ = d.get('accZ') blinkSpeed = d.get('blinkSpeed') blinkStrength = d.get('blinkStrength') eyeMoveDown = d.get('eyeMoveDown') eyeMoveLeft = d.get('eyeMoveLeft') eyeMoveRight = d.get('eyeMoveRight') eyeMoveUp = d.get('eyeMoveUp') fitError = d.get('fitError') noiseStatus = d.get('noiseStatus') pitch = d.get('pitch') powerLeft = d.get('powerLeft') roll = d.get('roll') sequenceNumber = d.get('sequenceNumber') walking = d.get('walking') yaw = d.get('yaw') # debug print('accX:', accX, 'accY:', accY, 'accZ:', accZ) print('blinkSpeed:', blinkSpeed, 'blinkStrength:', blinkStrength) print('eyeMoveDown:', eyeMoveDown, 'eyeMoveLeft:', eyeMoveLeft, 'eyeMoveRight:', eyeMoveRight, 'eyeMoveLeft:', eyeMoveLeft, 'eyeMoveUp', eyeMoveUp) print('fitError:', fitError, 'noiseStatus:', noiseStatus) print('pitch:', pitch, 'roll:', roll, 'yaw:', yaw) print('powerLeft:', powerLeft, 'sequenceNumber:', sequenceNumber, 'walking:', walking) # 5001番ポートでサーバーを立ち上げる server = WebsocketServer(port=5001, host='192.168.10.17') # イベントで使うメソッドの設定 server.set_fn_new_client(new_client) server.set_fn_client_left(client_left) server.set_fn_message_received(message_received) # 実行 server.run_forever() if __name__ == "__main__": start()
実行すると、こんな感じ。
開発されたい方向け。このコードが良くまとまっていて使いやすそうです。
JINS MEMEかなり詳細にデータ取れるなー👀
— 高橋 かずひと@孫請級プログラマー🦔 (@KzhtTkhs) 2021年10月18日
取れるデータ列挙してたら、こんな時間になってしまった、、、https://t.co/D25r1EfJkz