带联网功能的RFID宿舍门禁(六)-两年后的再次总结

news2024/12/24 21:18:25

文章首发及后续更新:https://mwhls.top/4066.html,无图/无目录/格式错误/更多相关请至首发页查看。
新的更新内容请到mwhls.top查看。
欢迎提出任何疑问及批评,非常感谢!

带联网功能的RFID宿舍门禁

两年后又来了次总结,为什么总结?因为有门课能拿它来扯

项目介绍

涉及技术

  1. 射频识别技术(Radio-frequency identification, RFID)。
  2. WiFi 联网。

项目出发点

  • 以更低的成本实现项目所需功能。
    1. 物料成本低。
    2. 学习成本低。
    3. 结合 RFID 与联网功能。

设计方向

  • 实现一个门禁装置,该门禁装置需要允许学生卡刷卡开门,以及联网控制开门。
    • RFID的一个简单应用就是门禁装置,通过刷卡控制舵机转动,舵机拉动门锁。
    • 加上联网功能后,手机连上控制设备的WiFi,打开控制网页控制舵机转动,舵机拉动门锁。

实现效果

  1. RFID: 在感应装置刷录入系统的学生卡后,可控制舵机转动。
  2. WiFi: 连上 WiFi,登录控制页面后,点击控制按钮,可控制舵机转动。
  3. 舵机: 舵机转动带动门锁,并打开门锁(实际实现中因舵机动力不足无法完全拉开门锁)。

实现过程

  1. 选择 RFID 与 WIFI 模块、实现平台、实现语言
  2. 测试 WIFI 模块与 RFID 模块
  3. 实现 WIFI 功能
  4. 实现 RFID 功能
  5. 融合 WIFI 与 RFID 功能

路径选择

资料收集

  1. 网上是否有现成或类似的方案?
  2. 该方案实现效果是否满足需求?
  3. 该方案所需成本是否可以接受?

确定目标

  • 硬件:
    • RFID 模块:MFRC522
    • WiFi 模块:ESP8266
    • 开发板:Arduino Nano V3 CH340G
    • 舵机:SG90
  • 开发平台:
    • Arduino
  • 编程语言:
    • C

首次实验

实验目的

  • 测试烧录与串口通信

实验结果

  • Arduino 环境配置。
  • 实验了 ESP8266 的烧录。
  • 学习了 Lua 与 CH340 开发板通信。

测试 WiFi 模块

实验目的

  • 使用 ESP8266,开放热点,建立简单网站。

实验材料

ESP8266
WiFi 模块
NodeMCU.jpg

实验过程

  1. ESP8266 环境配置
    • 环境下载速度慢:
      1. 用连谷歌的网络下载。
      2. 更换第三方下载源。
      3. 使用默认下载,然后用其它地方发布的该文件替换它(文件数量少)。
  2. ESP8266 建站及开放热点
    • 参考网上的代码,搞清楚各函数意义,修改为适用于本实现的代码。
  3. 测试连接
    • 根据代码写好的 WiFi 名与密码,使用手机连接 ESP8266 的热点,并在电脑上通过串口通信查看是否连接正常。

实验代码

#include <ESP8266WiFi.h>        // 本程序使用 ESP8266WiFi库
#include <ESP8266WebServer.h>   //  ESP8266WebServer库

ESP8266WebServer esp8266_server(80);// 建立ESP8266WebServer对象,对象名称为esp8266_server
                                    // 括号中的数字是网路服务器响应http请求的端口号
                                    // 网络服务器标准http端口号为80,因此这里使用80为端口号
#define WIFISSID "ESP8266Web"     //设定ESP8266 wifi名称
#define WIFIPSSD "123456789"      //设定wifi密码

void setup(void){
  Serial.begin(115200);          // 启动串口通讯
  setAP();                       // 设定AP模式,并建立热点。

//--------"启动网络服务功能"程序部分开始-------- //  此部分为程序为本示例程序重点1
  esp8266_server.begin();                   //  详细讲解请参见太极创客网站《零基础入门学用物联网》
  esp8266_server.on("/", handleRoot);       //  第3章-第2节 ESP8266-NodeMCU网络服务器-1
  esp8266_server.onNotFound(handleNotFound);        
//--------"启动网络服务功能"程序部分结束--------
  Serial.println("HTTP esp8266_server started");//  告知用户ESP8266网络服务功能已经启动
}

