当前位置: 首页 > news >正文

Qt/C++开发监控GB28181系统/获取设备信息/设备配置参数/通道信息/设备状态

一、前言

设备注册成功后,接下来要做的就是获取设备的信息,尤其是通道信息,根据国标协议,永远只有两个层级,一个是设备,然后就是设备下面多个通道,设备编码在整个系统中唯一,通道编码在一个设备中唯一,如果不唯一,那就可能会产生冲突,其实是程序层面的冲突,硬件层面不冲突,这个不是mac地址这种唯一性,仅仅是软件层面的学号的约定。理论上来说可以重复,但是软件编写者一般不会这么要求,包括国标文档也要求不能重复,一旦重复的话,很多逻辑和操作不好处理。

获取设备信息一般会拿到设备的名称,通道的信息会拿到编码和名称,这些名称可能是中文,需要转码才能正常解析。设备状态用的很少,除非用户主动去获取,设备的配置参数用的也很少,甚至很多国标监控系统不会去做,我也是从国标文档中才找到的对应的指令,一般通过设备参数拿到超时时间和超时次数,然后服务端这边根据这个值来判断是否超时,而不是写死一个超时时间。

在实际应用现场,会发现有些NVR上电后,连接上服务端后传过来的通道信息不全,因为该NVR下面的设备还没有完全上线,尽管已经做了目录订阅功能,但是上线后未必会主动通知,需要定时查询通道信息才能获取到,所以做了个定时查询的机制,一旦查询到有新的设备变动,则发出信号,重新更新设备通道信息。

