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

国标云台控制状态

1.基本概念

    国标联网系统的信息传输、交换、控制方面的都是通过SIP服务器负责通讯得,SIP负责信令流逐级转发。其中最重要的一部分就是和摄像机进行信令交互。

    像安全注册、实时视音频点播、历史视音频的回放等应用的会话控制采用IETFRFC3261规定的Register、Invite等请求和响应方法实现,历史视音频回放控制采用SIP扩展协议IETFRFC2976 规定的INFO方法实现,前端设备控制、信息査询、报警事件通知和分发等应用的会话控制采用SIP 扩展协议IETFRFC3428规定的Message方法实现,SIP 消息应支持基于UDP和TCP的传输互联的系统平台及设备不应向对方的SIP端口发送应用无关消息,避免应用无关消息占用系统平台及设备的SIP消息处理资源。本标准基于IETFRFC3261等基础性协议,进行监控联网各项业务功能的规定,本标准中各项功能如有特殊规定应遵循本标准,否则应遵循IETFRFC3261等引用协议。

1.1前端设备控制协议格式

字节字节1字节2字节3字节4字节5字节6字节7字节8
含义A5H组合码1地址指令数据1数据2组合码2校验码

各字节定义如下:

  • 字节1:令的首字节为 A5H.
  • 字节2:组合码高位是版本信息,低4位是校验位。本标准的版本号是1.0,版本信息为 0H。校验位=(享节1的高4位十字节1的低4位十字节2的高4位)%16
  • 字节3:地址的低8亿
  • 字节 4:指令码。
  • 字节5、6:数据1和数据2。
  • 字节7:组合码2,高4位是数据3,低4位是地址的高4位;在后续叙述中,没有特别指明的高4位,表示该4位与所指定的功能无关。
  • 字节8:校验码,为前面的第1~7字节的算术和的低8位,即算术和对256取模后的结果字节8=(字节1十字节2字节3十字节4十字节5+字节6字节7)%256。地址范围000H~FFFH(即0~4095),其中000H地址作为广播地址。注:前端设备控制中,不使用字节3和字节7的低4位地址码,使用前端设备控制消息体中的(DeviceID)统一编码标识控制的前端设备。

1.2ptz指令

     PTZ指令见表 A.4,其中Bit5和 Bit4不应同时为1,Bit3和Bit2不应同时为1;Bitl和 Bit0 不应同时为1。镜头变倍指令、云台上下指令、云台左右指令三者可以组合。

1.3 FI指令

   FI指令见表A.6,其中 Bit3和Bit2不应同时为1,Bit1和Bit0不应同时为1;光圈控制和聚焦控制的指令可以组合。

2.前端代码实现

vue template

<template><div id="ptz-control" v-if="showDialog" v-on:mouseover="drag('ptz-control','wonderMain',true)" ref="videoCloudCheck" :class="[className]"><div class="video-cloud-check-content" ><div class="win-dialog-title"><span class="ptztab" :class="{'active': currentTab=='ptz'}" @click="changeTab('ptz')">云台控制</span><span v-show="isShowPresetAndCruise"><span class="vline"></span><span class="ptztab" :class="{'active': currentTab=='preset'}" @click="changeTab('preset')">预置位</span><span class="vline"></span><span class="ptztab" :class="{'active': currentTab=='cruise'}" @click="changeTab('cruise')">巡航</span></span><span class="close iconfont i-f_a_close" @click="close"></span></div><div class="win-dialog-neck"></div><!--云台控制开始--><div class="view ptz" v-if="currentTab=='ptz'"><div class="dir-control"><span class="cmd vertical dir right" @mousedown="ptzCtrlMouseDown(0)" @mouseup="ptzCtrlMouseUp(0)" v-btnPer="'CAMERA_ptzCtrl'"></span><span class="cmd dir rightup" @mousedown="ptzCtrlMouseDown(1)" @mouseup="ptzCtrlMouseUp(1)" v-btnPer="'CAMERA_ptzCtrl'"></span><span class="cmd dir up" @mousedown="ptzCtrlMouseDown(2)" @mouseup="ptzCtrlMouseUp(2)" v-btnPer="'CAMERA_ptzCtrl'"></span><span class="cmd dir leftup" @mousedown="ptzCtrlMouseDown(3)" @mouseup="ptzCtrlMouseUp(3)" v-btnPer="'CAMERA_ptzCtrl'"></span><span class="cmd vertical dir left" @mousedown="ptzCtrlMouseDown(4)" @mouseup="ptzCtrlMouseUp(4)" v-btnPer="'CAMERA_ptzCtrl'"></span><span class="cmd dir leftdown" @mousedown="ptzCtrlMouseDown(5)" @mouseup="ptzCtrlMouseUp(5)" v-btnPer="'CAMERA_ptzCtrl'"></span><span class="cmd dir down" @mousedown="ptzCtrlMouseDown(6)" @mouseup="ptzCtrlMouseUp(6)" v-btnPer="'CAMERA_ptzCtrl'"></span><span class="cmd dir rightdown" @mousedown="ptzCtrlMouseDown(7)" @mouseup="ptzCtrlMouseUp(7)" v-btnPer="'CAMERA_ptzCtrl'"></span><span class="cmd zoom up adjust" title="焦距增大" @mousedown="ptzCtrlMouseDown(11, 1)" @mouseup="ptzCtrlMouseUp(11, 1)" v-btnPer="'CAMERA_ptzCtrl'"></span><span class="cmd zoom down adjust" title="焦距减小" @mousedown="ptzCtrlMouseDown(11, -1)" @mouseup="ptzCtrlMouseUp(11, -1)" v-btnPer="'CAMERA_ptzCtrl'"></span><span class="cmd focus up adjust" title="焦点增大" @mousedown="ptzCtrlMouseDown(12, 1)" @mouseup="ptzCtrlMouseUp(12, 1)" v-btnPer="'CAMERA_ptzCtrl'"></span><span class="cmd focus down adjust" title="焦点减小" @mousedown="ptzCtrlMouseDown(12, -1)" @mouseup="ptzCtrlMouseUp(12, -1)" v-btnPer="'CAMERA_ptzCtrl'"></span><span class="cmd iris up adjust" title="光圈增大" @mousedown="ptzCtrlMouseDown(10, 1)" @mouseup="ptzCtrlMouseUp(10, 1)" v-btnPer="'CAMERA_ptzCtrl'"></span><span class="cmd iris down adjust" title="光圈减小" @mousedown="ptzCtrlMouseDown(10, -1)" @mouseup="ptzCtrlMouseUp(10, -1)" v-btnPer="'CAMERA_ptzCtrl'"></span></div><div class="ptz-speed"><div class="control-speed"><span class="item">控制速度:</span><div class="speedSlider"><xui-slider v-model="speed" :options="sliderOptions" @change="changeHandle" v-btnPer="'CAMERA_ptzCtrl'"></xui-slider></div></div><div class="equipment"><span class="choose"><xui-select v-model="equip" :disabled="!isOn" :options="equipOptions" @change="changeSelect" v-btnPer="'CAMERA_ptzCtrl'"></xui-select></span><span class="switch"><label>开关:</label><xui-switch v-model="isOn" class="switch-input" size="normal" @change="changeSwitch" v-btnPer="'CAMERA_ptzCtrl'"></xui-switch></span></div></div></div><!--云台控制结束--><!--预置位开始--><div class="view preset" v-if="currentTab=='preset'"><div style="display:none;"><xui-button color="primary" size="mini" @click="addPreset">新增</xui-button></div><div class="head"><span class="preset-index">编号</span><span class="preset-img">图片</span><span class="preset-name">&nbsp;&nbsp;&nbsp;&nbsp;标题</span><span class="preset-do">操作</span></div><xui-scroll class="preset-content"><ul class="preset-list"><li v-for="(item,index) in presetsList" :key="index"><span class="preset-index num">{{index+1}}</span><span class='preset-img'><img :src="getImgUrl(item.imageUrl)" @dblclick="zooImg(item.imageUrl, item.name)"/></span><span class='preset-name' :title="item.name">{{item.name}}</span><span class='preset-do'><span class='preset-use' @click="presetUse(item)"></span><span class='preset-delete' @click="presetDelete(item)"></span></span></li></ul></xui-scroll><div class="hline"></div></div><!--预置位结束--><!--巡航计划开始--><div class="view cruise" v-if="currentTab=='cruise'"><div class="auto-content" v-if="isShowCruiseLists"><div class="auto-title" v-if="cruisesList.length >0"><span class="l-index">编号</span><span class="l-name">名称</span><span class="l-controller">操作</span></div><xui-scroll class="show-cruise-list" v-if="cruisesList.length >0"><ul><li class="auto-list common-list" v-for="(item,index) in cruisesList" :key="index"><span class="l-index">{{(index+1)}}</span><span class="l-name too-long" :title="item.name">{{item.name}}</span><span class="l-controller"><xui-switch v-model="item.status" :ctx="item" size="mini" @change="switchCruise(item)"></xui-switch><i class="common-icon edit" @click="editCruise(item)"></i><i class="common-icon del" @click="delCruise(item)"></i></span></li></ul></xui-scroll><span v-else class="no-data">暂无巡航数据</span></div><xui-button color="primary" size="mini" v-if="isShowCruiseLists" @click="showAddCruise">新增巡航</xui-button><div class="add-content add-auto" v-if="isShowAddCruise"><div class="n-title clearfix"><span class="add-new" title="新增自动巡航预置位" @click="addCruiseList"></span><span class="go-back" @click="goBack">返回</span></div><div class="n-content"><div class="auto-title common-title"><span class="l-index">预置位标题</span><span class="l-name">停留时间(秒)</span><span class="l-controller">操作</span></div><xui-scroll class="auto-ul"><ul><li class="auto-list" v-for="(item,index) in mockList" :key="index"><!-- 选择已有预置位 --><div class="pre-name"><xui-select v-model="item.presetId" :options="selectOptions" class="preset-select"></xui-select></div><div class='pre-time'><xui-input v-model="item.internalTime" @blur="validate('internalTime', item.internalTime)" :options="inputOptions"></xui-input></div><div class='pre-controller'><i class="common-icon up" title="上移" v-if="index !== 0" @click="moveUp(index,item)"></i><i class="common-icon down" title="下移" v-if="index !== (mockList.length-1)" @click="moveDown(index,item)"></i><i class="common-icon del" title="删除" @click="deleteLi(index)"></i></div></li></ul></xui-scroll><div class="new-cruise-info"><div class="title-name"><span class="cruise-title">名&nbsp;&nbsp;&nbsp;称:</span><xui-input v-model="cruiseName" :options="cruiseNameOptions" class="cruiseName"></xui-input></div><div class="auto-point"><span class="after-down">回位点:</span><xui-select v-model="homingPresetId" :options="selectOptions" @change="changePreset" class="preset-select"></xui-select></div><div class="save-or-cancel"><xui-button color="primary" size="mini" style="margin-right: 10px" @click="saveCruise">保存</xui-button><xui-button color="ghost" size="mini" @click="cancelCruise">取消</xui-button></div></div></div></div></div><!--巡航计划结束--></div><iframe scroll="none" src="about:blank" class="video-cloud-check-iframe"></iframe></div>
</template>

