简述

使用IP地址组播技术,实现海康的设备搜索功能,只要设备接入局域网就能够被搜索到。效果图.

功能代码:

1. scan_device_ui.py 布局文件

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'scan_device.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(849, 633)self.verticalLayout_2 = QtWidgets.QVBoxLayout(Form)self.verticalLayout_2.setObjectName("verticalLayout_2")self.horizontalLayout = QtWidgets.QHBoxLayout()self.horizontalLayout.setContentsMargins(-1, 10, -1, 10)self.horizontalLayout.setObjectName("horizontalLayout")self.scan_device = QtWidgets.QPushButton(Form)self.scan_device.setObjectName("scan_device")self.horizontalLayout.addWidget(self.scan_device)spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout.addItem(spacerItem)self.verticalLayout_2.addLayout(self.horizontalLayout)self.horizontalLayout_3 = QtWidgets.QHBoxLayout()self.horizontalLayout_3.setObjectName("horizontalLayout_3")self.device_list = QtWidgets.QTableWidget(Form)self.device_list.setObjectName("device_list")self.device_list.setColumnCount(0)self.device_list.setRowCount(0)self.horizontalLayout_3.addWidget(self.device_list)self.formLayout = QtWidgets.QFormLayout()self.formLayout.setObjectName("formLayout")self.label_mac = QtWidgets.QLabel(Form)self.label_mac.setObjectName("label_mac")self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_mac)self.et_mac = QtWidgets.QLineEdit(Form)self.et_mac.setObjectName("et_mac")self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.et_mac)self.label_ip = QtWidgets.QLabel(Form)self.label_ip.setObjectName("label_ip")self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_ip)self.et_ip = QtWidgets.QLineEdit(Form)self.et_ip.setObjectName("et_ip")self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.et_ip)self.label_mask = QtWidgets.QLabel(Form)self.label_mask.setObjectName("label_mask")self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_mask)self.et_mask = QtWidgets.QLineEdit(Form)self.et_mask.setObjectName("et_mask")self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.et_mask)self.label_gateway = QtWidgets.QLabel(Form)self.label_gateway.setObjectName("label_gateway")self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_gateway)self.et_gateway = QtWidgets.QLineEdit(Form)self.et_gateway.setObjectName("et_gateway")self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.et_gateway)spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)self.formLayout.setItem(5, QtWidgets.QFormLayout.FieldRole, spacerItem1)self.reset_ip = QtWidgets.QPushButton(Form)self.reset_ip.setObjectName("reset_ip")self.formLayout.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.reset_ip)self.reboot_device = QtWidgets.QPushButton(Form)self.reboot_device.setObjectName("reboot_device")self.formLayout.setWidget(7, QtWidgets.QFormLayout.FieldRole, self.reboot_device)spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)self.formLayout.setItem(8, QtWidgets.QFormLayout.FieldRole, spacerItem2)self.label_cmd = QtWidgets.QLabel(Form)self.label_cmd.setObjectName("label_cmd")self.formLayout.setWidget(9, QtWidgets.QFormLayout.LabelRole, self.label_cmd)self.et_remote_cmd = QtWidgets.QLineEdit(Form)self.et_remote_cmd.setObjectName("et_remote_cmd")self.formLayout.setWidget(9, QtWidgets.QFormLayout.FieldRole, self.et_remote_cmd)self.exec_remote_cmd = QtWidgets.QPushButton(Form)self.exec_remote_cmd.setObjectName("exec_remote_cmd")self.formLayout.setWidget(10, QtWidgets.QFormLayout.FieldRole, self.exec_remote_cmd)self.et_cmd_result = QtWidgets.QTextEdit(Form)self.et_cmd_result.setObjectName("et_cmd_result")self.formLayout.setWidget(11, QtWidgets.QFormLayout.FieldRole, self.et_cmd_result)self.horizontalLayout_3.addLayout(self.formLayout)self.horizontalLayout_3.setStretch(0, 2)self.horizontalLayout_3.setStretch(1, 1)self.verticalLayout_2.addLayout(self.horizontalLayout_3)self.verticalLayout_2.setStretch(1, 1)self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "Form"))self.scan_device.setText(_translate("Form", "搜索设备"))self.label_mac.setText(_translate("Form", "MAC地址:"))self.label_ip.setText(_translate("Form", "IP地址:"))self.label_mask.setText(_translate("Form", "子网掩码:"))self.label_gateway.setText(_translate("Form", "网关地址:"))self.reset_ip.setText(_translate("Form", "重新设置"))self.reboot_device.setText(_translate("Form", "重启设备"))self.label_cmd.setText(_translate("Form", "远程命令:"))self.exec_remote_cmd.setText(_translate("Form", "执行远程命令(慎用)"))

2. main.py 主文件

