Skip to content

Instantly share code, notes, and snippets.

@kota65535
Last active November 23, 2015 04:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kota65535/5d69d2b86563fee8b565 to your computer and use it in GitHub Desktop.
Save kota65535/5d69d2b86563fee8b565 to your computer and use it in GitHub Desktop.
require 'frisky/ssdp'
require 'httpclient'
require 'nokogiri'
require 'json'
require 'pp'
# SSDPで所定のデバイスを検索
SSDP_SEARCH_TARGET = 'urn:schemas-sony-com:service:ScalarWebAPI:1'
SSDP_SEARCH_RETRY = 3
SSDP_RETRY_INTERVAL = 5
try = 1
while true do
response = Frisky::SSDP.search SSDP_SEARCH_TARGET
if ! response.empty?
break
elsif try < SSDP_SEARCH_RETRY
try += 1
puts "SSDP discover failed, retrying... (#{try}/#{SSDP_SEARCH_RETRY})"
sleep(SSDP_RETRY_INTERVAL)
else
puts "The device not found."
exit 3
end
end
pp response
puts 'SSDP discover succeeded.'
# デバイスデスクリプション取得
cli = HTTPClient.new
dd = cli.get_content(response[0][:location])
puts dd
puts 'Got the device descripton.'
# デバイスデスクリプション解析
dd_xml = Nokogiri::XML(dd)
if dd_xml.nil?
puts 'Failed to parse XML.'
exit 1
end
dd_xml.remove_namespaces!
camera_name = dd_xml.css('device friendlyName')
services = dd_xml.css('device X_ScalarWebAPI_Service')
endpoint_urls = {}
services.each do |sv|
service_type = sv.css('X_ScalarWebAPI_ServiceType').inner_text
endpoint_urls[service_type] = File.join(sv.css('X_ScalarWebAPI_ActionList_URL').inner_text, service_type)
end
puts 'Endpoint URLs are:'
pp endpoint_urls
setShootMode_request = {
'method' => 'setShootMode',
'params' => ['movie'],
'id' => 1,
'version' => '1.0'
}
startMovieRec_request = {
'method' => 'startMovieRec',
'params' => [],
'id' => 2,
'version' => '1.0'
}
stopMovieRec_request = {
'method' => 'stopMovieRec',
'params' => [],
'id' => 3,
'version' => '1.0'
}
# 撮影モード切り替え->録画開始->録画停止
res = cli.post_content(endpoint_urls['camera'], setShootMode_request.to_json)
pp JSON.parse(res)
res = cli.post_content(endpoint_urls['camera'], startMovieRec_request.to_json)
pp JSON.parse(res)
sleep(5)
res = cli.post_content(endpoint_urls['camera'], stopMovieRec_request.to_json)
pp JSON.parse(res)
<?xml version="1.0"?><root xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<device>
<deviceType>urn:schemas-upnp-org:device:Basic:1</deviceType>
<friendlyName>HDR-AZ1</friendlyName>
<manufacturer>Sony Corporation</manufacturer>
<manufacturerURL>http://www.sony.net/</manufacturerURL>
<modelDescription>SonyDigitalMediaServer</modelDescription>
<modelName>SonyImagingDevice</modelName>
<UDN>uuid:000000001000-1010-8000-FEC2DEEB77DC</UDN>
<serviceList>
<service>
<serviceType>urn:schemas-sony-com:service:ScalarWebAPI:1</serviceType>
<serviceId>urn:schemas-sony-com:serviceId:ScalarWebAPI</serviceId>
<SCPDURL/>
<controlURL/>
<eventSubURL/>
</service>
<service>
<serviceType>urn:schemas-sony-com:service:DigitalImaging:1</serviceType>
<serviceId>urn:schemas-sony-com:serviceId:DigitalImaging</serviceId>
<SCPDURL>/DigitalImagingDesc.xml</SCPDURL>
<controlURL>/upnp/control/DigitalImaging</controlURL>
<eventSubURL></eventSubURL>
</service>
</serviceList>
<av:X_ScalarWebAPI_DeviceInfo xmlns:av="urn:schemas-sony-com:av">
<av:X_ScalarWebAPI_Version>1.0</av:X_ScalarWebAPI_Version>
<av:X_ScalarWebAPI_ServiceList>
<av:X_ScalarWebAPI_Service>
<av:X_ScalarWebAPI_ServiceType>guide</av:X_ScalarWebAPI_ServiceType>
<av:X_ScalarWebAPI_ActionList_URL>http://192.168.122.1:8080/sony</av:X_ScalarWebAPI_ActionList_URL>
<av:X_ScalarWebAPI_AccessType/>
</av:X_ScalarWebAPI_Service>
<av:X_ScalarWebAPI_Service>
<av:X_ScalarWebAPI_ServiceType>accessControl</av:X_ScalarWebAPI_ServiceType>
<av:X_ScalarWebAPI_ActionList_URL>http://192.168.122.1:8080/sony</av:X_ScalarWebAPI_ActionList_URL>
<av:X_ScalarWebAPI_AccessType/>
</av:X_ScalarWebAPI_Service>
<av:X_ScalarWebAPI_Service>
<av:X_ScalarWebAPI_ServiceType>camera</av:X_ScalarWebAPI_ServiceType>
<av:X_ScalarWebAPI_ActionList_URL>http://192.168.122.1:8080/sony</av:X_ScalarWebAPI_ActionList_URL>
<av:X_ScalarWebAPI_AccessType/>
</av:X_ScalarWebAPI_Service>
<av:X_ScalarWebAPI_Service>
<av:X_ScalarWebAPI_ServiceType>system</av:X_ScalarWebAPI_ServiceType>
<av:X_ScalarWebAPI_ActionList_URL>http://192.168.122.1:8080/sony</av:X_ScalarWebAPI_ActionList_URL>
<av:X_ScalarWebAPI_AccessType/>
</av:X_ScalarWebAPI_Service>
<av:X_ScalarWebAPI_Service>
<av:X_ScalarWebAPI_ServiceType>avContent</av:X_ScalarWebAPI_ServiceType>
<av:X_ScalarWebAPI_ActionList_URL>http://192.168.122.1:8080/sony</av:X_ScalarWebAPI_ActionList_URL>
<av:X_ScalarWebAPI_AccessType/>
</av:X_ScalarWebAPI_Service>
</av:X_ScalarWebAPI_ServiceList>
<av:X_ScalarWebAPI_ImagingDevice>
<av:X_ScalarWebAPI_LiveView_URL>http://192.168.122.1:8080/liveview/liveviewstream</av:X_ScalarWebAPI_LiveView_URL>
<av:X_ScalarWebAPI_DefaultFunction>RemoteShooting</av:X_ScalarWebAPI_DefaultFunction>
</av:X_ScalarWebAPI_ImagingDevice>
</av:X_ScalarWebAPI_DeviceInfo>
</device>
</root>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment