蓝牙模块HC-08+WIFI模块ESP-01S

news2024/11/28 14:54:03

蓝牙模块

又叫蓝牙串口模块。
串口透传技术:透传即透明传送,是指在数据的传输过程中,通过无线的方式使这组数据不发生任何形式的改变,仿佛传输过程是透明的一样,同时保证传输的质量,原封不动地道了最终接收者手里。
下载hc-08板子上二维码对应的HC蓝牙助手app,将hc08接入单片机(注意tx,rx反接),此时烧录以下代码:

#include "reg52.h"
#include <intrins.h>
#include <string.h>

#define SIZE 12
sfr AUXR = 0x8E;
sbit led = P3^7;

char cmd[12];

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void UartInit(void)		//9600bps@11.0592MHz
{
	SCON = 0x50;	//定义串口工作方式为方式1,8位UART
	//PCON初值为00x1 0000符合我们的要求,我们只需要SMOD=0不加倍即可
	AUXR = 0x01;
	TMOD &= 0x0F;
	TMOD |= 0x20;	//配置定时器1为8为自动重载定时器
	
	TL1 = 0xFD;
	TH1 = 0xFD;	//9600波特率初值
	
	TR1 = 1;	//打开中断
	
	EA = 1;	//开启总中断
	ES = 1;	//开启UART中断
}

void sendByte(char data_msg){
	SBUF = data_msg;
	//当8位数据没有传送结束时,卡在while循环中
	while(!TI);	//TI发送中断请求标志位,第8位数据传送结束时,硬件自动置1
	TI = 0;
}

void sendString(char* str){
	while(*str != '\0'){
		sendByte(*str++);
	}
}

void main()
{
	led = 1;
	//配置C51串口的通信方式
	UartInit();
	while(1){
		Delay1000ms();
		//往发送缓冲区写入数据,就完成数据的发送
		sendString("hello world\r\n");
	}
}

void Uart_Handler() interrupt 4
{
	static int i = 0;	//
	if(RI){	//中断处理函数中,对于接收中断的响应
		RI = 0;
		cmd[i] = SBUF;
		i++;
		if(i == SIZE) i=0;
		if(strstr(cmd,"en")){	//判断cmd中是否有“en”子串
			led = 0;
			i=0;
			memset(cmd,'\0',SIZE);
		}
		if(strstr(cmd,"se")){
			led = 1;
			i=0;
			memset(cmd,'\0',SIZE);
		}
	}
	if(TI);
}

打开手机app即可每隔一秒接收到一个hello world同时可以通过手机发送open或close开/关灯.
同时可以通过AT指令进行快乐的玩耍

WIFI模块

初始配置和验证

为了将来与单片机的波特率保持一致,将波特率修改为9600

AT+UART=9600,8,1,0,0

入网设置

1.设置工作模式

AT+CWMODE=3	//1.是station(设备)模式2.是AP(路由)模式3.双模

OK

2.以设备模式接入家中的路由器

AT+CWJAP="wifipig","66668888"
WIFI CONNECTED
WIFI GOT IP

OK

3.查询IP地址

AT+CIFSR
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"a6:cf:12:c1:ec:eb"
+CIFSR:STAIP,"192.168.31.46"
+CIFSR:STAMAC,"a4:cf:12:c1:ec:eb"

OK

4.连接服务器

AT+CIPSTART="TCP","192.168.31.152",8880
CONNECT

OK

5.发送数据

AT+CIPSEND=4	//设置即将发送的数据长度  4个字节
> 				//注意在发送数据的时候要取消勾选发送新行,在上传指令的时候要勾选发送新行
Recv 4 bytes

SEND OK

透传发送数据

基于上述连接服务器之后

AT+CIPMODE=1	//开启透传模式

OK

AT+CIPSEND

>				//即可肆意传输 当你不想传输了发送一个“+++”即可退出透传模式

将wifi模块接入单片机进行开发

首先我们将以下代码烧录至单片机中:

#include "reg52.h"
#include <intrins.h>
#include <string.h>

