小言_互联网的博客

Sony微单相机alpha6000 wifi远程控制(2)

336人阅读  评论(0)

引言

从上一篇文章,我们得知,Sony Camera Alpha 6000通过如下地址发送远程控制命令, 接收返回状态等:

http://192.168.122.1:8080/sony/camera

本文以此为出发点,来继续讨论如何向相机发送命令。

示例

最简单的方法是直接调用requests包,免去对HTTP通讯POST的理解。

import requests

js_startRecMode = {
        "method":"startRecMode",
        "params":[],
        "id": 1,
        "version": "1.0"
        }

js_takePhoto = {
        "method":"actTakePicture",
        "params":[],
        "id": 1,
        "version": "1.0"
        }

# 进入Rec模式
r=None
r=requests.post("http://192.168.122.1:8080/sony/camera", json.dumps(js_startRecMode))
print ('startRec\n',json.loads(r.content))

# 拍一张照片
r=None
r=requests.post("http://192.168.122.1:8080/sony/camera", json.dumps(js_takePhoto))
print ('TakePhoto\n',json.loads(r.content))

这个时候,相机已经能听从使唤了。但是,我并不满足,考虑整体思路的连续性,这里还是用socket重写该通讯。

为了理解HTTP POST过程,这里用了Fiddler来抓包,结果如下。

POST http://192.168.122.1:8080/sony/camera HTTP/1.1
Host: 192.168.122.1:8080
User-Agent: python-requests/2.23.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 67

{"method": "startRecMode", "params": [], "id": 1, "version": "1.0"}

可以看到,一个可以和相机工作的HTTP POST由上面2部分组成。


需要注意的是,在json之前,需要有2个换行符\r\n\r\n。可以从上图Hex码(0A0D)看出来。0A对应于\r, 0D对应于\n。

有了以上信息,这里直接用socket来写。
完整代码见链接github


import socket
# part 3
HOST2="192.168.122.1"
PORT2=8080


#sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#sock2.settimeout(2)
#sock2.connect((HOST2, PORT2))
ssdpRequest2 = "POST /sony/camera HTTP/1.1\r\n" +\
               "Host: 192.168.122.1:8080\r\n" +\
               "User-Agent: python-request\r\n" +\
               "Accept-Encoding: gzip, deflate\r\n" +\
               "Accept: */*\r\n" +\
               "Connection: keep-alive\r\n"
               #"Content-Length: %s\r\n\r\n" %len(json.dumps(js_startReMode)) # this line must be included, telling the server of the json length
               

js_startReMode = {
        "method":"startRecMode",
        "params":[],
        "id": 1,
        "version": "1.0"
        }
        
js_getSuppMode = {
        "method":"getSupportedShootMode",
        "params":[],
        "id": 1,
        "version": "1.0"
        }

js_actTkPhoto = {
        "method":"actTakePicture",
        "params":[],
        "id": 1,
        "version": "1.0"
        }
        

import json
        

try:
    print ('-------------START REMOTE CONTROL-------------')
    # send "startRecMode" request to camera
    sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock2.settimeout(10)
    sock2.connect((HOST2, PORT2))
    
    strAll = ssdpRequest2 + "Content-Length: %s\r\n\r\n" %len(json.dumps(js_startReMode)) + json.dumps(js_startReMode)
    print (strAll)
    sock2.send(bytearray(strAll,'utf-8'))    
    
    print ('setRemote')
    res0 = sock2.recv(1024)
    while(len(res0)>0):
        print (res0)
        res0 = sock2.recv(1024)
    
    sock2.close()
    sock2 = None
    print ('--------------------------------------')
    print ('')
    
    # send "actTakePicture" request to camera (take a photo)
    sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock2.settimeout(10)
    sock2.connect((HOST2, PORT2))
    
    strAll = ssdpRequest2 + "Content-Length: %s\r\n\r\n" %len(json.dumps(js_actTkPhoto)) + json.dumps(js_actTkPhoto)
    print (strAll)
    sock2.send(bytearray(strAll,'utf-8'))
    
    print ('getSupportedMode')
    res0 = sock2.recv(1024)
    while(len(res0)>0):
        print (res0)
        res0 = sock2.recv(1024)
        
    
    sock2.close()
    sock2 = None
        
except:
    print ("Something wrong here")

之前调试时候一直遇到相机端回复 invalid json, 后来才弄明白是"Content-Length: length\r\n\r\n"这句话一定要加上。

好了,到这里,基本的测试已经通过。

Experiment

有了远程控制部分,可以在保持相机不动的时候拍。这里以光的偏振效应为例,我们知道,对于透明物体(如玻璃),由于制造过程不可避免的引入残余应力,最终会产生双折射现象(birefringence)。

图片来自Wikipedia

因此,我们需要一个偏振光源,一个偏振片。

  1. 液晶屏幕就是一个偏振光源, 如电脑屏幕
  2. 找一副偏振眼镜

将偏振片置于相机镜头处,物体放置于电脑屏幕和偏振片之间即可。以下是效果图。

不加偏振片

偏振片 偏振方向平行于液晶屏的偏振

偏振片 偏振方向垂直于液晶屏的偏振

当偏振片的偏振方向垂直于入射光的偏振时,透过率降得非常低。由于玻璃残余应力的存在,出现了双折射现象,因此下图中能明显看到由于的应力变化引起的效果。在杯子握把部分加工过程中,把玻璃烧热后,贴在之前加工的圆柱玻璃表面,然后利用夹子固定出这个形状,因此在非缓慢退火过程中会残留应力。

结论

以上就是相机API通讯的部分。相机远程控制的其他功能,将在接下来的文章中讨论。


转载:https://blog.csdn.net/markfuk996/article/details/105462815
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场