Tip: Developing THETA "Client Mode" Applications

Jay Goldman suggested this on a comment in DZone. I have not tested this yet:

If someone gets node or some type of JavaScript working with Digest Authentication to the THETA in Client Mode, please post a working example.

Thanks.

Update December 11, 2019

Update May 19, 2020

I moved the key points of the discussion to this article.

https://www2.theta360.guide/doc/article/19

There are two ways to connect your mobile app to the RICOH THETA with Wi-Fi.

  1. Access Point (AP) mode where the THETA camera functions as a hotspot. The mobile phone connects to the THETA as if the camera were a hotspot or Wi-Fi router

  2. Client Mode (CM) where the THETA camera connects to your home or office router. Your mobile phone connects to the same router

Authentication

The RICOH THETA requires Digest Authentication for client mode. When you use client mode, you must use Digest Authentication in addition to the username and password.

On the THETA V, the username is similar to this: THETAYL00105377

The password is the numerical digits. Example: 00105377

HTTP GET example

In the example below, I am using curl on Linux Ubuntu 20.04 from the command line to test a HTTP GET command to a RICOH THETA V. You can also run curl on Mac or Windows.

$ curl --digest --user "THETAYL00105377:00105377" -X GET http://192.168.2.101/osc/info

Response

{"api":["/osc/info","/osc/state","/osc/checkForUpdates","/osc/commands/execute","/osc/commands/status"],"apiLevel":[2],"_bluetoothMacAddress":"00:26:73:D5:4C:40","endpoints":{"httpPort":80,"httpUpdatesPort":80},"firmwareVersion":"3.21.1","gps":false,"gyro":true,"manufacturer":"RICOH","model":"RICOH THETA V","serialNumber":"00105377","supportUrl":"https://theta360.com/en/support/","uptime":1555858,"_wlanMacAddress":"00:26:73:D5:AA:64"}

HTTP POST example

When you use POST, you must include the header.

curl --digest --user "THETAYL00105377:00105377" -H "Content-Type:application/json" -X POST http://192.168.2.101/osc/state

Response

{"fingerprint":"FIG_0067","state":{"_apiVersion":2,"batteryLevel":1.0,"_batteryState":"charged","_cameraError":[],"_captureStatus":"idle","_capturedPictures":0,"_latestFileUrl":"http://192.168.2.101/files/150100525831424d42079d18e0b6c300/100RICOH/R0010048.JPG","_pluginRunning":false,"_pluginWebServer":false,"_recordableTime":0,"_recordedTime":0,"storageUri":"http://192.168.2.101/files/150100525831424d42079d18e0b6c300/"}}

HTTP POST with data payload

The next example takes a picture.

curl -d '{"name":"camera.takePicture"}' --digest --user "THETAYL00105377:00105377" -H "Content-Type:application/json; charset=utf-8;" -X POST http://192.168.2.101/osc/commands/execute

Response

{"id":"29","name":"camera.takePicture","progress":{"completion":0.00},"state":"inProgress"}


December 19, 2021 notes on trying to get Digest Auth working with Flutter.

https://issueexplorer.com/issue/dart-lang/http/605

try using dart:io directly with preserveHeaderCase.