#define SIZE 12
sfr AUXR = 0x8E;
sbit led = P3^7;

char cmd[SIZE];

code char LJWL[]  = "AT+CWJAP=\"wifipi\",\"66668888\"\r\n";
code char LJFWQ[] = "AT+CIPSTART=\"TCP\",\"192.168.31.152\",8880\r\n";
char TCMS[]  = "AT+CIPMODE=1\r\n";
char SJCS[]  = "AT+CIPSEND\r\n";

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void UartInit(void)		//9600bps@11.0592MHz
{
	SCON = 0x50;	//定义串口工作方式为方式1,8位UART
	//PCON初值为00x1 0000符合我们的要求,我们只需要SMOD=0不加倍即可
	AUXR = 0x01;
	TMOD &= 0x0F;
	TMOD |= 0x20;	//配置定时器1为8为自动重载定时器
	
	TL1 = 0xFD;
	TH1 = 0xFD;	//9600波特率初值
	
	TR1 = 1;	//打开中断
	
	EA = 1;	//开启总中断
	ES = 1;	//开启UART中断
}

void sendByte(char data_msg){
	SBUF = data_msg;
	//当8位数据没有传送结束时,卡在while循环中
	while(!TI);	//TI发送中断请求标志位,第8位数据传送结束时,硬件自动置1
	TI = 0;
}

void sendString(char* str){
	while(*str != '\0'){
		sendByte(*str++);
	}
}

void main()
{
	led = 1;
	//配置C51串口的通信方式
	UartInit();
	while(1){
		//Delay1000ms();
		//往发送缓冲区写入数据,就完成数据的发送
		//sendString("hello world\r\n");
		sendString(LJWL);
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		sendString(LJFWQ);
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		sendString(TCMS);
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		sendString(SJCS);
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
	}
}

void Uart_Handler() interrupt 4
{
	static int i = 0;	//
	if(RI){	//中断处理函数中,对于接收中断的响应
		RI = 0;
		cmd[i] = SBUF;
		i++;
		if(i == SIZE) i=0;
		if(strstr(cmd,"en")){	//判断cmd中是否有“en”子串
			led = 0;
			i=0;
			memset(cmd,'\0',SIZE);
		}
		if(strstr(cmd,"se")){
			led = 1;
			i=0;
			memset(cmd,'\0',SIZE);
		}
	}
	if(TI);
}

依次传输连接网络、连接服务器、透传模式、数据传输的指令,先传到电脑上检查一个格式是否正确。
之后可以将wifi模块接入单片机,依次将上述指令传输给wifi模块,但是我们如何知道wifi模块是否正确接收到指令并返回正确的回复?
白盒测试
我们可以通过单片机传输指令至8266wifi模块,之后将8266的tx与pc端串口助手的rx连接,查看8266返回的数据以检查是否正确接收指令并作出正确的回复。
在这里插入图片描述
可以看到8266模块确实正确接收到了指令,并且成功连接网络、连接服务器、开启透传模式进行了数据传输,因此代码正确。
此时我们通过网络向8266发送数据后,由于8266的tx口连着pc端因此会在pc端的串口助手中接收到数据,当我们将8266的tx口与单片机相连,就可以实现通过网络来操控单片机的效果。

通过TCP通信控制LED灯

将8266与单片机相连,修改串口中断中的代码:

#include "reg52.h"
#include <intrins.h>
#include <string.h>

#define SIZE 12
sfr AUXR = 0x8E;
sbit led = P3^7;

char cmd[SIZE];

code char LJWL[]  = "AT+CWJAP=\"wifipi\",\"66668888\"\r\n";
code char LJFWQ[] = "AT+CIPSTART=\"TCP\",\"192.168.31.152\",8880\r\n";
char TCMS[]  = "AT+CIPMODE=1\r\n";
char SJCS[]  = "AT+CIPSEND\r\n";

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void UartInit(void)		//9600bps@11.0592MHz
{
	SCON = 0x50;	//定义串口工作方式为方式1,8位UART
	//PCON初值为00x1 0000符合我们的要求,我们只需要SMOD=0不加倍即可
	AUXR = 0x01;
	TMOD &= 0x0F;
	TMOD |= 0x20;	//配置定时器1为8为自动重载定时器
	
	TL1 = 0xFD;
	TH1 = 0xFD;	//9600波特率初值
	
	TR1 = 1;	//打开中断
	
	EA = 1;	//开启总中断
	ES = 1;	//开启UART中断
}