javascript

export default {props: {options: {}},mixins: [DialogPollify],data() {return {statusCache:[],showDialog: false,currentTab: "ptz", //可选值ptz,preset,cruiseclassName: "",sliderOptions: {min: 1,max: 15,step: 1,sliderWidth: 220,range: false},speed: 10,equipOptions: {multiple: false,clearable: false,filter: false,placeholder: "请选择",pickerClass: 'equipment-select',data: [{text: "雨刷",value: 17},{text: "灯光",value: 18}]},equip: 17,isOn: true,cameraInfo: null,_index: 0,H5Player: null,presetsList: [],cruisesList: [],isShowCruiseLists: true,isShowAddCruise: false,selectOptions: {placeholder: "选择预置位",multiple: false,clearable: true,filter: false,data: [],pickerClass: 'position-select'},inputOptions: {type: "text",clearable: false},cruiseNameOptions: {type: "text",placeholder: "请输入巡航名称",clearable: true},homingPresetId: null,mockList: [{"presetId": "","internalTime": 5}],cruiseName: "",cruiseId: "",isShowPresetAndCruise: true,playerInstance: {}};},computed: {},methods: {/*** 确定当前摄像机通道和播放窗口*/getPlayWindow(){return{index:this._index,channelNo:this._channel.channelNo}},getImgUrl: function (src) {// return "/vdtimg/" + src;return Toolkits.getUrl(src, 0, false, true, true);},zooImg(url, title) {window.VueExpress.$structImage.show({image: url,name: title//imgBase64: pic});},show(options, index, className, isShowPresetAndCruise) {if (!options || !options.cameraList) {return;}this.showDialog = true;this.playerInstance = options;this.cameraInfo = options.cameraList[index].deviceInfo;this.speed = options.cameraList[index].windowPtzSpeed || 10;//存储控制通道this._channel = Toolkits.getPtzChannel(this.cameraInfo.channelList);this._index = index;//云台状态记录this.statusCache[index]={};this.statusCache[index].status="open";this.H5Player = options.h5PlayerC;//样式this.className = className || "";if (typeof isShowPresetAndCruise === "boolean") {this.isShowPresetAndCruise = isShowPresetAndCruise;}this.currentTab = "ptz";var CAMERA_ptzCtrl = $permission.getPermissionMap()["CAMERA_ptzCtrl"];if (!CAMERA_ptzCtrl) {//不具有云台控制权限console.log("不具有云台控制权限");}},close() {this.showDialog = false;this.className = "";//云台状态记录this.statusCache[this._index].status="close";this.destoryInstance();},//弹出框拖拽事件drag: function (imgId, parentId, isLimitedDrag) {Toolkits.drag(imgId, parentId, isLimitedDrag);},changeTab: function (tab) {this.currentTab = tab;//如果是预置位面板,则需要加载预置位列表if (tab === "preset") {this.showPreset();}//如果是计划巡航面板,则需要加载计划巡航列表if (tab === "cruise") {this.isShowCruiseLists = true;this.isShowAddCruise = false;this.$nextTick(() => {this.showCruise();});}},changeHandle: function (v) {this.speed = v;this.playerInstance.cameraList[this._index].speed = v;this.playerInstance.setPtzSpeed(this._index,v)},changeSwitch: function (v) {this.isOn = v;},changeSelect: function (v) {// if(!this.isOn) return;var self = this;if (!self.cameraInfo || self.cameraInfo.channelList.length == 0) {return;}//组装参数并发送请求var data = {channelNo: this._channel.channelNo,cmd: v,param: this.isOn ? 1 : 0,cameraId: this._channel.cameraId};STORE.setPTZDir(data);},ptzCtrlMouseDown: function (cmd, param) {// if(!this.isOn) return;var self = this;//收集参数if (typeof (param) !== "number") {param = this.speed;}if (!self.cameraInfo || self.cameraInfo.channelList.length == 0) {return;}var data = {channelNo: this._channel.channelNo,cmd: cmd,param: param,cameraId: this._channel.cameraId};STORE.setPTZDir(data);},ptzCtrlMouseUp: function (cmd) {var self = this;if (!self.cameraInfo || self.cameraInfo.channelList.length == 0) {return;}//发送停止命令setTimeout(function () {STORE.setPTZDir({channelNo: self._channel.channelNo,cmd: cmd,param: 0,cameraId: self._channel.cameraId});}, 200);},showPreset: function () {var self = this;if (!self.cameraInfo || self.cameraInfo.channelList.length == 0) {return;}STORE.getPresets(this._channel.channelNo).then((res) => {self.presetsList = res;});},presetUse: function (item) {STORE.callPreset(item.id).then((res) => {if (res) {notify.success("调用预置位成功");} else {notify.error("调用预置位失败");}});},presetDelete: function (item) {// this.$confirm("确定要删除该预置位吗?", "删除提示", {//     confirmButtonText: "确定",//     cancelButtonText: "取消",//     type: "warning"// }).then(() => {//     STORE.hasCruiseByPresetId(item.id).then((res) => {//         if (res) {//             notify.error("该预置位存在于巡航中,请先删除巡航再删除此预置位!");//         } else {//             STORE.deletePreset(item.id).then((res) => {//                 if (res) {//                     notify.success("删除预置位成功!");//                     this.showPreset();//                 } else {//                     notify.error("删除预置位失败!");//                 }//             });//         }//     });// })$confirm("确定要删除该预置位吗?").then( () => {STORE.hasCruiseByPresetId(item.id).then((res) => {if (res) {notify.error("该预置位存在于巡航中,请先删除巡航再删除此预置位!");} else {STORE.deletePreset(item.id).then((res) => {if (res) {notify.success("删除预置位成功!");this.videoPresetRefresh()this.showPreset();} else {notify.error("删除预置位失败!");}});}});})},addPreset: function () {var self = this;var imgStr = self.H5Player.capturePicture(self._index, "png", 300, 0);var num = Math.floor(Math.random() * 10 + 1);if (self.cameraInfo.channelList.length == 0) {return;}var param = {"cameraId": self.cameraInfo.id,"channelNo": this._channel.channelNo,"imageStream": imgStr,"isRestoration": 0,"name": "我是预置位" + num,"server": {"apsType": 0,"id": this._channel.id,"ip": this._channel.ip,"password": this._channel.password,"port": this._channel.port,"userName": this._channel.userName},"stopTime": 5}STORE.createPreset(param).then((res) => {if (res) {this.showPreset();}});},showCruise: function () {if (!this.cameraInfo || this.cameraInfo.channelList.length == 0) {return;}STORE.getCruiseByCameraId(this.cameraInfo.id).then((res) => {if (res.length > 0) {this.cruisesList = res.map(item=>{item.status=!!item.status;return item});} else {this.cruisesList = [];}});},showAddCruise: function () {var self = this;if (!self.cameraInfo || self.cameraInfo.channelList.length == 0) {return;}self.cruiseId = "";//首先查询预置位列表,填充selectOptions.data数据STORE.getPresets(this._channel.channelNo).then((res) => {self.presetsList = res;self.selectOptions.data = self.presetsList.map((item) => {return {text: item.name,value: item.id}});//切换新增面板self.isShowAddCruise = true;self.isShowCruiseLists = false;//清空数据self.mockList = [];self.homingPresetId = null;self.cruiseName = "";});},addCruiseList: function () {var data = {"presetId": null,"internalTime": 5};this.mockList.push(data);},changePreset: function (v) {this.homingPresetId = v;},saveCruise: function () {var self = this;if (!self.cameraInfo || self.cameraInfo.channelList.length == 0) {return;}let validate = true;this.mockList.map((item, pos) => {item.sortNo = pos;if (!this.validate("internalTime", item.internalTime)) validate = false;});if (!validate) return;if (!self.cruiseName) {notify.warn("请输入巡航名称");return;}if (self.cruiseName.length > 20) {notify.warn("巡航名称不能超过20个字符");return;}var param = {"cameraId": self.cameraInfo.id,"channelNo": this._channel.channelNo,"cprList": self.mockList,"homingPresetId": self.homingPresetId, //回归点的预置位id"id": self.cruiseId ? self.cruiseId : "","name": self.cruiseName,"status": self.cruiseId?+self.status:0};console.log("param", param);//编辑if (self.cruiseId) {STORE.updateCruise(param).then((res) => {if (res) {notify.success("编辑自动巡航成功!");self.cruiseId = "";//切换新增面板self.isShowAddCruise = false;self.isShowCruiseLists = true;self.showCruise();} else {notify.warn("编辑自动巡航失败!");}});} else {STORE.addCruise(param).then((res) => {if (res) {notify.success("新增自动巡航成功!");self.cruiseId = "";//切换新增面板self.isShowAddCruise = false;self.isShowCruiseLists = true;self.showCruise();} else {notify.warn("新增自动巡航失败!");}});}},cancelCruise: function () {//切换新增面板this.isShowAddCruise = false;this.isShowCruiseLists = true;},moveUp: function (index, item) {var pre = this.mockList[index - 1];this.mockList.splice(index - 1, 2, item, pre);},moveDown: function (index, item) {var next = this.mockList[index + 1];this.mockList.splice(index, 2, next, item);},deleteLi: function (index) {this.mockList.splice(index, 1);},validate: function (type, val) {if (type === "internalTime" && !$regexp.isPositiveIntegers(val)) {$tip.warn("停留时间须为正整数");return false;}return true;},goBack: function () {//切换新增面板this.isShowAddCruise = false;this.isShowCruiseLists = true;},editCruise: function (item) {var self = this;if (!self.cameraInfo || self.cameraInfo.channelList.length == 0) {return;}//#97994if(item.status){ notify.warn("正在巡航,请先关闭巡航,然后编辑");return}//debugger//首先查询预置位列表,填充selectOptions.data数据if (self.selectOptions.data.length === 0) {STORE.getPresets(this._channel.channelNo).then((res) => {self.presetsList = res;self.selectOptions.data = self.presetsList.map((item) => {return {text: item.name,value: item.id}});});}self.cruiseName = item.name;self.homingPresetId = item.homingPresetId;self.mockList = IX.clone(item.cprList);self.cruiseId = item.id;self.status = item.status;//切换新增面板self.isShowAddCruise = true;self.isShowCruiseLists = false;},delCruise: function (item) {//没有在巡航if (!item.status) {$confirm("确定要删除该巡航吗?").then(() => {STORE.deleteCruise(item.id).then((res) => {notify.success("删除巡航成功");this.showCruise();});})} else {notify.warn("正在巡航中,清先关闭巡航,然后删除");}},switchCruise: function (item) {var param = {cruiseId: item.id,status: +item.status};STORE.switchOnOffCruise(param).then((res) => {//this.playerInstance.setWindowPtz(this._index, true);  //云台notify.success("修改巡航状态成功");// 判断有没有开启的任务,如果有就锁定,没有就不锁let hasTask = this.cruisesList.some(i => i.status);if (hasTask) {STORE.videoCloudLock({cameraId: this.cameraInfo.id}).then(res => {this.H5Player.setWindowPtz(this._index, true);  //<E4><BA><91><E5><8F><B0>this.H5Player.showOrHideToolbar(this._index, true, '29');this.H5Player.showOrHideToolbar(this._index, false, '28');})} else {STORE.videoCloudUnlock({cameraId: this.cameraInfo.id}).then(res => {this.H5Player.setWindowPtz(this._index, true);  //<E4><BA><91><E5><8F><B0>this.H5Player.showOrHideToolbar(this._index, true, '28');this.H5Player.showOrHideToolbar(this._index, false, '29');})}})}}
};

css 

<style lang="less">
@imgPath: "/viua/assets/player";
.position-select{z-index: 1000;
}
.equipment-select{z-index: 1000;
}
#ptz-control.left-bottom {bottom: 0px;left: 0px;
}
#ptz-control.right-bottom {bottom: 0px;right: 0px;
}
#ptz-control.left-top {top: 0px;left: 0px;
}
#ptz-control.right-top {top: 0px;right: 0px;
}
#ptz-control {position: fixed;z-index: 1000;width: 282px;height: 330px;border: solid 1px var(--border-color-gray);background-color: var(--bg-fill-normal);border-radius: 10px;cursor: move;bottom: 25%;left: 50%;.video-cloud-check-content, .video-cloud-check-iframe {width: 100%;height: 100%;position: absolute;}.video-cloud-check-content {z-index: 1;}.video-cloud-check-iframe {z-index: 0;}.win-dialog-title {font-family: "Microsoft YaHei" !important;height: 43px;line-height: 43px;padding-left: 10px;padding-top: 0px;padding-right: 3px;font-size: 13px;.close {float: right;margin-right: 10px;cursor: pointer;}.ptztab {display: inline-block;text-align: center;padding-left: 10px;padding-right: 10px;*display: inline;zoom: 1;*width: 60px;}& .ptztab:hover {border-bottom: solid 2px var(--prod-normal-color);color: var(--prod-normal-color);cursor: default;}& .ptztab.active {border-bottom: solid 2px var(--prod-normal-color);color: var(--prod-normal-color);}.vline {width: 2px;height: 18px;border-left: solid 1px var(--border-color-gray);border-right: solid 1px var(--border-color-gray);}}.win-dialog-neck {font-size: 0;height: 1px;line-height: 1px;border-top: solid 1px var(--border-color-gray);border-bottom: solid 1px var(--border-color-gray);}.ptz {.dir-control {display: block;width: auto;height: 134px;background: url("@{imgPath}/ptz-disable.png") no-repeat 0 0;margin-top: 30px;margin-left: 20px;position: relative;border: solid 0 red;*width: 240px;span {display: inline-block;background: url("@{imgPath}/ptz-normal.png") no-repeat 0 0;position: absolute;width: 15px;height: 15px;border: solid 0 red;cursor: pointer;&:hover {background: url("@{imgPath}/ptz-hover.png") no-repeat 0 0;}&:active {background: url("@{imgPath}/ptz-active.png") no-repeat 0 0;}&.dir.up {left: 59px;top: 21px;background-position: -59px -21px;}&.dir.leftup {left: 35px;top: 36px;background-position: -35px -36px;}&.dir.left {left: 23px;top: 61px;background-position: -23px -61px;}&.dir.leftdown {left: 35px;top: 87px;background-position: -35px -87px;}&.dir.down {left: 60px;top: 101px;background-position: -60px -101px;}&.dir.rightdown {left: 86px;top: 87px;background-position: -86px -87px;}&.dir.right {left: 101px;top: 61px;background-position: -101px -61px;}&.dir.rightup {left: 86px;top: 36px;background-position: -86px -36px;}&.zoom.up.adjust {left: 152px;top: 45px;background-position: -152px -45px;}&.zoom.down.adjust {left: 152px;top: 76px;background-position: -152px -76px;}&.focus.up.adjust {left: 183px;top: 44px;background-position: -183px -44px;}&.focus.down.adjust {left: 183px;top: 75px;background-position: -183px -75px;}&.iris.up.adjust {left: 214px;top: 44px;background-position: -214px -44px;}&.iris.down.adjust {left: 214px;top: 75px;background-position: -214px -75px;}}}.ptz-speed {margin-left: 25px;margin-top: 10px;.control-speed {color: var(--part-font-color);font-size: 12px;}}.equipment {margin-top: 10px;.choose {display: inline-block;width: 100px;color: var(--part-font-color);font-size: 12px;}.switch {display: inline-block;width: 130px;height: 18px;text-align: center;margin-left: 20px;position: relative;top: -10px;label {color: var(--part-font-color);}.switch-input {position: relative;top: -2px;left: -5px;background: var(--switch-normal-track-bg-color);&:checked {background: var(--switch-normal-track-bg-color);}}}}}.preset {.head {height: 32px;line-height: 32px;text-align: center;*width: 260px;*padding-left: 0;*text-align: left;*font-size: 0;span {display: inline-block;color: var(--part-font-color);text-align: center;*display: inline;zoom: 1;*font-size: 12px;&.preset-index {width: 40px;}&.preset-img {width: 64px;}&.preset-name {width: 90px;text-align: left;*text-align: center;}&.preset-do {width: 50px;text-align: left;*text-align: right;padding-left: 0;}}}.preset-content {height: 235px;border-top: solid 1px var(--border-color-gray);ul {margin: 10px 0 0 0;padding: 0;border: solid 0 red;li {height: 60px;line-height: 60px;border-bottom: solid 1px var(--border-color-gray);white-space: nowrap;span {vertical-align: middle;display: inline-block;border: solid 0 red;text-align: center;&.preset-index {width: 40px;color: var(--part-font-color);}&.preset-img {width: 64px;height: 50px;position: relative;top: 5px;}&.preset-img img {vertical-align: middle;padding: 0;margin: -27px 0 0 0;width: 64px;height: 50px;}&.preset-name {width: 80px;max-width: 80px;margin: 0px 5px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}&.preset-do {width: 50px;}&.preset-use {width: 18px;height: 18px;background: url("@{imgPath}/preset-use.png")no-repeat 0 0;cursor: pointer;}&.preset-use:hover {background-position: -22px 0;}&.preset-delete {width: 18px;height: 18px;background: url("@{imgPath}/preset-delete.png")no-repeat 0 0;cursor: pointer;}&.preset-delete:hover {background-position: -22px 0;}}}}}}.cruise {height: calc(~"100% - 45px");text-align: center;.auto-content {height: calc(~"100% - 30px");.auto-title {display: inline-block;width: 90%;height: 30px;line-height: 30px;white-space: nowrap;border-bottom: 1px solid var(--border-color-gray);color: var(--part-font-color);span {display: inline-block;white-space: nowrap;}.l-index {width: 25px;}.l-name {width: 150px;}.l-controller {width: 85px;}}.show-cruise-list {height: 220px;width: 90%;margin: auto;.auto-list {line-height: 30px;border-bottom: 1px solid var(--border-color-gray);table-layout: fixed;display: table;span {display: table-cell;}.l-index {width: 25px;}.l-name {width: 130px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;display: inline-block;vertical-align: middle;}.l-controller {width: 85px;.common-icon {cursor: pointer;display: inline-block;}.edit {position: relative;top: 3px;height: 16px;width: 18px;margin-left: 5px;margin-right: 5px;background: url("@{imgPath}/edit.png") no-repeatscroll 0 center;&:hover {margin-right: 5px;background: url("@{imgPath}/edit.png") no-repeatscroll -22px center;}}.del {position: relative;top: 3px;height: 16px;width: 14px;background: url("@{imgPath}/del.png") no-repeatscroll 0 center;&:hover {background: url("@{imgPath}/del.png") no-repeatscroll -22px center;}}}}}.no-data {display: inline-block;margin-top: 115px;color: var(--part-font-color);}}.add-content {height: 100%;.n-title {height: 30px;line-height: 30px;border-bottom: 1px solid var(--border-color-gray);.add-new {cursor: pointer;background: url("@{imgPath}/add.png") no-repeat 0 0;display: inline-block;height: 16px;width: 16px;margin-left: 205px;margin-top: 7px;&:hover {background: url("@{imgPath}/add.png") no-repeat scroll -21pxcenter;}}.go-back {cursor: pointer;color:var(--prod-normal-color);font-weight: bold;background: url("@{imgPath}/back.png") no-repeat 0px 10px;padding-left: 10px;margin-left: 10px;float: left;}}.n-content {border-top: 1px solid var(--border-color-gray);.auto-title {display: inline-block;height: 30px;line-height: 30px;white-space: nowrap;border-bottom: 1px solid var(--border-color-gray);width: 93%;margin: 0 10px;span {display: inline-block;white-space: nowrap;text-align: center;}.l-index {width: 40%;}.l-name {width: 40%;}.l-controller {width: 20%;}}.auto-ul {height: 105px;.auto-list {display: flex;align-items: center;justify-content: space-around;border-bottom: 1px solid var(--border-color-gray);padding: 2px 0;}.pre-name {display: inline-block;flex: 2;text-align: center;.preset-select {width: 100px;max-width: 100px;background-color: var(--bg-fill-normal);}.xui-select-inputwrap {line-height: normal;}.xui-single-text {position: relative;top: 4px;max-width: 64px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}.select-trigger-icon {top: 4px;}}.pre-time {display: inline-block;flex: 1;.xui-input-style {width: 40px;}}.pre-controller {display: inline-block;flex: 1;.common-icon {cursor: pointer;display: inline-block;margin-left: 4px;}.up {height: 16px;width: 14px;background: url("@{imgPath}/up.png") no-repeatscroll 0 center;&:hover {background: url("@{imgPath}/up.png") no-repeatscroll -14px center;}}.down {height: 16px;width: 14px;background: url("@{imgPath}/down.png") no-repeatscroll 0 center;&:hover {background: url("@{imgPath}/down.png") no-repeatscroll -14px center;}}.del {height: 16px;width: 14px;background: url("@{imgPath}/del.png") no-repeatscroll 0 center;&:hover {background: url("@{imgPath}/del.png") no-repeatscroll -22px center;}}}}.new-cruise-info {padding-top: 10px;border-top: 1px solid var(--border-color-gray);.title-name, .auto-point {padding-right: 10px;display: flex;align-items: center;span{flex: 1;}div{flex: 3;}}.title-name {.cruise-title {&:before{content: "*";color: rgb(255, 0, 0);padding: 0px 2px;}}}.auto-point {margin-top: 5px;.preset-select {background-color: var(--bg-fill-normal);text-align: left;}}.save-or-cancel {position:absolute;bottom:5px;width: 100%;display: flex;justify-content: center;}.xui-select-inputwrap{line-height: normal;display: inline-flex;align-items: center;}.select-trigger-icon{top: 5px;}.xui-single-text {max-width: 165px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}}}}}
}
</style>

