Skip to content

Olympus OM-D Firmware & WLAN Hacks

This page collects details about the protocol and internals of Olympus WiFi enabled Cameras. Usually the only way to communicate with your camera is the Image Share (Oi.Share) Android / iOS App by Olympus.

There’s a Qt library which uses this information to provide a clean and open access to all functions of your camera: /stv0g/libqt-omd .

The Oi.Share App also allows to talk to Toshiba Flash Air SD-Cards. Toshiba has released a detailed description of the protocol they use for their SD cards Fortunately some parts of these protocols are similar.

The following protocol documentation if for the Olympus OM-D E-M10 with firmware version 1.2

Get free capacity on the camera SD drive in bytes.

At maximum this is equal to 4 GiB. Everything above is ignored? FIXME

<?xml version="1.0" ?>
<unused>4294967295</unused>

Get list of available CGI commands and allowed parameters:

Get current WLAN connection mode: private or FIXME

<?xml version="1.0"?>
<connectmode>private</connectmode>

Switch camera mode: play, rec and set liveview quality/resolution

ParameterAllowed valuesDescription
moderecRecording
playPlayback
shutterShutter
  • Response: HTTP code 200 on success. No body
Content-Type: www/unknown

Shutdown camera

Content-Type: www/unknown
<?xml version="1.0"?>
<response>
<affocus>ok</affocus>
<afframepoint>0209x0154</afframepoint>
<afframesize>0036x0036</afframesize>
</response>
<?xml version="1.0"?>
<response>
<take>ok</take>
<affocus>ok</affocus>
<afframepoint>0209x0154</afframepoint>
<afframesize>0036x0036</afframesize>
</response>
HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: 324553
<?xml version="1.0" encoding="UTF-8"?>
<funcidlist>
<funcid name="framesize" />
<funcid name="afframeinfo" />
<funcid name="mntmediainfo" />
<funcid name="rotation" />
<funcid name="maxtakenum" />
<funcid name="temperror" />
<funcid name="battempty" />
<funcid name="shutspeedvalue" />
<funcid name="focalvalue" />
<funcid name="expcomp" />
<funcid name="wbvalue" />
<funcid name="isospeedvalue" />
<funcid name="contnotstop" />
<funcid name="aspectratio" />
<funcid name="liveaddinfo" />
<funcid name="expphotowarning" />
<funcid name="focusinfo" />
<funcid name="zoominfo" />
</funcidlist>

Get model of camera: E-M10

<?xml version="1.0"?>
<caminfo>
<model>E-M10</model>
</caminfo>

Set camera settings.

<?xml version="1.0"?>
<set>
<value>A</value>
</set>
<?xml version="1.0"?>
<set>
<value>continuous-H</value>
</set>
  • Response: HTTP code 200 on success. No body
Content-Type: image/jpeg

Get list of images which are marked for transfer via the camera menu.

Content-Type: text/plain
VER_100
/DCIM/100OLYMP,PC150001.JPG,7746678,0,17807,41094
/DCIM/100OLYMP,PC150006.JPG,7771088,0,17807,4474
<directory>,<filename>,<size>,<attribute>,<date>,<time>

These lines are separated by comas as follows:

#FieldExampleDescription
0<directory>/DCIM/100OLYMPFile directory name
1<filename>PC150006.JPGFile name
2<size>7771088The size of the file in bytes (decimal form)
3<attribute>0The attributes of the file (decimal form)
4<date>17807The date of the file (decimal form)
5<time>4474The time of the file (decimal form)

Attribute is specified in decimal 16-bit integer in the following formats (unverified):

BitDescription
5Archive
4Directly
3Volume
2System file
1Hidden file
0Read only

Date is specified in decimal 16-bit integer in the following formats (unverified):

BitFieldDescription
15-9YearSpecify a value based on 0 as a 1980.
8-5MonthSpecify a value from 1 to 12.
4-0DaySpecify a value from 1 to 31.

Time is specified in decimal 16-bit integer in the following formats (unverified):

BitDescription
15-11Hour
10-5Minute
4-0Second / 2

The line format seems to be identical to the one used by Toshiba Flash-Air SD cards.

See: https://flashair-developers.com/en/documents/api/commandcgi/#100

Clear flags of pictures marked for transfer.

Content-Type: www/unknown
  • The camera supports a live stream over Wifi of the current viewfinder.
  • The video is streamed via UDP packets
    • Every frame is splitted in several chunks (~5-20) UDP packages
  • Every frame is encoded in JPEG
    • See Wikipedia for a detailed description of the JPEG format
  • The stream has to started by issuing a HTTP GET request which includes the destination UDP port.
  • The stream can be stopped by issuing another HTTP request.
  • Depending on the camera, a few differend resolutions a available.

Take a look here for the decoded and annotated frame format.

ByteDescriptionSizeValuesDescription
1 - 2Packet type20x9060Start of frame
0x8060Middle part
0x80e0End of frame
3 - 4Number of frame chunk2
5 - 8Unique id per frame4
9 - 12Unique id per stream4

From: http://dpzen.com/comment/2604719#comment-2604719

Hi Airelle,

I’m gone the same way on analysing the video stream. SOI and EOI markers were the hint that MJPEG is used. The camera transmittes around 20 images per second if a resolution of 640 x 480 pixels is used. Each image is splitted into several parts because it doesn’t fit in one packet. Each packet containes a 12 byte long header at the beginning with following structure: In order to display such an image you have to collect all data beginning with 0xffd8 from start packet followed by data from following packets until 0xffd9. From first packet you already have cut the header and the meta data section. But you also have to cut the first 12 byte of header from all following packets. That is your mistake during your previous work. There is a mechanism for correct assembling of data packets realized per header data within each packet. But during my tests it wasn’t necessary to order the packets an no one packet was missing. This is because the server (camera) and the client (the application) uses a direct network connection. I would recommend to implement a header evaluation for your application, but for a simple test you can pass it. Sorry for my poor english. I hope it is understandable anyway and will help you to develop your application.

Best Regards Andreas