void sendByte(char data_msg){
	SBUF = data_msg;
	//当8位数据没有传送结束时,卡在while循环中
	while(!TI);	//TI发送中断请求标志位,第8位数据传送结束时,硬件自动置1
	TI = 0;
}

void sendString(char* str){
	while(*str != '\0'){
		sendByte(*str++);
	}
}

void main()
{
	int mark = 0;
	led = 1;
	//配置C51串口的通信方式
	UartInit();
	while(1){
		//Delay1000ms();
		//往发送缓冲区写入数据,就完成数据的发送
		//sendString("hello world\r\n");
		if(mark == 0){
			sendString(LJWL);
			Delay1000ms();
			Delay1000ms();
			Delay1000ms();
			Delay1000ms();
			Delay1000ms();
			sendString(LJFWQ);
			Delay1000ms();
			Delay1000ms();
			Delay1000ms();
			Delay1000ms();
			Delay1000ms();
			sendString(TCMS);
			Delay1000ms();
			Delay1000ms();
			Delay1000ms();
			Delay1000ms();
			Delay1000ms();
			sendString(SJCS);
			Delay1000ms();
			Delay1000ms();
			Delay1000ms();
			Delay1000ms();
			Delay1000ms();
			mark = 1;
		}else{
			sendString("hello world\r\n");
			Delay1000ms();
		}
	}
}

void Uart_Handler() interrupt 4
{
	if(RI){	//中断处理函数中,对于接收中断的响应
		RI = 0;
		cmd[0] = SBUF;
		if(cmd[0] == '1'){
			led = 0;
		}
		if(cmd[0] == '0'){
			led = 1;
		}
	}
	if(TI);
}

但是这段代码在运行时,我们无法看到任何连接的信息,不知道连接是否正确进行,因此代码是不完善的,在有时候我们无法连接上wifi因此我们还是需要借助上述白盒测试的方法来检查返回值,程序可能会因为在5s内连接不上wifi而导致后续一系列操作都发生错误,因此我们需要优化我们的代码:
基本上当我能够正确接入wifi后续的操作就会成功,而接入wifi后会返回的提示为WIFI CONNECTED
WIFI GOT IP
在这里插入图片描述
根据程序正确运行时的返回值来进行判断.
这里记录一下在编程过程中遇到的一个错误卡了我好久

void Uart_Handler() interrupt 4
{
	static int i = 0;
	char tmp;
	if(RI){	//中断处理函数中,对于接收中断的响应
		RI = 0;
		tmp = SBUF;
		if(tmp == 'W' || tmp == 'O' || tmp == 'L'){
			i = 0;
		}
		buffer[i] = tmp;
		i++;
		
		if(buffer[0] == 'W' && buffer[5] == 'G'){	//当显示WIFI GOR IP时表示网络已经接入,修改标志位
			AT_Connect_Net_Flag = 1;
			memset(buffer,'\0',SIZE);
		}
		
		if(buffer[0] == 'O' && buffer[1] == 'K'){
			AT_OK_Flag = 1;
			memset(buffer,'\0',SIZE);
		}
		
		if(buffer[0] == 'L' && buffer[2] == '1'){
			D5 = 0;
			memset(buffer,'\0',SIZE);
		}
		if(buffer[0] == 'L' && buffer[2] == '0'){
			D6 = 1;
			memset(buffer,'\0',SIZE);
		}
		if(i == 12) i=0;
		memset(buffer,'\0',SIZE);//出错了!!!!
	}
	if(TI);
}

