AL_ControlInd代码注释

///////////////////////////////////////////////////////////////////////////////////////// /** \param alControl 请求的新的状态 \param alStatusCode 请求的状态码 \brief 这个函数处理EtherCAT状态机。它被调用 * 在AL控制时间发生(0x220的位0)触发,当主站写AL控制寄存器,其中alControl包含AL控制的内容(0x120)的时候 * 当SM改变事件(0x220)的第4位,当激活SYNCM y寄存器被主站写(从Ecat_Main函数),alControl包含实际的状态在(0x130)的位0到3 * 防止本地的看门狗溢出(从ECAT_Main函数),alControl包含一个新的请求的状态(SAFE_OP状态)的时候 *防止应用程序特殊的事件来改变EtherCAT的状态(从应用程序),alControl包含新的请求状态(INIT,PRE_OP和SAFE_OP状态)的时候 *//////////////////////////////////////////////////////////////////////////////////////// void AL_ControlInd(UINT8 alControl, UINT16 alStatusCode) { UINT16 result = 0; UINT8 bErrAck = 0; UINT8 stateTrans; /*deactivate ESM timeout counter*/ EsmTimeoutCounter = -1; bApplEsmPending = TRUE; /* 为了能被主站响应,重置错误标号 */ if ( alControl & STATE_CHANGE ) { bErrAck = 1; nAlStatus &= ~STATE_CHANGE; /*使能SM2,SM2被移到状态转换块。首先检查SM的设置.*/ } else if ( (nAlStatus & STATE_CHANGE) // HBu 17.04.08: the error has to be acknowledged before when sending the same (or a higher) state // (the error was acknowledged with the same state before independent of the acknowledge flag) /*Error Acknowledge with 0xX1 is allowed*/ && (alControl & STATE_MASK) != STATE_INIT ) /* the error flag (Bit 4) is set in the AL-Status and the ErrAck bit (Bit 4) is not set in the AL-Control, so the state cannot be set to a higher state and the new state request will be ignored */ return; else { nAlStatus &= STATE_MASK; } /* 产生一个变量给状态转换(位0-3:新的状态(AL控制),位4-7:旧的状态) */ alControl &= STATE_MASK; stateTrans = nAlStatus; stateTrans <<= 4; stateTrans += alControl; /* 根据状态转换,检查SYNCM的设置check the SYNCM settings depending on the state transition */ switch ( stateTrans ) { case INIT_2_PREOP: case OP_2_PREOP: case SAFEOP_2_PREOP: case PREOP_2_PREOP: /* 在预运行状态,只有SYNCM给SYNCM0和SYNCM1(邮箱)的设置被检查,只要结果不等于0,从站将会停留或者转换到INIT状态和设置AL-Status的ErrorInd 位(位4) */ result = CheckSmSettings(MAILBOX_READ+1); break; case PREOP_2_SAFEOP: /* 在检查SYNCM的设置给SYNCM2和SYNCM3(过程数据)之前,需要的输入数据(nPdInputSize)和输出数据(nPdOutputSize)的长度可以被改变(通过PDO-Assign和PDO-Mapping)。如果检查结果不等于0,从站将会停留在PREOP和设置AL-状态的错误位(位4) */ result = APPL_GenerateMapping(&nPdInputSize,&nPdOutputSize); if (result != 0) break; case SAFEOP_2_OP: case OP_2_SAFEOP: case SAFEOP_2_SAFEOP: case OP_2_OP: /* 在安全运行和运行阶段,SYNCM设置给所有的SYNCM将被检查,如果检查结果不等于0,从站将会停留或者转换到PREOP和设置AL-Status的错误位(位4) */ result = CheckSmSettings(nMaxSyncMan); break; } if ( result == 0 ) { /* 如果result的结果等于0将会执行对应的本地处理服务根据状态的转换execute the corresponding local management service(s) depending on the state transition */ nEcatStateTrans = 0; switch ( stateTrans ) { case INIT_2_BOOT : #if BOOTSTRAPMODE_SUPPORTED//如果BOOT状态被支持的话 /* 如果应用程序需要执行代码当进入BOOT模式,这个在这里被完成 */ bBootMode = TRUE; if ( CheckSmSettings(MAILBOX_READ+1) != 0 ) { bBootMode = FALSE; result = ALSTATUSCODE_INVALIDMBXCFGINBOOT; break; } #if AL_EVENT_ENABLED /* 去使能所有的事件在BOOT的模式 */ HW_ResetALEventMask(0); #endif #if MAILBOX_SUPPORTED /* 在(mailbox.c)里的函数MBX_StartMailboxHandler,检查范围邮箱的SM,SM0和SM1之间是否相互重叠,如果结果不等于0,从站将会停留在INIT和设置AL-Status的错误为(位4) */ result = MBX_StartMailboxHandler(); if (result == 0) { bApplEsmPending = FALSE; /* 此外,这里有一个应用程序特殊的检查(在ecatappl.c里),如果状态转换从INIT到BOOT应该被完成,如果结果是NOERROR_INWORK,从站将会停留在INIT状态,直到超时或者转换完成在AL_ControlRes函数*/ result = APPL_StartMailboxHandler(); if ( result == 0 ) { /*转换完成transition successful*/ bMbxRunning = TRUE; } } if(result != 0 && result != NOERROR_INWORK) { /*停止APPL的邮箱处理,如果APPL开始处理器被调用之前*/ if(!bApplEsmPending) APPL_StopMailboxHandler(); MBX_StopMailboxHandler(); } #endif // MAILBOX_SUPPORTED BL_Start( STATE_BOOT ); #else result = ALSTATUSCODE_BOOTNOTSUPP; #endif break; case BOOT_2_INIT : #if BOOTSTRAPMODE_SUPPORTED//如果BOOT模式被支持 if(bBootMode) { bBootMode = FALSE; CheckSmSettings(MAILBOX_READ+1); #if AL_EVENT_ENABLED//如果AL事件使能 /* 禁止所有的事件在BOOT状态 */ HW_ResetALEventMask(0); #endif #if MAILBOX_SUPPORTED MBX_StopMailboxHandler(); result = APPL_StopMailboxHandler(); #endif } #else result = ALSTATUSCODE_BOOTNOTSUPP; #endif #if TIESC_HW//如果支持的是TI的ESC硬件 #ifdef ENABLE_ONLINE_FIRMWARE_UPGRADE bsp_boot_2_init_handler(); #endif #endif break; case INIT_2_PREOP : #if MAILBOX_SUPPORTED//如果邮箱支持 { /*在mailbox.c里面的函数MBX_StartMailboxHandler函数,检查是否邮箱SM区域SM0和SM1是否存在相互的重叠?如果结果是不等于0,则从站将停留在INIT状态和设置AL-Status的错误位(位4 */ result = MBX_StartMailboxHandler(); if (result == 0) { bApplEsmPending = FALSE; /* 此外,这里有一个另外得应用程序特别的检查(在ecatappl.c)如果状态在INIT到PREOP被转换,如果结果不等于0,从站将停留在INIT和设置AL-Status的错误代码(位4)additionally there could be an application specific check (in ecatappl.c) if the state transition from INIT to PREOP should be done if result is unequal 0, the slave will stay in INIT and sets the ErrorInd Bit (bit 4) of the AL-Status */ result = APPL_StartMailboxHandler(); if ( result == 0 ) { bMbxRunning = TRUE; } } if(result != 0 && result != NOERROR_INWORK) { /*停止APPL邮箱操作,如果APPL开始邮箱操作在之前被调用Stop APPL Mbx handler if APPL Start Mbx handler was called before*/ if(!bApplEsmPending) APPL_StopMailboxHandler(); MBX_StopMailboxHandler(); } } #endif break; case PREOP_2_SAFEOP: /* 开始输入操作(函数在上面被定义)start the input handler (function is defined above) */ result = StartInputHandler(); if ( result == 0 ) { bApplEsmPending = FALSE; result = APPL_StartInputHandler(&u16ALEventMask); if(result == 0) { #if AL_EVENT_ENABLED /* 初始化AL事件屏蔽寄存器(0x204)initialize the AL Event Mask register (0x204) */ HW_SetALEventMask( u16ALEventMask ); #endif bEcatInputUpdateRunning = TRUE; } } /*如果一个开始输入操作,返回一个错误,停止输入操作if one start input handler returned an error stop the input handler*/ if(result != 0 && result != NOERROR_INWORK) { if(!bApplEsmPending) { /*之前,APPL开始操作被调用,调用APPL停止操作Call only the APPL stop handler if the APPL start handler was called before*/ /*应用程序可以响应状态转换在函数APPL_StopInputHandle这个函数The application can react to the state transition in the function APPL_StopInputHandler */ /*ECATCHANGE_START(V5.01) ESM1*/ APPL_StopInputHandler(); /*ECATCHANGE_END(V5.01) ESM1*/ } StopInputHandler(); } break; case SAFEOP_2_OP: /* 开始输出操作(函数在上面被定义)start the output handler (function is defined above) */ result = StartOutputHandler(); if(result == 0) { bApplEsmPending = FALSE; result = APPL_StartOutputHandler(); if(result == 0) { /*设备是在运行状态Device is in OPERATINAL*/ bEcatOutputUpdateRunning = TRUE; } } if ( result != 0 && result != NOERROR_INWORK) { if(!bApplEsmPending) APPL_StopOutputHandler(); StopOutputHandler(); } break; case OP_2_SAFEOP: /* 停止输出操作(函数在上面定义)stop the output handler (function is defined above) */ /* ECATCHANGE_START(V5.01) ESM2*/ APPL_StopOutputHandler(); /* ECATCHANGE_END(V5.01) ESM2*/ StopOutputHandler(); break; case OP_2_PREOP: /* 停止输出操作(函数在上面定义)stop the output handler (function is defined above) */ /* ECATCHANGE_START(V5.01) ESM2*/ result = APPL_StopOutputHandler(); /* ECATCHANGE_END(V5.01) ESM2*/ StopOutputHandler(); if (result != 0) break; stateTrans = SAFEOP_2_PREOP; case SAFEOP_2_PREOP: /* 停止输出操作(函数在上面定义)stop the input handler (function is defined above) */ /* ECATCHANGE_START(V5.01) ESM2*/ APPL_StopInputHandler(); /* ECATCHANGE_END(V5.01) ESM2*/ StopInputHandler(); break; case OP_2_INIT: /* 停止输出操作(函数在上面定义)stop the output handler (function is defined above) */ /* ECATCHANGE_START(V5.01) ESM2*/ result = APPL_StopOutputHandler(); /* ECATCHANGE_END(V5.01) ESM2*/ StopOutputHandler(); if (result != 0) break; stateTrans = SAFEOP_2_INIT; case SAFEOP_2_INIT: /* 停止输出操作(函数在上面定义)stop the input handler (function is defined above) */ /* ECATCHANGE_START(V5.01) ESM2*/ result = APPL_StopInputHandler(); /* ECATCHANGE_END(V5.01) ESM2*/ StopInputHandler(); if (result != 0) break; stateTrans = PREOP_2_INIT; case PREOP_2_INIT: #if MAILBOX_SUPPORTED MBX_StopMailboxHandler(); result = APPL_StopMailboxHandler(); #endif break; case INIT_2_INIT: case PREOP_2_PREOP: case SAFEOP_2_SAFEOP: case OP_2_OP: /*ECATCHANGE_START(V5.01) ESM3*/ if(bErrAck) APPL_AckErrorInd(stateTrans); /*ECATCHANGE_END(V5.01) ESM3*/ if(!bLocalErrorFlag) { /*没有本地错误标号,使能SMno local error flag is currently active, enable SM*/ if ( nAlStatus & (STATE_SAFEOP | STATE_OP)) { if(nPdOutputSize > 0) { HW_EnableSyncManChannel(PROCESS_DATA_OUT); } else { HW_EnableSyncManChannel(PROCESS_DATA_IN); } } } result = NOERROR_NOSTATECHANGE; break; case INIT_2_SAFEOP: case INIT_2_OP: case PREOP_2_OP: case PREOP_2_BOOT: case SAFEOP_2_BOOT: case OP_2_BOOT: result = ALSTATUSCODE_INVALIDALCONTROL; break; default: result = ALSTATUSCODE_UNKNOWNALCONTROL; break; } } else { /* 检查SM设置不成功,转换回到PREOP和INIT状态the checking of the sync manager settings was not successful switch back the state to PREOP or INIT */ switch (nAlStatus) { case STATE_OP: /* 停止输出操作(函数在上面定义)stop the output handler (function is defined above) */ /* ECATCHANGE_START(V5.01) ESM2*/ APPL_StopOutputHandler(); /* ECATCHANGE_END(V5.01) ESM2*/ StopOutputHandler(); case STATE_SAFEOP: /* 停止输入操作(函数在上面定义)stop the input handler (function is defined above) */ /* ECATCHANGE_END(V5.01) ESM2*/ APPL_StopInputHandler(); /* ECATCHANGE_END(V5.01) ESM2*/ StopInputHandler(); case STATE_PREOP: if ( result == ALSTATUSCODE_INVALIDMBXCFGINPREOP ) { #if MAILBOX_SUPPORTED /* 邮箱的SM设置是错误的,转换回到INIT状态the mailbox sync manager settings were wrong, switch back to INIT */ MBX_StopMailboxHandler(); APPL_StopMailboxHandler(); #else /*禁止SM0Disable SM0 (邮箱输出)*/ HW_DisableSyncManChannel(MAILBOX_WRITE); /*禁止 SM1 (邮箱输入)*/ HW_DisableSyncManChannel(MAILBOX_READ); #endif nAlStatus = STATE_INIT; } else nAlStatus = STATE_PREOP; } } if ( result == NOERROR_INWORK ) { /* 状态转换仍然在工作,ECAT_SrateChange需要被调用从应用程序里面state transition is still in work ECAT_StateChange must be called from the application */ bEcatWaitForAlControlRes = TRUE; /* 状态转换需要被存储state transition has to be stored */ nEcatStateTrans = stateTrans; /*初始化ESM的超时计数(将被递减由本地的定时器,定时1ms的时间)Init ESM timeout counter (will be decremented with the local 1ms timer)*/ switch(nEcatStateTrans) { case INIT_2_PREOP: case INIT_2_BOOT: EsmTimeoutCounter = PREOPTIMEOUT; break; case PREOP_2_SAFEOP: case SAFEOP_2_OP: EsmTimeoutCounter = SAFEOP2OPTIMEOUT; break; default: EsmTimeoutCounter = 200; //设置常规的超时值为200msSet default timeout value to 200ms break; } EsmTimeoutCounter -= 50; //减去50ms从超时到响应,在主站进入超时之前subtract 50ms from the timeout to react before the master runs into a timeout. } else /* AL状态代码寄存器不应该被更改,如果函数被调用,如果SM转变时间或者同个状态的AL控制事件The AL Status Code register shall not be modified if the function is called in case of SM change event or an AL-Control event with the same state */ if ( alControl != (nAlStatus & STATE_MASK) ) { if ( (result != 0 || alStatusCode != 0) && ((alControl | nAlStatus) & STATE_OP) ) { /* 本地的应用程序需要请求离开状态OP,所以,我们需要禁止SM2和使状态转换从op到SAFEOP同个调用函数StopOutputHandler()the local application requested to leave the state OP so we have to disable the SM2 and make the state change from OP to SAFEOP by calling StopOutputHandler */ //如果输出更新仍然进行,需要执行StopOutputHandler()函数only execute StopOutputHandler() if Output update is still running if(bEcatOutputUpdateRunning) { /* ECATCHANGE_START(V5.01) ESM2*/ APPL_StopOutputHandler(); /* ECATCHANGE_END(V5.01) ESM2*/ StopOutputHandler(); } if(nPdOutputSize > 0) { /* 禁止Sync Manager通道2(输出)disable the Sync Manager Channel 2 (outputs) */ HW_DisableSyncManChannel(PROCESS_DATA_OUT); } else { /*禁止Sync Manager3(输入),如果没有输入变量disable Sync Manager 3 (inputs) if no outputs available*/ HW_DisableSyncManChannel(PROCESS_DATA_IN); } } if ( result != 0 ) { if ( nAlStatus == STATE_OP ) nAlStatus = STATE_SAFEOP; /* 保持失败的状态,如果AL状态代码应该被重置,如果一个成功的转换发生save the failed status to be able to decide, if the AL Status Code shall be reset in case of a coming successful state transition */ nAlStatus |= STATE_CHANGE; } else { /* 状态转换成功state transition was successful */ if ( alStatusCode != 0 ) { /* 来自用户的状态转换请求state change request from the user */ result = alStatusCode; alControl |= STATE_CHANGE; } /* 响应新的状态转换acknowledge the new state */ nAlStatus = alControl; } bEcatWaitForAlControlRes = FALSE; /* 写用户状态寄存器write the AL Status register */ SetALStatus(nAlStatus, result); } else { bEcatWaitForAlControlRes = FALSE; /* AL-Status应该被更新和AL-Status-Code应该被重置,如果错误码被响应AL-Status has to be updated and AL-Status-Code has to be reset if the the error bit was acknowledged */ SetALStatus(nAlStatus, 0); } #if CiA402_DEVICE if((stateTrans & 0x80) && !(stateTrans & STATE_OP)) //状态转换从运行状态到非运行状态state transition from OP to "not OP" { CiA402_LocalError(ERROR_COMMUNICATION); } #endif }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1169673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Beyond Compare5.0+的方法

