前回に引き続いて、
360度カメラ(RICOH THETA V)の話題ですよ。
前回の問題点
できることとして、「②【スマホとWi-fi接続】スマホで遠隔操作/スマホへ撮影ファイル転送」とありましたが、
THETA Vが無線LANのホスト、スマホが無線LANのクライアント、という位置づけでしたよね。
これだと、スマホがTHETAとしかWi-fi接続できない状態で、
「ネットが封じられてしまう」・「外からコントロールが一切できない」
という感じですよね。
これでは、THETAを応用して何かやったろうという、作りたがりの人間は発狂しちゃうかもしれません。
そこで、いろいろ調べました。
ファームウェアアップデートで突破できる!
こちらのページを見ると、
2018年1月26日 バージョン 2.00.2
- 無線LANクライアントモードに対応しました。
とのこと。ほう!!
鍵は「無線LANクライアントモード」のようです。
つまり、家のWi-fiルータがホスト、THETAがクライアント、という位置づけでコントロールできるということですね。
これを応用することで、同じネットワークの中でTHETAに命令を送り、
動画像を受信して、そのままネットの繋がったWi-fi経由で、自前のサーバへ転送!
といったオリジナルアプリが組めそうですね。
THETA Vのファームウェアアップデートの方法は、こちらを参考に。
外出先からの遠隔操作・動画像ゲットを目指して…
最終的に、こういう形を目指すぞぉー!
で、やってみました。
①Wi-fiルータの設定
以下、2点設定しました。
製品ごとに異なりますが、ブラウザからWi-fiルータのIPアドレスを叩くと設定画面が出てくるアレですね。
- THETA用に固定のローカルIPアドレス(AAA.AAA.AAA.AAA)を払い出す設定
- 外部からポート3000番でリクエストが来た時、AAA.AAA.AAA.AAA(ポート80番)へ振り分けるように設定
②THETAのWi-fi接続設定
念のため、これをやっておきます。
THETAから無線LANクライアントモードで、Wi-fiルータをつかめるよう、
通常のWi-fiモードであらかじめ設定しておきます。
※スマホの専用アプリからも設定できるんですが、
固定のIPアドレス払い出し設定までできないようなので、以下を参考にしてPCから設定してみました。
2.PCでブラウザからTHETAへPOST/GETリクエスト
THETAは通常のWi-fiモード。
PCは、そのTHETAのWi-fiに接続した状態で、
Advanced REST clientを使って、以下のPOSTリクエストを送ります。
POSTするjsonは、こんな感じでパラメータ設定してやりました。
{ "name": "camera._setAccessPoint", "parameters": { "ssid": "Wi-fiルータのSSID", "security": "WPA/WPA2 PSK", "password": "パスワード", "ipAddressAllocation": "static", "ipAddress": "BBB.BBB.BBB.BBB", "subnetMask": "255.255.255.0とか", "defaultGateway": "Wi-fiルータのIPアドレス" } }
そして、THETAを無線LANクライアントモードに切り替える。(Wi-fiボタンを2回押して、緑色のランプが点滅する状態)
緑色のランプが点滅→点灯に変われば、きっと固定IPでWi-fiルータに繋がっているだろう。
僕は、なぜか上手く行かなくて、何回もやりなおしたけどね!
③外部ネットワークから命令するスクリプトを作成
RICOH公式の専用アプリ『THETA S』は、さすがにBBB.BBB.BBB.BBBを向き先にすることはできそうもないので、ここからは使えないぞ!
また、ここで問題発覚!
さきほどのAdvanced REST clientを使って、
おうちのグローバルIPアドレス(図で言うとBBB.BBB.BBB.BBB)をポート3000番で叩いても、なぜかHTTP 200(OK)が返ってこない…。
いろいろググってみると、THETAが無線LANクライアントモードの時、
ダイジェスト認証が掛かるらしい。めんどいなぁ…。
だから、POSTしても弾かれていたらしい。
※ダイジェスト認証
ユーザ名:"THETAYL"+製品底部の数字8桁
パスワード:製品底部の数字8桁
ここで、元々システムチックにつくろうと狙っていたので、
僕が借りているさくらのVPSサーバから、PHPで書いたスクリプトで、
THETAへ命令を出してみることとしよう!(今どきPHPって古いんでしょうか…)
以下が、ダイジェスト認証も突破できるGETリクエスト用のPHPコード。
<?php //おうちのグローバルIP:3000を叩く $url = "http://BBB.BBB.BBB.BBB:3000/osc/info"; //配列として結果受領 $array = httpGet($url); //GET用(汎用的に関数化) function httpGet($url){ global $network; $option = [ CURLOPT_RETURNTRANSFER => true, //文字列として返す CURLOPT_TIMEOUT => 3, // タイムアウト時間 ]; $ch = curl_init($url); //ダイジェスト認証突破用にパラメータ設定 curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); curl_setopt($ch, CURLOPT_USERPWD, "THETAYL[底部の数字8桁]:[底部の数字8桁]"); curl_setopt_array($ch, $option); $json = curl_exec($ch); // 文字列から変換 $jsonArray = json_decode($json, true); return $jsonArray; } ?>
そして同じく、POSTリクエスト用のPHPコード。
<?php //おうちのグローバルIP:3000を叩く $url = "http://BBB.BBB.BBB.BBB:3000/osc/commands/execute"; //(例)カメラ内のファイルリストを取得するパラメータをセット $data = array( 'name'=>'camera.listFiles', 'parameters'=> array( 'fileType'=>'all', 'entryCount'=>50, 'maxThumbSize'=>400, '_sort'=>'newest', ) ); //配列として結果受領 $array = httpGet($url); //POST用の関数 function httpPost($url, $data){ global $network; $option = [ CURLOPT_RETURNTRANSFER => true, //文字列として返す CURLOPT_TIMEOUT => 3, // タイムアウト時間 CURLOPT_FOLLOWLOCATION => true, CURLOPT_AUTOREFERER => true, ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_POST, true); //ダイジェスト認証突破用のパラメータ curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); curl_setopt($ch, CURLOPT_USERPWD, "THETAYL[底部の数字8桁]:[底部の数字8桁]"); curl_setopt_array($ch, $option); $result = curl_exec($ch); curl_close($ch); // 文字列から変換 $jsonArray = json_decode($result, true); return $jsonArray; } ?>
できた!
上記の設定・PHPスクリプトを使って、外部ネットワークからTHETAへ命令を出したり、撮影ファイルを取得することが可能となりました!
また、今回、さくらのVPSサーバ上に、THETA制御用のWebページも作ってみたりしました。
UIが整い次第、気まぐれ的にこちらにアップするかもしれません。
(2018.04.30)gitにアップしました!
【IT備忘録】THETA V(360度カメラ)でVRアプリ製作 その3〜ブラウザからTHETAを制御〜
さぁ、スピードアップしてVRアプリ作りを進めていきますよ!