极客C -项目教程

思维导图文章末附录
个人网站


绪论

教程说明

因为模块太多,全部放在一起有些冗杂,所以每一个部分都有单独的文件,也为了能更好的描述,切换画布或者点击链接跳转就可以查看
应该加强核心的知识,并且学会融合进入其他的项目当中,举一反三。比如可以利用单片机与显示屏生成显示二维码,学生管理系统连接到数据库操作,五子棋实现人机对战等等。简单的逻辑实现比较简单,但是多元化的融合需要有较深的理解。
以简入繁,以剑破点,每一个知识点都要直击核心,抓住重点。每个人精力都有限,我希望用更短的时间做更高效的事。

培养方案

项目主要以实践为主,会写文章,做视频进行教学,刨析内部的每一个知识细节,通过一个项目,能掌握一个体系的知识。不过视频暂时做不了,因为没时间

教程总结

由于时间有限,个人水平有限,教程的内容叙述较浅,因为知识面较广,每一部分想要深入都需要大量的时间,想要真的掌握需要时间的沉淀。不过入门过后就能按照自己的需求去深入学习,网上有很多较好的开源资料,几乎想学什么都会有,所以找资源也是一个非常重要的技能。
项目在于精,而不在于多,从简单的实现到不断拓展精炼,从而实现更实用,更完善的项目。知识面广有助于思维的扩散,但是专精某一方向,才能在领域中有立足之地。
不积跬步无以至千里

语言篇

C语言基础

简单程序

	注意点
	头文件
	主函数
	注释
	输入输出

数据类型

	整型
	浮点型
	字符类型
	数组
	结构体
	联合
	枚举
	指针

运算符

	基本运算符
	运算符优先级
	自加自减运算符

流程结构

	while
	do while
	for
	if else
	switch
	goto

函数

	函数形式
	函数地址类型
	递归函数
	参数不确定
	[ ] 的三种作用

内存管理

	类型转换
	大小端存储

位运算

	进制转换
	位运算符
	位字段

文件操作

	打开文件
	操作文件
	关闭文件

其他

	类型重命名
	宏
	多文件
	存储类说明符
	类型限定符
	内存分区
	命令行参数
	随机数

C语言进阶

十天整理笔记

	基础复习
	内存管理
	指针
	数据结构
	算法

高级指针
总结

C++基础

C++介绍
基础知识点

	> 	与C类似,主要讲解有区别的地方
	> 	2.2数据类型	
	> 	2.3运算符	
	> 	2.4流程结构	
	> 	2.5函数	
	> 	2.6文件操作	
	> 	2.7内存管理	
	> 	2.8其他

3.1理论	
	3.2学习方法	
	3.3类实例	
		3.3.1类声明	
		3.3.2声明对象	
		3.3.3成员调用	
		3.3.4访问修饰符	
		3.3.5函数成员	
		3.3.6 数据成员	
3.4继承	
	3.4.1继承实例	
	3.4.2 多态与虚函数	
	3.4.3虚继承	
3.5 其他	
运算符重装
	4.1作用	
	4.2 形式	
	4.3 重载	
	4.4 重载实例	
		4.4.1 认识运算符	
		4.4.2 二元运算符	
		4.4.3 一元运算符	
		4.4.4 输入输出赋值	
		4.4.5 下标运算符	
		4.4.6 递增递减运算符	
		4.4.7 重载类型转换	
	4.5 运算符重载总结	
模板
	5.1 函数模板	
	5.2 类模板	
	5.3 继承的模板	
	5.4. 模板类型是类的模板	
	5.5 模板总结	

标准函数库

数学基本运算

	基本算术运算
	随机数产生函数
	三角函数
	双曲函数
	对数与指数
	幂函数

字符串

	字符串转数字
	数字转字符串
	字符串转浮点数
	浮点数转字符串

功能函数库

	日期和时间
	非本地跳转
	信号
	可变参数输入输出
	执行环境
	locale函数
	返回值作为指针函数

STL

容器
	数组
		array,vector
	链表(单向链表,双向链表)
		list/forward_list
			list lt; 
	栈
		stack
	队列
		deque
	树
		map/set
	hash表
		hash_map
算法
	algorithm
迭代器(iterator)
	string
		string::ierator ite;
	vector
		vector<int>::iterator ite;
	list
		list<Node>::iterator ite;
适配器
分配器
仿函数
STL总结

MCU篇

51

基础实验

1、C51的基础知识,regc51.h 头文件有什么作用?
2、51最小系统板的基本组成是什么,用Proteus该怎么画?
3、keil 软件的基本使用,程序如何烧入到单片机芯片中?
4、如何控制LED灯亮灭,原理是什么,程序该怎么写?
5、流水灯程序该如何写,有哪些方法?
6、什么是数码管,单位数码管的基本组成及亮灭原理是什么?
7、如何让单个数码管显示自己想要的数字,程序该怎么写?
8、多位数码管的组成,静态显示与动态显示的区别,断选和位选是什么,各有什么作用?
9、什么是点阵,点阵的原理,如何控制点阵的显示,程序该如何写?
10、独立按键的作用,如果用按键控制LED灯和数码管,程序该怎么写?
11、矩阵键盘的基本结构及检测原理是什么,程序该怎么写?
12、中断的概念,中断的处理机制,如何在程序中使用中断?
13、定时器/计数器的原理以及编程方法是什么?
14、串口通信原理,单片机与单片机如何通信?
15、单片机与PC机串口通信原理,以及编程方法?
16、串口转并口、USB转串口原理?
17、A/D转换原理?
18、D/A转换原理?
19、常见的A/D和D/A转换芯片,以及使用方法?
20、PWM脉冲调速原理是什么,如何编程输出PWM波?
21、LED1602液晶
22、LCD12864液晶
常用芯片
	锁存器
	38译码器
	4 - 16译码器
	驱动模块
	MAX7219
	等等

STM32

1、简介
2、基础使用
3、GPIO
4、外部中断
5、定时器
6、串口
7、PWM
8、ADC、DAC
9、IIC
10、SPI
11、相关外设

Peripherals(外设)

ADC/DAC
RTC
Timer/Watchdog Timer(定时器)
Flash/NAND Fiash
ROM/EEPROM
RAM
	SDRAM
	DDR1 DDR2 DDR3 DDR4
Cache
PWM
I/O / GPIO
USART
Modem
DTMF
CAN
SPI
I2C
IEEE
CRC
interrupt(中断)
入门开始学先掌握基础的知识,比如GPIO,串口,定时器,中断,PWM,I2C,SPI等等

Sensor(传感器)

RIP(人体红外)
Temperature(温度)
humidity sensor(温度传感器)
geomagnetic sensor(地磁传感器)
acceleration transducer(加速度传感器)
optoelectronic switch(光电开关)
pneumatic sensor(气流传感器)
current sensor(电流传感器)
soil sensor(土壤传感器)
liumination sensor(光照传感器)
laser sensor(激光传感器)
Motion(运动)
Moisture sensor(土壤湿度传感器)
电压传感器
Three-axis gyroscope(三轴陀螺仪)
Camera感光元件(图形传感器)
气压传感器
气敏传感器
粉尘浓度传感器
水位传感器
脉搏传感器
脑皮质电位传感器
弯曲传感器
近距离传感器

