10:WiFi模块服务器模式

news2024/9/17 9:02:54

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);
			}	
		}
}

在这里插入图片描述

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

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

相关文章

JAVA静态代理和动态代理

前言&#xff1a; 静态代理: 静态代理是在编译时就已经确定了代理类的具体实现。代理类需要实现与目标类相同的接口,并且持有目标对象的引用。在代理类中实现对目标方法的增强或修改。静态代理的优点是实现简单,可以很好地控制目标对象的行为。缺点是每个目标对象都需要创建一…

从光速常数的可变性看宇宙大爆炸的本质

基于先前关于光速本质的讨论&#xff0c;让我们从函数图像看看宇宙大爆炸到底是什么。 先前已经讨论过&#xff0c;在量子尺度上&#xff0c;长度的实际对应物是频率的差异&#xff0c;因为只有频率差异才能在这个尺度上区分相邻时空的两点&#xff0c;而两点之间“差异的大小”…

再不怕数据丢失了!全量增量的迁移工具发布!

随着用户量的增加,我们收到了各种各样的需求反馈。 为了更好地拓展Chat2DB Pro 产品, 我们很高兴地宣布推出了插件市场功能, 同时重磅推出数据迁移工具DBMotion插件。 &#x1f680; 关于 DBMotion 插件 DBMotion插件&#xff0c;是一款基于沃趣科技的 DBMotion 数据迁移工具…

软件兼容性测试内容和步骤简析,湖南软件测评公司分享

软件兼容性测试是确保软件产品在不同的硬件环境、操作系统、浏览器和设备上正常运行的重要环节。随着科技的迅猛发展&#xff0c;各类软件应用层出不穷&#xff0c;用户对软件的多样性需求日益增加&#xff0c;软件的兼容性显得尤为重要。 软件兼容性测试内容包含多个方面&…

RocketMQ中的参数约束和建议

消息发送重试次数&#xff1a; 默认值&#xff1a;3次。&#xff08;取值范围&#xff1a;无限制&#xff09; 消息发送重试和流控机制 | RocketMQ 消息消费重试次数&#xff1a; 默认值&#xff1a;16次。

便携式挂椅美国认证标准ASTM F1235测试,CPC认证

亚马逊作为一家致力于保障消费者权益的电商平台&#xff0c;亚马逊对便携式挂椅这一儿童用品的安全性有着严格的要求。为了确保儿童在使用过程中的安全&#xff0c;要求所有便携式挂椅必须经过特定法规或标准的检测&#xff0c;并符合相应的要求。 便携式挂椅是一种无腿座椅&am…

Linux 安装 MySQL

Linux 安装 MySQL 1. 下载 官网&#xff1a;https://downloads.mysql.com/archives/community/ 选择自己对应版本下载即可 百度网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1LDGptcllwO4n5yeln4rgPA?pwdszi9 提取码&#xff1a;szi9 上面截图是8.4.0…

Python爬虫知识体系-----Selenium

数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新&#xff1a;https://blog.csdn.net/grd_java/article/details/140574349 文章目录 一、安装和基本使用二、元素定位三、访问元素信息四、自动化交互五、PhantomJS六、Chrome headless 一、安装和基本使用…

一刷代码随想录(贪心12)

贪心算法理论基础 刷题或者面试的时候&#xff0c;手动模拟一下感觉可以局部最优推出整体最优&#xff0c;而且想不到反例&#xff0c;那么就试一试贪心。 例如刚刚举的拿钞票的例子&#xff0c;就是模拟一下每次拿做大的&#xff0c;最后就能拿到最多的钱&#xff0c;这还要…

对称字符串

