基于物联网的智能家居远程视频监控系统设计与实现

基于物联网的智能家居远程视频监控系统设计与实现

摘要:随着物联网技术的快速发展,智能家居系统已成为提升家居安全性和便利性的重要手段。本文设计并实现了一套基于物联网的智能家居远程视频监控系统,该系统结合了嵌入式技术、网络通信技术和视频处理技术,实现了对家居环境的实时监控、远程控制和数据安全传输。论文详细阐述了系统的硬件选型、软件设计、系统架构、数据传输与安全性等方面的内容,并通过实验数据和案例分析验证了系统的实用性和性能。

关键词:物联网;智能家居;远程视频监控;系统设计

一、绪论

(一)研究背景与意义

物联网技术的兴起为智能家居领域带来了革命性的变革。智能家居远程视频监控系统作为物联网技术的重要应用之一,能够为用户提供实时的家居环境监控、远程控制以及异常事件报警等功能,显著提升了家居生活的安全性和便利性。本研究旨在设计一套高效、稳定且安全的智能家居远程视频监控系统,以满足现代家庭对智能化、网络化家居监控的需求。

(二)国内外研究现状

本节将综述国内外在智能家居远程视频监控系统方面的研究进展,分析现有系统的优缺点,为本系统的设计提供参考和借鉴。

二、系统需求分析

(一)功能需求

系统需实现实时监控、远程控制、异常报警、历史数据查询等核心功能。

(二)性能需求

系统应具备高清晰度视频传输、低延迟响应、高稳定性和强安全性等特点。

(三)用户需求

系统应满足用户对不同场景下的监控需求,提供友好的用户界面和便捷的操作体验。

三、系统设计

(一)硬件选型与设计

  1. 监控摄像头:选用高分辨率、具备夜视功能的网络摄像头,支持无线连接和远程访问。
  2. 控制器:采用高性能的嵌入式处理器,负责视频数据的处理和传输。
  3. 存储设备:选用大容量、高速度的网络存储设备,用于保存视频数据。
  4. 传感器与执行器:根据实际需求选配烟雾、温湿度等传感器及智能门锁、照明等执行器。

(二)软件设计

  1. 嵌入式软件:开发基于Linux操作系统的嵌入式软件,实现视频数据的采集、压缩和传输。
  2. 服务器端软件:设计基于云计算平台的服务器端软件,负责视频数据的接收、存储和管理。
  3. 客户端软件:开发跨平台的客户端软件,支持PC、手机和平板等设备,实现远程监控和控制功能。

(三)系统架构

本系统采用分层架构,包括感知层、网络层、平台层和应用层。感知层负责数据采集和执行控制指令;网络层负责数据传输;平台层负责数据处理和存储;应用层负责提供用户服务和接口。

(四)数据传输与安全性

  1. 数据传输:采用无线通信技术(如Wi-Fi、4G/5G)进行数据传输,确保视频数据的实时性和稳定性。
  2. 数据加密:使用AES等加密算法对传输的视频数据进行加密处理,保障数据的安全性。
  3. 访问控制:实施严格的用户认证和权限管理机制,防止非法访问和操作。

四、系统实现与测试

(一)系统实现

详细阐述系统的硬件搭建、软件编程和集成调试过程。

(二)系统测试与分析

  1. 功能测试:对系统的各项功能进行全面测试,验证其正确性和完整性。
  2. 性能测试:通过模拟不同场景下的负载压力测试系统的性能指标。
  3. 安全性测试:对系统进行渗透测试和漏洞扫描等安全性评估。

五、案例分析与应用前景

(一)案例分析

结合实际案例分析系统的应用效果和用户反馈。

(二)应用前景展望

探讨智能家居远程视频监控系统在未来的发展趋势和潜在应用领域。

六、结论与展望

总结本研究的主要工作和成果,指出存在的不足之处,并对未来的研究方向进行展望。

由于篇幅和复杂性的限制,我无法直接为您提供一个完整的基于物联网的智能家居远程视频监控系统的设计和实现代码。然而,我可以为您提供一个大致的框架和指导,以帮助您开始这个项目。

1. 硬件和软件准备

