STC89C51基础及项目第9天:esp路由模式、4g模块、内网穿透

1. ESP工作为AP路由模式并当成服务器(226.72)

ESP-01s当服务器

USB转TTL插入电脑:

  • TX–RX
  • RX-TX
  • VCC-3.3V
  • GDN-GND
//0 重启
AT+RST
Response :
	WIFI CONNECTED
	WIFI GOT IP
//1 配置成双模
AT+CWMODE=3//包含station(设备)模式和AP(路由)模式
Response :OK
//1.5 查询IP地址
AT+CIFSR
+CIFSR:APIP,"192.168.4.1"//esp的ip地址
+CIFSR:APMAC,"4a:3f:da:6a:a5:4b"
+CIFSR:STAIP,"192.168.2.38"
+CIFSR:STAMAC,"48:3f:da:6a:a5:4b"
OK 
  • 1.6 电脑连接上esp的WIFI
    STC89C51基础及项目第9天:esp路由模式、4g模块、内网穿透_第1张图片
//2 使能多链接
AT+CIPMUX=1
Response :OK
WIFI CONNECTED//若是单模AP模式(AT+CWMODE=2)
WIFI GOT IP	  //则没有这两行
  • 2.5 设置 TCP Client 使能连接主机
  • ipconfig:查询电脑连接espWIFI的ip地址
    STC89C51基础及项目第9天:esp路由模式、4g模块、内网穿透_第2张图片
//3 建立TCPServer
AT+CIPSERVER=1 // default port = 333//默认端口号333
Response :OK
0,CONNECT	   //当客户端连接到esp服务器时,返回此行
//4 发送数据
AT+CIPSEND=0,4 //在通道0上发送4个字节//只有普通传输模式 (AT+CIPMODE=0),才能设置为多连接,即多连接下不能透传
>abcd //输入数据,不带新行
Response :SEND OK
//• 接收数据
+IPD, 0, n: xxxxxxxxxx //+IPD是固定字符串 0是通道,n是数据长度,xxx是数据
//断开连接
AT+CIPCLOSE=0//和在TCP Client断开一样
Response :0, CLOSED OK
  • 0:连接的通道号,一个ip地址一个通道
    STC89C51基础及项目第9天:esp路由模式、4g模块、内网穿透_第3张图片

2. 上官一号当路由和服务器模式控制(227.73)

  • 先用白盒测试,代码是否有误
  • 再做黑盒测试,即单片机和esp双向链接
  • 测试是否能在中断函数中,做连接服务器时灯亮,断开服务器时灯灭;结果:失败,无反应
    STC89C51基础及项目第9天:esp路由模式、4g模块、内网穿透_第4张图片
  • 代码(15./wifi模块04_esp工作在路由服务器模式)
#include "reg52.h"
#include "intrins.h"//<.h>会首先在标准库路径下查找头文件,
#include 										//而".h"会首先在当前工作目录或指定的包含路径下查找。

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

char buffer[SIZE];

//1 配置成路由模式
char APmode[]    = "AT+CWMODE=2\r\n";
//2 使能多链接
char multiConn[] = "AT+CIPMUX=1\r\n";
//3 建立TCPServer
char setupSer [] = "AT+CIPSERVER=1\r\n"; // default port = 333
//4 发送数据
char sendData [] = "AT+CIPSEND=0,6\r\n";

//char AT_ConnIn_flag = 0;		//WIFI GOT IP返回值的标志位
char AT_OK_flag		    = 0;		//OK返回值的标志位
char Client_Conn_Flag =0; //客户端连接上esp服务器的标志位

void UartInit() 
{
	AUXR =  0x01;//降低单片机时钟对外界的电磁辐射(EMD
	
	SCON =  0x50;//选择串口工作方式1,REN使能接收//PCON默认的复位就是0,所以可以不用写
	
	TMOD &= 0x0F;//高八位清0,第八位不变
	TMOD |= 0x20;//高八位变为0010,第八位不变//定时器1工作在8位自动重装载
	
	TH1   = 0xFD;
	TL1   = 0xFD;//9600波特率根据公式 算出的定时器1的初始值
	
	TR1   = 1;//定时器1开始工作
	
	EA    = 1;//开启总中断
	ES		= 1;//开启串口中断
}

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 sendByte(char data_msg)
{
	SBUF=data_msg;   //移位寄存器会耗时
	while(!TI);      //等待串口发送完成
	TI=0;
}
void sendString(char* str)//直接指向字符串的内存地址
{
	while(*str != '\0'){//字符串的结尾是\0
		sendByte(*str);
		str++;
	}
}

void main()
{
	D5=1;
	D6=1;
	
	//配置C51串口的通信方式
	UartInit();
	Delay1000ms();		  //给espwifi模块上电时间
	
	sendString(APmode);
	while(!AT_OK_flag);
	AT_OK_flag=0;
	
	sendString(multiConn);
	while(!AT_OK_flag);
	
	sendString(setupSer);
	while(!Client_Conn_Flag);

	if(AT_OK_flag){
		D5=0;			//点亮D5,代表成功开启多连接模式
	}
	if(Client_Conn_Flag){
		D6=0;  	  //点亮D6,代表有客户端接入  
	}
	
	while(1){				
		//4 发送数据
		sendString(sendData);
		Delay1000ms();
		Delay1000ms();
		sendString("Hello!");
		Delay1000ms();
		Delay1000ms();
	}
}

