在获取到相机设备配置文件(.xml)后, 调用qt的QNetworkAccessManager的get方法, 获得了用QByteArray的二进制xml文件, 对文件进行处理, 要使用到QXmlStreamReader.
QXmlStreamReader的使用
int CameraDscXmlResolve::resolve()
{
QXmlStreamReader reader(_xml);
while (!reader.atEnd()) {
if(reader.isStartElement())
{
if(reader.name() == "friendlyName"){
_cameraName = reader.readElementText();
}
else if(reader.name() == "X_ScalarWebAPI_ServiceType")
{
QString serviceType = reader.readElementText();
if(serviceType == "camera")
_isCamera = true;
else
_isCamera = false;
}else if(reader.name() == "X_ScalarWebAPI_ActionList_URL"){
if(_isCamera){
_cameraAPIUrl.append(reader.readElementText());
_isCamera = false;
return 0;
}
}
reader.readNext();
}
else
{
reader.readNext();
}
}
if (reader.hasError()) {
return 2;
}
return 1;
}
}
这里使用的惯用形式是只需要顺序读一次, 不需要反复读的xml文件(读了第一个属性, 读第二个, 依次下去, 不会回头去读第一个), 常用的形式就是如下提取出来的代码:
//handle error
中间的读取流程的话, 首先要判断是否为元素的开头, reader.isStartElement(), 如果是元素开头的话, 读取元素的名字reader.name(), 找到感兴趣的元素, 读取元素的内容reader.readElementText().
根据索尼相机开发文档, 索尼相机的控制接口放在名为"X_ScalarWebAPI_ActionList_URL"的元素中, 至此, 就获得了索尼相机的API的URL, 可以对索尼相机进行操控了.
有一点要额外说明的就是, 索尼相机厉害的地方在于, 把相机控制命令都封装成了http的post请求方法来调用, 而不是传统usb控制相机和部分wifi控制相机(亲测的有fuji)那样, 用ptp协议来进行控制, 让开发者摆脱了复杂的ptp封装和解析(相同厂家, 使用ptp控制相机的指令, 也会因为相机机型的不同而有所变化, 比如索尼的EOS系列和PowerShot就是不一样的指令封装, 虽然都遵循ptp协议, 但是找它的具体指令真的很麻烦, 用bushound去抓包, 然后对比着ptp的协议标准去比对才知道指令是什么意思, 这个在之后总结ptp相机的博客会具体说).