sip信令交互

package http_apiimport ("github.com/gin-gonic/gin""sipserver-rebuild/pkg/constant""sipserver-rebuild/pkg/constant/model""sipserver-rebuild/pkg/logUtil""sipserver-rebuild/pkg/sipapi""strconv"
)// @Summary     设备保活心跳设置
// @Description 用来获取下级设备或下级平台的设备目录列表,会包含地理位置等。
// @Tags        records
// @Accept      x-www-form-urlencoded
// @Produce     json
// @Param       id    path     string true "通道id"
// @Param       ip query    string    true "通道ip"
// @Param       port   query    string    true "通道port"
// @Success     0     {object} sipapi.Catalogs
// @Failure     1000  {object} string
// @Failure     1001  {object} string
// @Failure     1002  {object} string
// @Failure     1003  {object} string
// @Router      /channels/{id}/records [get]
func HolderControl(c *gin.Context) {logUtil.Log.Info("")channelid := c.Query("gbid")ip := c.Query("ip")port := c.Query("port")channelNum := c.Query("channelNum")order := c.Query("order")num := c.Query("num")speed := c.Query("speed")userName := c.Query("userId")controlPriority := c.Query("controlPriority")uuid := c.Query("uuid") // 同一会话日志唯一标识traceId := c.Query("traceId")var numcmd uint64var speedcmd uint64if order == "" {constant.JsonResponse(c, constant.OrderNil, "order不能为空")return}ordercmd, err := strconv.ParseUint(order, 16, 8)if err != nil || ordercmd < 0 {constant.JsonResponse(c, constant.OrderParamFail, "order错误")return}if userName == "" {constant.JsonResponse(c, constant.OrderUserNil, "用户名不能为空")return}if controlPriority == "" {constant.JsonResponse(c, constant.OrderControlPriorityNil, "控制权限不能为空")return}speedcmd, err = strconv.ParseUint(speed, 16, 8)if speedcmd < 0 {constant.JsonResponse(c, constant.OrderSpeedNil, "巡航速度错误")return}numcmd, err = strconv.ParseUint(num, 10, 8)if numcmd < 0 {constant.JsonResponse(c, constant.OrderNumNil, "巡航速度错误")return}var device model.HolderControlQueryif channelNum != "" {cn, e := strconv.Atoi(channelNum)if e != nil {logUtil.Log.Error("channelNum is error :" + e.Error())} else {device.ChannelNum = cn}}device.Channel.ChannelID = channeliddevice.Channel.Ip = ipdevice.Channel.Port = portdevice.Order = ordercmddevice.Num = numcmddevice.Speed = speedcmddevice.UserName = userNamedevice.UUID = uuiddevice.ControlPriority = controlPrioritydevice.IsCross = "N"device.Cmd = orderres, err := sipapi.SipHolderControl(&device, traceId)if err != nil {constant.JsonResponse(c, constant.HoldControlERR, err)return}if res.Code == 1005 {constant.JsonResponse(c, constant.HoldControlERR, res)return}constant.JsonResponse(c, res.Code, res)
}

