WiFi模块服务器模式
- 1、单片机通过WiFi模块向移动设备进行通信
我们通过AT指令AT+CWMODE = x,可以配置WiFi模块的工作模式。
- AT+CWMODE=1为移动设备模式,这时WiFi模块可以连接其他路由器WiFi,然后可以给连接这个WiFi的其他移动设备发送数据,也可以接收数据。
条件:①要连接同一个WiFi;②要知道其他移动设备的ip地址和端口号(服务端);③移动设备要网络调试软件(TCP模式,且作为服务端),并且打开端口,这样WiFi模块(客户端)才能连接成功。 - AT+CWMODE=2为服务器模式,这时WiFi模块作为一个服务端,模块不用连接WiFi,移动设备(客户端)要连接上模块发出WiFi和知道模块的IP地址和端口号,才能相互通信。
条件:①移动设备要连接模块发出的WiFi,②移动设备要知道模块的ip地址和端口号。
总结:1、要知道服务端的IP地址和端口号
2、通过TCP协议传输的
1、单片机通过WiFi模块向移动设备进行通信
操作步骤:1、先给模块供电,然后让客服端连接WiFi。
2、单片机给模块发送AT指令进行配置(AT+RST–>AT+CWMODE=2–>AT+CIPMUX=1–>AT+CIPSERVER=1)
3、我们通过指令AT+CIFSR知道了模块的IP为192.168.4.1,默认端口为333
4、然后客户端配置本机的IP,输入模块的ip和端口,进行连接。连接成功,客户端就可以给模块发送数据了
5、要想模块给客户端发送数据,则需要指令AT+CIPSEND=0,x
6、模块接收的数据格栅为:
+IPD,0,4:open
+IPD,0,5:close
#include <REGX52.H>
#include "intrins.h"
#include <string.h>
/*
发送:AT+RST//重启
返回:ready
发送:AT+CIPMUX=1//使能多连接
返回:OK
发送:AT+CIPSERVER=1//配置为TCP
返回:OK
连接到模块ip返回:0,CONNECT
*/
sfr AUXR = 0X8E;
sbit LED1 = P3^7;
sbit LED2 = P3^6;
char buffer[3];//定义2个字节的字符串数组,用来接收WiFi模块响应后,返回的字符串。
char dma_fs[] = "abcd\r\n";
code char CQWF[] = "AT+RST\r\n"; //wifi模块重启
//code char PZMS[] = "AT+CWMODE=2\r\n"; //工作模式
code char DLJ[] = "AT+CIPMUX=1\r\n"; //使能多连接
char JLTCP[] = "AT+CIPSERVER=1\r\n"; //建立TCP,先at,后连接
char FSSJ[] = "AT+CIPSEND=0,4\r\n"; //开始发送
char Flag_OK = 0;
char Flag_TCP = 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 Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartInit(void) //波特率9600
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR = 0x01;
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES = 1;//开启串口中断
EA = 1;//开启中断总开关
}
void sendByte(char data_sj)
{
SBUF = data_sj;
while(!TI);
TI = 0;
}
void sendString(char *str)
{
while(*str != '\0')
{
sendByte(*str);
str++;
}
}
void main()
{
LED1 = LED2 = 1;
UartInit();
Delay300ms();
sendString(CQWF);
Delay1000ms();
// sendString(PZMS);
// Delay1000ms();
//1、配置多连接
sendString(DLJ);
while(!Flag_OK)//如果没有配置成功LED1会闪烁
{
LED1 = 0;
Delay1000ms();
LED1 = 1;
Delay1000ms();
}
Flag_OK = 0;
LED1 = 0; //使能多连接成功后,LED1亮
Delay300ms();
//2、配置为TCP
sendString(JLTCP);
while(!Flag_OK);
while(!Flag_TCP)//等待客户机连接到模块的IP,如果客户端没有连接到模块,则LED2会闪烁
{
LED2 = 1;
Delay1000ms();
LED2 = 0;
Delay1000ms();
}
Flag_TCP = 0;
LED2 = 1;
Delay1000ms();
LED2 = 0; //如果客户端连接到模块,则LED2会被点亮
while(1)
{
Delay300ms();
sendString(FSSJ);
Delay1000ms();
Delay1000ms();
sendString(dma_fs);
Delay1000ms();
Delay1000ms();
}
}
void UART_Handler() interrupt 4
{
char temp;
static int i = 0;
if(RI)
{
RI = 0;
temp = SBUF;
if(temp == '0'||temp == 'O'|| temp == 'o'|| temp == 'c')
{
i = 0;
}
buffer[i] = temp;
i++;
if(i == 3)
i = 0;
if(buffer[0] == '0' && buffer[2] == 'C')//接收到的字符串为0,CONNECT,把0,C抓出来
{
Flag_TCP = 1;
memset(buffer,'\0',3);
}
if(buffer[0] == 'O' && buffer[1] == 'K')//接收到的字符串为OK
{
Flag_OK = 1;
memset(buffer,'\0',3);
}
if(buffer[0] == 'o' && buffer[1] == 'p')//输出open
{
LED1 = 0;
memset(buffer,'\0',3);
}
if(buffer[0] == 'c' && buffer[1] == 'l')//输入close
{
LED1 = 1;
memset(buffer,'\0',3);
}
}
}