void UartHepler() interrupt 4//中断有点像多任务线程
{
	static int i = 0;
	char tmp;
	
	if(RI){				 //中断处理函数中,对于接收中断的响应
		RI=0;        //须软件复位,清除接收中断标志位
		tmp=SBUF; 	 //读数据给tmp
		if(tmp=='O'||tmp=='0'||tmp==':'){
			i=0;
		}
		buffer[i++]=tmp;
		//连接服务器等OK返回值指令的判断
		if(buffer[0]=='O' && buffer[1]=='K'){
			AT_OK_flag=1;
			memset(buffer,'\0',SIZE);
		}
		if(buffer[0]=='0' && buffer[2]=='C'){
			Client_Conn_Flag=1;
			memset(buffer,'\0',SIZE);
		}
		//灯控指令
		if(buffer[0]==':' && buffer[1]=='o'&& buffer[2]=='p'){
			D6=0;
			memset(buffer,'\0',SIZE);
		}
		if(buffer[0]==':' && buffer[1]=='c'&& buffer[2]=='l'){
			D6=1;
			memset(buffer,'\0',SIZE);
		}
		if(i==12)i=0;
	}
}

3. 4G模块初识(228.74)

4. 4G模块A指令操作(229.75)

  • USB-ttl 至 4g 模块 接线正确的表现:(5V-VCC)(中号SIM卡槽)
    • 上电 5s 后左右,黄灯亮表卡插上,绿灯亮表连上,红灯常亮
  • 注意:线不要接反、松动,SIM不要插反,否则可能会烧掉
    STC89C51基础及项目第9天:esp路由模式、4g模块、内网穿透_第5张图片
  • 打开安信可串口调试助手
    • 波特率调至115200,其他默认(串口的出厂默认波特率是115200)
    • 打开串口
  • 进入AT指令模式:(默认是工作模式(透传模式),非AT模式)
    • 发送+++(不勾选新行)
    • 在此 3s 内发送如下或其他任意AT指令
    • AT+CPIN,返回+OK=1,表示检测到 SIM 卡已接入
    • AT+CSQ,返回+OK=99,表示当前信号强度(上电 5s 后左右才有)(99表示信号强度异常)
    • AT+ICCID,返回+OK=89860118802217996809,表示获得SIM卡信息:查询 SIM 卡ICCID 号(集成电路卡识别码)
  • 接好天线
  • 查询串口当前波特率
    • AT+UART,返回+OK=115200,NONE,表示当前波特率为115200、无校验位
  • 更改串口波特率
    • AT+UART=9600,NONE,返回+OK,表示成功修改
  • 重启模块
    • AT+REBT
  • 关闭串口、波特率调至9600、打开串口
  • 即可以 9600 波特率再次进入AT指令模式…
  • 注意:
    • 查状态的指令,可实时生效,即不用重启模块
    • 修改一些配置的指令(如对串口的配置(波特率))不可实时生效,须重启模块后才可生效,特别是对服务器的访问
  • 多看手册,包括指令介绍、指令错误码等

在测试之前,将电源、天线、SIM 卡、串口线等硬件连接好。

  1. 打开串口连接4G模块,串口出厂默认波特率是115200,可自行根据用户手册修改
  2. 进入AT指令模式,在串口助手内发送+++(不要勾选发送新行),必须在发送+++指令 3s 内发送其他任意 AT 指令,比如AT+CPIN
  3. 观察SIM卡灯是否亮起,AT+ICCID获得SIM卡信息,确认SIM卡安装完好 返回数据:
    +OK=89860118802217996809
    检查信号是否正常,通过AT+CSQ指令检查信号值,建议插入信号天线,返回数据:+OK=31
  4. AT+SOCK=TCPC,103.46.128.21,52541 连接socket服务器,103.46.128.21是公网IP地址,通过花生壳获得,26532是端口号,参数之间逗号隔开
  5. AT+LINKSTA查看连接状态,如果第四步没有问题,此时串口返回+OK=Connect

5. 内网穿透建立一个外网可访问的服务器(230.76)

  • 常用通信模式
    STC89C51基础及项目第9天:esp路由模式、4g模块、内网穿透_第6张图片