很多我也没接触过,我列举这么多主要是拓展,有兴趣的可以去了解下

Communication(通信)

USART
I2C
RS232C/RS485
SPI/SCI/SI
CAN
USB
FireWire
1-wire
网络协议
HTTP
CoAP
MQTT
XMPP
WebSocket
UDP
HTTP

一些我也还没学,我列举这么多主要是拓展,有兴趣的可以去了解下

Actuator(执行器)

直流电机
	有刷直流电机
	无刷直流电机
交流电机
	单相电机
	三相电机
步进电机
直线电机
舵机

使用起来还好,但是要深入原理得了解很多控制的原理,难哦

电路基础篇

主要相关课程

	电路分析基础
	模拟电路
	数字电路
	网址

Electronic Component(电子元件)

	电源
	电容
	保护装置
	开关
	电阻
		热敏电阻
		压敏电阻
		光敏电阻
	电磁感应装置
	电阻排
	压电装置、晶体谐振器
	二极管
	三极管
	晶体管

飞行篇

四旋翼

四旋翼基本组成及原理
四旋翼组装与调试
模拟器安装与飞行
实战飞行
核心知识
	硬件组装
		机架
		飞控
		电调
		电机
		光流
		陀螺仪
		电子罗盘
		激光测距
		等等
	主控芯片
		STM32F407
		其他都行
	飞控相关算法
		PID
		滤波算法
		姿态解算
		数据融合

固定翼

固定翼基本组成及原理
固定翼组装与调试
模拟器安装与飞行
实战飞行

软件项目篇

贪食蛇

实现
	纯C实现
	C++实现
	+图像库
主程序
蛇模块
墙模块
食物模块
蛇移动
拓展

五子棋