4.要求信令网络传视质量

      联网系统IP网络的传输质量(如传输时延、包丢失率、包误差率、虚假包率等)应符合如下要求
a)网络时延上限值为400ms;
b)时延抖动上限值为50ms;
丢包率上限值为1x10-3;。)
d)包误差率上限值为1x10-
5.6视频帧率

5.相关调用流程

相关文章:

国标云台控制状态

1.基本概念 国标联网系统的信息传输、交换、控制方面的都是通过SIP服务器负责通讯得&#xff0c;SIP负责信令流逐级转发。其中最重要的一部分就是和摄像机进行信令交互。 像安全注册、实时视音频点播、历史视音频的回放等应用的会话控制采用IETFRFC3261规定的Register、Invite等…...

PostgreSQL与MySQL哪个适合做时空数据分析?

PostgreSQL与MySQL的定位与区别 定位差异&#xff1a;功能导向与性能优先 PostgreSQL和MySQL作为两大主流开源数据库&#xff0c;其核心设计理念和适用场景存在显著差异。PostgreSQL定位为 对象-关系型数据库&#xff08;ORDBMS&#xff09; &#xff0c;强调功能完备性与标准…...

uniapp利用生命周期函数实现后台常驻示例

在 Uniapp 中&#xff0c;利用生命周期函数实现“后台常驻”主要是通过监听应用的前后台状态变化&#xff08; onHide 和 onShow &#xff09;&#xff0c;并结合 定时器、后台任务或状态保持逻辑 来实现。但需注意&#xff1a; 纯前端 JS 代码无法突破系统对后台应用的限制&am…...