void loop(void){
  esp8266_server.handleClient();     // 处理http服务器访问
}

void setAP(){
  WiFi.mode(WIFI_AP);               // AP模式设定
  WiFi.softAP(WIFISSID,WIFIPSSD);   // WIFI热点建立
  Serial.printf("Success!\nWIFISSID:  %s \nWIFIPSSD:  %s \nControlWeb:  ", WIFISSID, WIFIPSSD);     // 输出相关信息
  Serial.println(WiFi.softAPIP());  // 输出网站地址
}

void handleRoot() {   //处理网站根目录“/”的访问请求 
  esp8266_server.send(200, "text/plain", "ESP8266 WEB CONTROL PAGE.\n       -mwhls.top");   // NodeMCU将调用此函数。
}

// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){                                        // 当浏览器请求的网络资源无法在服务器找到时,
  esp8266_server.send(404, "text/plain", "404: Not found");   // NodeMCU将调用此函数。
}

实验结果

  • ESP8266 开放热点并建站后,串口输出相关信息。
  • 手机可通过 WiFi 连上 ESP8266,并连接至控制网站。

测试RFID模块

实验目的

  • 使用 RC522,当校园卡刷卡时,使舵机转动。

实验材料及连线

SG90 9克舵机MFRC522Arduino Nano V3 CH340G
拉动门锁RFID 模块开发板
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6caYNNGM-1668948818342)(https://s2.loli.net/2022/11/19/dY6JlMwk4hFr5SC.jpg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xVdDid9L-1668948818343)(https://s2.loli.net/2022/11/19/nhprZLk5HwyXsue.jpg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aW3eCrI7-1668948818343)(https://s2.loli.net/2022/11/19/Je8Y61B3zwfNPp9.jpg)]
Arduino Nano V3 CH340GSG90(颜色)RC522(顺序)
GNDGND (棕)
5V5V (红)
D8PWM信号 (黄)
D9RST (2)
D10SDA (8)
D11MOSI (6)
D12MISO (5)
D13SCK (7)
3V33.3V (1)
GNDGND (3)

实验过程

  1. 刷卡控制舵机转动。
  2. 添加学生卡为通行卡。
    • 实现刷学生卡开门。
    • 读取学生卡的 ID,并创建通行卡数组,将 ID 写入数组。
  3. 舵机正转反转实现。
    • 实现拉动及恢复门锁。
    • 正转:拉动门锁。
    • 反转:恢复门锁。

实验代码

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
#define SERVO_PIN 8
#define USER_NUM 3

byte servoRun = 0;              // 舵机是否运行。
MFRC522 rfid(SS_PIN, RST_PIN);  // 实例化类
byte userCard[USER_NUM][4] = {  // 通行卡存储数组。
  {28,   184,  119,  33},
  {249,  231,  71,   179},
  {109,  242,  234,  235}
};

void setup() { 
  Serial.begin(9600);           // 波特率设置
  SPI.begin();                  // 初始化SPI总线
  rfid.PCD_Init();              // 初始化 MFRC522 
  pinMode(SERVO_PIN, OUTPUT);   // 舵机控制端口
}

void loop() {
  if(servoRun == 1){            // 舵机运行变量若为1,则运行。
    servoControl();             // 舵机控制函数。
  }

  if ( ! rfid.PICC_IsNewCardPresent()) return;       // 找卡
  if ( ! rfid.PICC_ReadCardSerial())   return;       // 验证NUID是否可读
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  // 检查是否MIFARE卡类型
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println("Can identify this card!");
    return;
  }

  byte i;
  for (i=0; i<USER_NUM;  i++){    // 判断卡是否为通行卡。
    byte i2;
    for(i2=0;  i2<4; i2++){       // 遍历userCard中所有卡。
      if(rfid.uid.uidByte[i2] != userCard[i][i2]) break;  // break时,表示此卡不是通行卡。
    }
    if(i2 == 4){                  // i2为4,表示此卡的四位值都验证通过。
      Serial.println("Find an accessful card.");  // 输出成功信息。
      servoRun = 1;               // 将开门变量置1。
      break;                      // 已找到通行卡,跳出循环。
    }
  }
  if(i==USER_NUM){                // 若i等于通行用户数量,则上层循环未找到通行卡。
    Serial.print("Find a unknown card, its uid:");
    for(i=0;  i<4;  i++){         // 输出此卡UID。
      Serial.print(rfid.uid.uidByte[i], DEC);
      Serial.print(" ");
    }
    Serial.println();
  }

  rfid.PICC_HaltA();              // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
  rfid.PCD_StopCrypto1();         // 停止读卡模块编码

}