主要函数
	void judge(int y,int x,int color)
		判断当前位置4个方向连接的棋子数量,参数为棋子颜色 1白2黑
	bool pieceSet(int y, int x,int color
		放置棋子,返回true表示放置成功,false 表示放置失败
	void initGame()
		void initGame()
	void initView()
		初始化界面
	void drawPiece(int x,int y,int color)
		绘制棋子
	void AI()
		机器判断程序
	void playerVSplayer()
		人人对战
	void playerVSAI()
		人机对战

俄罗斯方块

   设置界面展示信息
    方块操作
	    生成方块
	    画方块
	    画下一个方块
	    方块运动
	    操作限制
	    得分消行
	    死亡判断
    左右栏目信息更新

学生管理系统

注册登录
    1、设置光标位置
    2、输出主菜单
    3、登录操作
    4、注册操作
    5、游客登录
    6、退出系统
    7、用户存取
    8、菜单指令
操作管理
    1、主界面
    2、添加操作
    3、读写文件
    4、查看
    5、删除
    6、修改
    7、排序
    8、考试
    9、退出
    10、统筹逻辑

文件加密与数据解析

 数据分析并解算
 MD5算法

二维码生成

基础知识
	定位图案
	功能性数据
	数据码和纠错码
数据编码
	示例一:数字编码
	示例二:字符编码
结束符和补齐符
	按8bits重排
	补齐码(Padding Bytes)
纠错码
最终编码
	穿插放置
	Remainder Bits
画二维码图
	Position Detection Pattern
	Alignment Pattern
	Timing Pattern
	Format Information
	Version Information
	数据和数据纠错码
	掩码图案

专业篇

这几个项目还没研究,在网上看到的,觉得不错,有时间就去看看。里面有GitHub的连接,想学习的可以去看看。
https://github.com/TheAlgorithms/C
	
https://github.com/ithewei/libhv
	
https://github.com/Light-City/CPlusPlusThings
	
https://github.com/JakubVojvoda/design-patterns-cpp
	
https://github.com/tmux/tmux
	
https://github.com/netdata/netdata

物联网项目篇

QT上位机

简介

什么是QT?
		Qt 是一个跨平台的 C++ 框架(C++库),可以用来写图型界面的应用,这里我们主要用来写电脑软件,用来与下位机通信
QT安装与使用
	建立一个新工程
	文本框
	编辑框
	按钮
	图片
	页面布局
	怎么更改控件的背景
		引入图片资源
		更改控件背景
	ui控件与cpp程序关联
	提示信息
	页面转换
	更改软件页面图标
	生成动态链接库
	功能
		TCP通信
			客户端
			服务器
		UDP通信
			客户端
			服务器
		串口
		蓝牙通信
			主机
			从机
QT模块与类
	QT基本模块
		15个QT基本模块
			QT core
				核心功能
					The Meta-object System 源对象系统
					Tread 线程
					I/O
					容器
					资源系统
					The Animation Framework 动画框架
					The Property System 属性系统
					对象模型
					信号与槽
					The Event System 事件系统
					The state Machine Framework 状态机框架
					JSON support  Json支持 
					QT Plugins 创建Qt插件
				QT core 类
					IO 类
					Container Classes 容器类
					Threading Classes 线程类
					Implicitly Shared Classes 隐式共享类
					Animation Classes 动画类
					Event Classes 事件类
					State Machine Classes 状态机类
					Plugin Classes 插件类
			QT GUI
				核心功能
					Application Windows 程序窗口
					2D Graphics 2D图形
					OpenGL and OpenGL ES Integration   OpenGL和OpenGL ES的整合
				QT GUI 类
					Event Classes 事件类
					Painting CLasses 绘画类
					Rendering in 3D 3D渲染类
			QT widgets
				Styles 样式
				Layouts 布局
				Model/VIew Classes 模型/视图类
				Graphics View 平面视图
			Qt QML
			QT Quick
			QT Quick Controls
			QT Quick Dialogs
			QT Quick Layouts
			QT Multimedia
				C++类
					QAudio OutPut
					QCamera
					QCameramageCapture
					QMediaPlayer
					QRadioTuner
					QVideoRendererControl
				QML类
					Audio
					Camera
					MediaPlayer
					Radio
					video
			QT Multimedia Widgets
			QT WebKit
			QT WebKit Widgets
			QT NetWork
			QT Sql
			QT Test
		QT WebView
	QT附加模块
		QT 开源免费附加模块
			跨平台模块
				Enfinio
				Qt Canvas 3D
				QT Concurrent 
				QT D-Bus
				QT Graphical Effects
				QT Image Formats
				QT Platform Headers
				QT Positioning
				QT Location
				QT Quick Extras
				QT Quick WIdgets
				QT Script 和 QT Script Tools
				QT SVG
				QT WebChannel
				QT WebSockets
			特定平台模块
				Active QT     Windows
				QT Bluetooth    Android/iOS/Linux/ OS X
				QT NFC 	Linux
				QT Sensors  Android/iOS/WInRT
				QT Serial Port Windows/Linux/OS X
				QT WebEngine 与 QT WebEngine Widgets  WIndows/Linux/OS X
				QT WIndows/Mac/X11/Android Extras Windows,OS X,Linux/X11,Android
			不再推荐使用的模块
				QT Open GL
				QT Declarative
		QT 企业增值模块
			QT for Device Creation
			QT Charts
			QT Quick Compiler
			QT Data Visualization
			QT Purchasing
			QT Virtual Keyboard
			QT Quick 2D Renderer
通信
	UDP
	TCP
	串口
实战项目
	一个电脑软件

ESP8266

AT指令模式
	SAT模式
		当作客户端,需要连接服务器,进行数据传输
	AP模式
		当作服务器,开放热点,拥有IP地址与端口号,其他客户端可以连接
	STA+AP模式
		两者都有,但是个人不太喜欢用
当作arduino开发
	利用电灯科技,连接阿里云,绑定小爱同学
	MQTT通信
	TCP通信
	UDP通信
TCP通信
	Server/Client
	怎么连接?
(使用AT指令)
		ESP8266 常用指令
			配置服务器指令(AP模式)
				1、设置模式为AP模式:AT+CWMODE=2
				2、重启模块:AT+RST
				3、AT+CWSAP="wifi名称","wifi密码",1,3
				4、查看模块的ip地址:命令: AT+CIFSR
				5、AT+CIPMUX=1 设置为多连接模式,启动模块
				6、AT+CIPSERVER=1,8090 服务器的设置端口
			配置服务器指令(STA模式)
				1、AT+CWMODE=1  配置STA模式
				2、AT+RST  重启生效
				3、AT+CWJAP="wifi名称","WiFi密码"    连接WIFI
				4、AT+CIPSTART="TCP","192.168.4.1",8090   连接服务器
				5、AT+CIPSEND=4     发送指令
				6、AT+CIPMODE=1    开启透传模式
				7、AT+CIPSEND    开始透传
		单片机当作服务器
			实现
				整体流程
					配置一个串口,然后将STM32的串口与ESP8266的串口连接
					将32的数据传输到ESP8266上,用于ESP8266初始化,也可以将ESP8266的数据传输到32上面,实现消息互传
				ESP8266初始化
					void esp8266_start_trans(void)
{
	//设置工作模式 1:station模式   2:AP模式  3:兼容 AP+station模式
	esp8266_send_cmd("AT+CWMODE=2","OK",50);
	//Wifi模块重启
	esp8266_send_cmd("AT+RST","OK",20);
	delay_ms(1000);         //延时3S等待重启成功
	delay_ms(1000);
	delay_ms(1000);	
	//AP模式
	//esp8266_send_cmd("AT+CWSAP=\"Geek\",\"12345678\",1,4","OK",200);  //设置热点的账号密码
	esp8266_send_cmd("AT+CIPMUX=1","OK",20);  
	esp8266_send_cmd("AT+CIPSERVER=1,8080","OK",200);
}
					由上面代码可知  esp8266_send_cmd 函数是想ESP8266发送指令,是利用串口发送,具体实现看工程代码   
			被连接
				手机客户端
				单片机客户端
				电脑客户端
		单片机当作客户端
			实现
				整体流程
					配置一个串口,然后将STM32的串口与ESP8266的串口连接
				ESP8266初始化
					//ESP8266模块和PC进入透传模式
void esp8266_start_trans(void)
{
	//设置工作模式 1:station模式   2:AP模式  3:兼容 AP+station模式
	esp8266_send_cmd("AT+CWMODE=1","OK",50);
	
	//让Wifi模块重启的命令
	esp8266_send_cmd("AT+RST","ready",20);
	
	delay_ms(1000);         //延时3S等待重启成功
	delay_ms(1000);
	delay_ms(1000);
	delay_ms(1000);
	
	//让模块连接上自己的路由
	while(esp8266_send_cmd("AT+CWJAP=\"GeekPan\",\"12345678\"","WIFI GOT IP",600));
	
	//=0:单路连接模式     =1:多路连接模式
	esp8266_send_cmd("AT+CIPMUX=0","OK",20);
	
	//建立TCP连接  这四项分别代表了 要连接的ID号0~4   连接类型  远程服务器IP地址   远程服务器端口号
	while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"192.168.4.1\",8090","CONNECT",200));
	
	//是否开启透传模式  0:表示关闭 1:表示开启透传
	esp8266_send_cmd("AT+CIPMODE=1","OK",200);
	
	//透传模式下 开始发送数据的指令 这个指令之后就可以直接发数据了
	esp8266_send_cmd("AT+CIPSEND","OK",50);
}
					由上面代码可知  esp8266_send_cmd 函数是想ESP8266发送指令,是利用串口发送,具体实现看工程代码   
			去连接
				单片机服务器
				手机服务器
				电脑服务器
		总结
			ESP8266初始化流程
				配置串口
					串口的波特率最好为9600,因为在硬件上面,太高可能实现不了
				写串口的发送指令函数
					用于给ESP8266发送对应的AT指令,初始化
				初始化客户端与服务器类似,只是发送的指令不同,但都需要利用串口发送
				硬件连线是TX接RX,RX接TX
			配置思路
				如果单片机当作服务器,那么ESP8266就是AP模式,开放热点,拥有IP地址与端口号。其他TCP客户端想要连接服务器时,需要先连接热点,然后再绑定IP地址与端口号,进行连接
				如果是STA模式,就需要连接服务器的热点,绑定IP地址与端口号,进行连接
			连接范围
				因为是利用WIFI局部通信,只是在局部网内有效,想要实现广域网通信,可以连接到云服务器,需要利用WIFI或者流量配置
	怎么进行数据传输
		发送数据
接收数据
			STM32与ESP8266
				主要利用串口进行数据传输
				STM32串口发送数据
					代码实现
						//向ESP8266发送命令
//cmd:发送的命令字符串;ack:期待的应答结果,如果为空,
//则表示不需要等待应答;waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果);1,发送失败
u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
	u8 res=0; 
	USART3_RX_STA=0;
	u3_printf("%s\r\n",cmd);	//发送命令
	if(ack&&waittime)		//需要等待应答
	{
		while(--waittime)	//等待倒计时
		{
			delay_ms(10);
			if(USART3_RX_STA&0X8000)//接收到期待的应答结果
			{
				if(esp8266_check_cmd(ack))
				{
					printf("ack:%s\r\n",(u8*)ack);
					break;//得到有效数据 
				}
					USART3_RX_STA=0;
			} 
		}
		if(waittime==0)res=1; 
	}
	return res;
}
					USART3_RX_STA
						一个 unsigned short 的变量
					USART3_RX_BUF
						接收缓冲区
				STM32串口接收数据
					代码实现
						if(USART3_RX_STA&0x8000)
{
	printf("USART3_RX_BUF=%s\r\n",USART3_RX_BUF);
	sprintf(a,"%s",USART3_RX_BUF);
	printf("a=%s",a);
	if(strstr((const char*)a,"on"))  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
				
	if(strstr((const char*)a,"off")) GPIO_SetBits(GPIOB,GPIO_Pin_5);
				
	USART3_RX_STA=0;
}
					USART3_RX_STA
						一个 unsigned short 的变量
					USART3_RX_BUF
						接收缓冲区
					注意点
						因为ESP8266利用串口向32发送的数据,数据格式不同,需要过滤掉多余的数据
					具体实现还是看整体的工程代码
			Client与Server
				Client发送与接收
					Client是单片机
						esp8266_send_cmd("数据","OK",50);
						数据发送流程
							客户端利用串口给客户端的ESP8266发送数据
							因为客户端与服务器已经连接,然后数据传输到服务器的ESP8266上
							服务器的ESP8266又利用串口给32发送数据
							最终32得到数据,可以根据数据执行相应的动作
						图片示意图
							
					Client是上位机
						上位机简单理解就是电脑软件,手机软件,可以用来控制单片机
						上位机发送数据,就是直接传输到服务器的ESP8266上,然后再利用串口发送给32
						示意图
							
				Server发送与接收
					Server是单片机
						同理
					Server是上位机
						同理