//获取设备信息:服务端-》设备端
MESSAGE sip:34020000001320000002@192.168.0.64:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.110:15060;branch=z3hG9bK9225da1aa0084d469ebc6f6694bf6dc8
From: <sip:34020000002000000001@192.168.0.110:15060>;tag=1019
To: <sip:34020000001320000002@192.168.0.64:5060>
Call-ID: 35d87369b8b34488867dfbfbea2e91c2
CSeq: 20 MESSAGE
User-Agent: wx_feiyangqingyun
Max-Forwards: 70
Content-Length: 154
Content-Type: application/MANSCDP+xml
Contact: <sip:34020000002000000001@192.168.0.110:15060><?xml version="1.0" encoding="GB2312"?>
<Query><CmdType>DeviceInfo</CmdType><SN>10019</SN><DeviceID>34020000001320000002</DeviceID>
</Query>//设备信息返回:设备端-》服务端
MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.64:5060;rport;branch=z9hG4bK2061567590
From: <sip:34020000001320000002@3402000000>;tag=415404928
To: <sip:34020000002000000001@3402000000>
Call-ID: 541248116
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: IP Camera
Content-Length:   324<?xml version="1.0" encoding="GB2312"?>
<Response>
<CmdType>DeviceInfo</CmdType>
<SN>10019</SN>
<DeviceID>34020000001320000002</DeviceID>
<Result>OK</Result>
<DeviceName>IP CAMERA</DeviceName>
<Manufacturer>Hikvision</Manufacturer>
<Model>DS-2CD5024EFWD</Model>
<Firmware>V5.5.85</Firmware>
<Channel>1</Channel>
</Response>//获取设备状态:服务端-》设备端
MESSAGE sip:34020000001320000002@192.168.0.64:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.110:15060;branch=z3hG9bK326223905abd4c258ab82e726ef93616
From: <sip:34020000002000000001@192.168.0.110:15060>;tag=1018
To: <sip:34020000001320000002@192.168.0.64:5060>
Call-ID: f69573838e564a4c8762a3465544037b
CSeq: 19 MESSAGE
User-Agent: wx_feiyangqingyun
Max-Forwards: 70
Content-Length: 156
Content-Type: application/MANSCDP+xml
Contact: <sip:34020000002000000001@192.168.0.110:15060><?xml version="1.0" encoding="GB2312"?>
<Query><CmdType>DeviceStatus</CmdType><SN>10018</SN><DeviceID>34020000001320000002</DeviceID>
</Query>//设备状态返回:设备端-》服务端
MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.64:5060;rport;branch=z9hG4bK1675009157
From: <sip:34020000001320000002@3402000000>;tag=2077654677
To: <sip:34020000002000000001@3402000000>
Call-ID: 1002341894
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: IP Camera
Content-Length:   427<?xml version="1.0" encoding="GB2312"?>
<Response>
<CmdType>DeviceStatus</CmdType>
<SN>10018</SN>
<DeviceID>34020000001320000002</DeviceID>
<Result>OK</Result>
<Online>ONLINE</Online>
<Status>OK</Status>
<DeviceTime>2025-04-22T11:14:23</DeviceTime>
<Alarmstatus Num="1">
<Item>
<DeviceID>34020000001340000001</DeviceID>
<DutyStatus>ONDUTY</DutyStatus>
</Item>
</Alarmstatus>
<Encode>ON</Encode>
<Record>ON</Record>
</Response>//获取设备参数:服务端-》设备端
MESSAGE sip:34020000001320000002@192.168.0.64:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.110:15060;branch=z3hG9bK8fdd12678d10455faf6141abf099c783
From: <sip:34020000002000000001@192.168.0.110:15060>;tag=1020
To: <sip:34020000001320000002@192.168.0.64:5060>
Call-ID: 207ffb519158414a926275c01512ee0f
CSeq: 21 MESSAGE
User-Agent: wx_feiyangqingyun
Max-Forwards: 70
Content-Length: 197
Content-Type: application/MANSCDP+xml
Contact: <sip:34020000002000000001@192.168.0.110:15060><?xml version="1.0" encoding="GB2312"?>
<Query><CmdType>ConfigDownload</CmdType><SN>10020</SN><DeviceID>34020000001320000002</DeviceID><ConfigType>BasicParam</ConfigType>
</Query>//设备参数返回:设备端-》服务端
MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.64:5060;rport;branch=z9hG4bK626480488
From: <sip:34020000001320000002@3402000000>;tag=1196765638
To: <sip:34020000002000000001@3402000000>
Call-ID: 1421185166
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: IP Camera
Content-Length:   608<?xml version="1.0" encoding="GB2312"?>
<Response>
<CmdType>ConfigDownload</CmdType>
<SN>10020</SN>
<DeviceID>34020000001320000002</DeviceID>
<Result>OK</Result>
<BasicParam>
<Name>IP CAMERA</Name>
<DeviceID>34020000001320000002</DeviceID>
<SIPServerID>34020000002000000001</SIPServerID>
<SIPServerIP>192.168.0.110</SIPServerIP>
<SIPServerPort>15060</SIPServerPort>
<DomainName>3402000000</DomainName>
<Expiration>3600</Expiration>
<Password>12345678</Password>
<HeartBeatInterval>30</HeartBeatInterval>
<HeartBeatCount>3</HeartBeatCount>
<PositionCapability>0</PositionCapability>
</BasicParam>
</Response>//获取通道信息:服务端-》设备端
MESSAGE sip:34020000001320000002@192.168.0.64:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.110:15060;branch=z3hG9bKca6cdd79b54b4a898a08a027df9ee74f
From: <sip:34020000002000000001@192.168.0.110:15060>;tag=1021
To: <sip:34020000001320000002@192.168.0.64:5060>
Call-ID: 73a10bfd47944564aebc9f383d8d5dbc
CSeq: 22 MESSAGE
User-Agent: wx_feiyangqingyun
Max-Forwards: 70
Content-Length: 151
Content-Type: application/MANSCDP+xml
Contact: <sip:34020000002000000001@192.168.0.110:15060><?xml version="1.0" encoding="GB2312"?>
<Query><CmdType>Catalog</CmdType><SN>10021</SN><DeviceID>34020000001320000002</DeviceID>
</Query>//通道信息返回:设备端-》服务端
MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.64:5060;rport;branch=z9hG4bK759035473
From: <sip:34020000001320000002@3402000000>;tag=417631013
To: <sip:34020000002000000001@3402000000>
Call-ID: 438658409
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: IP Camera
Content-Length:   963<?xml version="1.0" encoding="GB2312"?>
<Response>
<CmdType>Catalog</CmdType>
<SN>10021</SN>
<DeviceID>34020000001320000002</DeviceID>
<SumNum>2</SumNum>
<DeviceList Num="2">
<Item>
<DeviceID>34020000001310000001</DeviceID>
<Name>hikangname</Name>
<Manufacturer>Hikvision</Manufacturer>
<Model>IP Camera</Model>
<Owner>Owner</Owner>
<CivilCode>3402000000</CivilCode>
<Address>Address</Address>
<Parental>0</Parental>
<ParentID>34020000002000000001</ParentID>
<SafetyWay>0</SafetyWay>
<RegisterWay>1</RegisterWay>
<Secrecy>0</Secrecy>
<Status>ON</Status>
</Item>
<Item>
<DeviceID>34020000001340000001</DeviceID>
<Name></Name>
<Manufacturer>Hikvision</Manufacturer>
<Model>AlarmIn</Model>
<Owner>Owner</Owner>
<CivilCode>3402000000</CivilCode>
<Address>Address</Address>
<Parental>0</Parental>
<ParentID>34020000001320000002</ParentID>
<SafetyWay>0</SafetyWay>
<RegisterWay>1</RegisterWay>
<Secrecy>0</Secrecy>
<Status>ON</Status>
</Item>
</DeviceList>
</Response>