void servoControl(){              // 舵机控制函数。
  Serial.println("Servo run!");   // 函数运行输出标识。
  servoPulse(0);                  // 舵机转至0度。
  delay(1000);                    // 等待舵机运转。
  servoPulse(180);                // 舵机转至180度。
  servoRun = 0;                   // 舵机运行变量置零。
}

void servoPulse(int myangle)      // 定义一个脉冲函数,作者:https://blog.csdn.net/sss_369/article/details/52894347
{
  int pulseWidth=(myangle*11)+500;// 将角度转化为500-2480 的脉宽值
  digitalWrite(SERVO_PIN,HIGH);   // 将舵机接口电平至高
  delayMicroseconds(pulseWidth);  // 延时脉宽值的微秒数weimiao
  digitalWrite(SERVO_PIN,LOW);    // 将舵机接口电平至低
  delay(20-pulseWidth/1000);
}

实验结果

  • RC522 读取到未录入通行数组的卡时,串口会输出对应卡 ID 信息。
  • RC522 读取到学生卡时,会触发舵机转动。
  • 舵机触发转动后,将正转 180 度,在 1 秒后回转180度。

连接 WiFi 模块与 RFID 模块

实验目的

  • 可通过 WiFi 连接至控制网站以转动舵机;也可通过刷学生卡来转动舵机。

