Grid

Building Grid

Ricoh publishes no SDK, no API documentation, and has no developer program for the GR series. Everything Grid does with the camera is built on the work of a small community that reverse-engineered the protocol. On that foundation I built an app in Swift/SwiftUI, verified on real hardware.

The story

The GR communicates over two channels, and Grid uses them exactly the way the official Ricoh app does:

  1. Bluetooth Low Energy (BLE) is the control channel. The camera advertises itself as GR_XXXXXX. After pairing (a standard iOS bond; the camera needs to be in pairing mode once), the app can use GATT characteristics to read the battery and storage, power the camera on and off, push GPS positions for geotagging. And, crucially, it can read the camera's own WiFi credentials.
  2. WiFi is the data channel. The camera is an access point (no internet). Grid reads the SSID and passphrase over BLE, has iOS join the network (NEHotspotConfiguration), and then talks to a simple HTTP server at 192.168.0.1: photo listings, thumbnails, downloads, and a WebSocket for live updates.

Sources

None of this came from Ricoh. dm-zharov mapped the full BLE GATT tree of the GR II/III by sniffing traffic between the camera and the official app. clyang's GRsync and adriantache's GReat-Image-Downloader independently confirmed the same WiFi HTTP endpoints in their own desktop tools.

What about the GR IV?

For the GR IV there is nothing at all. No documentation, no reverse-engineering. Grid's GR IV profile therefore starts as an exact copy of the GR III profile, with a diagnostics screen in the app that can dump the full GATT tree of a connected camera to spot differences. In practice the GR IV (firmware 1.11) turns out to be compatible: the same UUIDs, the same HTTP endpoints, with two known differences. The bulk /v1/photos/infos listing is missing (so Grid fetches per-photo info lazily), and there are two storages (internal + SD, via the ?storage= parameter).

All Ricoh codes in use

BLE Services (GR II/III, verified on GR IV)

ServiceUUID
Camera Information6FE9D605-3122-4FCE-A0AE-FD9BC08FF879
Camera (power/status)4B445988-CAA0-4DD3-941D-37B4F52ACA86
Shooting9F00F387-8345-4BBC-8B92-B87B52E3091A
WLAN ControlF37F568F-9071-445D-A938-5441F2E82399
Bluetooth Control0F291746-0C80-4726-87A7-3C501FD3B4B6
GPS Control84A0DD62-E8AA-4D0F-91DB-819B6724C69E
Device Information9A5ED1C5-74CC-4C50-B5B6-66A48E7CCFF1

BLE Device information (read)

CharacteristicUUIDUse in Grid
Bluetooth Device Name97E34DA2-2E1A-405B-B80D-F8F0AA9CC51CDisplay name
Firmware RevisionB4EB8905-7411-40A6-A367-2834C2157EA7Firmware version (update check)
Manufacturer NameF5666A48-6A74-40AE-A817-3C9B3EFB59A6Info
Model Number35FE6272-6AA5-44D9-88E1-F09427F51A71GR III/IV detection
Serial Number0D2FC4D5-5CB3-4CDE-B519-445E599957D8Info
MAC Address1C5C6C55-8E57-4B32-AD80-B124AE229DECInfo

BLE Camera status (read/write/notify)

CharacteristicUUIDUse in Grid
Camera PowerB58CE84C-0666-4DE9-BEC8-2D27B27B3211Read status; wake the camera (write 01)
Operation Mode1452335A-EC7F-4877-B8AB-0F72E18BB295Read and set Capture/Playback
Battery Level875FC41D-4980-434C-A653-FD4A4D4410C4Battery % + charging state (byte 1 = level, byte 2 = source)
Storage InformationA0C10148-8865-4470-9631-8F36D79A41A5Free space internal/SD (binary blob)
Camera Service NotificationFAA0AEAF-1654-4842-A139-F4E1C1E722ACPush notifications from the camera
Operation Request559644B8-E0BC-4011-929B-5CF9199851E7(Defined, unused, remote shutter candidate)
Date TimeFA46BBDD-8A8F-4796-8CF3-AA58949B130ASync the camera clock (Settings option)

BLE Geotagging (GPS Control service)

CharacteristicUUIDUse in Grid
GEO TagA36AFDCF-6B67-4046-9BE7-28FB67DBC071Geotagging on/off on the camera (1 byte)
GPS Information28F59D60-8B8E-4FCD-A81F-61BDB46595A9Write GPS fix (32-byte payload, see below)

BLE WiFi bridge (WLAN Control service)

The heart of the connection:

CharacteristicUUIDUse in Grid
WLAN Network Type9111CDD0-9F01-45C4-A2D4-E09E8FB0424DTurn the AP on (write accessPoint)
WLAN SSID90638E5A-E77D-409D-B550-78F7E1CA5AB4Read network name (e.g. "GR wifi")
WLAN Passphrase0F38279C-FE9E-461B-8596-81287E8C9A81Read WiFi password
WLAN Channel51DE6EBC-0F22-4357-87E4-B1FA1D385AB8(Defined, unused)

BLE Bluetooth behavior (Bluetooth Control service)

CharacteristicUUIDUse in Grid
BLE Enable ConditionD8676C92-DC4E-4D9E-ACCE-B9E251DDCC0CConfigure "Always on" standby (Settings)
Paired Device NameFE3A32F8-A189-42DE-A391-BC81AE4DAA76(Defined, unused)

BLE Value encodings

BytesContents
0–7Latitude, float64 big-endian
8–15Longitude, float64 big-endian
16–23Altitude, float64 big-endian
24–25Year, uint16 little-endian
26–30Month, day, hour, minute, second (1 byte each, UTC)
31Datum: 0 = WGS84

BLE Scanning

No advertised service UUID is known; Grid scans by name prefix: GR, RICOH, PENTAX.

WiFi HTTP API (http://192.168.0.1:80)

EndpointUse in Grid
GET /v1/pingReachability check (connect + health check)
GET /v1/propsFull property dump (Info screen)
GET /v1/photosPhoto list (directories + files)
GET /v1/photos?storage=in|sdPhoto list per storage (GR IV: internal + SD)
GET /v1/photos/<dir>/<file>Full file (JPG/DNG/MOV download)
…?size=thumbThumbnail (grid)
…?size=viewScreen resolution (viewer)
GET /v1/photos/<dir>/<file>/infoPer-photo metadata: date, exposure, GPS
ws://192.168.0.1/v1/changesWebSocket: live pushes (battery level, among others)

Downloads use a keep-alive TCP connection on the same port, so a batch doesn't pay a handshake per file.