在获取到相机设备配置文件(.xml)后, 调用qt的QNetworkAccessManager的get方法, 获得了用QByteArray的二进制xml文件, 对文件进行处理, 要使用到QXmlStreamReader.
QXmlStreamReader的使用
QXmlStreamReader可以使用QByteArray和IO实例化, 假设实例化以后的对象名为reader, 有如下代码操作:
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文件(读了第一个属性, 读第二个, 依次下去, 不会回头去读第一个), 常用的形式就是如下提取出来的代码:
while (!reader.atEnd()) {
//read element
.......
reader.readNext(); //指向下一个分隔符
}
if (reader.hasError()) {
//handle error
//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相机的博客会具体说).