之前有个项目,为了提高网络摄像头的采图效率,我从最开始的opencv调rtsp到用大华的SDK接口,最终成功实现了采图速度也确实快了很多,但如果同一台电脑有多个网络摄像头连接,同一时间又可能有多个摄像头采图,由于摄像头出厂配置都是一样的,即ip是固定的(我拿到的ip统一为192.168.1.108),而SDK采图又必须通过摄像头ip,端口等信息,这就导致我同一台电脑连接多个摄像头时,我无法区分当前连接的是哪个摄像头。
于是我想通过修改ip或端口,用以区分连接的多个摄像头,恰巧大华对网络摄像头的监视和配置有个web,登录上之后我找到了修改的地方并保存,手动点击网页发现可以实现,于是考虑通过代码实现这个过程。
由于我主要是写c++/python,对web前端等知识的了解基本为零,所以请教了我的高中同学(空心菜JSS),感谢我女神的不吝赐教,感谢感谢!~~
postman调试工具
web和c++的通讯模块
首先要从web找到你要用代码实现的操作,一般Fn+F12进调试界面就可以看到了,主要确定下url地址和调用方法(GET/POST....)有的操作需要拼接一些数据,基本都是json格式的,很容易看懂。
把从网页上看到的信息复制进postman即可,登录第一步出错是正常的,因为我不知道session,所以第一步要先获得session,就在返回的json格式的一堆数据里,拿到后解析一下就好了。
拿到session后,把session写入数据再发一次,正常情况下就会返回正确了。
这个其实和上个接口大同小异,只是这个的数据多一点而已,但反正都是从网页上复制的。
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 : ""; }
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; }
修改完后登录了下网页查看,修改成功,完结撒花~