硬件:

  • 摄像头模块(如ESP32-CAM)
  • 物联网开发板(如ESP32, Arduino等)
  • 传感器(如温湿度传感器、烟雾传感器等)
  • 执行器(如智能灯泡、智能插座等)
  • 无线路由器或热点
  • 云服务器(可选,用于数据存储和远程访问)

软件:

  • Arduino IDE 或其他适用于您的开发板的IDE
  • 物联网通信库(如MQTT库)
  • 视频流处理库(如FFmpeg)
  • 服务器端软件(如Node.js, Flask等,用于处理视频流和发送控制指令)
  • 客户端软件(如移动应用或Web应用)

2. 系统设计

数据传输:

  • 使用WiFi或以太网将摄像头和开发板连接到网络。
  • 通过MQTT等协议将视频流数据上传到云服务器。
  • 客户端通过HTTP或WebSocket等协议从服务器获取视频流。

远程控制:

  • 客户端发送控制指令到服务器。
  • 服务器将指令转发给物联网开发板。
  • 开发板解析指令并控制家居设备。

安全性:

  • 使用SSL/TLS加密通信。
  • 实施用户认证和权限管理。

3. 代码实现步骤

  1. 设置硬件:

    • 配置摄像头模块和开发板。
    • 连接传感器和执行器。
  2. 编写物联网开发板代码:

    • 初始化WiFi连接。
    • 配置MQTT客户端,设置主题和回调函数。
    • 捕获摄像头视频流,并将其发送到MQTT服务器。
    • 监听控制指令,并执行相应动作。
  3. 搭建服务器端应用:

    • 设置MQTT服务器,接收并存储视频流数据。
    • 实现WebSocket或HTTP服务器,用于处理客户端请求。
    • 实现用户认证和权限管理功能。
  4. 开发客户端应用:

    • 设计用户界面,显示实时视频流和控制按钮。
    • 实现与服务器端的通信,发送控制指令并接收视频流数据。
  5. 测试和调试:

    • 在本地网络中测试系统的各项功能。
    • 通过VPN或公网IP进行远程测试。
    • 优化性能和修复潜在问题。
  6. 部署和维护:

    • 将系统部署到实际环境中。
    • 定期监控和维护系统,确保其稳定运行。

请注意,这只是一个大致的指南,具体实现细节将取决于您选择的硬件和软件平台以及您的具体需求。您可能需要查阅相关文档和教程以获取更详细的指导。

由于构建一个完整的智能家居远程视频监控系统涉及大量代码,且不同硬件和软件平台之间的实现会有所不同,我将提供一些伪代码和代码片段来指导您如何在不同的部分中实现关键功能。

物联网开发板代码(以Arduino/ESP32为例)

#include <WiFi.h>  
#include <PubSubClient.h> // MQTT库  const char* ssid = "YOUR_SSID";  
const char* password = "YOUR_PASSWORD";  
const char* mqttServer = "YOUR_MQTT_SERVER";  
const int mqttPort = 1883;  WiFiClient espClient;  
PubSubClient client(espClient);  void setup() {  // 初始化WiFi连接  WiFi.begin(ssid, password);  while (WiFi.status() != WL_CONNECTED) {  delay(500);  Serial.print(".");  }  // MQTT连接  client.setServer(mqttServer, mqttPort);  client.setCallback(callback);  if (!client.connect("ESP32Client")) {  delay(5000);  }  
}  void loop() {  // 发送视频流数据(伪代码,需要实际实现视频捕获和编码)  if (isCameraReady()) {  String frameData = captureCameraFrame();  client.publish("home/video", frameData.c_str());  }  client.loop();  delay(1000);  
}  void callback(char* topic, byte* payload, unsigned int length) {  // 处理控制指令  String message;  for (int i = 0; i < length; i++) {  message += (char)payload[i];  }  handleCommand(message);  
}  void handleCommand(String command) {  // 根据接收到的指令控制家居设备  if (command == "turn_on_light") {  // 执行开灯动作  } else if (command == "turn_off_light") {  // 执行关灯动作  }  // 添加其他指令处理...  
}  bool isCameraReady() {  // 检查摄像头是否准备就绪  // 需要根据实际硬件进行实现  
}  String captureCameraFrame() {  // 捕获摄像头的帧数据  // 这里需要将摄像头数据编码为适合MQTT传输的格式,如Base64  // 需要根据实际硬件和库进行实现  
}