from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QTableWidgetItem, QTableWidget, QAbstractItemView
from PyQt5.QtCore import Qt, pyqtSignal, QObject
from PyQt5.QtGui import QFont, QImage, QPixmap, QIcon
import sys
import socket
import threading
import scan_device_uiclass signal(QObject):# 自定义一个信号signal = pyqtSignal(str)# 定义一个发送信号的函数def emit(self, text):self.signal.emit(text)class QDeviceWidget(QWidget):def __init__(self):super().__init__()self.ui = ui = scan_device_ui.Ui_Form()self.ui.setupUi(self)self.setWindowTitle("海帆-设备配置助手 V1.0")self.ui.scan_device.clicked.connect(self.scan_device)self.ui.reset_ip.clicked.connect(self.reset_ip_info)self.ui.reboot_device.clicked.connect(self.reboot_device)self.ui.exec_remote_cmd.clicked.connect(self.exec_remote_cmd)self.MULTICAST_ANY = "0.0.0.0"self.MULTICAST_IP = "239.255.255.250"self.MULTICAST_PORT = 35880self.update_ui = signal()self.update_ui.signal.connect(self.update_list_ui)self.start_listening()self.init_tables()self.count_index = 0self.list_content = []def init_tables(self):self.ui.device_list.setColumnCount(5)self.ui.device_list.setHorizontalHeaderLabels(['ID', 'MAC地址', 'IP地址', '子网掩码', '网关'])self.ui.device_list.setSelectionBehavior(QAbstractItemView.SelectRows)self.ui.device_list.itemClicked.connect(self.table_item_click)passdef table_item_click(self, item):print("item click = ", item.row())content = self.list_content[item.row()]self.ui.et_mac.setText(content[1])self.ui.et_ip.setText(content[2])self.ui.et_mask.setText(content[3])self.ui.et_gateway.setText(content[4])passdef start_listening(self):# 创建UDP socketself.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)# 允许端口复用self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定监听多播数据包的端口self.socket.bind((self.MULTICAST_ANY, self.MULTICAST_PORT))# 声明该socket为多播类型self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)# 加入多播组,组地址由第三个参数制定self.socket.setsockopt(socket.IPPROTO_IP,socket.IP_ADD_MEMBERSHIP,socket.inet_aton(self.MULTICAST_IP) + socket.inet_aton(self.MULTICAST_ANY))self.socket.setblocking(False)self.receive_thread = threading.Thread(target=self.receive_message_worker, args=())self.receive_thread.start()passdef receive_message_worker(self):print("start recive message thread ...")while True:try:data, address = self.socket.recvfrom(2048)except Exception as e:# print(e)passelse:data = data.decode()print(data)self.update_ui.emit(data)passdef scan_device(self):print("scan device start ...")self.list_content = []self.count_index = 0self.ui.device_list.clearContents()self.socket.sendto("list".encode(), (self.MULTICAST_IP, self.MULTICAST_PORT))passdef update_list_ui(self, content):if content.startswith("client"):print("client = ", content)self.ui.device_list.setRowCount(self.count_index + 1)contents = content.split("-")item1 = QTableWidgetItem(str(self.count_index + 1))self.ui.device_list.setItem(self.count_index, 0, item1)item2 = QTableWidgetItem(contents[1])self.ui.device_list.setItem(self.count_index, 1, item2)item3 = QTableWidgetItem(contents[2])self.ui.device_list.setItem(self.count_index, 2, item3)if len(contents) > 3:item4 = QTableWidgetItem(contents[3])self.ui.device_list.setItem(self.count_index, 3, item4)item5 = QTableWidgetItem(contents[4])self.ui.device_list.setItem(self.count_index, 4, item5)self.count_index += 1self.list_content.append([str(self.count_index + 1), contents[1], contents[2], contents[3], contents[4]])if content.startswith("cmdstr"):content = content.split("#")[1]self.ui.et_cmd_result.setText(content)passdef reset_ip_info(self):mac = self.ui.et_mac.text()ip = self.ui.et_ip.text()mask = self.ui.et_mask.text()gateway = self.ui.et_gateway.text()cmd = "modifyip-{}-{}-{}-{}".format(mac, ip, mask, gateway)print("reset ip param = " + cmd)self.socket.sendto(cmd.encode(), (self.MULTICAST_IP, self.MULTICAST_PORT))passdef reboot_device(self):mac = self.ui.et_mac.text()cmd = "reboot-{}".format(mac)print("reset ip param = " + cmd)self.socket.sendto(cmd.encode(), (self.MULTICAST_IP, self.MULTICAST_PORT))def exec_remote_cmd(self):mac = self.ui.et_mac.text()cmdstr = self.ui.et_remote_cmd.text()cmd = "exec#{}#{}#".format(mac, cmdstr)print("reset ip param = " + cmd)self.socket.sendto(cmd.encode(), (self.MULTICAST_IP, self.MULTICAST_PORT))if __name__ == '__main__':app = QApplication(sys.argv)w = QDeviceWidget()# w.setWindowState(Qt.WindowMaximized)w.show()sys.exit(app.exec_())