在调试过程中,我用之前的白盒测试方法来进行检验,但是当我给单片机发送OK信号时,没有用,卡了很久,最后发现是,倒数第四行多写了一个memset。这段代码的含义是,每次写入一个字节后,会对每个写入的字符进行判断,如果是W、O、L开头,会强制将下标变为0,为了能够方便下面的判断,因为当我们连入wifi后,8266模块会返回WIFI GOT IP,第一个字符为W,第6个字符为G,因此我们可以判断buffer[0]是否为W,buffer[5]是否为G从而判断是否成功入网,如果满足条件,将入网标志位置一,同时清空buffer数组。但是上述代码会在我每次读取完一个字符后,将buffer清空,因此永远也无法达到效果。
修改完毕后,就可以达到我们需要的效果了:
在这里插入图片描述
检验完毕后,我们直接连接到单片机即可。

#include "reg52.h"
#include <intrins.h>
#include <string.h>

#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;
sbit D6 = P3^6;

char buffer[SIZE];

code char LJWL[]  = "AT+CWJAP=\"wifipig\",\"66668888\"\r\n";
code char LJFWQ[] = "AT+CIPSTART=\"TCP\",\"192.168.31.152\",8880\r\n";
char RESET[] = "AT+RST\r\n";
char TCMS[]  = "AT+CIPMODE=1\r\n";
char SJCS[]  = "AT+CIPSEND\r\n";

char AT_Connect_Net_Flag = 0;
char AT_OK_Flag = 0;

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void UartInit(void)		//9600bps@11.0592MHz
{
	SCON = 0x50;	//定义串口工作方式为方式1,8位UART
	//PCON初值为00x1 0000符合我们的要求,我们只需要SMOD=0不加倍即可
	AUXR = 0x01;
	TMOD &= 0x0F;
	TMOD |= 0x20;	//配置定时器1为8为自动重载定时器
	
	TL1 = 0xFD;
	TH1 = 0xFD;	//9600波特率初值
	
	TR1 = 1;	//打开中断
	
	EA = 1;	//开启总中断
	ES = 1;	//开启UART中断
}

void sendByte(char data_msg){
	SBUF = data_msg;
	//当8位数据没有传送结束时,卡在while循环中
	while(!TI);	//TI发送中断请求标志位,第8位数据传送结束时,硬件自动置1
	TI = 0;
}

void sendString(char* str){
	while(*str != '\0'){
		sendByte(*str++);
	}
}

void main()
{
	int mark = 0;
	D5 = D6 = 1;
	//配置C51串口的通信方式
	UartInit();
	Delay1000ms();	//给wifi模块上电时间
	
	sendString(LJWL);
	while(!AT_Connect_Net_Flag);
	while(!AT_OK_Flag);
	AT_OK_Flag = 0;
	
	sendString(LJFWQ);
	while(!AT_OK_Flag);
	AT_OK_Flag = 0;
	
	sendString(TCMS);
	while(!AT_OK_Flag);
	AT_OK_Flag = 0;
	
	sendString(SJCS);
	while(!AT_OK_Flag);
	
	if(AT_Connect_Net_Flag){
		D5 = 0;	//点亮第一盏灯说明入网成功
	}
	if(AT_OK_Flag){
		D6 = 0;	//点亮第二盏led说明网络连接成功并成功打开透传模式
	}
	
	while(1){
		Delay1000ms();
		sendString("hello world\r\n");
		
	}	
}