很多文章都提了用某个keygen脚本 但是没提要先改windows系统下的bc.exe 这里摘录了一位大佬的方法。原文链接&#xff1a; https://github.com/garfield-ts/BCompare_Keygen?tabreadme-ov-file 下载的脚本在这里&#xff1a; https://github.com/garfield-ts/BCompare_Ke…

【2026】超详细BurpSuite安装保姆级教程,Burp Suite的基本介绍及使用,收藏这一篇就够了

【2026】超详细Burp Suite安装保姆级教程&#xff0c;Burp Suite的基本介绍及使用&#xff0c;收藏这一篇就够了 一、简介 Burpsuite 是用于攻击 web 应用程序的集成平台。它包含了许多 Burp 工具&#xff0c;这些不同的 Burp 工具通过协同工作&#xff0c;有效的分享信息&am…

Hadoop_Spark背后的CAP定理:大数据框架设计哲学

Hadoop/Spark背后的CAP定理&#xff1a;大数据框架设计哲学关键词&#xff1a;CAP定理、分布式系统、一致性、可用性、分区容错性、Hadoop、Spark摘要&#xff1a;本文将带你走进分布式系统的"三角困境"——CAP定理&#xff0c;用生活中的小故事和大数据框架&#xf…

性价比高的厌氧池清淤哪个靠谱