服务器端应用(以Node.js和Express为例)

const express = require('express');  
const mqtt = require('mqtt');  
const WebSocket = require('ws');  
const app = express();  
const wss = new WebSocket.Server({ port: 8080 });  
const client = mqtt.connect('mqtt://YOUR_MQTT_SERVER');  client.on('connect', () => {  console.log('Connected to MQTT broker');  client.subscribe('home/video');  
});  client.on('message', (topic, message) => {  // 接收到视频数据后广播给所有WebSocket客户端  wss.clients.forEach((ws) => {  if (ws.readyState === WebSocket.OPEN) {  ws.send(message.toString());  }  });  
});  app.use(express.static('public')); // 静态文件目录  // 其他API路由...  app.listen(3000, () => {  console.log('Server started on port 3000');  
});  // WebSocket连接处理  
wss.on('connection', (ws) => {  console.log('New WebSocket connection');  ws.on('message', (message) => {  // 接收来自客户端的控制指令  const command = JSON.parse(message);  publishCommand(command.type, command.data);  });  
});  function publishCommand(type, data) {  // 将控制指令发布到MQTT  const payload = JSON.stringify({ type, data });  client.publish('home/control', payload);  
}

客户端应用(HTML/JavaScript WebSocket 客户端示例)

<!DOCTYPE html>  
<html>  
<head>  <title>Smart Home Video Monitor</title>  
</head>  
<body>  <video id="videoStream" autoplay></video>  <button id="lightControl">Toggle Light</button>  <script>  const ws = new WebSocket('ws://localhost:8080');  const videoElement = document.getElementById('videoStream');  ws.onmessage = (event) => {  // 处理从服务器接收到的视频数据  // 这里的处理方式依赖于视频数据格式,可能需要进行Base64解码或其他操作  const videoData = event.data;  // 伪代码,需要根据实际数据进行实现  // updateVideoStream(videoData);  };  document.getElementById('lightControl').addEventListener('click', () => {  // 发送控制指令  const command = { type: 'light_toggle', data: null };  ws.send(JSON.stringify(command));  });  function updateVideoStream(videoData) {  // 将接收到的视频数据更新到video元素  // 根据实际情况,可能需要创建一个MediaSource和SourceBuffer来处理视频流  }  </script>  
</body>  
</html>

请注意,上述代码是示例性的,并没有针对具体的硬件设备进行实现。在实际应用中,您需要根据您所选用的硬件和库来进行调整。此外,安全性和错误处理机制在实际应用中是至关重要的,应确保所有的通信都经过加密,且对用户输入和设备响应进行严格的校验和错误处理。

继续展开代码实现会涉及很多具体的细节,这些细节会根据您的硬件平台、所选择的库以及具体的项目需求而有所不同。以下是在之前的基础上更详细的代码示例,但仍然需要您根据实际情况进行调整和完善。

物联网开发板代码(以ESP32-CAM为例)

首先,您需要安装ESP32的开发环境,例如使用Arduino IDE配合ESP32开发板支持。然后,您需要找到一个适合ESP32-CAM的库来捕获视频流。

#include <WiFi.h>  
#include <PubSubClient.h>  
#include "esp32cam.h" // 假设您使用了一个名为esp32cam的库来处理摄像头  // WiFi和网络设置  
const char* ssid = "YOUR_SSID";  
const char* password = "YOUR_PASSWORD";  
const char* mqttServer = "YOUR_MQTT_SERVER";  
const uint16_t mqttPort = 1883;  WiFiClient espClient;  
PubSubClient client(espClient);  // 摄像头设置  
CAMERA_MODEL_AI_THINKER camera; // 根据您的摄像头型号调整  
const int frameSize = 1024; // 根据需要调整帧大小  
uint8_t buffer[frameSize];  void setup() {  Serial.begin(115200);  setupWiFi();  client.setServer(mqttServer, mqttPort);  client.setCallback(callback);  camera.set_pixformat(PIXFORMAT_JPEG); // 设置像素格式为JPEG  camera.set_framesize(FRAMESIZE_QVGA); // 设置帧大小  camera.set_quality(10); // 设置JPEG质量  // ...其他摄像头初始化代码...  
}  void loop() {  if (!client.connected()) {  reconnect();  }  client.loop();  captureAndSendFrame();  delay(1000); // 根据需要调整延迟  
}  void setupWiFi() {  WiFi.begin(ssid, password);  while (WiFi.status() != WL_CONNECTED) {  delay(500);  Serial.print(".");  }  Serial.println("");  Serial.println("WiFi connected");  
}  void reconnect() {  // 循环直到连接  while (!client.connected()) {  Serial.print("Attempting MQTT connection...");  if (client.connect("ESP32CAMClient")) {  Serial.println("connected");  } else {  Serial.print("failed, rc=");  Serial.print(client.state());  Serial.println(" try again in 5 seconds");  delay(5000);  }  }  
}  void captureAndSendFrame() {  camera_fb_t * fb = camera.take_picture();  if (fb == NULL) {  Serial.println("Camera capture failed");  return;  }  // 假设fb->buf包含了JPEG图片数据,并且fb->len是数据长度  // 将JPEG数据发送到MQTT服务器(可能需要分块发送)  client.beginPublish("home/video", fb->len, false);  uint8_t *p = fb->buf;  while (client.write(p, fb->len) < fb->len) { }  client.endPublish();  esp_camera_fb_return(fb); // 返回帧缓冲,以便重用  
}  void callback(char* topic, byte* payload, unsigned int length) {  // 处理从MQTT服务器接收到的消息  
}

服务器端应用(Node.js、Express和MQTT)

服务器端需要同时处理WebSocket连接和MQTT消息。以下是一个简化的示例,展示了如何接收视频流并通过WebSocket发送给客户端。

const express = require('express');  
const mqtt = require('mqtt');  
const WebSocket = require('ws');  
const app = express();  
const wss = new WebSocket.Server({ port: 8080 });  
const mqttClient = mqtt.connect('mqtt://YOUR_MQTT_SERVER');  
let mqttConnected = false;  // MQTT连接和处理逻辑  
mqttClient.on('connect', () => {  mqttConnected = true;  console.log('Connected to MQTT broker');  mqttClient.subscribe('home/video');  
});  mqttClient.on('message', (topic, message) => {  // 当从MQTT接收到视频数据时,广播给所有WebSocket客户端  wss.clients.forEach((client) => {  if (client.readyState === WebSocket.OPEN) {  client.send(message);  }  });  
});  // WebSocket连接和处理逻辑  
wss.on('connection', (ws) => {  console.log('New WebSocket connection');  ws.on('message', (data) => {  // 处理从WebSocket客户端接收到的消息(例如控制指令)  });  
});  // 启动Express服务器来托管前端静态资源  
app.use(express.static('public'));  
app.listen(3000, () => {  console.log('Server is running on port 3000');  
});

客户端应用(HTML和JavaScript)

在客户端,您可以使用HTML和JavaScript来显示视频流和控制智能家居设备。以下是一个简单的Web页面示例,它使用WebSocket连接到服务器并接收视频流。

<!DOCTYPE html>  
<html>  
<head>  <title>Smart Home Video Monitor</title>  
</head>  
<body>  <img id="videoStream" autoplay />  <script>  const ws = new WebSocket('ws://localhost:8080');  const videoElement = document.getElementById('videoStream');  let arrayBuffer;  ws.onmessage = (event) => {  if (!arrayBuffer) {  arrayBuffer = new Uint8Array(event.data);  } else {  const tmp = new Uint8Array(arrayBuffer.length + event.data.length);  tmp.set(arrayBuffer, 0);  tmp.set(new Uint8Array(event.data), arrayBuffer.length);  arrayBuffer = tmp;  }  // 当接收到完整的JPEG图片时,更新<img>元素的src属性(需要实现)  // 例如:videoElement.src = 'data:image/jpeg;base64,' + arrayBufferToBase64(arrayBuffer);  };  function arrayBufferToBase64(buffer) {  var binary = '';  var bytes = new Uint8Array(buffer);  var len = bytes.byteLength;  for (var i = 0; i < len; i++) {  binary += String.fromCharCode(bytes[i]);  }  return window.btoa(binary);  }  </script>  
</body>  
</html>

请注意,上述代码仅作为示例提供,并且需要根据您的具体环境和需求进行调整。特别是,处理视频流和确保实时通信的可靠性可能是一个复杂的任务,需要考虑网络延迟、数据完整性和错误处理等因素。此外,安全性(如使用TLS/SSL进行加密通信)也是在实际部署中必须考虑的重要方面。

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

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

相关文章

节流和防抖

节流和防抖 定义和区别: 节流和防抖的概念。 节流是一种减少函数执行频率的技术&#xff0c;它通过设定一个等待时间(delay)&#xff0c;确保函数在这段时间内只执行一次。如果在等待时间内再次触发事件&#xff0c;则不会执行函数&#xff0c;直到等待时间结束。 防抖是一种控…

【Go语言】go语言简单的变量声明和结构体使用

目录 数字类型 布尔类型 字符串类型 Rune 类型 Byte 类型 类型转换 结构体 结构体定义 结构体作为函数参数 结构体方法 1. 接收者类型 2. 方法定义 3. 值接收者 vs 指针接收者 4. 调用方式的灵活性 5. 方法集 6. 方法与继承 7. 方法声明的位置 在Go语言中&…

【Linux】sudo分权管理实战

一般sudo命令是默认安装的&#xff0c;如果你的机器里没有&#xff0c;可以使用命令 yum install sudo 来安装 [rootgaosh-64 ~]# yum install sudo 我们来看一下配置文件&#xff1a; 在上图root下面添加一行 &#xff0c;给gaosh用户加权限 [rootgaosh-64 ~]# vim /etc/su…

中移物联网 OneOS 操作系统环境搭建和工程创建

一、官网 OneOS Lite是中国移动针对物联网领域推出的轻量级操作系统&#xff0c;具有可裁剪、跨平台、低功耗、高安全等特点&#xff0c;支持ARM Cortex-A和 Cortex-M、MIPS、RISC-V等主流芯片架构&#xff0c;兼容POSIX、CMSIS等标准接口&#xff0c;支持Javascript、MicroPyt…

nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)

一、安装nvm 1. 下载nvm 点击 网盘下载 进行下载 2、双击下载好的 nvm-1.1.12-setup.zip 文件 3.双击 nvm-setup.exe 开始安装 4. 选择我接受&#xff0c;然后点击next 5.选择nvm安装路径&#xff0c;路径名称不要有空格&#xff0c;然后点击next 6.node.js安装路径&#…

哨兵-1A与DInSAR技术监测尼泊尔地震前后地表形变

2015年4月25号&#xff0c;尼泊尔发生里氏7.8级地震&#xff0c;超过5000人伤亡和几百万人受到影响。大量的卫星影像支持地震救援。地理学家利用卫星影像量测地震对陆地的影响。 Sentinel-1A是欧洲委员会发起的哥白尼环境监测计划中的第一颗卫星。可获取全天候的数据&#xff0…

实验6 单臂路由方式实现VLAN间路由

实验6 单臂路由方式实现VLAN间路由 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤1.配置IP地址2.交换机配置3.路由器配置 一、 原理描述 VLAN将一个物理的LAN在逻辑上划分为多个广播域。VLAN内的主机间可以互相通信&#xff0c;但是VLAN之间却不能互通。…

JAVAEE——网络初始

文章目录 网络发展史独立模式网络模式局域网LAN路由器的诞生 网络通信的基础IP地址端口号 认识协议OSI七层模型TCP/IP五层模型 网络发展史 独立模式 在原始的年代中电脑间想要通信需要两台电脑连接一根网线&#xff0c;但是一台电脑基本上只有一个接口。因此想要链接更多的电…

ChatGPT 写作秘籍:指导您如何利用ChatGPT撰写学术论文

ChatGPT无限次数:点击直达 ChatGPT 写作秘籍&#xff1a;指导您如何利用ChatGPT撰写学术论文 作为CSDN网站的作者&#xff0c;您可能经常面临不同类型的写作任务&#xff0c;包括学术论文的撰写。在这篇文章中&#xff0c;我们将探讨如何利用ChatGPT这一强大的文本生成工具来辅…

计算机基础知识-第9章-存储的本质(2)——硬盘和文件系统基础知识

一、机械硬盘的原理 概括来说&#xff0c;硬盘的工作原理是利用特定的磁粒子的极性来记录数据。磁头在读取数据时&#xff0c;将磁力子的不同极性转换成不同的电脉冲信号&#xff0c;再利用数据转换器将这些原始信号变成电脑可以使用的数据&#xff0c;写的操作正好与此相反。…

ubuntu或类Debian获取某些包的离线版本-包括依赖(还有一些意想不到的用途,哈哈)

前言 偶尔能碰到很特殊的情况。网址白名单&#xff0c;纯内网&#xff0c;超多依赖及一些很难描述的场景。 比如一些少见的发行版缺少某些包。这时候可以找一台类似的系统环境来下载离线包及 其依赖包&#xff0c;然后转移到内网进行安装。如果是网址白名单&#xff0c;或者纯内…

【讲解下常见的分类算法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

牛客NC413 两个升序数组的中位数【hard 数组,模拟 Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/b3b59248e61f499482eaba636305474b 思路 直接模拟2个数组有顺序放到一个数组中help中如果help长度为奇数&#xff0c;返回中间的数如果help长度为偶数&#xff0c;返回中间2个数的和除以2参考答案java import j…

【AI 测试】八:数学基础在算法测试工程师工作中的具体应用

算法测试工程师在测试和优化算法时&#xff0c;确实需要具备扎实的数学基础。这是因为算法往往涉及到复杂的计算、逻辑推理和数据分析&#xff0c;而这些都需要依靠数学工具和方法来进行有效的处理。以下是数学基础在算法测试工程师工作中的具体应用&#xff1a; 线性代数&…

会话跟踪技术基础:Cookie和Session

久违了&#xff0c;之前忙碌了一周赶毕设&#xff0c;今天抽空更新~ 一.理论知识 1.会话&#xff1a;用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求和响应~ 2.会话跟…

【远程桌面】Microsoft Remote Desktop 4 mac

看起来 mac的apple store 不给下载mac apple store 微软官方可以直接下载 app center 最新版本。 官方文档 这里有更新的介绍和下载地址

Python生成图片和音频验证码

captcha是pyhton的一个模块&#xff0c;用来生成图片和音频验证码。 安装 pip install captcha使用 from captcha.audio import AudioCaptcha from captcha.image import ImageCaptcha# 加载声音和字体 audio AudioCaptcha(voicedir/path/to/voices) image ImageCaptcha(…

StylizedGS: Controllable Stylization for 3D Gaussian Splatting

StylizedGS: Controllable Stylization for 3D Gaussian Splatting StylizedGS&#xff1a;3D高斯溅射的可控样式化 Dingxi Zhang, Zhuoxun Chen, Yu-Jie Yuan, Fang-Lue Zhang, Zhenliang He, Shiguang Shan, and Lin Gao1 张定西&#xff0c;陈卓勋&#xff0c;袁玉洁&#x…

vue3.4 新特性 defineModel() 宏

v-model 简介 官网是这样解释 v-model 的 v-model 的功能是&#xff0c;实现数据的双向绑定【本质上是 :value 和 input 语法糖】 如果是表单元素&#xff0c;下面两种写法是一样&#xff0c;这时v-model就是语法糖&#xff0c;帮你简化了操作 <input v-model"messag…

【MySQL】锁篇

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;保留赤子之心也许是种幸运吧 本文封面由 凯楠&#x1f4f8;友情提供 目录 本系列专栏 1. MySQ 中的锁 2. 表锁和行锁 表锁 行锁 3. InnoDB 存储引擎的三种行级锁 4. 悲观锁…