Android项目

什么是Android?
	可以开发手机APP
如何开发一个安装APP
	开发环境
		Android Studio
	新建一个基本工程,测试开发环境
		新建空白工程
		利用USB线与电脑连接
		手机进入开发者模式
		打开手机USB安装与调试
		在Android Studio中运行程序
			如果开发环境无误,那么就会在手机上安装一个APP
	控件
		按键
		图片按钮
		文本框
		编辑框
		选择开关
		拓展
			拖动条
			进度条
			浏览器框
			地图
			单选框
			复选框
	功能
		TCP通信
			客户端
			服务器
		UDP通信
			客户端
			服务器
		串口
		蓝牙通信
			主机
			从机
		MQTT通信
			连接外部的MQTT服务器

智能家居项目

通信
	局域网
	广域网
	ESP8266基础教程
		AT指令模式
			SAT模式
				当作客户端,需要连接服务器,进行数据传输
			AP模式
				当作服务器,开放热点,拥有IP地址与端口号,其他客户端可以连接
			STA+AP模式
				两者都有,但是个人不太喜欢用
		当作arduino开发
			利用电灯科技,连接阿里云,绑定小爱同学
			MQTT通信
			TCP通信
			UDP通信
		TCP通信
			Server/Client
			怎么连接?
(使用AT指令)
				ESP8266 常用指令
					配置服务器指令(AP模式)
						1、设置模式为AP模式:AT+CWMODE=2
						2、重启模块:AT+RST
						3、AT+CWSAP="wifi名称","wifi密码",1,3
						4、查看模块的ip地址:命令: AT+CIFSR
						5、AT+CIPMUX=1 设置为多连接模式,启动模块
						6、AT+CIPSERVER=1,8090 服务器的设置端口
					配置服务器指令(STA模式)
						1、AT+CWMODE=1  配置STA模式
						2、AT+RST  重启生效
						3、AT+CWJAP="wifi名称","WiFi密码"    连接WIFI
						4、AT+CIPSTART="TCP","192.168.4.1",8090   连接服务器
						5、AT+CIPSEND=4     发送指令
						6、AT+CIPMODE=1    开启透传模式
						7、AT+CIPSEND    开始透传
				单片机当作服务器
					实现
						整体流程
							配置一个串口,然后将STM32的串口与ESP8266的串口连接
							将32的数据传输到ESP8266上,用于ESP8266初始化,也可以将ESP8266的数据传输到32上面,实现消息互传
						ESP8266初始化
							void esp8266_start_trans(void)
{
	//设置工作模式 1:station模式   2:AP模式  3:兼容 AP+station模式
	esp8266_send_cmd("AT+CWMODE=2","OK",50);
	//Wifi模块重启
	esp8266_send_cmd("AT+RST","OK",20);
	delay_ms(1000);         //延时3S等待重启成功
	delay_ms(1000);
	delay_ms(1000);	
	//AP模式
	//esp8266_send_cmd("AT+CWSAP=\"Geek\",\"12345678\",1,4","OK",200);  //设置热点的账号密码
	esp8266_send_cmd("AT+CIPMUX=1","OK",20);  
	esp8266_send_cmd("AT+CIPSERVER=1,8080","OK",200);
}
							由上面代码可知  esp8266_send_cmd 函数是想ESP8266发送指令,是利用串口发送,具体实现看工程代码   
					被连接
						手机客户端
						单片机客户端
						电脑客户端
				单片机当作客户端
					实现
						整体流程
							配置一个串口,然后将STM32的串口与ESP8266的串口连接
						ESP8266初始化
							//ESP8266模块和PC进入透传模式
void esp8266_start_trans(void)
{
	//设置工作模式 1:station模式   2:AP模式  3:兼容 AP+station模式
	esp8266_send_cmd("AT+CWMODE=1","OK",50);
	
	//让Wifi模块重启的命令
	esp8266_send_cmd("AT+RST","ready",20);
	
	delay_ms(1000);         //延时3S等待重启成功
	delay_ms(1000);
	delay_ms(1000);
	delay_ms(1000);
	
	//让模块连接上自己的路由
	while(esp8266_send_cmd("AT+CWJAP=\"GeekPan\",\"12345678\"","WIFI GOT IP",600));
	
	//=0:单路连接模式     =1:多路连接模式
	esp8266_send_cmd("AT+CIPMUX=0","OK",20);
	
	//建立TCP连接  这四项分别代表了 要连接的ID号0~4   连接类型  远程服务器IP地址   远程服务器端口号
	while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"192.168.4.1\",8090","CONNECT",200));
	
	//是否开启透传模式  0:表示关闭 1:表示开启透传
	esp8266_send_cmd("AT+CIPMODE=1","OK",200);
	
	//透传模式下 开始发送数据的指令 这个指令之后就可以直接发数据了
	esp8266_send_cmd("AT+CIPSEND","OK",50);
}
							由上面代码可知  esp8266_send_cmd 函数是想ESP8266发送指令,是利用串口发送,具体实现看工程代码   
					去连接
						单片机服务器
						手机服务器
						电脑服务器
				总结
					ESP8266初始化流程
						配置串口
							串口的波特率最好为9600,因为在硬件上面,太高可能实现不了
						写串口的发送指令函数
							用于给ESP8266发送对应的AT指令,初始化
						初始化客户端与服务器类似,只是发送的指令不同,但都需要利用串口发送
						硬件连线是TX接RX,RX接TX
					配置思路
						如果单片机当作服务器,那么ESP8266就是AP模式,开放热点,拥有IP地址与端口号。其他TCP客户端想要连接服务器时,需要先连接热点,然后再绑定IP地址与端口号,进行连接
						如果是STA模式,就需要连接服务器的热点,绑定IP地址与端口号,进行连接
					连接范围
						因为是利用WIFI局部通信,只是在局部网内有效,想要实现广域网通信,可以连接到云服务器,需要利用WIFI或者流量配置
			怎么进行数据传输
				发送数据