JAVA设计模式——(八)单例模式

JAVA设计模式——&#xff08;八&#xff09;单例模式 介绍理解实现饿汉式懒汉式 应用 介绍 确保一个类只存在一个实例。 理解 就是一个实例&#xff0c;new出来的一个&#xff0c;很简单。不过单例模式分为了懒汉式和饿汉式&#xff0c;其中也有线程安全的实现方式和线程不…...

【亚马逊云】AWS Wavelength 从理论讲解到实验演练

一、什么是 AWS Wavelength&#xff1f; Wavelength——一种新型的 AWS 基础设施&#xff0c;旨在运行需要低延迟或边缘弹性的工作负载。 AWS Wavelength 将按需计算和存储服务引入通信服务提供商网络&#xff0c;使客户能够构建和部署满足其数据驻留、低延迟和弹性要求的应用…...

Uniapp:vite.config.js全局配置

目录 一、基本概述二、配置自动引入插件一、基本概述 vite.config.js 是一个可选的配置文件,如果项目的根目录中存在这个文件,那么它会被自动加载,一般用于配置 vite 的编译选项 二、配置自动引入插件 在项目命令行终端中执行如下代码 npm install unplugin-auto-import…...

Springboot整合阿里云腾讯云发送短信验证码 可随时切换短信运营商