实验材料及连线

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1EDh35rl-1668948818343)(https://s2.loli.net/2022/11/19/F78BNYIXUZ6Wcmr.jpg)]

名称用途数量
Arduino Nano V3 CH340G 及配套数据线开发板1
MFRC522RFID 模块1
NodeMCU(ESP8266 CH340串口) 及配套数据线WiFi 模块1
SG90舵机1
母对母杜邦线导线13
公对公杜邦线导线3
支持微电流的两万毫安小米充电宝电源1
Arduino Nano V3 CH340G(引脚)NodeMCU(引脚)RC522(顺序)SG90(颜色)
GNDGND
A4D1
A5D2
D9RST (2)
D10SDA (8)
D11MOSI (6)
D12MISO (5)
D13SCK (7)
3V33.3V (1)
GNDGND (3)
5V5V(红)
D8PWM信号(黄)
GNDGND (棕)

实验过程

  1. 开发板开启通信端口,接收外部信号。
  2. WiFi 模块开放热点,并建立可交互网站。
  3. 与网站交互后,WiFi 模块发送舵机转动信号至开发板,开发板触发舵机转动。
  4. RC522 读取到学生卡后,开发板触发舵机转动。

实验环境

  • 烧录平台:Arduino 1.8.13
  • 开发板:NodeMCU 1.0

实验代码 - 开发板

/* 作者:MWHLS,主页MWHLS.TOP
 * 链接:http://mwhls.top/?p=659
 * 因为使用的不是SERVO.H库,舵机的PWM控制端口并不局限于9/10两个端口,且也不局限于仅控制两个舵机。
 * 通行卡的存储使用二维数组,将卡的UID转为十进制保存。
 * 卡的对比使用for函数遍历二维数组,对比UID是否相同。
 * 舵机启动由舵机控制变量servoRun控制,若值为1,则启动,其余不运行。
 * 接受到NodeMCU传来的信号时,舵机控制变量置1。
 * 发现通行卡时,舵机控制变量置1。
 * 参考文章:
 * 网页控制:https://blog.csdn.net/qq_46292418/article/details/106605366
 * I2C通信:https://blog.csdn.net/qq_44506730/article/details/90578507
 * RC522读卡:https://blog.csdn.net/leytton/article/details/73480974
 * 舵机控制:https://blog.csdn.net/sss_369/article/details/52894347
 */ 

#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>              //使用Wire.h进行I2C通信

#define SS_PIN 10
#define RST_PIN 9
#define SERVO_PIN 8
#define USER_NUM 3

byte servoRun = 0;              // 舵机控制变量。
MFRC522 rfid(SS_PIN, RST_PIN);  // 实例化类
byte userCard[USER_NUM][4] = {  // 通行卡存储数组。
  {28,   184,  119,  33},
  {249,  231,  71,   179},
  {109,  242,  234,  235}
};

void setup() { 
  Serial.begin(9600);           // 波特率设置
  SPI.begin();                  // 初始化SPI总线
  rfid.PCD_Init();              // 初始化 MFRC522 
  pinMode(SERVO_PIN, OUTPUT);   // 舵机控制端口。
  Wire.begin(8);                // 设置与NodeMCU的通信I2C端口。
  Wire.onReceive(receiveEvent); // 信号接受处理。
}

void loop() {
  if(servoRun == 1){            // 舵机运行变量若为1,则运行。
    servoControl();             // 舵机控制函数。
  }

  if ( ! rfid.PICC_IsNewCardPresent()) return;       // 找卡
  if ( ! rfid.PICC_ReadCardSerial())   return;       // 验证NUID是否可读
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  // 检查是否MIFARE卡类型
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println("Can identify this card!");
    return;
  }

  byte i;
  for (i=0; i<USER_NUM;  i++){    // 判断卡是否为通行卡。
    byte i2;
    for(i2=0;  i2<4; i2++){       // 遍历userCard中所有卡。
      if(rfid.uid.uidByte[i2] != userCard[i][i2]) break;  
    }                             // break时,表示此卡不是通行卡。
    if(i2 == 4){                  // i2为4,表示此卡的四位值都验证通过。
      Serial.println("Find an accessful card.");  // 输出成功信息。
      servoRun = 1;               // 将开门变量置1。
      break;                      // 已找到通行卡,跳出循环。
    }
  }
  if(i==USER_NUM){                // 若i等于通行用户数量,则上层循环未找到通行卡。
    Serial.print("Find a unknown card, its uid:");
    for(i=0;  i<4;  i++){         // 输出此卡UID,便于后期新增通行卡。
      Serial.print(rfid.uid.uidByte[i], DEC);
      Serial.print(" ");
    }
    Serial.println();
  }

  rfid.PICC_HaltA();              // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
  rfid.PCD_StopCrypto1();         // 停止读卡模块编码

}

void servoControl(){              // 舵机控制函数。
  Serial.println("Servo run!");   // 函数运行输出标识。
  servoPulse(0);                  // 舵机转至0度。
  delay(1000);                    // 等待舵机运转。
  servoPulse(180);                // 舵机转至180度。
  servoRun = 0;                   // 舵机运行变量置零。
}

void servoPulse(int myangle)      // 定义一个脉冲函数,作者:https://blog.csdn.net/sss_369/article/details/52894347
{
  int pulseWidth=(myangle*11)+500;// 将角度转化为500-2480 的脉宽值
  digitalWrite(SERVO_PIN,HIGH);   // 将舵机接口电平至高
  delayMicroseconds(pulseWidth);  // 延时脉宽值的微秒数weimiao
  digitalWrite(SERVO_PIN,LOW);    // 将舵机接口电平至低
  delay(20-pulseWidth/1000);
}

void receiveEvent(int howMany){   // 定义接受联网信息函数,参考:https://blog.csdn.net/qq_44506730/article/details/90578507
  while(0<Wire.available()){      
    char c = Wire.read();
    if (c == '1')  servoRun = 1;  // 如果传入数据为1,则舵机运行变量置1。
    Serial.println("Receive an access sign from ESP8266.");  
  }
}

实验代码 - WiFi 模块