接收数据
					STM32与ESP8266
						主要利用串口进行数据传输
						STM32串口发送数据
							代码实现
								//向ESP8266发送命令
//cmd:发送的命令字符串;ack:期待的应答结果,如果为空,
//则表示不需要等待应答;waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果);1,发送失败
u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
	u8 res=0; 
	USART3_RX_STA=0;
	u3_printf("%s\r\n",cmd);	//发送命令
	if(ack&&waittime)		//需要等待应答
	{
		while(--waittime)	//等待倒计时
		{
			delay_ms(10);
			if(USART3_RX_STA&0X8000)//接收到期待的应答结果
			{
				if(esp8266_check_cmd(ack))
				{
					printf("ack:%s\r\n",(u8*)ack);
					break;//得到有效数据 
				}
					USART3_RX_STA=0;
			} 
		}
		if(waittime==0)res=1; 
	}
	return res;
}
							USART3_RX_STA
								一个 unsigned short 的变量
							USART3_RX_BUF
								接收缓冲区
						STM32串口接收数据
							代码实现
								if(USART3_RX_STA&0x8000)
{
	printf("USART3_RX_BUF=%s\r\n",USART3_RX_BUF);
	sprintf(a,"%s",USART3_RX_BUF);
	printf("a=%s",a);
	if(strstr((const char*)a,"on"))  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
				
	if(strstr((const char*)a,"off")) GPIO_SetBits(GPIOB,GPIO_Pin_5);
				
	USART3_RX_STA=0;
}
							USART3_RX_STA
								一个 unsigned short 的变量
							USART3_RX_BUF
								接收缓冲区
							注意点
								因为ESP8266利用串口向32发送的数据,数据格式不同,需要过滤掉多余的数据
							具体实现还是看整体的工程代码
					Client与Server
						Client发送与接收
							Client是单片机
								esp8266_send_cmd("数据","OK",50);
								数据发送流程
									客户端利用串口给客户端的ESP8266发送数据
									因为客户端与服务器已经连接,然后数据传输到服务器的ESP8266上
									服务器的ESP8266又利用串口给32发送数据
									最终32得到数据,可以根据数据执行相应的动作
								图片示意图
									
							Client是上位机
								上位机简单理解就是电脑软件,手机软件,可以用来控制单片机
								上位机发送数据,就是直接传输到服务器的ESP8266上,然后再利用串口发送给32
								示意图
									
						Server发送与接收
							Server是单片机
								同理
							Server是上位机
								同理
PCB设置
参考网址
硬件设计
	ESP8266-NODEMCU开发板
	ESP32-cam
	外设
		DHT11温湿度传感器
		光敏传感器
		AS608光学指纹模块
		舵机
		减速电机
		步进电机
		红外管
		OLED显示屏
		LED灯
		其他
软件设计
	服务器端
		1.node-red
			node-red是一个非常方便的在线可视化编程,且提供了web组件框架,可以很方便地进行测试开发;下图便是node-red的线上开发环境,可视化拖拉工具就行了。
		2.MQTT服务器
			EMQ主要用来搭建MQTT服务器,网上有很多现成免费的MQTT服务器可以使用,但终归自己的才是最好的;当使用node-red服务的时候,会出现途中掉线,服务挂掉的情况,这种情况是由于没有托管,导致node-red自动退出,可以使用dockter托管安装(但是由于刚开始不知道,我各种搜寻,找到了forever这个托管工具,用着倒是挺简单且没有出现问题),下图便是EMQ自带的管理后台。功能很多,但没用上,主要也就是用于MQTT服务器使用

嵌入式项目篇

基础知识
	51
	STM32
		keil软件的安装与使用
			安装
				软件安装,破解
					keil5安装包
					注册机
				相关的驱动与支持包
					串口驱动
					JlinkSTlink驱动
					51
					STM32F10X/F4
					等等
				需要什么就安装什么
			使用
				建立一个新的工程
				使用别人的工程
				keil一些重要的操作
		程序烧录
			串口下载
			仿真器下载
				Jlink下载
				STlink下载
				其他下载
		点亮一个LED灯
			配置IO口
				void GPIO_Config(void)                            //GPIO初始配置
{
    GPIO_InitTypeDef GPIO_InitStructure;      //定义结构体变量

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能GPIOD的时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;                    //指定引脚13
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //设置输出速率50MHz
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出模式
    GPIO_Init(GPIOD, &GPIO_InitStructure);                            //初始化外设GPIOx寄存器
}
			将IO口拉高或拉低
				GPIO_ResetBits(GPIOD,GPIO_Pin_13);
					PD13引脚拉低
				GPIO_SetBits(GPIOD,GPIO_Pin_13);
					PD13引脚拉高
		LED灯闪烁
			在LED灯亮灭的基础上加上延时函数
			融入delay.h与delay.c文件
		在工程中融合其他模块程序
			独立按键
				进行相关设置
			温湿度传感器
				获取当前环境温湿度,显示到上位机
			0.96寸OLED
				显示屏
			直流电机、电机驱动、扇叶
				风扇
			蜂鸣器
				警报
			RFID-RC522
				门禁卡
			ESP8266模块
				实现通信的核心模块
			会看,会用,会改
				至于每个模块内部的具体原理,如果不是特别感兴趣,可以不用了解,会用就行
	传感器
		电机驱动
			L298N
			TB6612FNG
			L9110S
		测距
			激光测距
			超声波测距
		OLED
		WIFI
		蓝牙
		摇杆
		语言模块
		舵机
		摄像头
		图传
		MPU6050
		等等
实战项目
	智能小车项目
		智能小车远程控制系统
		平衡小车
	玲珑机器人(硬件)
		机器人自平衡
			主要模块
				MUP6050
				电机、电机驱动
				机器人主体
			设计思路
				PID算法
		OLED显示相关信息
			显示相关参数,比如姿态、测距、文学、图像信息等
		超声波测距
			测量距离,可以利用距离来设计动作
		舵机控制肢体动作
		语音控制机器人动作
		WIFI通信
			利用APP控制机器人的基本动作
		硬件摇杆
			利用摇杆控制机器人动作
		无线图传
			显示图像信息
		图像识别
			根据图像实现设计的功能
	掌握核心知识过后,就能做自己想做的,项目不在多,而是要能消化内部的知识。

辅助设计篇

焊接与基本测量工具

数字式万用表
	测量前先打到测量的档位,要注意的是档位上所标的是量程,即最大值
吸锡器
电络铁
	掌握好电烙铁的温度,当在铬铁上加松香冒出柔顺的白烟,而又不"吱吱"作响时为焊接最佳状态。控制焊接时间,不要太长,这样会损坏元件和电路板。清除焊点的污垢,要对焊接的原件用刻刀除去氧化层并用松香和锡预先上锡。
焊锡
	焊接用品,在锡中间有松香
松香
	除去氧化物的焊接用品
助焊剂
	作用和松香一样,但效果比松香好,可是,因为助焊剂含有酸性,所以使用过的原件都要用洒精擦净,以防腐蚀。
