1. 文章背景
之前有个项目,为了提高网络摄像头的采图效率,我从最开始的opencv调rtsp到用大华的SDK接口,最终成功实现了采图速度也确实快了很多,但如果同一台电脑有多个网络摄像头连接,同一时间又可能有多个摄像头采图,由于摄像头出厂配置都是一样的,即ip是固定的(我拿到的ip统一为192.168.1.108),而SDK采图又必须通过摄像头ip,端口等信息,这就导致我同一台电脑连接多个摄像头时,我无法区分当前连接的是哪个摄像头。
于是我想通过修改ip或端口,用以区分连接的多个摄像头,恰巧大华对网络摄像头的监视和配置有个web,登录上之后我找到了修改的地方并保存,手动点击网页发现可以实现,于是考虑通过代码实现这个过程。
2. 前期准备
由于我主要是写c++/python,对web前端等知识的了解基本为零,所以请教了我的高中同学(空心菜JSS),感谢我女神的不吝赐教,感谢感谢!~~
postman调试工具
web和c++的通讯模块
2.1 找到web接口
首先要从web找到你要用代码实现的操作,一般Fn+F12进调试界面就可以看到了,主要确定下url地址和调用方法(GET/POST....)有的操作需要拼接一些数据,基本都是json格式的,很容易看懂。
2.1.1 登录接口
2.1.2 修改ip接口
2.2 postman调试
2.2.1 登录接口调试
把从网页上看到的信息复制进postman即可,登录第一步出错是正常的,因为我不知道session,所以第一步要先获得session,就在返回的json格式的一堆数据里,拿到后解析一下就好了。
拿到session后,把session写入数据再发一次,正常情况下就会返回正确了。
2.2.2 修改ip接口调试
这个其实和上个接口大同小异,只是这个的数据多一点而已,但反正都是从网页上复制的。
3. 代码实现
3.1 登录函数
QString MainWidget::loginWeb(QString ipAdress)
{
QString url = QString("http://%1/RPC2_Login").arg(ipAdress);
QVariantMap postDataMap = HaatGlobalUtils::jsonfileToVariantMap(QString(":/Config/loginPostData.json"));
int sendID = postDataMap["id"].toInt();
bool result = false;
int count = 0;
QString m_session;
while(!result && count < 2)
{
QString postDataStr = HaatGlobalUtils::getJsonStringFromMap(postDataMap);
QByteArray postData = postDataStr.toLatin1();
QByteArray responseData = m_http->postSync(url, postData);
count ++;
QVariantMap loginResponse = HaatGlobalUtils::getMapFromJsonString(QString(responseData));
if(sendID == loginResponse["id"].toInt())
{
result = loginResponse["result"].toBool();
m_session = loginResponse["session"].toString();
postDataMap["session"] = m_session;
ui->textEdit->append(result? QSC("登录成功") : QSC("获取session%1").arg(m_session.isEmpty()? QSC("失败") : QSC("成功")));
if(result)
qDebug() << QSC("登录成功");
else
qDebug() << QSC("获取session%1").arg(m_session.isEmpty()? QSC("失败") : QSC("成功"));
}
else
{
ui->textEdit->append(QSC("错误:收发不对应!"));
qDebug() << QSC("错误:收发不对应!");
}
}
return result? m_session : "";
}
3.2 修改ip函数
bool MainWidget::alterIP(QString sessionStr, QString ipAdress, QString alterIPAdress)
{
QString url = QString("http://%1/RPC2").arg(ipAdress);
QVariantMap postDataMap = HaatGlobalUtils::jsonfileToVariantMap(QString(":/Config/alterPostData.json"));
postDataMap["session"] = sessionStr;
QVariantList paramsList = postDataMap["params"].toList();
for(QVariant paramsTemp : paramsList)
if(paramsTemp.toMap().keys().contains("session"))
paramsTemp.toMap()["session"] = sessionStr;
QString postDataStr = HaatGlobalUtils::getJsonStringFromMap(postDataMap);
postDataStr.replace(QString("%1").arg(ipAdress), QString("%1").arg(alterIPAdress));
QByteArray postData = postDataStr.toLatin1();
QByteArray responseData = m_http->postSync(url, postData);
QVariantMap alterResponse = HaatGlobalUtils::getMapFromJsonString(QString(responseData));
bool result = alterResponse["result"].toBool();
ui->textEdit->append(QSC("ip:%1 -> %2 修改%3").arg(ipAdress).arg(alterIPAdress).arg(result? QSC("成功") : QSC("失败")));
qDebug() << QSC("ip:%1 -> %2 修改%3").arg(ipAdress).arg(alterIPAdress).arg(result? QSC("成功") : QSC("失败"));
return result;
}
4. 实现效果
修改完后登录了下网页查看,修改成功,完结撒花~