/* 作者:MWHLS,主页MWHLS.TOP
 * 链接:http://mwhls.top/?p=659
 * 通过主机连接上ESP8266热点,进入通信网址,点击CLICK按钮后,
 * 一个消息会使用I2C通信传输给Arduino,这个消息会触发舵机转动。
 * 参考文章:
 * I2C通信:https://blog.csdn.net/qq_44506730/article/details/90578507
 * 网页控制:https://blog.csdn.net/qq_46292418/article/details/106605366
 */
#include <ESP8266WiFi.h>            // 本程序使用 ESP8266WiFi库
#include <ESP8266WebServer.h>       // ESP8266WebServer库
#include <Wire.h>                   // 使用Wire.h进行I2C通信

ESP8266WebServer esp8266_server(80);// 建立ESP8266WebServer对象,对象名称为esp8266_server
                                    // 括号中的数字是网路服务器响应http请求的端口号
                                    // 网络服务器标准http端口号为80,因此这里使用80为端口号
#define WIFISSID "ESP8266Web"       // 设定ESP8266 wifi名称
#define WIFIPSSD "123456789"        // 设定wifi密码

void setup(void){
  Serial.begin(9600);               // 启动串口通讯
  Wire.begin(D1,D2);                // I2C通信端口
  setAP();                          // 设定AP模式,并建立热点。

//--------"启动网络服务功能"程序部分开始--------           // 此部分为程序为本示例程序重点1
  esp8266_server.begin();                             // 详细讲解请参见太极创客网站《零基础入门学用物联网》
  esp8266_server.on("/", HTTP_GET, handleRoot);       // 第3章-第2节 ESP8266-NodeMCU网络服务器-1
  esp8266_server.on("/CLICK", HTTP_POST, handleClick);// 处理用户点击消息。
  esp8266_server.onNotFound(handleNotFound);          // 404处理。
//--------"启动网络服务功能"程序部分结束--------
  Serial.println("HTTP esp8266_server started");      // 告知用户ESP8266网络服务功能已经启动
}

void loop(void){
  esp8266_server.handleClient();                      // 处理http服务器访问
}

void setAP(){
  WiFi.mode(WIFI_AP);                                 // 设定ESP8266的AP模式
  WiFi.softAP(WIFISSID,WIFIPSSD);                     // 设定ESP8266热点
  Serial.printf("Success!\nWIFISSID:  %s \nWIFIPSSD:  %s \nControlWeb:  ", WIFISSID, WIFIPSSD);
  Serial.println(WiFi.softAPIP());                    // 接上行,输出WIFI信息与通信网址。
}

void handleRoot() {                                   // 处理网站根目录“/”的访问请求 
  esp8266_server.send(200, "text/html", "<form action=\"/CLICK\" method=\"POST\"><input type=\"submit\" value=\"CLICK\"></form>");
}

void handleClick(){                                   // 点击消息处理函数
  Serial.println("Click.");                           
  clickTransmission();                                // 传输点击消息到Arduino板。
  esp8266_server.sendHeader("Location","/");          // 跳转回页面根目录
  esp8266_server.send(303);                           // 发送Http相应代码303 跳转  
}

void clickTransmission(){                             // 点击消息传输函数
  Wire.beginTransmission(8);                          // 开始传输
  Wire.write('1');                                    // 传 1 至Arduino版
  Wire.endTransmission();                             // 结束传输
  Serial.println("Click transmiss success.");         // 输出成功信息
}

// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){                                        // 当浏览器请求的网络资源无法在服务器找到时,
  esp8266_server.send(404, "text/plain", "404: Not found");   // NodeMCU将调用此函数。
}

实验结果

  • RC522 读取到学生卡时,触发舵机转动。
  • RC522 读取到未录入的卡时,串口输出卡 ID。
  • 手机连接至 ESP8266 热点后,登录 192.168.4.1 ,点击 Click 以触发舵机转动。
  • 舵机收到触发信号,先正转 180 度,再回转 180 度。

成果展示

视频及图片

  • 没有视频图床,以后想起来再补视频。
  • [外链图片转存中…(img-BEG8pHmM-1668948818344)]

材料成本

  • 合计 49.75 元,其中 RC522 因为坏了一块重买了,去掉之后只有 44.95 元。