PyQt5 实现类似海康的设备搜索工具相关推荐

  1. pyQT5 学习使用 笔记 六 pyQt5+opencv 显示海康GIGE相机动态视频流

    opencv 读取 海康GIGE相机视频流 新项目中我们需要使用opencv读取海康威视的工业相机 MV-CA060-10GM 的视频流进行处理.那么首先我们要读取到相机的视频流,总所周知 openc ...

  2. 海康NVR设备RTSP协议转RTMP协议

    Title:海康NVR设备RTSP协议转RTMP协议 Date: 2017-10-17 Author: kagula 环境: [1]海康NVR设备  型号为DS-7808N-E2/8P [2]Cent ...

  3. 使用GB28181从海康NVR设备上获取实时视频

    本人现在已经不做音视频方向了,所以大家的一些疑问可能无法解答,相关资料基本都在下载链接中,希望可以帮助到大家. 正文: 最近在调研使用GB28181协议获取海康NVR设备上的实时视音频数据,真的是搞了 ...

  4. 海康摄像头设备对接——js接入自己系统的流程方法

    本次对接海康摄像头的系统前端采用的是VUE2-CLI,而海康硬件对接前端接入客服提供的是jq+原生版本,如果需要官方客服提供的对接demo(包含接口文档),可以下拉到底部附上了下载云盘资源, 接下来记 ...

  5. 海康NVR回放导出工具

    海康NVR的录像回放导出功能,迅速导出回放录像,10分钟1080p的录像导出约4秒钟 支持 7916等支持ocx在线播放的硬盘录像机,本资源仅用个人使用 要求打开basic认证,web端口协议,要求f ...

  6. 海康练习设备网络抓图错误代码29

    通过下载官网<设备网络SDK_Win64 V6.1.9.4_build20220412>进行练习时,遇到错误29. 通过ip连接摄像头时可以捕获图片.但是在通过连接录像机,在选择摄像头捕获 ...

  7. 宇视设备搜索工具_【聚焦】2019版中国纸箱行业供应商搜索引擎、全球瓦楞行业设备前沿技术报告将于4月瓦楞展现场首发!...

    点击上方蓝字"美印纸包装"一起玩耍呦 导语:2019年,上海美印文化传播有限公司成立10周年!10年来,美印文化始终秉承"诚信.求实.创意.共赢"的理念,致力于 ...

  8. 海康设备对接——高抛

    背景:由于工作问题,最近对接了海康的设备网络SDK,参考了SDK自带demo,还有一部分的网上博客,发现没有很全的,自己决定把自己开发的经验分享下 开发环境: 语言:Java 工具:idea 代码: ...

  9. LiveGBS国标流媒体平台-海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查

    GB/T28181国标流媒体平台海康大华宇视华为等硬件NVR摄像机注册到LiveGBS国标平台看不到设备的时候如何抓包及排查 1.设备注册后查看不到 1.1.是否是自带物联网卡的摄像头 1.2.关闭萤 ...

  10. 使用RTSP协议读海康设备的视频记录

    前言 作为一名搞CV的程序员,我们的输入通常就是视频流.我相信很多人都用的OpenCV提供的VideoCapture函数.就我现在的经验来说,该函数支持以下3种输入: # 方式1:填入索引,表示读取设 ...

最新文章

  1. 小白使用ubuntu杂记
  2. Why Go Is Not Good
  3. 开发了一款chrome扩展程序
  4. 解决g2o无法编译出g2o_viewer的问题
  5. webpack5+vue3搭建h5项目模板-(一)-基础配置
  6. 咸鱼CAD笔记—CAD基础操作
  7. java 坦克大战暂停_java实现坦克大战游戏
  8. 【python基础】windows下python环境版本更新教程
  9. Word另存为PDF时,将目录转换为PDF书签
  10. 如何应对阿里、美团、Oracle等大厂的面试刁难?
  11. 语音增强——DNN(深度神经网络)频谱映射
  12. pythondecode_Python decoder.decode方法代码示例
  13. CentOS6.5挂载大于2TB的磁盘使用parted和GPT类型
  14. 整理准备使用wireshark、拉米在线解密PDM5生成密钥网址
  15. 如何快速上手小程序开发(史上最全)
  16. 正则密码验证,包含数字、字母、特殊符号
  17. python按关键字爬取必应高清图片
  18. kaggle泰坦尼克号_Kaggle基础知识:泰坦尼克号比赛
  19. TensorFlow常用函数tf.where()、tf.gather()、tf.squeeze()详解!!
  20. Android系统架构原理

热门文章

  1. oracle区分度公式,区分度越大的列,作为主导列,索引效果越好?
  2. 《数据库原理》课程设计报告
  3. Ubuntu下局域网内+花生壳远程调试程序
  4. Monkey Test - 命令
  5. COGS 2507. 零食店
  6. 《机械基础》记忆性内容总结
  7. 数据治理:数据血缘关系分析
  8. 哈理工oj 1006 River Hopscotch
  9. 基于java的图书管理系统(英文)
  10. Web前端开发技术第三版课后练习答案