引言
Sony’s Camera Remote API beta SDK allows you to control a number of Sony cameras, including Sony Action cams, Sony Alpha cameras and Lens Style cameras, wirelessly from another device.
索尼于2017年三月Release了远程控制API SDK(beta), 给用户提供用WIFI来控制索尼系列相机, 包括运动相机,Alpha系列,以及棱镜组相机。
The Camera Remote API is a flexible API that builds on commonly-used protocols such as HTTP and JSON. And you can develop apps for any operating system, such as Android, iOS or Microsoft® Windows®.
相机控制端芯片搭建了UPnP服务,用户可以通过UDP,HTTP方式向服务端发起请求,访问数据,控制相机和镜头等。
支持的系列 (2020/04)
Sony_CameraRemoteAPIbeta_API-Reference_v2.40.pdf
工作流示意图
Sony_CameraRemoteAPIbeta_DevelopmentGuide_v1.20.pdf
相机设置
- 打开相机,按menu进入主菜单
- 设置Remote control 部分为On。目的是为了让相机允许被远程API控制
- USB Connection设置为任意。我这里当时是用了PC Remote,因为之前测试了Sony 2020年刚出的SDK USB控制版, 发现目前不支持Alpha6000系列。
- 进入Appliation List, 选择Smart Remote Embedded,按确定键进入
这个时候,上面会显示相机广播的WIFI名称和密码,在电脑端WIFI找到该热点,连接。
以上就是相机端的准备工作。
连接测试
根据下载的手册 下载地址
- 先通过发送SSDP请求来获得设备相关信息。
- 命令格式如上图Request Example
python socket测试
step 1
为方便起见,这里用socket来测试该通信。
代码可以从我的github上找到。
- 向IP : 239.255.255.250,端口1900 发送请求
SSDP_ADDR = "239.255.255.250";
SSDP_PORT = 1900;
SSDP_MX = 1;
SSDP_ST = "urn:schemas-sony-com:service:ScalarWebAPI:1";
- 请求内容:
ssdpRequest = "M-SEARCH * HTTP/1.1\r\n" + \
"HOST: %s:%d\r\n" % (SSDP_ADDR, SSDP_PORT) + \
"MAN: \"ssdp:discover\"\r\n" + \
"MX: %d\r\n" % (SSDP_MX, ) + \
"ST: %s\r\n" % (SSDP_ST, ) + "\r\n";
需要注意的是,由于相机端用的Fedora/Linux系统,\r\n是Linux的换行符,windows下的\n 不接受。一开始我没主要到这个问题,所以今天花了很长时间才把第二部分(见下文)调试完。
完整代码如下所示:
import sys
import socket
SSDP_ADDR = "239.255.255.250";
SSDP_PORT = 1900;
SSDP_MX = 1;
SSDP_ST = "urn:schemas-sony-com:service:ScalarWebAPI:1";
ssdpRequest = "M-SEARCH * HTTP/1.1\r\n" + \
"HOST: %s:%d\r\n" % (SSDP_ADDR, SSDP_PORT) + \
"MAN: \"ssdp:discover\"\r\n" + \
"MX: %d\r\n" % (SSDP_MX, ) + \
"ST: %s\r\n" % (SSDP_ST, ) + "\r\n";
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(2)
try:
# send request to UPnP server
sock.sendto(ssdpRequest.encode(), (SSDP_ADDR, SSDP_PORT))
print (sock.recv(1000).decode())
except:
None
运行python程序:
$python3 test1