ブラック研究室へようこそ!

ブラック研究室。それは大学院生が放り込まれるかもしれない闇のアジト。在籍時代のエピソード・Web/アプリ開発の備忘録など。

【IT備忘録】THETA V(360度カメラ)でVRアプリ製作 その2〜THETAの無線LANクライアントモード〜

前回に引き続いて、

360度カメラ(RICOH THETA V)の話題ですよ。

 

前回の問題点

<< その1〜THETAでできること〜

できることとして、「②【スマホWi-fi接続】スマホで遠隔操作/スマホへ撮影ファイル転送」とありましたが、

THETA Vが無線LANのホスト、スマホが無線LANのクライアント、という位置づけでしたよね。

f:id:blackLab:20180423005453p:plain

 これだと、スマホがTHETAとしかWi-fi接続できない状態で、

「ネットが封じられてしまう」・「外からコントロールが一切できない」

という感じですよね。

これでは、THETAを応用して何かやったろうという、作りたがりの人間は発狂しちゃうかもしれません。

そこで、いろいろ調べました。

 

ファームウェアアップデートで突破できる!

こちらのページを見ると、

2018年1月26日 バージョン 2.00.2
  • 無線LANクライアントモードに対応しました。

とのこと。ほう!!

 

鍵は「無線LANクライアントモード」のようです。

 つまり、家のWi-fiルータがホスト、THETAがクライアント、という位置づけでコントロールできるということですね。

f:id:blackLab:20180423185248p:plain

これを応用することで、同じネットワークの中でTHETAに命令を送り、

動画像を受信して、そのままネットの繋がったWi-fi経由で、自前のサーバへ転送!

といったオリジナルアプリが組めそうですね。

 

THETA Vのファームウェアアップデートの方法は、こちらを参考に。

 

外出先からの遠隔操作・動画像ゲットを目指して…

最終的に、こういう形を目指すぞぉー!f:id:blackLab:20180424164507p:plain

で、やってみました。

 

①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から設定してみました。

 

1.公式のTHETAのAPI仕様

2.PCでブラウザからTHETAへPOST/GETリクエスト

hima-zinn.hatenablog.com

 

THETAは通常のWi-fiモード。

PCは、そのTHETAのWi-fiに接続した状態で、

Advanced REST clientを使って、以下のPOSTリクエストを送ります。

 

f:id:blackLab:20180424170816p:plain

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アプリ作りを進めていきますよ!