二、效果图

在这里插入图片描述

三、相关地址

  1. 国内站点:https://gitee.com/feiyangqingyun
  2. 国际站点:https://github.com/feiyangqingyun
  3. 个人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 文件地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_gb28181。

四、功能特点

  1. 支持设备注册、注销、心跳、校时、注册认证、注销认证等。
  2. 设备上线后可以手动获取设备状态、设备信息、配置信息、预置位信息等。
  3. 设备上线后自动获取设备通道信息,包括中文通道名称。识别到通道上线离线变化,会重新获取该设备的所有通道信息。
  4. 支持视频点播,可以分别点播主码流和子码流,内置rtp解包线程,解包后发给视频播放组件解码播放。
  5. 每个设备每个通道支持点播多个视频,通过ssrc区分,支持共用端口和不同端口收流。
  6. 支持对某个设备下面所有通道、某个通道、某个通道对应的某个流分别关闭。
  7. 支持录像文件查询和回放,回放控制支持暂停播放、继续播放、倍速播放、切换播放进度。
  8. 支持录像文件下载,支持倍速比如8倍速下载,可同时多线程批量下载。
  9. 回放和下载同时支持IPC和NVR,比如摄像头自带的SD存储卡录像文件回放,NVR上的硬盘录像文件回放。
  10. 支持云台控制,向上、向下、向左、向右、左上、右上、左下、右下方位移动,镜头放大缩小,光圈放大缩小,镜头聚焦放焦。
  11. 支持预置位信息的查询、调用、添加、修改、删除等操作。
  12. 自动目录订阅功能,通道上线下线都有对应的信号通知。
  13. 内置定时读取通道信息机制,以保证通道信息是最新的,比如有些NVR是不断更新的通道信息。
  14. 支持警情订阅,各种警情事件比如运动目标检测报警、入侵检测报警、徘徊检测报警等自动上报。
  15. 国标服务同时支持udp和tcp方式,可选只监听一种或者两种都监听,tcp方式自动处理粘包问题。
  16. 国标拉流同时支持udp、tcp被动、tcp主动三种方式,每个通道都可以自由选择何种拉流方式。
  17. 内置拉流端口池,每次拉流从中取出一个,关闭流自动回收端口号,重复利用。
  18. 收流端口自动纠错,自动跳过被占用的端口,不会出现端口占用导致收流失败的情况。
  19. 视频播放自适应硬解码,极低资源占用,实时性极好,带悬浮条显示视频流信息,可以直接在悬浮条单击按钮保存录像文件到本地。
  20. 支持几千路国标消息交互并发,实时视频流支持64路同时显示,可以拓展更多路数。
  21. 支持阿里云等云服务器,可以分别设置内网监听地址和外网访问地址,一般云服务器上是监听地址用内网,对外访问用外网地址。
  22. 支持视频分发,也就是推流,视频通道打开后可以自动推流到流媒体服务器,其他需要的地方拉流即可,支持rtsp、rtmp、hls、webrtc等方式拉流。
  23. 同时支持gb28181-2011、gb28181-2016、gb28181-2022以及后续可能的所有协议版本。
  24. SIP解析和交互采用纯Qt底层代码实现,udp/tcp通信交互,祖传原创代码解析,不依赖任何第三方。
  25. 代码量少,gb28181交互部分共几千行代码,注释详细,接口友好,使用极其简单,提供非常详细的使用示例。
  26. 支持海康、大华、宇视、华为、天地伟业等所有国标设备。
  27. 支持所有Qt版本和编译器以及操作系统,包括但不限于win、linux、mac、android、嵌入式linux、树莓派香橙派、国产os等。

五、相关代码