厌氧池清淤哪家好&#xff1f;2024年性价比TOP5专业深度测评开篇&#xff1a;行业痛点与测评使命厌氧池作为污水处理的核心设施&#xff0c;其清淤作业直接影响企业环保合规与生产效率。然而&#xff0c;市场上清淤服务商资质参差不齐&#xff0c;价格从每立方几十元到数百元差…

深入解析BPFDoor:利用BPF技术的隐蔽Linux后门

嗨&#xff0c;恶意软件爱好者们&#xff0c; 今天&#xff0c;我将分析一款名为“BPFDoor”的恶意软件。该恶意软件于2022年被发现。 在分析恶意软件之前&#xff0c;别忘了使用虚拟机&#xff0c;并始终记住使用仅主机模式连接。 摘要 BPFDoor 是一款 Linux/Unix 恶意后门程序…

手把手教你用9款AI工具一键生成毕业论文全程指南

一、毕业论文工具选择&#xff1a;9款AI工具核心功能对比表 写论文前最头疼的是“选对工具”——不同工具擅长的环节不同&#xff0c;选错了反而浪费时间。下面这张表格帮你快速定位每个阶段最适合的工具&#xff0c;核心推荐的「鲲鹏智写」会用★标注&#xff0c;方便你重点关…

HTTPS加密与JWT鉴权机制详解

