2023-03-29 08:13:06 | 人围观 | 编辑:wyc
客户管理系统192.168.2.1,你好!大家好,我是。对于wifi来说,无论是家用还是公司用,其实都是一种只需修改密码的方式,即进入后台修改即可。这里边肖将用自己的wifi来演示:如何修改WiFi的密码?
原材料/工具
手机:小米6plus,系统:MIUI10.8
浏览器:小米自带浏览器,版本:* * *
确保手机连接了wifi。
第一步
打开手机的【设置】,如图。
第二步
打开手机的【wifi】,如图。
第三步
打开手机wifi的开关,如图。
第四步
自动连接家里wifi,如图。
更改wifi密码
第一步
已经确认连接了wifi连接,然后打开手机自带的浏览器,如图。
第二步
然后输入路由器的后台地址,对边肖的家庭来说是[* * *]。看自己路由器后面就能看到,然后就不用登录主动进入路由器后台了。
【Unix课程设计基于Linux内核的防火墙的分析与设计】
一.什么是状态机?
有限状态机(FSM)是一种建模对象行为的工具。它的主要功能是描述一个对象在其生命周期中所经历的状态序列,以及如何响应来自外界的各种事件。在面向对象的软件系统中,无论一个对象多么简单或复杂,它从开始到结束都必然要经历一个完整的过程,这个过程通常称为对象的生命周期。一般来说,一个对象在它的一生中是不可能完全孤立的。它必须通过发送消息来影响其他对象,或者通过接受消息来改变自己。在大多数情况下,这些消息只是简单的同步方法调用。例如,在银行客户管理系统中,Customer类的一个实例可能会在必要时调用Account类中定义的getBalance()方法。在这个简单的例子中,类Customer不需要有限状态机来描述它的行为,主要是因为它当前的行为不依赖于过去的某个状态。
可惜,并不是所有的情况都会这么简单。实际上,很多实用的软件系统都必须维护一两个非常关键的对象,这些对象通常具有非常复杂的状态转换关系,需要响应来自外部的各种异步事件。例如,在VoIP电话系统中,电话实例必须能够响应来自另一方的随机呼叫、来自用户的击键事件和来自网络的信号。在处理这些消息时,Telephone类要采取的行为完全取决于它的当前状态,所以此时使用状态机将是一个不错的选择。
游戏引擎是有限状态机最成功的应用领域之一。因为一个设计良好的状态机可以用来代替一些人工智能算法,所以游戏中的每个角色或设备都有可能嵌入一个状态机。考虑一个简单的对象,比如RPG游戏中的城门,它有四种状态:打开、关闭、锁定和解锁,如图1所示。当玩家到达一扇锁着的门时,如果他找到了开门的钥匙,他可以使用它来将门的当前状态改变为未锁,并且进一步地,他可以通过旋转门上的把手将门的状态改变为已打开,从而成功地进入城市。
图1控制城门的状态机
在描述有限状态机时,状态、事件、转移和动作是经常遇到的几个基本概念。
状态是指对象在其生命周期中的状态。处于某种状态的对象必然会满足某些条件、执行某些动作或等待某些事件。'
事件是指在时间和空间中占据一定位置,对状态机有意义的事物。事件通常会导致状态转换,促使状态机从一种状态切换到另一种状态。
过渡是指两种状态之间的关系,表示对象在第一种状态下会执行某些动作,当某个事件发生且满足某个条件时会进入第二种状态。
动作是指可以在状态机中执行的原子操作。所谓原子操作,就是在运行的过程中不能被其他消息打断,必须一直执行。
第二,手工编写状态机
与其他常用的设计模式不同,当程序员想在自己的软件系统中添加状态机时,必须额外编写一部分代码进行逻辑控制。如果系统足够复杂,实现和维护这部分代码还是相当困难的。在实现有限状态机时,使用switch语句是最简单直接的方法。基本思想是在状态机中为每个状态设置一个case分支,专门用来控制状态。下面的代码演示了如何使用switch语句实现图1所示的状态机:
开关(状态){
//处理状态打开的分支。
案例(已打开):{
//执行打开操作
open();
//检查是否有CloseDoor事件。
if(closeDoor()){
//当前状态转换为关闭。
变更状态(关闭)
}
打破;
}
//处理关闭状态的分支
案例(已关闭):{
//执行关闭操作。
close();
//检查是否有OpenDoor事件。
if(openDoor()){
//当前状态转换为已打开。
changeState(已打开);
}
//检查是否有LockDoor事件。
if(lockDoor()){
//当前状态转换为锁定。
changeState(锁定);
}
打破;
}
//处理锁定状态的分支
案例(锁定):{
//执行动作锁。
lock();
//检查是否有UnlockDoor事件。
if(unlockDoor()){
//当前状态转换为解锁状态。
changeState(解锁);
}
打破;
}
//处理未锁定状态的分支。
机箱(未锁定):{
//执行解锁动作
unlock();
//检查是否有LockDoor事件。
if(lockDoor()){
//当前状态转换为锁定。
变更状态(锁定)
}
//检查是否有OpenDoor事件。
if(openDoor()){
//当前状态转换为已打开。
changeSate(已打开);
}
打破;
}
}
switch语句实现的有限状态机可以很好的工作,但是代码的可读性不是很理想。主要原因是在实现状态之间的转换时,检查转换条件和执行状态转换是在当前状态中混合进行的。比如城门处于打开状态时,需要在相应的情况下调用closeDoor()函数来检查是否需要进行状态转换,如果是,则需要调用changeState()函数将当前状态切换到关闭状态。显然,如果每个状态需要分别检查几个不同的转换条件,状态机需要根据检查结果切换到不同的状态,这样的代码会很枯燥,很难理解。从代码重构的角度来说,引入两个函数比较好,checkStateChange()和performStateChange(),专门用来检查转换条件,激活转换过程中需要执行的各种动作。这样,程序结构将变得更加清晰:
开关(状态){
//处理状态打开的分支。
案例(已打开):{
//执行打开操作
open();
//检查是否有触发状态转换的事件。
if(checkStateChange()){
//转换状态机的状态。
performStateChange();
}
打破;
}
//处理关闭状态的分支
案例(已关闭):{
//执行关闭操作。
close();
//检查是否有触发状态转换的事件。
if(checkStateChange()){
//转换状态机的状态。
performStateChange();
}
打破;
}
//处理锁定状态的分支
案例(锁定):{
//执行动作锁。
lock();
//检查是否有触发状态转换的事件。
if(checkStateChange()){
//转换状态机的状态。
performStateChange();
}
打破;
}
//处理未锁定状态的分支。
机箱(未锁定):{
//执行动作锁。
unlock();
//检查是否有触发状态转换的事件。
if(checkStateChange()){
//转换状态机的状态。
performStateChange();
}
打破;
}
}
但是checkStateChange()和performStateChange()这两个函数在面对非常复杂的状态机时,仍然会使内部逻辑变得极其臃肿,甚至难以实现。
长期以来,使用switch语句一直是实现有限状态机的唯一方式,即使是编译器这样的复杂软件系统也大多是直接用这种方式实现的。然而,随着状态机应用的逐步深入,构造的状态机变得越来越复杂,这种方法也开始面临各种严峻的考验。最头疼的是,如果状态机中有很多状态或者状态之间的转换关系极其复杂,那么单纯用switch语句构造的状态机就不具有可维护性。
第三,自动生成状态机
为一个实际的软件系统编写一个状态机并不是一件非常容易的事情,尤其是当状态机本身很复杂的时候。很多有过类似经历的程序员经常把它描述为一个‘没有创造性’的过程,因为他们需要投入大量的时间和精力在如何管理状态机中的各种状态,而不是程序本身的运行逻辑。作为一种通用的软件设计模式,各种软件系统的状态机之间必然存在一些共性,于是人们开始尝试开发一些工具来自动生成有限状态机的框架代码,在Linux下有一个不错的选择:—— FSME(有限状态机编辑器)。
图2显示了FSME
FSME是一个基于Qt的有限状态机工具,允许用户以图形化的方式对程序中需要的状态机进行建模,也可以自动生成用C或Python实现的状态机框架代码。以图1中城门的状态机为例,介绍了如何使用FSME自动生成程序中需要的状态机代码。
3.1状态机建模
首先运行fsme命令启动状态机编辑器,然后单击工具栏上的“新建”按钮创建一个新的状态机。在FSME中,有五个基本元素用于构建状态机:事件、输入、输出、状态和转换。其中四个可以在界面左侧的树形列表中找到。
状态建模
在FSME界面左侧的树形列表中选择“状态”项,然后按键盘上的Insert键插入一个新的状态,再在右下方的“名称”文本框中输入状态的名称,然后在右上方的绘图区域中点击要放置状态的位置,一个新的状态就创建好了。同样,您可以添加状态机所需的所有状态,如图3所示。
图3状态建模
事件建模
在FSME界面左侧的树型列表中选择“事件”项,然后按键盘上的Insert键添加一个新事件,然后在右下角的“名称”文本框中输入事件的名称,然后单击“应用”按钮创建一个新事件。同样,您可以添加状态机所需的所有事件,如图4所示。
图4事件建模
转换建模
状态转移是整个建模过程中最重要的部分,用于定义有限状态机中的一个状态如何切换到另一个状态。例如,当用于控制城门的状态机处于打开状态时,如果此时有关闭事件,状态机的当前状态就会切换到关闭状态,这样一个完整的过程可以用状态机模型中的closeDoor之类的变换来描述。
要在FSME中添加这样的转换,您首先需要在界面左侧的树形列表中选择“States”下的“Opened”项,然后按键盘上的Insert键添加一个新的转换,然后在右下角的“Name”文本框中输入转换的名称“closeDoor”。在“条件”文本框中输入“关闭”,表明触发转换的条件是关闭事件的发生。在' Target '下拉框中选择' Closed '表示转换发生后状态机将切换到Closed状态,最后点击' Apply '定义一个新的状态转换关系,如图5所示。同样,您可以添加状态机所需的所有转换。
图5转换建模
3.2 '生成状态机框架
使用FSME不仅可以对状态机进行可视化建模,更重要的是,它还可以根据得到的模型自动生成用C或Python实现的状态机框架。首先在FSME界面左侧的树形列表中选择‘Root’项,然后在右下角的‘Name’文本框中输入状态机的名称‘door FSM’,再从‘initial state’下拉列表中选择状态‘Opened’作为状态机的初始化状态,如图6所示。
图6设置初始属性
将状态机模型保存为door.fsm文件后,可以使用以下命令生成包含状态机定义的头文件:
$fsmcdoor.fsm-d-oDoorFSM。
此外,您可以生成一个包含状态机实现的框架代码:
$ fsmcdoor . FSM-d-impldoorfsm . h-odoorfsm . CPP
如果想验证生成的状态机,只需要手动编写一段代码进行测试:
/*
*TestFSM.cpp
*测试生成的状态机框架
*/
#包含“DoorFSM.h”
intmain()
{
DoorFSMdoor
门。a(door FSM:Close);
门。a(door FSM:Lock);
门。a(door FSM:Unlock);
门。a(door FSM:Open);
}
有限状态机由事件驱动。在FSME生成的状态机框架代码中,可以使用方法A()向状态机发送相应的事件,从而为状态机的正常运行提供所需的“动力”。状态机负责在内部维护一个事件队列,所有到达的事件都会先放在事件队列中等待,保证按照到达的顺序进行处理。在处理每一个到达的事件时,状态机会根据其当前状态检查该状态对应的转移条件是否已经满足,如果满足,则激活相应的状态转移过程。
可以使用以下命令将生成的状态机框架和测试代码编译成可执行文件:
$gDoorFSM.cppTestFSM.cpp-ofsm
因为在使用fsmc命令生成状态机代码时使用了-d选项,所以生成的状态机框架将包含某些调试信息,包括状态机中每个状态转换时的激活事件、转换前的状态、经历的转换以及转换后的状态,如下所示:
$./fsm
DoorFSM:事件:“关闭”
DoorFSM:状态:“已打开”
DoorFSM:转换:“关门”
DoorFSM:新状态:“已关闭”
DoorFSM:事件:“锁定”
DoorFSM:状态:“关闭”
DoorFSM:转换:“锁定门”
DoorFSM:新状态:“锁定”
DoorFSM:事件:“解锁”
DoorFSM:状态:“锁定”
DoorFSM:转换:“解锁门”
DoorFSM:新状态:“已解锁”
DoorFSM:事件:“打开”
DoorFSM:状态:“解锁”
DoorFSM:转换:“开门”
DoorFSM:新状态:“已打开”
3.3自定义状态机
目前,状态机已经能够响应各种外部事件,并适当地调整其当前状态,也就是说,状态机引擎的功能已经实现。接下来要做的就是根据应用的具体需求进行定制,将那些与软件系统本身相关的处理逻辑添加到状态机中。在FSME,与特定应用相关的操作被称为输出,这实际上是需要用户实现的虚拟功能。自动生成的状态机引擎负责在进入或退出某个状态时调用它们。
还是以控制城门的状态机为例,假设我们要在进入每个状态时添加一些处理逻辑。首先,在FSME界面左侧的树形列表中选择“Outputs”项,然后按键盘上的Insert键添加一个新的输出,然后在右下方的“Name”文本框中输入相应的名称,然后单击“Apply”按钮创建一个新的输出,如图7所示。同样,您可以添加状态机所需的所有输出。
图7添加输出
在定义了所有输出之后,您可以为状态机中的每个状态绑定相应的输出。首先在FSME界面左侧的‘States’项中选择相应的状态,然后在右下角的‘Available’列表框中选择与该状态对应的输出,然后点击“”按钮将其添加到‘in’列表中,如图8所示。同理,状态机中的所有状态都可以设置对应的输出,同一状态可以有多个输出对应,其中进入状态时调用In列表中的输出,退出状态时调用out列表中的输出,输出调用的顺序与in或out列表中的一致。
图8显示了状态设置输出。
由于修改了状态机模型,我们需要重新生成状态机的帧代码,但这次不需要添加-d参数:
$fsmcdoor.fsm-oDoorFSM.h
$ fsmcdoor . FSM-d-impldoorfsm . h-odoorfsm . CPP
在新的状态机模型中,我们增加了四个输出:enterOpend、enterClosed、enterLocked和enterUnlocked,因此生成的类DoorFSM将包含以下纯虚函数。
virtualvoidenterOpened()=0;
virtualvoidenterLocked()=0;
virtualvoidenterUnlocked()=0;
virtualvoidenterClosed()=0;
显然,此时生成的状态机框架已经不能直接编译了。我们必须从DoorFSM类派生一个子类,并提供这些纯虚函数的具体实现:
/*
*DoorFSMLogic.h
*状态机控制逻辑的头文件
*/
#包含“DoorFSM.h”
classDoorFSMLogic:publicDoorFSM
{
受保护:
virtualvoidenterOpened();
virtualvoidenterLocked();
virtualvoidenterUnlocked();
virtualvoidenterClosed();
};
如前所述,这些功能实际上代表了应用系统的处理逻辑。例如,我们简单地输出一些提示信息:
/*
*DoorFSMLogic.cpp
*状态机控制逻辑的实现文件
*/
#包含“DoorFSMLogic.h”
#includeiostream
voidDoorFSMLogic:enterOpened()
{
std:cout'EnterOpenedstate。STD:endl;
}
voidDoorFSMLogic:enterClosed()
{
std:cout'EnterClosedstate。STD:endl;
}
voidDoorFSMLogic:enterLocked()
{
std:cout'EnterLockedstate。STD:endl;
}
voidDoorFSMLogic:enter unlocked()
{
std:cout'EnterUnlockedstate。STD:endl;
}
类似地,为了验证生成的状态机,我们还需要手动编写一段测试代码:
/*
*TestFSM.cpp
*测试状态机逻辑
*/
#包含“DoorFSMLogic.h”
intmain()
{
DoorFSMLogicdoor
门。a(door FSM:Close);
门。a(door FSM:Lock);
门。a(door FSM:Unlock);
门。a(door FSM:Open);
}
可以使用以下命令将生成的状态机框架和测试代码编译成可执行文件:
$ gdoorfsm . cppdoorfsmlogic . cpptestlogic . CPP-ologic
运行结果如下:
$./逻辑
输入Closedstate。
EnterLockedstate。
EnterUnlockedstate。
肠穿孔状态。
四。摘要
在面向对象的软件系统中,一些对象具有非常复杂的生命周期模型,使用有限状态机是描述这类对象的最佳方式。作为一种软件设计模式,虽然有限状态机的概念并不复杂,实现起来也并不困难,但它的问题是当状态机的模型复杂到一定程度时,会带来实现和维护上的困难。Linux下的FSME是一个可视化的有限状态机建模工具,它支持状态机框架代码的自动生成。有了它,构建基于有限状态机的应用系统就更容易了。
【192.168.2.1路由器设置密码?】
路由器里有两个密码,一个是无线密码,一个是登录密码。介绍各自的设置或更改方法:
首先,设置路由器登录密码
1.将路由器连接到电脑上,打开浏览器,在路由-输入用户名和密码(默认一般是admin)中输入192.168.1.1(这是一般路由器地址或者查看路由器背面的登录信息)。
2.更改登录密码的选项通常在系统工具中。
3.在新页面中,填写要更改的用户名和密码。前提是知道正确的原用户名和密码。修改后,保存。
其次,设置或修改无线连接密码
1.将路由器连接到电脑上,打开浏览器,在路由-输入用户名和密码(默认一般是admin)中输入192.168.1.1(这是一般路由器地址或者查看路由器背面的登录信息)。
2.进入后台后,选择无线设置,然后选择无线安全设置来设置或更改无线密码,如下图所示:
以上就是与wifi怎么改密码相关内容,是关于wifi怎么改密码,客户管理系统192.168.2.1的分享。看完客户管理系统192.168.2.1后,希望这对大家有所帮助!
本文标签:
全站搜索