void GB28181Parse::parseConfigDownload(GB28181Info info, QList<GB28181Device> &devices)
{//找到对应的设备GB28181Device device = GB28181Helper::getDevice(info.deviceId, devices);if (device.deviceId.isEmpty()) {return;}QDomNodeList nodes = info.bodyNodes;for (int i = 0; i < nodes.count(); ++i) {QDomNode node = nodes.at(i);if (!node.isElement()) {continue;}QDomElement element = node.toElement();QString name = element.tagName();QString text = element.text();if (name == "Expiration") {device.expiration = text.toInt();} else if (name == "HeartBeatInterval") {device.heartBeatInterval = text.toInt();} else if (name == "HeartBeatCount") {device.heartBeatCount = text.toInt();}}//更新设备信息devices[devices.indexOf(device)] = device;
}//具体格式规范在gb28181-2016文档的第68页
GB28181Event GB28181Parse::parseAlarmInfo(GB28181Info info)
{GB28181Event event;event.deviceId = info.deviceId;event.channelId = info.bodyAttr["DeviceID"];event.alarmPriority = info.bodyAttr["AlarmPriority"].toInt();event.alarmMethod = info.bodyAttr["AlarmMethod"].toInt();event.alarmInfo = info.bodyAttr["AlarmInfo"].toInt();event.alarmType = info.bodyAttr["Info"].toInt();event.alarmTime = info.bodyAttr["AlarmTime"];event.alarmDescription = info.bodyAttr["AlarmDescription"];return event;
}GB28181Status GB28181Parse::parseMediaStatus(GB28181Info info, const QList<GB28181Device> &devices)
{//这里需要根据主机信息去查询设备/info.deviceId很可能是通道编号而不是设备编号GB28181Device device = GB28181Helper::getDevice(info.deviceIp, info.devicePort, devices);GB28181Status status;status.deviceId = device.deviceId;status.channelId = info.bodyAttr["DeviceID"];//121-播放完成/122-播放中断/213-设备报警status.notifyType = info.bodyAttr["NotifyType"].toInt();//有些设备传过来的xml数据中的是设备编号而不是通道编号if (status.channelId == status.deviceId) {status.channelId = info.deviceId;}//每个通道可能有多个流/需要找到具体哪个流QStringList ssrcs, froms, tos, callIds;GB28181Helper::getChannel(device, status.channelId, "", ssrcs, froms, tos, callIds, false);QString callId = info.attr["Call-ID"];int index = callIds.indexOf(callId);if (index >= 0) {status.ssrc = ssrcs.at(index);}return status;
}int GB28181Parse::parseDeviceList(GB28181Info info, const QString &deviceId, QList<GB28181Channel> &channels)
{QDomNodeList nodes = info.bodyNodes;for (int i = 0; i < nodes.count(); ++i) {QDomNode node = nodes.at(i);if (!node.isElement()) {continue;}GB28181Channel channel;channel.parentId = deviceId;QDomNodeList list = node.childNodes();for (int j = 0; j < list.count(); ++j) {QDomElement element = list.at(j).toElement();QString name = element.tagName();QString text = element.text();channel.attr.insert(name, text);if (name == "DeviceID") {channel.channelId = text;} else if (name == "Name") {channel.channelName = text;} else if (name == "ParentID") {//部分设备传回来的这里的编号其实并不是父编号//channel.parentId = text;} else if (name == "Status") {}}//补全默认名称if (channel.channelName.isEmpty()) {channel.channelName = "xxx";}channels << channel;}return info.bodyAttr["SumNum"].toInt();
}

相关文章:

Qt/C++开发监控GB28181系统/获取设备信息/设备配置参数/通道信息/设备状态

一、前言 设备注册成功后&#xff0c;接下来要做的就是获取设备的信息&#xff0c;尤其是通道信息&#xff0c;根据国标协议&#xff0c;永远只有两个层级&#xff0c;一个是设备&#xff0c;然后就是设备下面多个通道&#xff0c;设备编码在整个系统中唯一&#xff0c;通道编…...

Linux系统基础:基础指令简介(网络概念部分)

简介&#xff1a;Linux 是一种开源的类 Unix 操作系统内核&#xff0c;由 Linus Torvalds 于 1991 年首次发布。经过多年发展&#xff0c;它已成为服务器、嵌入式设备和个人计算机领域的重要操作系统。 网络基础概念 初始协议 简单来说&#xff0c;协议是一种约定&#xff0…...

labview项目文件架构

为了使 LabVIEW 项目更具可扩展性和易于维护&#xff0c;合理规划和设计项目文件结构是非常重要的。 以下是一些基于行业经验和最佳实践的建议&#xff1a; 1. ### 文件夹层次划分 将不同的功能模块分开存储在一个清晰的分层目录结构中是一个常见的做法。通常情况下&#xff…...

nuxt项目中引入并配置 iview

安装iview npm install iview --save注&#xff1a;想要加入其它的配置&#xff0c;可以在 nuxt.config.js 的 plugins 配置项中加入&#xff0c;同时在 plugins 文件夹下加入引入逻辑。 在nuxt.config.js文件中写&#xff1a; {src: ~plugins/iview, ssr: true}同时新建 plugi…...

Origin绘图操作:点线图符号显示不全解决方法

一、问题说明 在用origin绘制点线图时&#xff0c;图表刻度线处的点符号显示不完全&#xff0c;如图所示&#xff1a; 二、解决方法 方法一&#xff1a;调整坐标轴刻度&#xff0c;使其能够显示全部数据点。 方法二&#xff1a;有时为了图表美观&#xff0c;则不对坐标轴刻…...

【进程与线程】

文章目录 一、实验目的二、实验内容与设计思想实验内容设计思路 三、实验代码实现四、总结 一、实验目的 1.深刻理解进程和线程的概念&#xff0c;掌握线程与进程在组成成分上的差别&#xff1b; 2.进一步认识并发执行的实质。 二、实验内容与设计思想 实验内容 用pipe()创…...

项目实战-飞机大战【补档】

和项目实战-贪吃蛇大作战【补档】-CSDN博客一样&#xff0c;这也是一个我在大一和网友完成的项目的补档。Dont waste your youth—time flies. 目录 1.工具&环境 2.项目简介 3.需求文档 4.流程图 5.产品原型图 6.可行性分析 7.源代码 8.实战效果 ​编辑 9.心得…...

算法基础学习|02归并排序——分治

一、思路 &#xff08;1&#xff09;确定分界点&#xff1a;mid(lr)/2 ——这里和快排不同 &#xff08;2&#xff09;递归排序&#xff08;left right&#xff09; &#xff08;3&#xff09;归并——合二为一 时间复杂度nlogn 二、题目练习 三、模板 归并排序 …...

测试基础笔记第十六天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、UI自动化介绍1.认识UI自动化测试2.实施UI自动化测试前置条件3.UI自动化测试执行时机4.UI自动化测试核心作用和劣势 二、认识Web自动化测试工具-Selenium021.Sel…...

Android项目中使用ComposeUI

首先确认项目环境kotlin版本&#xff0c;以下是本机的版本 使用命令 ./gradlew -version 这里kotlin 版本是1.5.31 然后查看build.gradle sdk版本 这里是32 属于低版本 然后需要添加以下配置 buildFeatures {compose true}composeOptions {kotlinCompilerExtensionVersio…...

springboot中有关数据库信息转换的处理

现代项目一般都是前后端分离的&#xff0c;前端只负责展示数据&#xff0c;不负责对数据处理&#xff0c;所以所有数据处理工作都由后端进行 比如在仿京东中的status&#xff0c;审核信息展示&#xff0c;数据库中是以0/1显示&#xff0c;但是前端需要以"审核/未审核&quo…...

HHsuite同源序列搜索数据库构建

HHsuite 可用的数据库格式简介 HHsuite 是用于蛋白质序列比对和同源性检测的工具套件,它使用特定的数据库格式以实现高效的数据存储和快速的检索。HHsuite 常用的数据库格式主要基于 FFINDEX(Flat-File Index),这是一种简单而高效的文件索引系统,它将数据文件(如蛋白质序…...

大模型推理:Qwen3 32B vLLM Docker本地部署

Qwen3基础知识 此次Qwen3开源8个模型&#xff08;MOE架构&#xff1a;Qwen3-235B-A22B、Qwen3-30B-A3B&#xff0c;Dense架构&#xff1a;Qwen3 0.6B/1.7B/4B/8B/14B/32B&#xff09;&#xff0c;新版本的Qwen3特性包括&#xff1a; 支持混合思维模式&#xff0c;即推理/非推…...

第十六届蓝桥杯 2025 C/C++B组 第二轮省赛 全部题解(未完结)

目录 前言&#xff1a; 试题A&#xff1a;密密摆放 试题B&#xff1a;脉冲强度之和 试题C&#xff1a;25之和 试题D&#xff1a;旗帜 试题H&#xff1a;破解信息 前言&#xff1a; 这是我后续刷到的第二轮省赛的题目&#xff0c;我自己也做了一下&#xff0c;和第一轮省赛…...

域名转移:什么是转移码/EPP码/授权码?

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…...

Android 系统发展史

Android 1.0&#xff1a;2008年9月 全球第一台安卓设备是 HTC Dream Google地图、YouTube、HTML浏览器、Gmail、即使消息、短信、彩信、日历等 Android Market&#xff08;应用程序商店&#xff09; Android 1.1&#xff1a;2009年2月&#xff08;Petit Four 花色小蛋糕&am…...

Python中的defaultdict方法

文章目录 核心特点基本语法常见使用场景1. 分组数据&#xff08;默认值为列表&#xff09;2. 计数&#xff08;默认值为整数&#xff09;3. 集合操作&#xff08;默认值为集合&#xff09;4. 嵌套字典 注意事项与普通字典对比总结1. 键&#xff08;Key&#xff09;的类型2. 值&…...

Android启动应用时屏蔽RecyclerView滑动,延时后再允许滑动,Kotlin

Android启动应用时屏蔽RecyclerView滑动&#xff0c;延时后再允许滑动&#xff0c;Kotlin var bCanScrollVertically falselifecycleScope.launch(Dispatchers.Default) {repeatOnLifecycle(Lifecycle.State.CREATED) {Log.d(TAG, "Lifecycle.State.CREATED")delay(…...

2025运维工程师面试题1(答案在后一张)

一、逻辑思维能力考核&#xff1a; 问题1&#xff1a; 3个人去投宿&#xff0c;一晚30元三个人每人掏了10元凑够30元交给了老板后来老板说今天优惠只要25元就够了&#xff0c;拿出5元命令服务生退还给他们&#xff0c;服务生偷偷藏起了2元&#xff0c;然后&#xff0c;把剩下…...

在网页中使用【LaTeX 数学公式块】的完整步骤总结

以下是在网页中使用 LaTeX 数学公式块的完整步骤总结&#xff0c;记录如何让网页正确渲染 LaTeX 数学表达式&#xff08;如 \(H(X) -\sum p(x) \log p(x)\) 这样的公式&#xff09;&#xff1a; ✅ 使用 LaTeX 数学公式块的完整步骤&#xff08;以 KaTeX 为例&#xff09; &am…...

新人销售如何找精准客户?

深入了解自身产品或服务。 清晰掌握产品优势、应用场景和解决的问题&#xff0c;比如销售办公软件&#xff0c;要熟知其提升办公效率的具体功能&#xff0c;以此定位需求客户。 利用社交媒体平台。 像领英可完善资料&#xff0c;加入行业群组分享内容吸引潜在客户&#xff1…...

【Unity】使用Socket建立客户端和服务端并进行通信的例子

Socket服务端: using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; public class SocketServer { public static Socket listenSocket;//监听Socket public static List<Socket>…...

为什么要学习《易经》?

《易经》精华解读&#xff1a;变易之道与人生智慧 《易经》&#xff08;《周易》&#xff09;是中国最古老的经典之一&#xff0c;被誉为“群经之首&#xff0c;大道之源”。它不仅是占卜之书&#xff0c;更是一部哲学经典&#xff0c;揭示了宇宙运行的规律和人生处世的智慧。…...

13.继承、重载、重写、多态、抽象类、接口、final、Static的学习

一、继承 继承&#xff1a;你继承谁你就是谁&#xff0c;继承是一种严格的父子关系 &#xff08;在父类里面抽取的属性和方法一定是所有子类所共有&#xff09; &#xff08;Student继承Person&#xff0c;那么Student就是人&#xff09; UML: 类图&#xff08;描述类和类之间的…...

SpringBoot Actuator未授权访问漏洞的全面解析与解决方案

引言 SpringBoot Actuator 作为应用监控与管理的核心组件,为开发者提供了丰富的系统自省和运维能力。然而,其默认配置中可能存在的未授权访问漏洞,已成为企业安全防护的潜在风险。本文将从漏洞原理、影响范围、检测方法到解决方案,系统性地剖析该问题,并提供覆盖开发、运维…...

使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(1)

背景 用户在WEB页面上点击按钮&#xff0c;服务端需要执行一系列操作&#xff0c;该操作系列步骤较多且耗时长&#xff0c;为了更好的给用户浏览体验&#xff0c;需要在每进行一个步骤由服务端推送消息给客户端&#xff08;浏览器&#xff09;&#xff0c;避免一个长时间的操作…...

一网统管建设组织保障分工常见表

在 “一网统管” 建设进程中,强有力的组织保障体系与各业务部门间的紧密分工协作是确保建设成效的关键。 从组织保障层面来看,需建立专门的 “一网统管” 建设领导小组,由政府高层领导担任组长,各关键业务部门负责人作为组员,以此强化对整体建设工作的统筹规划与组…...

JVM | CMS垃圾收集器详解

目录 CMS垃圾回收器简介 为什么CMS图中初始标记的阶段是单线程&#xff1f;为啥不多线程&#xff1f;当然现在默认多线程了。 CMS的两种模式与一种特殊策略 Backgroud CMS 记忆集 卡表 ForeGroud CMS CMS的标记压缩算法 三色标记 &#xff08;便于理解而被后人提出&am…...

android开发中的多线程、数据存储同步功能实现方案和应用场景

在Android开发中&#xff0c;多线程、数据存储与同步功能有多种实现方案&#xff0c;以下是详细介绍及其应用场景&#xff1a; 多线程 实现方案&#xff1a; Thread类与Runnable接口&#xff1a;通过继承Thread类并重写run方法&#xff0c;或实现Runnable接口并将其传入Threa…...

【C++初阶】--- 模板进阶

1.非类型模板参数 • 模板参数分类类型形参与非类型形参。 • 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 • 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参…...

数据库所有知识

# 第一章 数据库-理论基础 ## 1.1 什么是数据库 数据&#xff1a; 描述事物的符号记录&#xff0c; 可以是数字、 文字、图形、图像、声音、语言等&#xff0c;数据有多种形式&#xff0c;它们都可以经过数字化后存入计算机。 数据库&#xff1a; 存储数据的仓库&#xff0c…...

docker部署的Nextcloud,处于维护模式,如何解决

Nextcloud 在升级后卡在维护模式&#xff0c;以下是针对 Docker 部署的解决方案&#xff1a; 1. 通过 OCC 命令强制关闭维护模式 进入 Nextcloud 容器内部执行命令&#xff1a; # 替换 nextcloud 为你的容器名称 docker exec -it --user www-data nextcloud php occ maintena…...

mongoose插入文档,字段类型, 字段验证, 删除文档,更新文档,读取文档,查询文档的条件控制 ,字段筛选,数据排序,数据截取

、Mongoose 中与 文档操作&#xff08;插入、查询、更新、删除&#xff09;及其相关功能&#xff08;字段类型、验证、条件筛选、排序、分页等&#xff09;相关示例&#xff1a; &#x1f4cb; 一、字段类型定义&#xff08;Schema Types&#xff09; const mongoose require…...

源码编译安装LAMP

一&#xff1a;LAMP概述 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词&#xff0c;具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、PHP…...

C++每日训练 Day 18:构建响应式表单与数据验证(初学者友好)

&#x1f4d8; 本篇目标&#xff1a;在前几日协程与事件驱动机制基础上&#xff0c;构建一个响应式表单系统&#xff0c;实现用户输入的异步验证与反馈。通过协程挂起/恢复机制&#xff0c;简化异步逻辑&#xff0c;提升代码可读性。 &#x1f501; 回顾 Day 17&#xff1a;响应…...

Linux环境变量以及进程虚拟地址原理

目录 一、介绍进程优先级 1.什么是优先级 2.为什么会有优先级 3.Linux中的优先级是怎么确定的 1&#xff09;查看Linux中的优先级 2&#xff09;计算优先级和更改优先级 二、环境变量 1.什么是环境变量 2.环境变量有什么作用 3.环境变量怎么做到的 1&#xff09;查看系统已有的…...

基于非递归求解的汉诺塔超级计算机堆栈与数据区设计方案

基于非递归求解的汉诺塔超级计算机堆栈与数据区设计方案 一、设计背景与目标 汉诺塔问题存在非递归直接求解方法&#xff0c;相较于递归法具有明确移动规律和潜在性能优势。本设计旨在利用非递归求解规律&#xff0c;优化汉诺塔超级计算机的堆栈与数据区结构&#xff0c;降低…...

【Linux应用】在PC的Linux环境下通过chroot运行ARM虚拟机镜像img文件(需要依赖qemu-aarch64、不需要重新安装iso)

【Linux应用】在PC的Linux环境下通过chroot运行ARM虚拟机镜像img文件&#xff08;需要依赖qemu-aarch64、不需要重新安装iso&#xff09; qemu提供了运行ARM虚拟机的方法 具体的操作方式就是建立一个硬盘img 然后通过iso安装到img 最后再运行img即可 这种方式教程很多 很简单 …...

CISC与RISC详解:定义、区别及典型处理器

一、CISC&#xff08;复杂指令集计算机&#xff09; Complex Instruction Set Computer 核心思想&#xff1a;通过设计复杂的指令&#xff0c;减少程序指令数量&#xff0c;以硬件复杂度换取编程便利性。 主要特点&#xff1a; 指令复杂度高&#xff1a; 单条指令可完成多步操…...

数据库中DDL、DML、DCL的区别是什么?

数据库中DDL、DML、DCL的区别是什么&#xff1f; 在数据库的使用过程中&#xff0c;SQL&#xff08;结构化查询语言&#xff09;常常被用来执行不同的操作&#xff0c;主要分为三类&#xff1a;DDL&#xff08;数据定义语言&#xff09;、DML&#xff08;数据操纵语言&#xf…...

【东枫电子】AI-RAN:人工智能 - 无线接入网络

太原市东枫电子科技有限公司&#xff0c;翻译 文章目录 1.概述1.1 什么是AI-RAN&#xff1f;1.2 为什么是AI-RAN&#xff1f;1.3 AI-RAN有哪些好处&#xff1f;1.4 为什么 AI-RAN 会给通信服务提供商 (CoSP) 带来变革&#xff1f;1.5 AIRAN 的构建模块是什么&#xff1f; 2. 参…...

实习技能记录【5】-----项目中消息传递到ui层的方法

代码 while (1){osEvent evt;evt osMailGet(ui_msg_mailbox, 0);if (evt.status osEventMail){UI_MSG_APP_T *msg (UI_MSG_APP_T *)evt.value.p;if (msg->cmd_type CMD_TYPE_INNER){if (msg->cmd_code CMD_CODE_INNER_REFRESH_NOW){lv_obj_invalidate(lv_scr_act()…...

4.29【Q】paraCompute

还是同样的要求&#xff0c;我要写实验报告&#xff0c;如何组织描述运行时间&#xff0c;加速比&#xff0c;效率等随数据规模&#xff0c;进程数&#xff0c;线程数变化的语言和逻辑&#xff0c;从而显得不冗余和精简&#xff1f;为我生成合理排版&#xff0c;布局的文字&…...

什么是布林带?

什么是布林带&#xff1f; 布林带是约翰布林格在20世纪80年代开发的一种广泛使用的技术分析工具。布林带由价格图表上的三条线组成&#xff1a;中轨、上轨和下轨。中轨通常是20天简单移动平均线&#xff08;SMA&#xff09;&#xff0c;代表资产在此期间的平均价格。上轨和下轨…...

爬虫学习笔记(四)---request入门

例1 例1&#xff1a;写一个爬取百度搜索页面的程序&#xff0c;以搜索一个喜欢的明星为例&#xff08;如在搜索框中输入周杰伦&#xff09; 正常搜索 页面 爬虫思路&#xff1a; 1.用一个query变量&#xff0c;在控制台输入的方式更加灵活的输入想爬取的明星的百度搜索页面 …...

JSON配置文件格式全解析与多语言实战指南

JSON配置文件格式全解析与多语言实战指南 摘要 本文全面解析JSON配置文件的核心语法规范&#xff0c;深入探讨数据类型、转义机制及JSON5扩展特性&#xff0c;提供JavaScript/Python/Java等多语言解析方案。通过典型应用场景案例演示JSON的最佳实践&#xff0c;帮助开发者高效…...

JavaScript 中的类型转换机制?

一、类型转换的两种模式 1. 显式转换&#xff08;手动翻译&#xff09; 你主动告诉 JavaScript 如何转换类型&#xff0c;比如&#xff1a; let num Number("123"); // 字符串 → 数字&#xff1a;123 let str String(123); // 数字 → 字符串&#xff1a;&qu…...

【分享】音频音乐剪辑[特殊字符]人声分离伴奏提取[特殊字符]拼接合并

音频音乐剪辑是一款专业的剪辑软件。在剪辑过程中&#xff0c;它可以对音频进行拼接合成、音乐裁剪、变调变速、格式转换&#xff0c;同时音频音乐剪辑还是一款支持高清录音、音频降噪等众多功能于一体的音频制作软件。 【应用名称】&#xff1a;音频剪辑 【应用版本】&#xf…...

关于 const a 定义的数据 与 其渲染 的问题。即通过const定义的常量,会不会导致渲染不及时。

情况1 &#xff08;同2、4结论一致&#xff09; 定义&#xff1a;使用子hook&#xff0c;将数据 const a 【对stateX的一系列操作】 封存到子hook里。并return出去。结果&#xff1a;此种情况不影响实时渲染。缺点&#xff1a;只要stateX变更&#xff0c;一定展示c的最新数据…...

开源Kotlin从零单排0基础完美入门教程

&#x1f680; Kotlin 从零单排 一个让你欲罢不能的 Kotlin 入门教程&#xff01; 教程仓库地址 &#x1f44b; Hey&#xff0c;你好啊&#xff01; 如果你&#xff1a; &#x1f914; 听说 Kotlin 很香&#xff0c;但不知道香在哪&#xff1f;&#x1f605; Java 写得头大&a…...