HTTPS加密与JWT鉴权机制详解 1.HTTPS 数据传输加密流程 非对称加密&#xff08;公钥/私钥&#xff09;并不直接用于数据传输 • 直接用公钥加密大量业务数据效率太低&#xff08;RSA、ECC 这种算法比 AES 慢几个数量级&#xff09;。• 实际上&#xff0c;非对称加密只用来 …

OV SSL证书为什么是助力企业网站实现HTTPS加密的优选方案?怎么快速获取?

一、为什么 OV SSL 证书是企业网站实现 HTTPS 加密的优选方案&#xff1f; &#xff08;一&#xff09;核心优势&#xff1a;安全 可信 合规的黄金三角 1. 身份强验证&#xff0c;终结“真假官网”难题 双重审核机制&#xff1a;不同于 DV&#xff08;域名验证&#xff09…

Ubuntu 22.04上的Bitsandbytes模型量化完全指南:从原理到实践 - 实践

Ubuntu 22.04上的Bitsandbytes模型量化完全指南:从原理到实践 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &q…

3月份SSL证书有效期缩短为200天?企业应该如何有效的应对?

一、政策背景与核心解读 政策背景​ 国际标准组织 CA/浏览器论坛&#xff08;CA/Browser Forum&#xff09;通过了《SC-081v3 提案》&#xff0c;决定逐步缩短 SSL/TLS 证书最长有效期&#xff0c;旨在降低私钥泄露风险、加速加密算法迭代&#xff0c;并提升网络安全整体水平。…

