LANにあるTHETA Vを見つける

RICOH THETA VをCLモードでネットワークに繋がっているときに、LAN内のTHETA Vを見つけるいくつかの方法を記載します。THETA VはNSD(DNS-SD)を使って見つけることができますが、ユースケースによっては直接接続する方法で済み、探索は不要かもしれません。

# 環境
* RICOH THETA V, ver.2.50.1 （ファームアップ必須）
 * 無線LANクライアントモード(CLモード)はver.2.00.2以降で対応)
 * シリアル番号"YL00123456"の端末をパスワード"00123456"で運用しているものと仮定。


# THETA Vへのアクセス方法
## 方法1. 直接アクセス
THETA+シリアル番号+".local."というアドレスを作って、アクセスします。
今回の例では、"THETAYL00123456.local."となります。
この方法の場合、直接THETA Vと接続しているとき(THETAが192.168.1.1の時)にも同じように"THETAYL00123456.local."でアクセスできます。

動作確認方法は以下の通り。
1. THETA Vをルータにつなげる
2. ブラウザを開き、 "http://thetayl00123456.local./osc/info" に接続します。
3. パスワードを聞かれるため、ログインID；THETAYL00123456、パスワード：00123456で接続します。
ブラウザ上で[カメラの情報](https://developers.theta360.com/ja/docs/v2.1/api_reference/protocols/info.html
)が得られます。

## 方法2. DNS-SDで探索
### 方法2-1. dns-sdコマンドを使う場合
macOSの場合はdns-sdコマンドが使えるため、`dns-sd -B _osc._tcp.`でLAN内のTHETA Vを見つけられます。見つけたTHETA Vの名前から、`dns-sd -q THETAYL00123456.local` とすると、THETA VのIPアドレス（ここでは192.168.1.74）を得られます。

```
$ dns-sd -B _osc._tcp.

Browsing for _osc._tcp.
DATE: ---Sat 09 Mar 2019---
21:02:07.744  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
21:02:07.745  Add        2   8 local.               _osc._tcp.           THETAYL00123456

$ dns-sd -q THETAYL00123456.local.

DATE: ---Sat 09 Mar 2019---
21:02:13.900  ...STARTING...
Timestamp     A/R Flags if Name                          Type  Class   Rdata
21:02:13.901  Add     2  8 THETAYL00123456.local.        Addr   IN     192.168.1.74
```

### 方法2-2. Pythonを使う場合
Pythonのzeroconfパッケージを使って探索します。手順は[zeroconfパッケージのサイト](https://pypi.org/project/zeroconf/)の通りです。ここではPython3を使って、`pip3 install zeroconf`でzeroconfをインストールし、以下のファイル(testDNSSD.py)を作成、`python3 testDNSSD.py`を実行します。

``` python:testDNSSD.py
from zeroconf import ServiceBrowser, Zeroconf
import socket
from typing import cast

class MyListener:

    def remove_service(self, zeroconf, type, name):
        print("Service %s removed" % (name,))

    def add_service(self, zeroconf, type, name):
        info = zeroconf.get_service_info(type, name)
        print("Service %s added, service info: %s, IP-Address: %s" %
              (name, info, socket.inet_ntoa(cast(bytes, info.address))))

zeroconf = Zeroconf()
listener = MyListener()
browser = ServiceBrowser(zeroconf, "_osc._tcp.local.", listener)
try:
    input("Press enter to exit...\n\n")
finally:
    zeroconf.close()
```

実行すると、

```
$ python3 testDNSSD.py 
Press enter to exit...

Service THETAYL00123456._osc._tcp.local. added, service info: ServiceInfo(type='_osc._tcp.local.', name='THETAYL00123456._osc._tcp.local.', address=b'\xc0\xa8\x01J', port=80, weight=0, priority=0, server='THETAYL00123456.local.', properties={}), IP-Address: 192.168.1.74
Service THETAYL00123456._osc._tcp.local. removed
```
のようにTHETA VがLANに接続されたとき、切断されたときに教えてくれます。

# 撮影してみる
アクセス方法がわかったので、POSTコマンドを使って撮影してみます。

## curlコマンドを使う
直接アクセスする方法で、撮影してみます。
1. THETA Vをルータにつなげる
2. curlコマンドを送る

```
curl -X POST http://THETAYL00123456.local./osc/commands/execute --data '{"name":"camera.takePicture"}' -H 'content-type: application/json' --digest -u THETAYL00123456:00123456
```
CLモードではダイジェスト認証が必要なため、--digestパラメータで認証情報を送ります。
もちろん、"THETAYL00123456.local." 部分をTHETA VのIPアドレス（ここでは192.168.1.74）にしても同じです。

シリアル番号（とパスワード）がわかればIPアドレスを知ることなくLAN内のTHETA Vで撮影できます。

# WebUIのあるプラグインへの接続
THETAのプラグインでWebUIを持っている場合は、8888ポートで公開されています。そのためプラグインのWebUIには、
`http://THETAYL00123456.local:8888/`
で接続できます。