void Uart_Handler() interrupt 4
{
	static int i = 0;
	char tmp;
	if(RI){	//中断处理函数中,对于接收中断的响应
		RI = 0;
		tmp = SBUF;
		if(tmp == 'W' || tmp == 'O' || tmp == 'L' || tmp == "F"){
			i = 0;
		}
		buffer[i] = tmp;
		i++;
		
		if(buffer[0] == 'W' && buffer[5] == 'G'){	//当显示WIFI GOR IP时表示网络已经接入,修改标志位
			AT_Connect_Net_Flag = 1;
			memset(buffer,'\0',SIZE);
		}
		
		if(buffer[0] == 'O' && buffer[1] == 'K'){
			AT_OK_Flag = 1;
			memset(buffer,'\0',SIZE);
		}
		
		if(buffer[0] == 'F' && buffer[1] == 'A'){
			for(i=0;i<5;i++){
				D5 = 0;
				Delay1000ms();
				D5 = 1;
				Delay1000ms();
			}
			//sendString(RESET);
			memset(buffer, '\0', SIZE);
		}
		if(buffer[0] == 'L' && buffer[2] == '1'){
			D5 = 0;
			memset(buffer,'\0',SIZE);
		}
		if(buffer[0] == 'L' && buffer[2] == '0'){
			D5 = 1;
			memset(buffer,'\0',SIZE);
		}
		if(i == 12) i=0;
	}
	//if(TI);
}

当成功连入后,两盏灯都会点亮,可以用过L-1点亮D5,L-0熄灭D5。

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

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

相关文章

ROS机器人实用技术与常见问题解决

问题速查手册&#xff08;时实更新&#xff09;更加全面丰富的问题手册记录 1.机器人使用GPARTED挂载未分配空间 需要在图型界面下操作&#xff0c;建议使用no machine连接 安装gparted磁盘分区工具, sudo apt-get install gparted -y 启动软件 sudo gparted 点击磁盘/内存…

vivado Versal ACAP 可编程器件镜像 (PDI) 设置

Versal ACAP 可编程器件镜像 (PDI) 设置 下表所示 Versal ACAP 器件的器件配置设置可搭配 set_property <Setting> <Value> [current_design] Vivado 工具 Tcl 命令一起使用。 注释 &#xff1a; 在 Versal ACAP 架构上 &#xff0c; 原先支持将可编程器…

Misc 流量分析

流量分析简介 网络流量分析是指捕捉网络中流动的数据包&#xff0c;并通过查看包内部数据以及进行相关的协议、流量分析、统计等来发现网络运行过程中出现的问题。 在CTF比赛中&#xff0c;以及各种技能大赛对于流量包的分析取证是一种十分重要的题型。通常这类题目都是会提供…

干货分享-策划人都在用的活动策划网站

职场上&#xff0c;学会借力&#xff0c;学会‘抄’&#xff0c;比辛辛苦苦做老黄牛&#xff0c;更能事倍功半&#xff0c;不仅自己省事省力&#xff0c;还能获得更多升职加薪的机会。 那么&#xff0c;职场新人如何快速的写出一份领导满意的方案&#xff1f; 今天分享的‘抄…

基于Springboot的教学辅助系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的教学辅助系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

Linux —— 信号(3)

Linux —— 信号&#xff08;3&#xff09; Core dump为什么core默认是被关闭的阻塞信号信号其他相关常见概念信号递达信号未决信号阻塞两者的区别信号的结构 信号集操作函数一个简单使用例子sigpending的使用例子 我们今天接着来了解信号&#xff1a; Core dump 大家不知道有…

automa警惕通过点击元素打开新的标签页,因为你可能会被他蒙蔽!

大家好&#xff0c;我是大胡子&#xff0c;专注于研究RPA实战与解决方案。 我们经常用到automa里面的【点击元素】组件&#xff0c;但要警惕通过点击元素打开新的标签页&#xff0c;例如下面这个场景&#xff0c;点击公众号的图文消息&#xff0c;之后&#xff0c;要自动输入标…

爬虫学习(4)每日一笑

代码 import requests import re import osif __name__ "__main__":if not os.path.exists("./haha"):os.makedirs(./haha)url https://mlol.qt.qq.com/go/mlol_news/varcache_article?docid6321992422382570537&gameid3&zoneplat&webview…

免费https证书申请

HTTPS证书&#xff0c;也称为SSL证书&#xff08;Secure Sockets Layer&#xff09;或TLS证书&#xff08;Transport Layer Security&#xff09;&#xff0c;是一种数字证书&#xff0c;用于在互联网通信中确保数据传输的安全性、完整性和真实性。它是基于公钥基础设施&#x…