网络安全等级保护制度详解,一文掌握核心要点!

网络安全等级保护制度详解&#xff0c;一文掌握核心要点&#xff01;_等级保护相关政策和法律法规 一、等级保护制度发展情况 等级保护制度的法律依据 《计算机信息系统安全保护条例》&#xff08;1994年General Office of the State Council第147号令&#xff09; 公安部主…

全网最全9个一键生成论文工具,继续教育学生轻松搞定毕业论文!

全网最全9个一键生成论文工具&#xff0c;继续教育学生轻松搞定毕业论文&#xff01; AI 工具助力论文写作&#xff0c;轻松应对学术挑战 在当今快速发展的教育环境中&#xff0c;继续教育学生面临着越来越高的学术要求。尤其是在撰写毕业论文时&#xff0c;如何高效完成内容创…

2026年靠谱GEO助手源码哪家?源头作者直推 - 源码云科技

2026年靠谱GEO助手源码哪家?源头作者直推2026年AI搜索风口全面爆发,生成式引擎优化已然成为企业引流获客的核心赛道,选择一家靠谱的GEO优化服务商,拿到一手GEO优化源码,直接决定了创业项目的盈利上限和市场竞争力…

yum命令用法与技巧总结

yum是RHEL、CentOS等Linux系统上强大的软件包管理器&#xff0c;能自动解决依赖问题。掌握它的核心操作和技巧&#xff0c;能极大提升你的系统管理效率。 &#x1f4e6; yum核心操作速查 你可以将yum理解为Linux的“应用商店”&#xff0c;它通过仓库&#xff08;Repository&…