示波器
	示波器是一种用来测量交流电或脉冲电流波的形状的仪器,由电子管放大器、扫描振荡器、阴极射线管等组成。除观测电流的波形外,还可以测定频率、电压强度等。凡可以变为电效应的周期性物理过程都可以用示波器进行观测。
	分类编辑
游标卡尺
	游标卡尺(VERNIER CALLIPER),是一种测量长度、内外径、深度的量具。游标卡尺由主尺和附在主尺上能滑动的游标两部分构成。
其他
	用啥就学啥

PCB画板与打印

软件安装
	AD
		入门难度稍大
	立创EDA
		主要介绍
	其他也行
PCB是什么?
	印刷电路板
为什么要用PCB?
	减少赘余的线路
	因为项目用面包板和杜邦线连接的话,整体看起来会显得杂乱无章,不美观,而且一旦模块过多,出现错误不容易排查。如果使用PCB,可以利用软件先画出自己想要的板子,然后去打印出来,再将对应模块安装好就行。
如何打印PCB?
	嘉立创
		https://www.jlc.com
	锦邦达
		http://pay.jinbang-pcb.com/Order_add.aspx
	顺易捷
		https://www.syjpcb.com
	华秋
		https://www.hqpcb.com
PCB文件制作方法
	前期准备
		这包括准备元件库和原理图。“工欲善其事,必先利其器”,要做出一块好的板子,除了要设计好原理之外,还要画得好。在进行PCB设计之前,首先要准备好的元件(原理图库和PCB库)。元件库可以用立创EDA的元件库,元件库内容丰富。
	PCB结构设计
		这一步根据已经确定的电路板尺寸,在PCB 设计环境下绘制PCB板面,并按定位要求放置所需的接插件、按键/开关、螺丝孔、装配孔等等。并充分考虑和确定布线区域和非布线区域。
	PCB布局
		按电气性能合理分区,一般分为:数字电路区(即怕干扰、又产生干扰)、模拟电路区(怕干扰)、功率驱动区(干扰源);
		完成同一功能的电路,应尽量靠近放置,并调整各元器件以保证连线最为简洁;同时,调整各功能块间的相对位置使功能块间的连线最简洁;
		对于质量大的元器件应考虑安装位置和安装强度;发热元件应与温度敏感元件分开放置,必要时还应考虑热对流措施;
		I/O驱动器件尽量靠近印刷板的边、靠近引出接插件;
		时钟产生器(如:晶振或钟振)要尽量靠近用到该时钟的器件;
		在每个集成电路的电源输入脚和地之间,需加一个去耦电容(一般采用高频性能好的独石电容);电路板空间较密时,也可在几个集成电路周围加一个钽电容。
		继电器线圈处要加放电二极管;
		布局要求要均衡,疏密有序,不能头重脚轻或一头沉
	特别注意
		在放置元器件时,一定要考虑元器件的实际尺寸大小(所占面积和高度)、元器件之间的相对位置,以保证电路板的电气性能和生产安装的可行性和便利性同时,应该在保证上面原则能够体现的前提下,适当修改器件的摆放,使之整齐美观,如同样的器件要摆放整齐、方向一致,不能摆得“错落有致” 。
	布线
		布线一般有这么三种境界的划分
			首先是布通,这时PCB设计时的最基本的要求。如果线路都没布通,搞得到处是飞线,那将是一块不合格的板子,可以说还没入门。
			其次是电器性能的满足。这是衡量一块印刷电路板是否合格的标准。这是在布通之后,认真调整布线,使其能达到最佳的电器性能。
			接着是美观。假如你的布线布通了,也没有什么影响电器性能的地方,但是一眼看过去杂乱无章的,加上五彩缤纷、花花绿绿的,那就算你的电器性能怎么好,在别人眼里还是垃圾一块。这样给测试和维修带来极大的不便。
	布线优化和丝印
		一般优化布线的时间是初次布线的时间的两倍。感觉没什么地方需要修改之后,就可以铺铜了(Place->polygon Plane)。铺铜一般铺地线(注意模拟地和数字地的分离),多层板时还可能需要铺电源。
		对于丝印,要注意不能被器件挡住或被过孔和焊盘去掉。同时,设计时正视元件面,底层的字应做镜像处理,以免混淆层面。 
	网络和DRC检查和结构检查
		在确定电路原理图设计无误的前提下,将所生成的PCB网络文件与原理图网络文件进行物理连接关系的网络检查(NETCHECK),并根据输出文件结果及时对设计进行修正,以保证布线连接关系的正确性;
		网络检查正确通过后,对PCB设计进行DRC检查,并根据输出文件结果及时对设计进行修正,以保证PCB布线的电气性能。最后需进一步对PCB的机械安装结构进行检查和确认。
	制版
	总结

PCB设计是一个考心思的工作,谁的心思密,经验高,设计出来的板子就好。所以设计时要极其细心,充分考虑各方面的因数(比如说便于维修和检查这一项很多人就不去考虑),精益求精,就一定能设计出一个好板子

3D建模与打印

建模工具
	SolidWorks
	3Dmax
	其他
	会那种就用那种
模型打印
	方式比较多,还得看3D打印机类型
	一般是STL文件用的比较多
这方面主要是建模,得结合实际需求设计
文档撰写
思维导图
策划、海报、视频等等各方面

Linux项目篇

基础知识

Linux 基础知识
	发展
	特定和优势
	应用场景
	常见的Linux系统版本
		CentOS
		Ubuntu
		其他
Linux 环境
	搭建方式
		虚拟机
		云服务器
		在线工具
		其他
	远程连接
		SSH
		连接工具
			XShell
			MobaXterm
			FinalShell
Linux操作系统基础
	文件和目录的操作
		ls

			显示文件和目录列表

		cd

			切换目录

		pwd

			显示当前工作目录
		mkdir

			创建目录

		rmdir

			删除空目录
		touch

			生成一个空文件或更改文件的时间

		cp

			复制文件或目录

		mv
			移动文件或目录、文件或目录改名
		rm
			删除文件或目录
		ln
			建立链接文件
		find
			查找文件
		file/stat
			查看文件类型或文件属性信息
		echo
			把内容重定向到指定的文件中 ,有则打开,无则创建
		管道命令 |
			将前面的结果给后面的命令,例如:`ls -la | wc `,将ls的结果加油wc命令来统计字数
		重定向 > 是覆盖模式,>> 是追加模式
			例如:`echo "Java3y,zhen de hen xihuan ni" > qingshu.txt `把左边的输出放到右边的文件里去
	查看文件
		cat
			查看文本文件内容
		more
			可以分页看
		less
			不仅可以分页,还可以方便地搜索,回翻等操作
		tail -10
			查看文件的尾部的10行
		head -20
			查看文件的头部20行
	系统信息
		uname 查看系统信息
		hostname 查看主机名
		cat/proc/cpuinfo 查看CPU信息
		lsmod 查看已加载的系统模块
		top 查看系统使用情况
		df 查看磁盘分区
		du 查看目录使用情况
		lostat 查看I/O 使用情况
		free 显示系统内存情况
		env 查看环境变量
		uptime 查看系统运行时间、用户数、负载
	系统操作
		shutdown 关机
		reboot 重启
		mount 挂载设备
		umount 卸载设备
	管理用户
		用户管理
			useradd
				添加用户
			usermod
				修改用户
			userdel
				删除用户
		组管理
			groupadd
				添加组
			groupmod
				修改组
			groupdel
				删除组
		
			成批添加/更新一组账户:newusers
			成批更新用户的口令:chpasswd
		组成员管理:
			向标准组中添加用户

