Skip to content

Instantly share code, notes, and snippets.

@mangelajo
Last active February 28, 2023 06:10
Show Gist options
  • Save mangelajo/6fa005ff3544fecdecfa to your computer and use it in GitHub Desktop.
Save mangelajo/6fa005ff3544fecdecfa to your computer and use it in GitHub Desktop.
Olympus Share E-M10 camera
and get_commandlist.cgi result:
<oishare>
<version>2.20</version>
<support func="web"/>
<support func="remote"/>
<support func="gps"/>
<support func="release"/>
<cgi name="get_connectmode">
<http_method type="get"/>
</cgi>
<cgi name="switch_cammode">
<http_method type="get">
<cmd1 name="mode">
<param1 name="rec">
<cmd2 name="lvqty">
<param2 name="0320x0240"/>
<param2 name="0640x0480"/>
</cmd2>
</param1>
<param1 name="play"/>
<param1 name="shutter">
<cmd2 name="lvqty">
<param2 name="0320x0240"/>
<param2 name="0640x0480"/>
</cmd2>
</param1>
</cmd1>
</http_method>
</cgi>
<cgi name="get_caminfo">
<http_method type="get"/>
</cgi>
<cgi name="exec_pwoff">
<http_method type="get"/>
</cgi>
<cgi name="get_resizeimg">
<http_method type="get">
<cmd1 name="DIR">
<param1>
<cmd2 name="size">
<param2 name="1024"/>
<param2 name="1600"/>
<param2 name="1920"/>
<param2 name="2048"/>
</cmd2>
</param1>
</cmd1>
</http_method>
</cgi>
<cgi name="get_movplaytime">
<http_method type="get">
<cmd1 name="DIR"/>
</http_method>
</cgi>
<cgi name="clear_resvflg">
<http_method type="get"/>
</cgi>
<cgi name="get_rsvimglist">
<http_method type="get"/>
</cgi>
<cgi name="get_imglist">
<http_method type="get">
<cmd1 name="DIR"/>
</http_method>
</cgi>
<cgi name="get_thumbnail">
<http_method type="get">
<cmd1 name="DIR"/>
</http_method>
</cgi>
<cgi name="exec_takemotion">
<http_method type="get">
<cmd1 name="com">
<param1 name="assignafframe">
<cmd2 name="point"/>
</param1>
<param1 name="releaseafframe"/>
<param1 name="takeready">
<cmd2 name="point"/>
</param1>
<param1 name="starttake">
<cmd2 name="point">
<cmd3 name="exposuremin"/>
<cmd3 name="upperlimit"/>
</cmd2>
</param1>
<param1 name="stoptake"/>
</cmd1>
</http_method>
</cgi>
<cgi name="exec_takemisc">
<http_method type="get">
<cmd1 name="com">
<param1 name="startliveview">
<cmd2 name="port"/>
</param1>
<param1 name="stopliveview"/>
<param1 name="getrecview"/>
<param1 name="getlastjpg"/>
<param1 name="ctrlzoom">
<cmd2 name="move">
<param2 name="widemove"/>
<param2 name="telemove"/>
<param2 name="off"/>
<param2 name="wideterm"/>
<param2 name="teleterm"/>
</cmd2>
</param1>
</cmd1>
</http_method>
</cgi>
<cgi name="get_camprop">
<http_method type="get">
<cmd1 name="com">
<param1 name="desc">
<cmd2 name="propname">
<param2 name="touchactiveframe"/>
<param2 name="takemode"/>
<param2 name="drivemode"/>
<param2 name="focalvalue"/>
<param2 name="expcomp"/>
<param2 name="shutspeedvalue"/>
<param2 name="isospeedvalue"/>
<param2 name="wbvalue"/>
<param2 name="noisereduction"/>
<param2 name="lowvibtime"/>
<param2 name="bulbtimelimit"/>
<param2 name="artfilter"/>
<param2 name="digitaltelecon"/>
<param2 name="desclist"/>
</cmd2>
</param1>
<param1 name="get">
<cmd2 name="propname">
<param2 name="touchactiveframe"/>
<param2 name="takemode"/>
<param2 name="drivemode"/>
<param2 name="focalvalue"/>
<param2 name="expcomp"/>
<param2 name="shutspeedvalue"/>
<param2 name="isospeedvalue"/>
<param2 name="wbvalue"/>
<param2 name="noisereduction"/>
<param2 name="lowvibtime"/>
<param2 name="bulbtimelimit"/>
<param2 name="artfilter"/>
<param2 name="digitaltelecon"/>
<param2 name="desclist"/>
</cmd2>
</param1>
</cmd1>
</http_method>
</cgi>
<cgi name="set_camprop">
<http_method type="post">
<cmd1 name="com">
<param1 name="set">
<cmd2 name="propname">
<param2 name="takemode"/>
<param2 name="drivemode"/>
<param2 name="focalvalue"/>
<param2 name="expcomp"/>
<param2 name="shutspeedvalue"/>
<param2 name="isospeedvalue"/>
<param2 name="wbvalue"/>
<param2 name="artfilter"/>
</cmd2>
</param1>
</cmd1>
</http_method>
</cgi>
<cgi name="get_activate">
<http_method type="get"/>
</cgi>
<cgi name="set_utctimediff">
<http_method type="get">
<cmd1 name="utctime">
<cmd2 name="diff"/>
</cmd1>
</http_method>
</cgi>
<cgi name="get_gpsdivunit">
<http_method type="get"/>
</cgi>
<cgi name="get_unusedcapacity">
<http_method type="get"/>
</cgi>
<cgi name="get_dcffilenum">
<http_method type="get"/>
</cgi>
<cgi name="req_attachexifgps">
<http_method type="post"/>
</cgi>
<cgi name="req_storegpsinfo">
<http_method type="post">
<cmd1 name="mode">
<param1 name="new"/>
<param1 name="append"/>
<cmd2 name="date"/>
</cmd1>
</http_method>
</cgi>
<cgi name="exec_shutter">
<http_method type="get">
<cmd1 name="com">
<param1 name="1stpush"/>
<param1 name="2ndpush"/>
<param1 name="1st2ndpush"/>
<param1 name="2nd1strelease"/>
<param1 name="2ndrelease"/>
<param1 name="1strelease"/>
</cmd1>
</http_method>
</cgi>
<cgi name="exec_shuttermisc">
<http_method type="get">
<cmd1 name="com">
<param1 name="startliveview">
<cmd2 name="port"/>
</param1>
<param1 name="stopliveview"/>
</cmd1>
</http_method>
</cgi>
</oishare>
Olympus Share APP control urls over E-M10 camera, still to investigate..
http://192.168.0.10
http://192.168.0.10/
http://192.168.0.10/clear_resvflg.cgi
http://192.168.0.10/exec_pwoff.cgi
http://192.168.0.10/exec_shutter.cgi?com=1st2ndpush
http://192.168.0.10/exec_shutter.cgi?com=1stpush
http://192.168.0.10/exec_shutter.cgi?com=1strelease
http://192.168.0.10/exec_shutter.cgi?com=2nd1strelease
http://192.168.0.10/exec_shutter.cgi?com=2ndpush
http://192.168.0.10/exec_shutter.cgi?com=2ndrelease
http://192.168.0.10/exec_takemisc.cgi?com=ctrlzoom&move=
http://192.168.0.10/exec_takemisc.cgi?com=digitalzoomshift
http://192.168.0.10/exec_takemisc.cgi?com=getlastjpg
http://192.168.0.10/exec_takemisc.cgi?com=getrecview
http://192.168.0.10/exec_takemisc.cgi?com=startliveview&port=
http://192.168.0.10/exec_takemisc.cgi?com=stopliveview
http://192.168.0.10/exec_takemisc.cgi?com=supermacroaflock&func=lock
http://192.168.0.10/exec_takemisc.cgi?com=supermacroaflock&func=release
http://192.168.0.10/exec_takemisc.cgi?com=supermacromfinaflock&move=
http://192.168.0.10/exec_takemotion.cgi?com=assignafframe&point=
http://192.168.0.10/exec_takemotion.cgi?com=assignaflock&point=
http://192.168.0.10/exec_takemotion.cgi?com=releaseafframe
http://192.168.0.10/exec_takemotion.cgi?com=releaseaflock
http://192.168.0.10/exec_takemotion.cgi?com=starttake
http://192.168.0.10/exec_takemotion.cgi?com=starttake&exposuremin=
http://192.168.0.10/exec_takemotion.cgi?com=starttake&point=
http://192.168.0.10/exec_takemotion.cgi?com=starttake&upperlimit=200
http://192.168.0.10/exec_takemotion.cgi?com=starttake&upperlimit=200&point=
http://192.168.0.10/exec_takemotion.cgi?com=stoptake
http://192.168.0.10/exec_takemotion.cgi?com=takeready
http://192.168.0.10/exec_takemotion.cgi?com=takeready&point=
http://192.168.0.10/get_caminfo.cgi
http://192.168.0.10/get_camprop.cgi?com=desc&propname=desclist
http://192.168.0.10/get_camprop.cgi?com=get&propname=touchactiveframe
http://192.168.0.10/get_commandlist.cgi
http://192.168.0.10/get_connectmode.cgi
http://192.168.0.10/get_dcffilenum.cgi
http://192.168.0.10/get_gpsdivunit.cgi
http://192.168.0.10/get_imglist.cgi?DIR=
http://192.168.0.10/get_imglist.cgi?DIR=/DCIM
http://192.168.0.10/get_resizeimg.cgi?DIR=
http://192.168.0.10/get_rsvimglist.cgi
http://192.168.0.10/get_thumbnail.cgi?DIR=
http://192.168.0.10/get_unusedcapacity.cgi
http://192.168.0.10/req_attachexifgps.cgi
http://192.168.0.10/req_storegpsinfo.cgi?mode=
http://192.168.0.10/set_camprop.cgi?com=set&propname=artfilter
http://192.168.0.10/set_camprop.cgi?com=set&propname=drivemode
http://192.168.0.10/set_camprop.cgi?com=set&propname=expcomp
http://192.168.0.10/set_camprop.cgi?com=set&propname=focalvalue
http://192.168.0.10/set_camprop.cgi?com=set&propname=isospeedvalue
http://192.168.0.10/set_camprop.cgi?com=set&propname=shutspeedvalue
http://192.168.0.10/set_camprop.cgi?com=set&propname=supermacrosub
http://192.168.0.10/set_camprop.cgi?com=set&propname=takemode
http://192.168.0.10/set_camprop.cgi?com=set&propname=wbvalue
http://192.168.0.10/set_takemode.cgi?com=normal
http://192.168.0.10/set_takemode.cgi?com=selftimer
http://192.168.0.10/set_utctimediff.cgi?utctime=
http://192.168.0.10/switch_cammode.cgi?mode=play
http://192.168.0.10/switch_cammode.cgi?mode=rec&lvqty=
http://192.168.0.10/switch_cammode.cgi?mode=shutter
http://flashair
http://flashair/
http://flashair/command.cgi?op=100&DIR=
http://flashair/thumbnail.cgi?
@mangelajo
Copy link
Author