材料用途数量价格
RC522RFID 模块24.8 * 2
公对公杜邦线 (10cm)导线11.9
母对母杜邦线 (30cm)导线11.65
NodeMCU(ESP8266 CH340串口) 及配套数据线WiFi 模块114.8
SG90 9克舵机舵机15.1
Arduino Nano V3 CH340G 及配套数据线开发板116.7

优点

  1. 完成了所需功能。
  2. 成本控制令我满意。
  3. 学习成本低,生态好,且可直接使用 C 语言实现。

缺点

  1. 舵机拉力太小,无法拉动门锁,中看不中用。
  2. RC522 质量太差,第一天正常,第二天就坏了,得刷三次卡才能触发一次,不过还好当时录了视频。

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

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

相关文章

聚观早报|中国制造成世界杯交通主力;特斯拉拟召回32万辆车

今日要闻&#xff1a;中国制造成世界杯交通主力&#xff1b;特斯拉拟召回32万辆车&#xff1b;iPhone14pro发货或延期至2023年&#xff1b;Tik Tok逆势宣布招聘&#xff1b;世界杯部署2.2万电子眼中国制造成世界杯交通主力 据消息&#xff0c;来自中国的新能源客车成了服务本届…

美国、欧洲、中国关于工业互联网的比较分析

工业革命的发展历史 1.0•机械化•大规模 2.0•电气化•自动化 3.0•信息化•产品标准 4.0•网络化•定制 3.0相当于肯德基麦当劳门店全部机械化&#xff0c;全程过程控制&#xff0c;任何一批不合格的产品&#xff0c;都可以追溯到上游任何一个环节 4.0全部设备通过中央控…

【C++笔试强训】第二十九天

&#x1f387;C笔试强训 博客主页&#xff1a;一起去看日落吗分享博主的C刷题日常&#xff0c;大家一起学习博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a;夜色难免微凉&#xff0c;前方必有曙光 &#x1f31e;。 &#x1f4a6;&a…

【linux】coredump问题排查

序言 记录coredump问题的一些定位技巧 1. coredump简介 coredump称为核心转储&#xff0c;就是在进程异常时的一个快照&#xff0c;保存了异常时的内存、寄存器、堆栈等数据当进程接收到某些 信号 而导致异常退出时&#xff0c;就会生成 coredump 文件core文件是ELF文件格式…

docker-compose 安装 Prometheus + Grafana 配置监控页面

安装 Prometheus Grafana docker 编排 prometheus:image: prom/prometheus:v2.40.1container_name: prometheusports:- "9090:9090"volumes:- /docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.ymlnetwork_mode: "host"grafana:image: gra…

【Linux】基础:进程控制

【Linux】基础&#xff1a;进程控制 摘要&#xff1a;本文主要介绍关于Linux进程控制内容&#xff0c;分为创建、退出、等待与替换四个板块&#xff0c;希望读者可以掌握每个板块的主要概念以及使用原因和调用方法。 文章目录【Linux】基础&#xff1a;进程控制一、进程创建1.1…

Nginx重定向

Rewrite简介 Rewrite是Nginx服务器提供的一个重要基本功能&#xff0c;是Web服务器产品中几乎必备的功能。主要的作用是用来实现URL的重写。 注意:Nginx服务器的Rewrite功能的实现依赖于PCRE的支持&#xff0c;因此在编译安装Nginx服务器之前&#xff0c;需要安装PCRE库。Ngin…

(续)SSM整合之springmvc笔记(SpringMVC处理ajax请求)(P154-158)

目录 SpringMVC处理ajax请求 一 准备工作 1 新建spring_mvc_ajax com.atguigu 2 .导入依赖 3 添加web模块 4 .配置web.xml 5 . springmvc.xml 6 .创建控制层 7 . index.html 8 静态 9 部暑到tomcat上 10 启动tomcat 二 . 测试SpringMVC处理ajax 1 . ind…

TCP三次握手与四次挥手详解

TCP三次握手(建立TCP连接): 建立TCP连接&#xff0c;就是指建立一个TCP连接时&#xff0c;需要客户端和服务总共发送3个包以确认连接的建立。在socket编程中&#xff0c;这一过程由客户端执行connect来触发。 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连…