gpasswd -a <用户账号名> <组账号名>

usermod -G <组账号名> <用户账号名>

从标准组中删除用户

gpasswd -d <用户账号名> <组账号名>
		口令管理
			
				修改 /etc/login.defs 的相关配置参数
			
				passwd
			设置已存在用户的口令时效:
				change
		切换用户
			su
			sudo
		用户相关的命令:
			id:显示用户当前的uid、gid和用户所属的组列表
			groups:显示指定用户所属的组列表
			whoami:显示当前用户的名称
			w/who:显示登录用户及相关信息
			newgrp:用于转换用户的当前组到指定的组账号,用户必须属于该组才可以正确执行该命令
	进程管理
		ps:查找出进程的信息
		nice和renice:调整进程的优先级
		kill:杀死进程
		
		
		作业管理
			jobs:列举作业号码和名称
			bg:
			fg:在前台恢复运行
			ctrl+z:暂时停止某个进程
		自动化任务
			at
			cron
		管理守护进程
			chkconfig
			service 
			
	打包和压缩文件
		压缩
			gzip filename
			bzip2 filename
			tar -czvf filename
		解压
			gzip -d filename.gz
			bzip2 -d filename.bz2
			tar -xzvf filename.tar.gz
	grep+正则表达式
		grep -n mystr myfile
			在文件 myfile 中查找包含字符串 mystr的行
		grep  '^[a-zA-Z]'  myfile
			显示 myfile 中第一个字符为字母的所有行
	Vi编辑器
		普通模式
			G
			ZZ
			ZQ
			/和?
			n
			yy
			p
			dd 删除一行文本
			u 取消上一次编辑操作(undo)
		插入模式
			使用i或a或o进去插入模式
			使用esc返回普通模式
		命令行模式
			w
			w
			wq
			q!
			q
		设置Vi环境
			set autoindent  缩进,常用于程序的编写
			set noautoindent 取消缩进
			set number 在编辑文件时显示行号
			set tabstop=value 设置显示制表符的空格字符个数
			set 显示设置的所有选项
	权限管理
		改变文件或目录的权限:chmod
		改变文件或目录的属主(所有者):chown
		
		设置文件的缺省生成掩码:umask
		文件扩展属性
			
	其他
		
			ifconfig:查看网络接口信息
			ifup/ifdown:开启或关闭接口
		临时配置相关
			route命令:可以临时地设置内核路由表
			hostname命令:可以临时地修改主机名
			sysctl命令:可以临时地开启内核的包转发
			
		
			ifconfig 检测网络接口配置

route 检测路由配置

ping 检测网络连通性

netstat 查看网络状态

lsof 查看指定IP 和/或 端口的进程的当前运行情况

host/dig/nslookup 检测DNS解析

traceroute 检测到目的主机所经过的路由器

tcpdump 显示本机网络流量的状态
		安装软件
			yum
			rpm
			wget
	vim
		基本工作模式
			命令模式 
				移动光标
					左移
					右移
					下移
					 上移
					光标移动文件开头
					光标移动到文件末尾
					光标移动到行首
					光标移动到行尾
					跳转到第123行
				删除
					删除光标后一个字符,相当于 Del
					 删除光标前一个字符,相当于 Backspace
					删除光标开始位置的字,包含光标所在字符
						光标必须移动到删除单词的首字符上
					删除光标前本行所有内容
					 删除光标后本行所有内容
					删除光标所在行
					删除10行
					并不是真的删除,实际上是剪切
				撤销操作
					一步一步撤销
					反撤销
				复制粘贴
					复制当前行
					从当前行开始复制10行
					在光标所在位置向下新开辟一行,粘贴
					在光标所在位置向上新开辟一行,粘贴
				可视模式
					按字移动
					按行移动
					如何移动光标?
					如何复制选中的内容?
				查找操作
					从光标所在位置向后查找 hello
					从光标所在位置向前查找 hello
					在要查询的单词上使用哪个符号就能对单词进行查找
					切换位置?
				替换操作
					替换所在的字符
				文本行移动
					文本行右移
					文本行左移
				查看 Man Page
					光标移动到函数上
					查看第三章的 ManPage
			文本输入模式
				进入输入模式
					插入光标前一个字符
					插入行首
					插入光标后一个字符
					插入行未
					向下新开一行,插入行首
					向上新开一行,插入行首
					删除光标所在的字符
					删除当前行
			末行模式
				命令
					行跳转
						跳转到第123行
					替换
						替换一行
							将当前行中的第一个abc替换为123
							将当前行中的abc全部替换为123
						替换全部
							将所有行中的第一个abc替换为123
							将所有行中的abc全部替换为123
						替换指定行
							将10-30行中的abc全部替换为123
					执行shell命令
		分屏操作
			末行模式
				水平分屏
				垂直分屏
				分屏显示两个不同的文件
				操作
					保存并退出所有屏幕
					保存并退出光标所在的屏幕
					屏幕切换
		vim 打造 IDE
			系统级配置文件目录:
			用户级配置文件目录:
		命令模式
			
		命令模式
		文本模式
		末行模式
		完成
		文件
		完成
Linux网络编程
	计算机网络知识补充
		计算机网络概论
		应用层协议
		运输层协议:TCP与UDP
		网络层协议
		数据链路层协议
	TCP网络通信刨析
		三次握手与四次握手
		TCP流量控制
		TCP拥塞避免
		TCP状态转换
	socket网络编程接口
		socket的创建与关闭
		server端:bind、listen、accept
		Client端:connect
		数据的发送与接收:send、recv
	UDP编程实现
		在UDP上使用connect
	基于CS模型的TCP客服端设计与实现
	P2P模型网络服务的实现
	HTTP与BS模型
	简单的网络并发模型
		基于多线程与多进程
		简单的IO多路复用机制
	项目实战
		服务器集群监控系统