nginx--FastCGI

CGI 概念 nginx通过与第三方基于协议实现&#xff0c;即通过某种特定协议将客户端请求转发给第三方服务处理&#xff0c;第三方服务器会新建新的进程处理用户的请求&#xff0c;处理完成后返回数据给Nginx并回收进程(下次处理有需要新建)&#xff0c;最后nginx在返回给客户端…

2024.5.6 关于 SpringCloud 的基本认知

目录 引言 微服务框架所包含的技术栈 微服务架构演变 单体架构 分布式架构 微服务架构 微服务技术对比 认识 SpringCloud SpringBoot 版本兼容关系 服务拆分和远程调用 服务拆分注意事项 远程调用 引言 微服务是一种框架风格&#xff0c;按照业务板块来划分应用代码…

研发效能 | Jacoco dump基于k8s的实现

问题描述 总所周知&#xff0c;jacoco的dump操作如果是使用server模式只需要使用以下命令就能获取到 exec 文件。 java -jar jacococli.jar dump --address 192.169.110.1 --port 6300 --destfile ./jacoco-demo.exec 如果是非 k8s 的集群&#xff0c;也只需要遍历执行这条命…

高项第四版 十大管理及49个过程【背】作业分享

项目管理 1.十大管理【背】 包括&#xff08;口诀:范进整狗子&#xff08;沟质&#xff09; 才&#xff08;采&#xff09;干成疯子&#xff08;风资&#xff09;&#xff09;: &#xff08;1&#xff09;项目整合管理:识别、定义、组合、统一和协调各项目管理过程组的各个过…

记一些内存取证题

生活若循规蹈矩&#xff0c;我们便随心而动 1.Suspicion 给了俩文件 python2 vol.py -f mem.vmem imageinfo 查看可疑进程 python2 vol.py -f mem.vmem --profileWinXPSP2x86 pslist 发现可疑进程TrueCrypt.exe 把这个进程提取出来。memdump -p 进程号 -D 目录 python2 vol…

QT+网络调试助手+TCP服务器

一、UI界面设计 二、单线程 代码设计 1、 查找合法的本地地址&#xff0c;用于当作服务器的IP地址 #include <QThread> #include <QTcpSocket> #include <QNetworkInterface> #include <QMessageBox>QList<QHostAddress> ipAddressesList QNe…

华为机考入门python3--(23)牛客23- 删除字符串中出现次数最少的字符

分类&#xff1a;字符串 知识点&#xff1a; 访问字典中keychar的值&#xff0c;不存在则返回0 my_dict.get(char, 0) 字典的所有值 my_dict.value() 列表中的最小值 min(my_list) 题目来自【牛客】 import sysdef delete_min_freq_char(s):# 计算字母出现的频次…

Arduino控制继电器,制作智能浇水系统

所需硬件材料 Arduino模块、继电器、直流电机、3-6v电池&#xff08;这个是必须的&#xff0c;电机不能直接接在arduino的5v引脚上&#xff0c;会引起电压不足&#xff09;、杜邦线 实现效果&#xff1a; 电机转动一秒停一秒 将硬件连接如下&#xff1a; 将电机连接到继电…

(MATLAB)安装指南

参考链接&#xff1a;MATLAB2019a安装教程&#xff08;避坑版&#xff09;

应用层协议——HTTP协议

1. 认识HTTP协议 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;协议又叫做超文本传输协议&#xff0c;是一个简单的请求-响应协议&#xff0c;HTTP通常运行在TCP之上。 超文本的意思就是超越普通的文本&#xff0c;http允许传送文字&#xff0c;图片&#xff0c…

PostgreSQL连接拒绝如何解决和排查?

1. 服务器未运行 解决方案&#xff1a;确保 PostgreSQL 服务已启动。在 Linux 上&#xff0c;你可以使用如下命令来检查服务状态&#xff1a;sudo systemctl status postgresql如果服务未运行&#xff0c;使用以下命令启动它&#xff1a;sudo systemctl start postgresql2. Po…