本文描述了在springboot项目中整合实现对接阿里云 和 腾讯云的短信验证码发送&#xff0c;可通过更改配置文件达到切换短信发送运营商(申请签名、短信模版这些本文不在叙述)。 首先看下大体结构&#xff1a; 一、需要导入的jar <dependency><groupId>com.…...

git 查看用户信息

在 Git 中查看用户信息是一项常见的任务&#xff0c;可以帮助你确认当前仓库的配置或全局的 Git 配置是否正确设置。你可以通过多种方式来查看这些信息。 查看全局用户信息 全局用户信息是应用于所有 Git 仓库的默认设置。要查看全局用户信息&#xff0c;可以使用以下命令&am…...

JAVA基础:Collections 工具类实战指南-从排序到线程安全

在 Java 开发中&#xff0c;集合类几乎贯穿每一个项目&#xff0c;而Collections工具类提供了一系列强大的方法&#xff0c;用于操作和增强集合的功能。无论是排序、查找还是线程安全的封装&#xff0c;Collections工具类都是提升代码效率和质量的重要工具。 一、Collections …...

【计算机视觉】TorchVision 深度解析:从核心功能到实战应用 ——PyTorch 官方计算机视觉库的全面指南

TorchVision 深度解析&#xff1a;从核心功能到实战应用 ——PyTorch 官方计算机视觉库的全面指南 1. TorchVision 项目概览核心模块 2. 实战案例&#xff1a;10 大应用场景详解案例 1&#xff1a;使用预训练 ResNet 进行图像分类代码实现常见问题相关论文 案例 2&#xff1a;加…...

case和字符串操作

使用if选择结构 if [];then elif [];then #注意这个地方,java是else if else ; fi 使用for循环结构 使用for循环&#xff0c;语法结构如下所示&#xff1a; for 变量名 in 值1 值2 值3 #值的数量决定循环任务的次数 do命令序列 done#循环输出1到10 for i in {1..10} #注…...

Golang|外观模式和具体逻辑

最终返回的是Document的切片&#xff0c;然后取得Bytes自己再去做反序列化拿到文档的各种详细信息。 外观模式是一种结构型设计模式&#xff0c;它的目的是为复杂的子系统提供一个统一的高层接口&#xff0c;让外部调用者&#xff08;客户端&#xff09;可以更简单地使用子系统…...

关于kafka

1.为什么需要消息队列 举个经典的例子。 你是一个网购达人&#xff0c;经常在网上购物。快递小哥到了你的小区后&#xff0c;立刻给你打电话说&#xff1a;“你的快递到了&#xff0c;请马上来取。” 但你是一个合格的牛马&#xff0c;在上班&#xff0c;不方便取快递&#…...

OpenCV 图形API(67)图像与通道拼接函数-----水平拼接(横向连接)两个输入矩阵(GMat 类型)函数concatHor()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于水平拼接两个 GMat 矩阵&#xff0c;要求输入矩阵的行数必须一致: GMat A { 1, 4,2, 5,3, 6 }; GMat B { 7, 10,8, 11,9, 12 }; GM…...

夜莺 v8.0.0-beta.10 部署

