基于QT的智能监控系统——(1)设备搜索功能

展示查找到的设备
1.需求:
网络摄像头的使用首先要获取其IP地址,usb摄像头使用QT自带的QCamera类即可
2.实现方法:
(1).使用onvif框架代码;
(2).自实现socket,向组播地址发送探测消息
在实际编程过程中,onvif框架代码的设备搜索方式,会被wifi,vpn等影响,导致搜索失败,并且速度很慢,因此使用组播的方式
3.伪代码:

/* 1.socket初始化开始 */
/* 根据抓包得到的xml内容,这是要向组播地址发送的消息 */
const char *probe = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Envelope xmlns:dn=\"http://www.onvif.org/ver10/network/wsdl\" xmlns=\"http://www.w3.org/2003/05/soap-envelope\"><Header><wsa:MessageID xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">uuid:fc0bad56-5f5a-47f3-8ae2-c94a4e907d70</wsa:MessageID><wsa:To xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To><wsa:Action xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action></Header><Body><Probe xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://schemas.xmlsoap.org/ws/2005/04/discovery\"><Types>dn:NetworkVideoTransmitter</Types><Scopes /></Probe></Body></Envelope>";

/* 本机网络设备 */
QList<QNetworkInterface> card = QNetworkInterface::allInterfaces();
for(int i=0; i<card.size(); i++)
{
    qDebug() << "netWorkCard:" << card[i].humanReadableName();
}

/* 添加某一设备到组播 */
QHostAddress groupAddr("239.255.255.250");
QUdpSocket m_UdpSocket;
bool bs = m_UdpSocket.bind(QHostAddress::AnyIPv4,port,QUdpSocket::ShareAddress|QUdpSocket:euseAddressHint);//port随便填一个本机没有被占用的端口
m_UdpSocket.setMulticastInterface(card[]);//card[]自己选择用来搜索IPC的网络设备
bs = m_UdpSocket.joinMulicastGroup(groupAddr, card[]);
connect(&m_UdpSocket, SIGNAL(readyRead()), this, SLOT(readDataGrams());
/* 初始化结束 */

/* 2.发送probe开始 */
QString msg = probe;
QByteArray array = msg.toUtf8();
m_UdpSocket.writeDatagram(array);
/* 发送probe结束 */

/* 3.接受IPC返回的消息,并解析得到地址 */
QByteArray data;
int i=0, y=0;
data.resize(m_UdpSocket.pendingDatagramSize());
m_UdpSocket.readDatagram(data.data(), data.size());
QString str = data.data();
i = str.indexOf("XAddrs");
y = str.lastIndexOf("XAddrs");
QString str1 = str.mid(i, y-i);
i = str1.indexOf("http");
y = str1.indexOf("<");
Qstring IPC = str1.mid(i, y-i);
qDebug() << "IPCAddress:" << IPC;
/* 接受IPC返回消息,并解析得到地址 */

4.总结
将伪代码中的三步,按照自己的实际情况封装到QT按钮里即可实现设备搜索

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值