GSN前瞻预处理

在数控加工等应用中&#xff0c;要求数控系统对机床进行平滑的控制&#xff0c;以防止较大的冲击影响零件的加工质量。 运动控制器的前瞻预处理功能可以根据用户的运动路径计算出平滑的速度规划&#xff0c;减少机床的冲击&#xff0c;从而提高加工精度。 下面用一个实例来说明…

一文了解Spring MVC(上)

目录 什么是Spring MVC 什么是MVC Spring MVC 和MVC的区别 怎么学Spring MVC Spring MVC的创建和连接 RequestMapping注解 获取参数 传递基础数据类型/包装类型&#xff08;无注解&#xff09; 添加RequestParam注解&#xff08;使用在方法参数上&#xff09; 传递自…

python——GIL锁详解

文章目录一、GIL全局解释器锁二、为什么会有GIL锁&#xff1f;三、多线程无法利用多核优势&#xff1f;计算密集型和IO密集型计算密集型——采用多进程计算密集型——采用多线程IO密集型——采用多进程IO密集型——采用多线程四、总结一、GIL全局解释器锁 1、GIL锁不是python的…

C语言 数据的存储

C语言 数据的存储一、数据与进制之间的关系1. 十进制与二进制之间的转换2. 二进制与十六进制之间的转换二、整型数据存储1. 原、反、补码2. 整型数据在内存中的存储3. 为什么整型数据存在内存中存储的是补码4. 有符号和无符号的数据类型有符号和无符号的存储范围猜想5. 关于 ch…

Java项目:SSH企业人力资源管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 企业人力资源管理系统&#xff0c;分为超级管理员与普通管理员两种角色,超级管理员可以对普通管理员进行添加、删除等操作&#xff1b; 超级管理…

【k8s】1、基础概念和架构及组件

文章目录一、kubernetes概述1、什么是kubernetes&#xff1f;2、应用程序部署方式的演变3、为什么要用kubernetes&#xff1f;二、kubernetes 特性三、Kubernetes集群架构与核心组件1、master组件1.1 kube-apiserver&#xff08;中央枢纽&#xff09;1.2 kube-controller-manag…

股价下跌18%后,满帮集团(YMM)的财务业绩正在加速放缓

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 市场与竞争 根据Beroe Advantage Procuremen的一份市场研究报告&#xff0c;2020年中国道路运输服务市场的规模估计为250亿美元。 这意味着这个行业近年来的复合年增长率为6.5%。 物流参与者往往集中在中国的西南和中南部地…

.NET跨平台框架选择之一 - Avalonia UI

1. Avalonia UI简介 Avalonia UI文档教程&#xff1a;https://docs.avaloniaui.net/docs/getting-started 随着跨平台越来越流行&#xff0c;.NET支持跨平台至今也有十几年的光景了(Mono开始)。 但是目前基于.NET的跨平台&#xff0c;大多数还是在使用B/S架构的跨平台上&…

数据分析面试重点

2022年10月求职季&#xff0c;疫情的影响&#xff0c;但是也挡不住各位小伙伴&#xff0c;找工作的热情。目前&#xff0c;数据分析行业大火&#xff0c;相信很多小伙伴都想去这一行业试试水。想要成功进入数据分析行业&#xff0c;就必须得通过数据分析面试&#xff0c;面试的…

计控实验(二)——积分分离PID控制实验

太原理工大学计算机控制技术实验之积分分离PID控制实验 积分分离PID控制实验实验原理实验内容实验结果思考题实验原理 上图是一个典型的PID 闭环控制系统方框图&#xff0c;其硬件电路原理及接线图可设计如下&#xff0c;图中画“○”的线需用户在实验中自行接好&#xff0c;对…

跟艾文学编程《Python基础》PyCharm 安装

作者&#xff1a;艾文&#xff0c;计算机硕士学位&#xff0c;企业内训讲师和金牌面试官&#xff0c;公司资深算法专家&#xff0c;现就职BAT一线大厂。 邮箱&#xff1a;1121025745qq.com 博客&#xff1a;https://edu.csdn.net/lecturer/894?spm1003.2001.3001.4144 内容&am…