夜莺 v8.0.0-beta.10 部署 1. mariadb-server2. Redis安装3. 下载 n9e-v8.0.0-beta.10-linux-amd64.tar.gz设置 root 用户密码配置文件 配置mariadb的登录密码导入数据库表结构配置为 systemd 启动服务重新加载 systemd配置日志 访问夜莺VictoriaMetrics 时序数据库安装接入数据…...

HTML5好看的水果蔬菜在线商城网站源码系列模板7

文章目录 1.设计来源1.1 主界面1.2 关于我们界面1.3 商城界面1.4 商品信息界面1.5 我的账户界面1.6 联系我们界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#…...

优化问题中变量分类与作用分析

优化问题中的变量分类与作用 在优化问题中&#xff0c;变量的定义和作用因问题类型和建模需求而异。以下从决策变量、控制变量的区别与联系出发&#xff0c;结合其他相关变量进行系统分析&#xff1a; 1. 决策变量&#xff08;Decision Variables&#xff09; 定义&#xff1a…...

RSS‘25|CMU提出统一空中操作框架:以末端执行器为中心,无人机实现高精度遥操作

导读在科技飞速发展的当下&#xff0c;机器人技术不断拓展其应用边界&#xff0c;空中操作领域成为了研究的热点之一。无人空中操纵器&#xff08;UAMs&#xff09;凭借其在高空复杂任务中的巨大潜力&#xff0c;正逐渐改变着诸如高空设备维护、桥梁检测等传统行业的作业模式&a…...

智能指针之设计模式6

本系列文章探讨了智能指针和设计模式的关系&#xff0c;前面五篇文章介绍的是使用设计模式实现了智能指针的相关特性&#xff0c;比如使用工厂模式控制了智能指针对象的创建&#xff0c;使用代理模式控制了资源对象的销毁。本文介绍一下使用智能指针来帮助我们实现相关的设计模…...

【设计模式】GOF概括

一、创建型模式&#xff08;5种&#xff09; 1. 单例模式 (Singleton) 适用场景&#xff1a;全局唯一实例&#xff08;如配置管理、日志工具&#xff09;。C示例&#xff1a;// 所谓的scott mayer单例模式 class Singleton { public:static Singleton& getInstance() {st…...

深入浅出限流算法(三):追求极致精确的滑动日志

在限流的世界里&#xff0c;精度往往是关键。我们已经讨论过固定窗口&#xff08;简单但有突刺&#xff09;和滑动窗口&#xff08;更平滑但仍有格子边界&#xff09;。如果我们需要更精确的控制&#xff0c;滑动日志 (Sliding Log) 算法便登场了。 核心思想&#xff1a;记录每…...

一文读懂Tomcat应用之 CentOS安装部署Tomcat服务

目录 一、Tomcat概述 (一)、Tomcat安装目录简介 (二)、Tomcat配置文件简介 1、server.xml文件 2、web.xml 3、context.xml 4、tomcat-users.xml 5、logging.properties 二、Tomcat安装部署 (一)、环境规划 (二)、安装JDK 1、下载JDK二进制安装包 2、解压JDK二进制…...

JVM 内存分配策略

引言 在 Java 虚拟机&#xff08;JVM&#xff09;中&#xff0c;内存分配与垃圾回收是影响程序性能的核心机制。内存分配的高效性直接决定了对象创建的速率&#xff0c;而垃圾回收策略则决定了内存的利用率以及系统的稳定性。为了在复杂多变的应用场景中实现高效的内存管理&am…...

轻松上手:使用 Docker Compose 部署 TiDB 的简易指南

作者&#xff1a;ShunWah 在运维管理领域&#xff0c;我拥有多年深厚的专业积累&#xff0c;兼具坚实的理论基础与广泛的实践经验。精通运维自动化流程&#xff0c;对于OceanBase、MySQL等多种数据库的部署与运维&#xff0c;具备从初始部署到后期维护的全链条管理能力。拥有Oc…...

Linux权限管理

权限的概念 在 Linux 系统里&#xff0c;权限管理是系统安全的关键环节。权限管理的核心目的是明确不同用户对文件和目录的操作许可范围&#xff0c;以此来保障系统资源的安全与合理使用。权限管理涉及三种不同的用户角色和三种基本的操作权限。 用户角色 所有者&#xff08…...

Crusader Kings III 王国风云 3(十字军之王 3) [DLC 解锁] [Steam] [Windows SteamOS macOS]

Crusader Kings III 王国风云 3&#xff08;十字军之王 3&#xff09; [DLC 解锁] [Steam] [Windows & SteamOS & macOS] DLC 版本 至最新全部 DLC 后续可能无法及时更新文章&#xff0c;具体最新版本见下载文件说明&#xff1b; DLC 解锁列表&#xff08;仅供参考&am…...

架构风格对比

架构风格深度对比&#xff1a;从管道-过滤器到微内核 &#x1f4dc; 引言 在软件架构设计中&#xff0c;不同的架构风格适用于不同的业务场景。本文将深入解析 7种主流架构风格&#xff0c;包括它们的核心思想、优缺点、适用场景&#xff0c;并通过对比表格和示例帮助您选择最…...

V Rising 夜族崛起 [DLC 解锁] [Steam] [Windows SteamOS]

V Rising 夜族崛起 [DLC 解锁] [Steam] [Windows & SteamOS] 注意 这个符号表示 可打开折叠内容 需要有游戏正版基础本体&#xff0c;安装路径不能带有中文&#xff0c;或其它非常规拉丁字符&#xff1b;仅限用于自建服务器&#xff0c;并禁用 VAC &#xff01;&#xff0…...

HTML标记语言_@拉钩教育

