NodeMCU远程点亮电灯泡

**目标:**远程点亮一个灯泡 硬件:ModeMCU 基础知识 ESP8266和NodeMCU: ESP8266是一块芯片,NodeMCU是以ESP8266芯片为核心的开发板 esp8266芯片 内置ESP8266芯片的nodemcu开发板 ESP8266的三种工作模式: STA(Station):ESP8266主动去连接WIFI AP(Wireless Access Point):ESP8266创建WIFI STA+AP:上面两个共存 API: WiFiServer,Serial.begin(),pinMode(),Serial.print() 板载小灯: GPIO2引脚与板载小灯相联 在esp8266的库文件中hardware/esp8266/3.0.2/variants/nodemcu/pins_arduino.h中定义了各种引脚 基本思路 ESP8266以STA模式工作,连接到WIFI后,自己内部启动一个TCP server,这个TCP server其实是写一个小型的HTTP服务器,客户端通过浏览器就可以访问到。 代码: #include <ESP8266WiFi.h> //此处设置您的wifi接入信息 #ifndef STASSID #define STASSID "WiFi" // wifi名称 #define STAPSK "password" //要连接的wifi密码 #endif const char *ssid = STASSID; const char *password = STAPSK; //创建TCP server对象,并将端口指定为80 WiFiServer server(80); void setup() { //打开串口 Serial.begin(115200); //初始化板载LED pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, 0); //连接WiFi Serial.println(); Serial.println(); Serial.print(F("Connecting to ")); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi....

April 21, 2022 · 1 min

算法导论第二章习题

2.1 1 2 INSERTION-SORT(A) for j = 2 to A.length key = A[j] i = j-1 while i>0 and A[i]<key A[i+1]=A[i] i=i-1 A[i+1]=key 3 for i = 1 to A.length if A[i]=v return i v = NIL A[1..i-1]表示位置1到i-1的元素都不等于v **初始化:**当i=1时,没有元素,自然也没有元素等于v **保持:**每次循环会将不等于v的元素加入到A[i..i-1]中 **终止:**如果遇到A[i]=v,循环终止。如果最后i=A.length时,A[1..i-1]中元素都不等于v也就是数组中所有元素都不等于v。 4 **输入:**两个二进制序列 $$A=<a_1,a_2,\cdots,a_n>,B=<b_1,b_2,\cdots,b_n>$$ **输出:**二进制序列 $$C=<c_1,c_2,\cdots,c_n,c_n+1>,C=A+B$$ carry = 0 for i = n downto 1 C[i] = A[i]^B[i]^carry if(A[i]+B[i]+carry>1) carry = 1 else carry = 0 c[1] = carry 2.2 1 $\theta(n^3)$...

April 18, 2022 · 3 min

TCP为什么使用三次握手协议

背景知识 TCP是一个高可靠的主机到主机之间的通讯协议,这些主机位于分组交换网络(基于IP协议)中,也可能位于由这些网络组成的通讯系统中。TCP需要在不可靠的网络通讯系统中提供可靠的服务必须满足一系列基本实现,其中包括可靠性和多路复用。 为了实现可靠性,TCP连接发送的每个字节都有一个序列号。因为每个字节都编号了,所以可以对每个字节进行确认。 为了实现多路复用,TCP提供了一系列端口,主机地址加上端口号称为socket。TCP协议没有限制同一个TCP连接的重复使用。一个连接由一对socket唯一确定。 使用三次握手的充分性 如果一条连接突然断开重连后,TCP 如何识别旧连接发送的包?为了避免混乱,我们要避免当前连接正在使用的序列号与旧连接发送的且仍在网络中传输的数据包的序列号相同。并且要在TCP协议无法记住以前的序列号的前提下实现这个功能(因为TCP可能崩溃并忘记之前的序列号)。 为了实现上述功能,可以使用ISN生成器。当一个新连接建立时,初始序列号( initial sequence number ISN)生成器会生成一个新的32位的 ISN。ISN生成器生成的初始序列号是唯一的。 每一个连接都有一个接收序列号和发送序列号。发送初始序列号由发送数据的TCP实体选择,接收序列号是在连接建立时确定的。 连接建立时,两端必须要同步对方的初始序列号。双方通过同步带有SYN标志和初始序列号的数据段来实现。所以为了实现上述目的,一般需要一个初始化序列号选择器并且需要一些握手机制来同步初始化序列号。 同步机制需要发送自己的初始化序列号给对方,并且接收对方发送过来的确认信息。连接的两端必须接收对方发送过来的初始序列号并且发回确认信息。 A --> B SYN my sequence number is X A <-- B ACK your sequence number is X A <-- B SYN my sequence number is Y A --> B ACK your sequence number is Y 因为第二步和第三步可以合并成一步,所以一般称为三次握手 the three way (or three message) handshake。 因为序列号并没有使用一个网络里的全局时钟来进行同步,而且不同 TCP实体会使用不同的机制来选择初始序列号。当一端接收到一个SYN连接请求时,无法确定这个连接请求是不是之前被网络延迟的连接请求(如果是之前的连接请求,应该拒绝连接),所必须向另一端确认这个序列号。所以三次握手是必须的。 使用三次握手的必要性 三次握手可以确保过期的连接请求即使重新送到了接收端也会被接收端抛弃。因为接收端每次接收到连接请求都会向发送方进行确认,而因为不会出现相同的序列号,所以接收端接受的这个过期的连接请求的序列号一定与发送方的初始序列号不同,所以这个过期的连接请求一定会被拒绝。 三次握手可以确保两端进行可靠的数据传输。因为连接时两端都知道对方的初始序列号,所以接下来的传输过程双方对整个传输过程的序列号都是完全掌握的。 参考资料: https://datatracker.ietf.org/doc/html/rfc793 https://book.douban.com/subject/10510747/(6.2.2节)

May 9, 2021 · 1 min

OpenCV的安装与环境配置(window10,Visual Studio 2019)

OpenCV的安装 **第一步:**下载OpenCv https://opencv.org/releases/,本文使用 OpenCV-4.5.0 。 **第二步:**下载得到 opencv-4.5.0-vc14_vc15.exe 文件,运行该文件,选择解压到目标地址,本文解压到目录 D:\Library 。 **第三步:**为了方便以及清晰,这一步添加系统环境变量 OPENCV_DIR 。方法为以管理员身份运行 cmd ,输入并运行命令setx -m OPENCV_DIR D:\Library\opencv\build\x64\vc15,(此处根据平台环境可能需要有所调整)。 第四步:添加系统环境变量Path中的环境变量,添加%OPENCV_DIR%\bin Visual Studio 2019项目的配置 解决方案配置为 Debug ,解决方案平台为 x64 。 项目属性 - VC++ 目录 - 包含目录,添加 D:\Library\opencv\build\include 路径 项目属性 - VC++ 目录 - 库目录,添加 D:\Library\opencv\build\x64\vc15\lib 路径 项目属性 - 链接器 - 输入 - 附加依赖项,添加 opencv_world450d.lib ,(此处lib文件可在 D:\Library\opencv\build\x64\vc15\bin 中查看,d表示debug,解决方案与平台需要根据实际情况做调整) 测试程序 #include <iostream> #include <stdio.h> #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" using namespace std; using namespace cv; int main() { // 设置窗口 Mat img = Mat::zeros(Size(800, 600), CV_8UC3); img....

April 17, 2021 · 1 min