import java.util.Scanner; /*** author gyf* ClassName Test* Date 2024/7/31 13:39* Version V1.0* Description :*/ public class Test {public static void main(String[] args) {// StringBuilder 的场景// 1.字符串的拼接// 2.字符串的反转Scanner scanner new Scanner(…

Maven问题:IDEA无法创建javaweb和没有web Application支持的方案

解决方案一&#xff1a; 项目右键单击&#xff0c;点击add framework support 完成后就出现了web文件夹 解决方案二 右键单击后没有add framework support,先制作该功能的快捷键&#xff0c;添加快捷键之后按照解决方案1操作 注&#xff1a; 如果按照以上步骤均创建不成…

springboot业务层service开发全过程(以mybatis-plus为例)

在配置完数据层Dao/Mapper层的基础上&#xff0c;接下来我们要开始实现业务层的开发。 数据层和业务层的区别&#xff1a; 简单来说业务层是数据层的一个升级&#xff0c;从名字上也可以看出&#xff0c;数据层要想查询一个ID&#xff0c;都是需要定义SelectById这样的名称&a…

零门槛AI 绘图:教你为客户定制 ComfyUI Serverless API 应用

作者&#xff1a;鸥弋、筱姜 2023年下半年&#xff0c;ComfyUI 以其快速、流畅的图像生成能力&#xff0c;结合多样的自定义节点&#xff0c;迅速在创作者中流行起来。ComfyUI 的亮点就是能够批量化生成图像&#xff0c;一键加载大量工作流&#xff0c;让用户可以轻松实现人像…

代理仓业务好做吗?有没有什么系统可以打理的?

做海外仓代理相对自建海外仓而言&#xff0c;风险较小&#xff0c;更适合货代&#xff0c;但也需要面对一些难题&#xff1a;仓库管理、市场拓展、多仓协同、打通接口等。易境通DWMS系统就可以让海外仓代理变得简单明晰&#xff0c;让刚进入这个领域的小白也可以成功转型&#…

各类网页设计的设计尺寸大揭秘

我们讨论网页的大小时&#xff0c;我们需要明白这不仅仅是一个数字。在一个充满随时变化和创新的数字世界中&#xff0c;网页的建立和设计应考虑设备类型、屏幕大小和分辨率、用户浏览习惯等诸多因素。本文将深入分析这个主题&#xff0c;以帮助您充分理解这种情况&#xff0c;…

tensorRT 自带测试样例 sampleOnnxMNIST 源码分析

该测试样例是进行手写数字识别&#xff0c;使用 Visual Studio 2022 打开 tensorRT安装目录下的 samples 下的 sampleOnnxMNIST 工程( 例如我的是 D:\install\tensorRT\TensorRT-8.6.1.6\samples\sampleOnnxMNIST )&#xff0c;执行输出结果&#xff1a; 成功识别出数字0&#…

ai模特换装软件哪个好用?不知道怎么穿搭就用这几个

最近#紫色跑道的city穿搭#风靡全网&#xff0c;大家纷纷晒出自己的紫色风情。 可一想到衣橱里堆积如山的衣服和钱包的“瘦身计划”&#xff0c;是不是有点小纠结&#xff1f; 别怕&#xff0c;科技来救场&#xff01;那就是“一键换装在线工具”&#xff0c;让你无需剁手&…

【初阶数据结构】11.排序(2)

文章目录 2.3 交换排序2.3.1 冒泡排序2.3.2 快速排序2.3.2.1 hoare版本2.3.2.2 挖坑法2.3.2.3 lomuto前后指针2.3.2.4 非递归版本 2.4 归并排序2.5 测试代码&#xff1a;排序性能对比2.6 非比较排序2.6.1 计数排序 3.排序算法复杂度及稳定性分析 2.3 交换排序 交换排序基本思想…

2024最新 Navicat Premium 17 简体中文激活版详细安装教程(最简单的激活方式)

一、下载地址 下载链接&#xff1a;分享文件&#xff1a;Navicat Premium 17.0.8 (x64) 中文版.zip 二、安装步骤 1、解压后点击运行navicat170_premium_cs_x64.exe 2、开始安装 3、选择安装路径&#xff0c;最好不要放在系统盘C盘&#xff0c;后面两个步骤默认 4、安装中&a…

【小知识】黑白分明的计算机世界——关系表达式,逻辑表达式和三目运算符

【小知识】黑白分明的计算机世界——关系表达式&#xff0c;逻辑表达式和三目运算符 1.逻辑变量2.关系表达式和逻辑表达式2.1.关系表达式2.1.1.例题——a和b的关系2.1.2.浮点数精度误差 2.2.逻辑表达式2.2.1.常见的逻辑运算符2.2.2.优先级2.2.3.注意事项2.2.3.1.在写逻辑表达式…