目录 1.文本标签 2.格式化标签 3.图片标签 4.超链接标签 5.表格标签 6表单标签 6.1 6.2 6.3 7.行内框架(超链接内套一个页面) 8.多媒体标签(音/视频) 1.文本标签 2.格式化标签 3.图片标签 4.超链接标签 5.表格标签 6表单标签 6.1 6.2 6.3 7.行内框架(超链接内套一个…...

云原生开发革命:iVX 如何实现 “资源即插即用” 的弹性架构?

云原生技术正以惊人的速度重塑软件开发的版图。短短几年间&#xff0c;它从少数技术先驱的实验性方案&#xff0c;迅速崛起为全球企业数字化转型的核心驱动力。Gartner 预测&#xff0c;到 2026 年&#xff0c;全球 85% 的企业将全面采用云原生技术进行应用开发与部署。云原生架…...

whois为什么有时会返回两个不同的域名状态

前阵子发现一直想注册但被别人注册了的一个域名快要过期了&#xff0c;就想着写个脚本跑在电脑上&#xff0c;每分钟检查一次域名状态&#xff0c;一旦域名被正式删除&#xff0c;就发封邮件通知我&#xff0c;这样就不用频繁手动检查域名状态了。 写脚本时发现一个有趣的现象…...

跨境电商店铺矩阵布局:多账号运营理论到实操全解析

在当今竞争激烈的全球电商市场中&#xff0c;跨境电商店铺矩阵布局已成为卖家脱颖而出的关键策略。本文将深入剖析跨境电商店铺矩阵布局的本质、优势&#xff0c;并提供从理论到实操的全方位指导&#xff0c;助力您在全球市场中开启属于自己的销售新篇章。 一、是什么&#xff…...

安卓基础(强制转换)

​​一、强制转换&#xff08;Type Casting&#xff09;​​ ​​1. 什么是强制转换&#xff1f;​​ 当你想将一个类型的对象转换为另一个类型时&#xff0c;如果它们之间存在继承关系&#xff0c;就需要​​强制转换​​。 ​​注意​​&#xff1a;只有存在继承关系的类型…...

VS2022+OpenCasCade配置编译

一、Open CASCADE Technology介绍及安装&#xff08;windows10&#xff09; Open CASCADE Technology&#xff08;简称OCCT&#xff09;是一款开源的 3D CAD/CAM/CAE 软件开发平台&#xff0c;广泛应用于工业设计、工程仿真、制造等领域。开源OCC对象库是一个面向对象C类库&…...

AIGC重构元宇宙:从内容生成到沉浸式体验的技术革命

1. 引言 当数字技术掀开人类交互的新篇章&#xff0c;元宇宙正从科幻构想蜕变为现实——这个由虚拟与现实交织的数字宇宙&#xff0c;承载着未来社会的娱乐、工作与社交形态。作为核心赋能技术&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;正以惊人的创造力&…...

当所有人都用上先进ai,如何保持你的优势?

这不再是你能用上openai模型别人只能用文心一言的时候&#xff0c;而是每个人都可以免费用deepseek r1的时代。如今&#xff0c;办公室里每个人都能随时调用deepseek模型&#xff0c;喊一声“帮我写段代码”便轻松解决问题。在这种情况下&#xff0c;单纯“会用AI”已经很难再形…...

【浙江大学DeepSeek公开课】人类经验与AI算法的镜像之旅

人类经验与AI算法的镜像之旅 人类经验与 AI 算法的镜像之旅一、语言的奥秘&#xff1a;人类如何解码世界二、从符号到智能&#xff1a;AI 的语言理解之路三、DeepSeek - V3&#xff1a;大语言模型的构建与进化四、DeepSeek - R1&#xff1a;推理模型的诞生与突破五、智能体时代…...

【前端】从零开始的搭建顺序指南(技术栈:Node.js + Express + MongoDB + React)book-management

项目路径总结 后端结构 server/ ├── controllers/ # 业务逻辑 │ ├── authController.js │ ├── bookController.js │ ├── genreController.js │ └── userController.js ├── middleware/ # 中间件 │ ├── authMiddleware…...

探针台维护方法

探针台的维护直接影响其测试精度与使用寿命&#xff0c;需结合日常清洁、环境控制、定期校准等多维度操作&#xff0c;具体方法如下&#xff1a; 一、日常清洁与保养 1.‌表面清洁‌ 使用无尘布或软布擦拭探针台表面&#xff0c;避免残留清洁剂或硬物划伤精密部件。探针头清…...

js day8

事件绑定 事件&#xff1a;发生在html元素上的特定动作&#xff0c;鼠标点击&#xff0c;键盘按下&#xff0c;鼠标移入 事件三要素&#xff1a;事件源&#xff08;触发事件的元素&#xff09; 事件类型&#xff0c;事件触发后执行的函数 通过html触发事件&#xff08;不建议…...

大模型训练平台:重构 AI 研发范式的智慧基建

当 AI 研发陷入“高耗低效”困局&#xff0c;如何破局&#xff1f; 在大模型技术爆发的今天&#xff0c;企业 AI 研发正面临前所未有的挑战&#xff1a;某金融机构为训练风控模型投入大量算力&#xff0c;却因数据标注耗时半年延误项目&#xff1b;某制造企业搭建的训练集群利…...

vuex刷新数据丢失解决方案-vuex-persist

安装 npm install -S vuex-persist&#xff08;yarn add vuex-persist&#xff09; 使用&#xff1a; /store/index.js引入vuex-persist配置&#xff1a; import Vue from vue import Vuex from vuex import VuexPersistence from vuex-persist import user from ./modules/use…...

多模态革命!拆解夸克AI相机技术架构:如何用视觉搜索重构信息交互?(附开源方案对比)

一、技术人必看&#xff1a;视觉搜索背后的多模态架构设计 夸克「拍照问夸克」功能绝非简单的OCRQA拼接&#xff0c;而是一套多模态感知-推理-生成全链路系统&#xff0c;其技术栈值得开发者深挖&#xff1a; 视觉编码器&#xff1a;基于Swin Transformer V2&#xff0c;支持4…...

Python依据卫星TLE轨道根数,计算可见时间窗口

1.卫星TLE数据 概括&#xff1a;两行字符串表示的卫星参数 字段 字符串位置&#xff08;以0为起点&#xff09; 描述内容注释1 01–01卫星编号203-07卫星类别卫星类别&#xff08;U表示不保密&#xff0c;可供公众使用的&#xff1b;C 表示保密&#xff0c;仅限NORAD使用&…...

C++?模板!!!

一、引言 在之前我们一起学习了C中类和对象、动态内存管理等相关知识&#xff0c;今天我们将一起学习C中有关模板的相关知识&#xff0c;学完模板之后我们就可以进入C中非常重要的库---STL了&#xff0c;那么模板究竟有什么奥秘呢&#xff1f;让我们一起来看看吧&#xff01; …...

web技术与nginx网站服务

一、Web服务基础概念 Web服务器核心功能 通过HTTP/HTTPS协议提供网页内容&#xff0c;支持HTML、CSS、JavaScript等静态资源&#xff0c;动态内容需结合后端语言&#xff08;如PHP、Python&#xff09;处理36。常用软件&#xff1a;Nginx、Apache、Lighttpd。Nginx以高并发、低…...

关系数据的可视化

目录 【实验目的】 【实验原理】 【实验环境】 【实验步骤】 一、安装Python所需要的第三方模块 二、实验 【实验总结】 【实验目的】 1.掌握关系数据在大数据中的应用 2.掌握关系数据可视化方法 3. python 程序实现图表 【实验原理】 在传统的观念里面&#xff0…...

MATLAB小试牛刀系列(1)

问题描述 某机床厂生产甲、乙两种机床&#xff0c;每台机床销售后的利润分别为 4 千元与 3 千元。生产甲机床需用 A、B 机器加工&#xff0c;加工时间分别为每台 2h 和每台 1h&#xff1b;生产乙机床需用 A、B、C 三种机器加工&#xff0c;加工时间均为每台 1h。若每天可用于加…...

CUDA、pytorch、配置环境教程合集

1.CUDA卸载 参考&#xff1a; 【环境搭建】卸载&重新安装cudacudnnanacondagpu版pytorch_卸载cuda-CSDN博客 【cuda】cuda安装与卸载升级_升级cuda-CSDN博客 检测代码&#xff1a; https://www.zhihu.com/question/482335084 import torch print(CUDA版本:,torch.vers…...

代码随想录打卡|Day29 动态规划Part02(不同路径、不同路径2、整数拆分、不同的二叉树搜索)

动态规划Part02 不同路径 力扣题目链接 代码随想录链接 视频讲解链接 题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xf…...