Linux系统编程
	Linux系统编程入门
		命令行参数解析
		用于调试测试的宏实现
		通用功能封装
	文件I/O
		文件的打开、关闭、读写
		阻塞与非阻塞IO
		同步IO
		内核内幕:虚拟文件系统
	缓冲I/O
		标准I/O
		流的开大、关闭与读写
		控制缓冲
		线程安全:对文件加锁
	多进程编程
		进程体系:进程ID,父子进程关系
		运行新的进程:fork、exec
		终止进程
		等待子进程退出
		特殊进程
			僵尸进程
			孤儿进程
			守护进程
	高级进程管理
		进程调度
		完全公平调度算法
		实时系统的原理与实现
	线程池的实现
	进程与通信IPC
		基于文件的简单进程间通信
		共享内存:互斥锁、条件变量
		管道:匿名管道与命名管道
		共享存储映射
		消息队列
		信号量
		套接字
	多线程编程
		线程与进程的对比
		线程模型
		线程API
		线程模式
			一个连接对应一个线程
			事件驱动
		并发、并行和竞争
		同步:互斥与死锁
	信号
		基本信号管理
		发送信号
		信号集
		高级信号管理
	时间
		时间的表示
		睡眠与等待
		定时器
	高级IO
		分散、聚集IO
		IO多路复用
			select
			poll
			epoll
		IO调度器与IO性能
	终端IO编程
		终端驱动程序的模式
		ncurses库使用
	项目实战
		实现自己的shell

实战项目

	Client/Server
		介绍
			Socket是进程间通信的方式之一,是进程间的通信。这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上。只要他们之间建立起了socket的连接,那么数据便可以在机器之间进行双向的交流,直到连接断开。
		socket的建立
			在我们接触到实际的代码API之前,我们应该对基础的连接方式有所了解。
			Note left of server: 建立一个正被监听的socket并等待客户端的连接
			Note right of client: 建立一个客户端的socket并尝试连接server
			Note left of server: 接受来自client的连接请求
			server->client: 发送与接受数据
			client->server: 接受与发送数据
			Note left of server: 关闭当前的连接
			Note right of client: 关闭当前的连接
		连接步骤
			首先server需要创建正在被监听的socket,等待client的连接请求。
			client创建一个socket,尝试连接server。
			server接受client的请求,建立起两者之间的连接。
			数据交换,双向通信。
			任何一方都可以断开连接,断开后连接会自动销毁。
		Client
			通过系统函数socket()创建一个socket。
			通过系统函数connect()向server端的socket发起请求。
			交换数据,实现这种数据交换的方式有很多种方式,其中最简单的就是使用系统函数read(),write()。
		Server
			通过系统函数socket()创建一个socket。
			通过系统函数bind()绑定这个socket到server的一个端口上。
			通过系统函数listen()监听这个socket。
			当监听到又一个请求来临时,通过系统函数accept()接受一个请求。这个函数会阻塞io直到两者的连接完全断开。
			交换数据。
		socket的类型
			当一个socket被建立起来之后,进程间需要去说明所使用的协议和socket type。只有通信的双方都拥有相同的type和协议。
			目前广泛使用的协议有两大类,分别是Unix文件系统协议(Unix domain)、Internet网络协议(Internet domain)。对应的他们有各自的特点。使用Unix domain的双方使用公共的文件系统进行通信,使用Internet domain的进程分别位于不同的主机上,他们通过网络进行通信。
			使用Unix domain的socket地址本质上就是文件系统的一个记录,本身是一条字符串。
			使用Interner domain的socket包含两部分,一部分是主机的IP地址,一部分是socket绑定到的端口号。一般端口号比较低的端口都会被当作特殊的用途,比如端口号是80的端口是提供http服务的。
			目前广泛使用的socket类型也是两种,一种是流socket(stream sockets),一种是数据报socket(datagram sockets)。stream socket处理通信就像是处理流水一样的连续不断的字节流,而datagram sockets需要读取完整的字符,通常一个字符由几个字节组成。
			建立在使用TCP协议的基础上,这是一种可靠的面向字节流的协议,另外一种协议是UDP协议,这是一种不可靠的面向字符的协议。
		创建步骤
			创建socket
					socket_desc = socket(AF_INET, SOCK_STREAM, 0);
	if (-1 == socket_desc) {
		perror("cannot create socket");
		exit(1);
	}
			设置远程服务器的信息
				server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_family = AF_INET;
server.sin_port = htons(80);
			连接
					if (connect(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0) {
		perror("cannot connect");
		return 0;
	}
			当服务器接受请求时便会建立连接
		函数说明
			connect()函数
				简介
					connect()函数会向服务器发起请求建立一个连接。
				参数
					int sockfd	=> socket的描述符
					const struct sockaddr *addr	=> sockaddr的结构体,通用的socket地址
					socklen_taddrlen	=> socket描述符的长度。
					struct sockaddr是通用的套接字地址,而struct sockaddr_in则是Internet环境下套接字的地址形式,二者长度一样,都是16个字节。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。一般情况下,需要把sockaddr_in结构强制转换成sockaddr结构再传入系统调用函数中。
				另外代码中的htons()函数的作用是将主机的数据转化为网络字节的顺序
			send()函数
			recv()函数
			htons()函数
			socket()函数
			介绍
				https://www.cnblogs.com/tingyugetc/p/6253041.html
				网上很多资料,搜一搜就会有很多
	实现自己的shell
		网址
			https://blog.csdn.net/OCTODOG/article/details/70942194
			https://blog.csdn.net/qq_44049351/article/details/99702807
	服务器集群监控系统
		网址
			https://blog.51cto.com/wangfx/1955766
		网上资料比较冗杂,要学会区分
	搭建一个网站

拓展篇

FreeROTS嵌入式实时操作系统
	网址
		官网
			https://www.freertos.org
		https://zhuanlan.zhihu.com/p/90608412
		https://www.pcworld.com/article/460666/tesla_cto_talks_model_s_batteries_and_incar_linux.html
	视频
		https://www.bilibili.com/video/BV1C5411M7gK?from=search&seid=5307118440328018083&spm_id_from=333.337.0.0
		在B站搜有很多,韦东山,正点原子等都有
	如何移植FreeROTS
Linux实时操作系统
	简介
		RTLinux(AReal-Time Linux,亦称作实时Linux)是Linux中的一种 实时操作系统 。
	网址
		https://zhuanlan.zhihu.com/p/147563274
ucos实时多任务操作系统
	网址
		https://blog.csdn.net/ideal121/article/details/119571307
ARM
	网址
		https://blog.csdn.net/weixin_38717634/article/details/112860225?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163324583316780274116753%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163324583316780274116753&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-112860225.pc_search_all_es&utm_term=ARM&spm=1018.2226.3001.4187
ESP
	网址
		https://blog.csdn.net/wdscq1234/article/details/52705458?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163324798016780261927900%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163324798016780261927900&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-52705458.pc_search_all_es&utm_term=ESP&spm=1018.2226.3001.4187
其他

总结

每一个方想深入都比较难,建议多实践操作与总结,自己也很多内容没整明白,但是往后的时间会不断去学,加强巩固,深入拓展
入门建议看视频,跟着视频练,对基础知识掌握过后,就要多实践思考,基础非常重要,不要没基础就去研究深奥的知识

极客C -项目教程
极客C -项目教程

极客C -项目教程

上一篇:ESP8266 – ESP8266WebServer库


下一篇:MicroPython_ESP8266_IoT——第二回 致敬点灯(一切从点灯开始)