将4g公网通信到局域网内

  1. 下载花生壳app
  • https://hsk.oray.com/download/?utm_source=360&utm_medium=cpc&utm_campaign=hsk_download&referral_id=44600&wordid=pc03010010202203160001102&adp=%7Badposition%7D&qhclickid=906a1f2c56dc03b5
    STC89C51基础及项目第9天:esp路由模式、4g模块、内网穿透_第7张图片
  1. 建立服务器,并打开
    STC89C51基础及项目第9天:esp路由模式、4g模块、内网穿透_第8张图片
  2. 打开花生壳app,自定义映射、新增映射
    STC89C51基础及项目第9天:esp路由模式、4g模块、内网穿透_第9张图片
  3. 自定义如下设置
    STC89C51基础及项目第9天:esp路由模式、4g模块、内网穿透_第10张图片
  4. 连接成功
    STC89C51基础及项目第9天:esp路由模式、4g模块、内网穿透_第11张图片
  5. 建立用于测试的客户端,并连接;可与服务器双向发送
    STC89C51基础及项目第9天:esp路由模式、4g模块、内网穿透_第12张图片

6. 配置4G模块连接服务器并进行数据交互(231.77)

  1. 装好4g,打开串口,设置后从默认工作模式进入AT指令模式
    STC89C51基础及项目第9天:esp路由模式、4g模块、内网穿透_第13张图片

  2. 配置心跳包
    1) 查询心跳包数据

    • AT+HEARTINFO,返回+OK=Smart-H,表示当前的心跳包数据

    2)设置心跳包数据

    • AT+HEARTINFO=(1,)JessieNO.1,返回+OK,表示设置成功(1 心跳类型为 ASCII 码,40 字节之内的 ASCII 码的心跳包数据)(最好不加“1,”0 心跳包类型为 HEX,合法的 HEX 格式且长度须是偶数)

    3)再次查询心跳包数据

    • AT+HEARTINFO,返回+OK=1,JessieNO.1,表示设置已生效为新的心跳包数据

    4)查询心跳包时间

    • AT+HEARTM,返回+OK=60,表示时间为60s

    5)设置心跳包时间

    • AT+HEARTM=3,返回+OK,表示设置成功(范围 1~65535 秒)

    6)再次查询心跳包时间

    • AT+HEARTM,返回+OK=3,表示设置已生效为新的心跳包时间
  3. 连接socket服务器

    • AT+SOCK=TCPC,115.236.153.177,33821,返回+OK,表示设置成功
  4. 重启

    • AT+REBT,返回+OK
  5. 便可看到服务器在接收心跳包
    STC89C51基础及项目第9天:esp路由模式、4g模块、内网穿透_第14张图片

  6. 也可发送数据给4g

    • 须退出 AT 指令模式回到默认的透传模式:AT+EXAT
      STC89C51基础及项目第9天:esp路由模式、4g模块、内网穿透_第15张图片

7. 上官一号通过4g模块控制LED(232.78)

  • 代码(16. 4g控制led)
#include "reg52.h"
#include "intrins.h"//<.h>会首先在标准库路径下查找头文件,
#include 										//而".h"会首先在当前工作目录或指定的包含路径下查找。

#define SIZE 12
sfr AUXR = 0x8E;
sbit D5  = P3^7;
char cmd[SIZE];

void UartInit() 
{
	AUXR =  0x01;//降低单片机时钟对外界的电磁辐射(EMD
	
	SCON =  0x50;//选择串口工作方式1,REN使能接收//PCON默认的复位就是0,所以可以不用写
	
	TMOD &= 0x0F;//高八位清0,第八位不变
	TMOD |= 0x20;//高八位变为0010,第八位不变//定时器1工作在8位自动重装载
	
	TH1   = 0xFD;
	TL1   = 0xFD;//9600波特率根据公式 算出的定时器1的初始值
	
	TR1   = 1;//定时器1开始工作
	
	EA    = 1;//开启总中断
	ES		= 1;//开启串口中断
}

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 sendByte(char data_msg)
{
	SBUF=data_msg;   //移位寄存器会耗时
	//Delay10ms();   //不准确的延时
	//while(TI == 0);//智能延时
	while(!TI);      //等待串口发送完成
	TI=0;			 //发送中断请求标志位,发送结束时硬件自动置1,后须软件复位0
}
void sendString(char* str)//直接指向字符串的内存地址
{
	while(*str != '\0'){//字符串的结尾是\0
		sendByte(*str);
		str++;
	}
}

void main()
{
	D5=1;
	
	//配置C51串口的通信方式
	UartInit();
	while(1)
	{								//像心跳包
		Delay1000ms();
		//往发送缓冲区写入数据,即完成数据的发送
		//sendString("Hello,Jessie!\r\n");//串口中\r\n换行
	}
}

void UartHepler() interrupt 4//中断有点像多任务线程
{
	static int i=0;  //静态变量,只被初始化一次
	char tmp;
	
	if(RI){				   //中断处理函数中,对于接收中断的响应
		RI=0;    		   //须软件复位,清除接收中断标志位
		tmp=SBUF;
		if(tmp==':'){
			i=0;
		}
		cmd[i++]=tmp;
		
		if(cmd[0]==':' && cmd[1]=='o' && cmd[2]=='p'){
			D5=0;
			memset(cmd,'\0',SIZE);
		}
		if(cmd[0]==':' && cmd[1]=='c' && cmd[2]=='l'){
			D5=1;
			memset(cmd,'\0',SIZE);
		}
		if(i==12)i=0;
	}
}

你可能感兴趣的:(mongodb,数据库)