靶场 一个免费的CTF靶场练习平台

靶场 | 一个免费的CTF靶场练习平台 介绍 一个动态flag练习靶场平台拥有容器管理、题库管理、动态flag、作弊检测、公告通知、题库隔离、排行榜等功能&#xff0c;能够实现动态启动题库、快速部署、权限分离、一键部署、多端口开放&#xff0c;并提供compose容器支持&#xff…

计算机专业必看,大学如何规划才能跑赢同龄人?

计算机专业必看&#xff0c;大学如何规划才能跑赢同龄人&#xff1f; 计算机专业 -COMPUTER SCIENCE- 你有没有发现——同样学计算机&#xff0c; 有人**一毕业****月薪两三万、**甚至年薪百万&#xff1b; 也有人六七千、甚至对口工作都找不着。 差距到底在哪&#xff1…

2026集美装修公司哪家好?口碑+性价比精选,装修博主实测分享! - 品牌测评鉴赏家

2026集美装修公司哪家好?口碑+性价比精选,装修博主实测分享!一、引言:集美装修选公司,别再盲目踩坑! 1.1 集美业主装修的痛点与需求 在集美,不管是拿到新房钥匙、满心憧憬未来生活的业主,还是打算对老房子进行…

dnf包管理器使用指南与技巧总结

一、命令结构概览基本语法dnf [选项] <子命令> [参数]二、核心子命令详解1. 安装相关命令install - 安装软件包sudo dnf install package_name sudo dnf install package1 package2 package3 # 多个包 sudo dnf install package-1.0-1.el8.x86_64 # 指定版本 sudo dnf…

2026年口碑好的温州商务车租车,温州大巴55座租车,温州商务车出租公司用户好评名录 - 品牌鉴赏师

引言在当今出行需求日益多样化的时代,租车服务成为了许多人商务出行、旅游度假等活动的重要选择。温州作为经济活跃、旅游资源丰富的城市,其租车市场也呈现出蓬勃发展的态势。为了帮助消费者在众多的租车公司中挑选到…

红队视角:内网是如何被一步步打穿的?

红队视角&#xff1a;内网是如何被一步步打穿的&#xff1f; 在数字化的世界里&#xff0c;信息已成为最具战略价值的资产之一&#xff0c;而与之相伴的信息安全威胁也愈发复杂多样&#xff0c;黑客攻击、恶意软件感染、数据泄露等安全事件频繁发生&#xff0c;给个人、企业乃…