in http://www.dpreview.com/forums/thread/3579412
Andreas Rebs says
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:

byte 1..2: packet type (start: 0x9060, part n: 0x8060, final: 0x80e0),
byte 3..4: consecutive number within a image to assemble packets in the right order (remeber, UDP is used),
byte 5..8: it seems to be an unique id for each transmitted image, so one can distinguish between data blocks of different images,
byte 9..12: it seems to be a kind of session id (it means an id from starting the stream until this stream will be stopped).
In orer 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

@mdauphin
Copy link

mdauphin commented Feb 3, 2016

@crispgm
Copy link

crispgm commented Jun 2, 2016

@mdauphin Great gist and document!

@LeeTroy
Copy link

LeeTroy commented Apr 24, 2018

I was able to take three shots with the following sequence.

curl "http://192.168.0.10/switch_cammode.cgi?mode=shutter"
curl "http://192.168.0.10/exec_shutter.cgi?com=1st2ndpush"
curl "http://192.168.0.10/exec_shutter.cgi?com=1st2ndpush"
curl "http://192.168.0.10/exec_shutter.cgi?com=1st2ndpush"

Thanks for your documentation. I could create a ESP8266 wifi shutter button!!
My repo: https://github.com/LeeTroy/OlympusWiFiShutter

@aanarcissus
Copy link

Thank for your document!
In share app
what is the code to start video record and stop?

@AngelicaPerduta
Copy link

Olympus seem to have dropped the air SDK and removed it from their site. I was wondering if anyone here per chance still has a backup copy of it they could share?

@nandenjin
Copy link

Olympus seem to have dropped the air SDK and removed it from their site.

I searched with the filename and found new one. ✨ Cc: @AngelicaPerduta

https://dl-support.olympus-imaging.com/opc/en/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment