STM32基于WiFi和蓝牙的内外网通信

4 篇文章 1 订阅
4 篇文章 0 订阅

目录

通信模块选择

WiFi模块

蓝牙模块

基本框架

1、内网通信(近距离通信)

2、外网通信(远程通信)

3、关于WiFi配网以及云平台验证问题

4、关于蓝牙名称问题

模块连接图示

重要驱动开发

STM32的ID获取

蓝牙修改名称

WIFI配网以及蓝牙通信协议解析

WiFi连接云平台

实验效果

蓝牙已经连接(WiFi请求配网)

APP发送WiFi名称和密码信息

WIFI连接云平台

云端查看设备信息

蓝牙APP查看设备信息

通信模块选择

WiFi模块

WIFI模块选择ESP8266S01(MQTT固件库),选择MQTT固件库既支持MQTT指令也支持TCP指令,对于维护和开发有便利之处,模块大致在10元左右,建议选择安可信官网购买

蓝牙模块

蓝牙模块选择HC-08,可以满足基本的开发需求

 

基本框架

1、内网通信(近距离通信)

STM32与蓝牙模块进行连接,在不用远程通信的情况下,直接使用蓝牙透传模式,手机蓝牙上位机进行接收数据,用户可以直接通过APP观测数据

2、外网通信(远程通信)

WiFi模块先连接路由器或WiFi热点进行联网,通过MQTT协议连接上云平台,按照云平台协议规则将数据发送至平台,平台应用层对数据进行展示(应用APP,可视化界面等等)

3、关于WiFi配网以及云平台验证问题

①对于WiFi来说,我们需要将WiFi名称与密码送入WiFi模块进行配网,直接使用STM32写死程序不利于后期的维护与批量生产,所以采用蓝牙配网的模式较为合适,蓝牙先与STM32连接进行消息透传,我们通过APP输入WiFi名称与密码,STM32对数据进行解析,获取有用的数据段,再将WiFi名称与密码发送给WIFI模块进行配网

②MQTT协议需要设备ID进行连接,WiFi模块获取唯一ID较为复杂,这里我们获取STM32的设备ID作为连接云平台所需ID,我们只需要在云平台批量添加STM32设备ID,STM32烧录程序后就直接获取ID,通过ID去连接云平台,在开发的时候我们就不用因为ID问题重复修改代码

4、关于蓝牙名称问题

实际开发中,每一套设备都会装一套蓝牙模块,由于蓝牙模块初始化名称都为HC-08,连接会出现误连情况,所以在初次使用时,我们需要设置一个唯一的蓝牙名称,这里采用STM32的ID作为蓝牙名称,保证名称的唯一性,并且符合一机一密的规则

模块连接图示

STM32串口1作为调试,串口2连接蓝牙模块,串口3连接WiFi模块,WiFi模块的EN引脚直接连接3.3V,STM32定义3个引脚连接WiFi模块的RST,蓝牙模块的KEY引脚和STA引脚

 

重要驱动开发

STM32的ID获取

int Get_ChipID(void)
{
  
  chipid.id[0] = *(__I uint32_t *)(0X1FFFF7F0 + 0x00);
  chipid.id[1] = *(__I uint32_t *)(0X1FFFF7F0 + 0x04);
  chipid.id[2] = *(__I uint32_t *)(0X1FFFF7F0 + 0x08);
  
  sprintf((char *)(chipid.ID_buff),"%08X%08X",chipid.id[1],chipid.id[2]);  
	
	if((char *)chipid.ID_buff == NULL)
	{
		return 0;
	}
	
	return 1;
}

蓝牙修改名称

void HC08_AT_Init(void)
{
  if(HC08_SetRole(HC08_SLAVE_ROLE) == HC08_ACK_OK)
	{
		printf("AT+ROLE OK\n");
		delay_ms(500);
	}	
	
	if(HC08_SetNAME((char *)chipid.ID_buff) == HC08_ACK_OK )
	{
	   printf("AT+NAME OK\n");
		 delay_ms(500);
	}
}

WIFI配网以及蓝牙通信协议解析

void HC08_RecvProcess(void)
{
		char *local;
		hc08_recv_complete = 0;
		hc08_recv_len = hc08_rx_index;
		hc08_rx_index = 0;
		
		//´òÓ¡ÐÅÏ¢
		printf((const char *)hc08_recv_buff);
		printf("\n");
		if((local = strstr((char *)hc08_recv_buff,"ID")) != NULL )
		{
		  if(local[2] == '1')
			{
			   strncpy(ID,local+4,((int)local[3] - 48));
				 printf("WIFI ID is %s\n",ID);
				 flag1 = 1;
			}
			if(local[2] == '2')
			{
				strncpy(ID,local+5,((int)local[3]-48)*10+((int)local[4]-48));
				printf("WIFI ID is %s\n",ID);
				flag1 = 1;
			}
			
		}
		
		if((local = strstr((char *)hc08_recv_buff,"PS")) != NULL )
		{
		  if(local[2] == '1')
			{
			   strncpy(PASSWORD,local+4,((int)local[3] - 48));
				 printf("WIFI Password is %s\n",PASSWORD);
				 flag2 = 1;
			}
			if(local[2] == '2')
			{
				strncpy(PASSWORD,local+5,((int)local[3]-48)*10+((int)local[4]-48));
				printf("WIFI Password %s\n",PASSWORD);
				flag2 = 1;
			}
			
		}
		
		printf("\r\n");
		HC08_RecvBuff_Clear();
	
}

WiFi连接云平台

while(1)
    {	
		  if(esp_connect_ok != ESP_STA_CONNECTED)  
		  {
			  ESP_Client_ConnectServer(0,(u8 *)"",(u8 *)"",(u8 *)ID,(u8 *)PASSWORD); 
				
			  connect_ok = MQTT_IDLE;
		  }
		  else
		  {
			  if(connect_ok == MQTT_IDLE)  
			 {
				
				HF_Mqtt_Connect();
				connect_ok = MQTT_WAIT;
			 }
		  }
			
     MQTT_RecvProcess();
		 
  
		if(urc_update == 1)
		{
			urc_update = 0;
			MQTT_PUB_Init();
			if(connect_ok == MQTT_RUN)  
			{
			  Mqtt_Publish(mqtt_send.topic,2,0,(uint8_t *)mqtt_send.data,strlen(mqtt_send.data));
		    printf("MQTT is PUBing\n");
			}
		}
			
		 
		 if(ping_start == 1)
		 {
			 ping_start = 0;
			if(connect_ok == MQTT_RUN)  
			{
       Mqtt_Ping();     
			 printf("MQTT-PING\n");
			}
		 }
			
		}

实验效果

蓝牙已经连接(WiFi请求配网)

 

APP发送WiFi名称和密码信息

 

 

WIFI连接云平台

 

云端查看设备信息

 

蓝牙APP查看设备信息

 

 

  • 11
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于STM32的双蓝牙通信是指使用STM32微控制器来建立两个蓝牙设备之间的通信连接。在这种通信方式中,STM32作为主控设备,通过蓝牙模块与其他从设备进行通信。通常情况下,双蓝牙通信可以分为蓝牙主机和蓝牙从机两种角色。 在使用STM32进行双蓝牙通信时,首先需要将蓝牙模块连接到STM32的UART或SPI接口上,通过配置串口通信参数和初始化蓝牙模块,使其能够与其他蓝牙设备进行配对和通信。 对于主设备来说,通常需要编写STM32的固件来实现与从设备之间的数据交换。主设备通过发送特定的指令或数据包给从设备,并接收从设备返回的数据。通过解析和处理接收到的数据,主设备可以完成各种功能,如发送命令、控制从设备的状态、获取传感器数据等。 对于从设备来说,通常需要编写对应的固件来实现与主设备的数据交换。从设备通过监听主设备发送的指令或数据包,并根据指令来执行相应的操作。同时,从设备也可以根据需要发送数据给主设备,实现双向通信。从设备还可以根据具体需求,通过蓝牙模块将数据发送给其他设备或接收其他设备的数据。 双蓝牙通信物联网、智能家居、智能设备等领域有着广泛的应用。通过使用STM32搭建双蓝牙通信系统,可以方便地实现各种无线数据传输和控制功能。同时,STM32具有丰富的外设资源和强大的处理能力,可以满足不同应用场景下的需求。 ### 回答2: 基于STM32的双蓝牙通信是指利用STM32微控制器进行蓝牙通信,并支持同时与两台蓝牙设备进行数据交互的通信方式。STM32是一款强大的嵌入式微控制器,具备高性能、低功耗的特点,适合用于蓝牙通信应用。 首先,我们需要选择一款搭载蓝牙模块的STM32微控制器,例如ST公司的BlueNRG系列产品。BlueNRG系列芯片集成了低功耗蓝牙通信和ARM Cortex-M0内核,具备高效的数据处理能力和低功耗的特点。 其次,我们需要编写适合双蓝牙通信的程序,该程序包括初始化蓝牙模块、建立蓝牙连接、数据收发等功能。在初始化蓝牙模块时,我们需要配置蓝牙模块的基本参数,例如蓝牙名称、设备地址等。在建立蓝牙连接时,我们需要实现蓝牙通信协议的配对与认证过程,确保通信安全可靠。在数据收发时,我们可以利用蓝牙的无线传输功能,实现双蓝牙设备之间的数据传递。 在程序编写完成后,我们可以通过编译、烧录程序至STM32微控制器,然后将双蓝牙设备与STM32进行连接。连接成功后,两台蓝牙设备便可以进行数据的互传了。 总结起来,基于STM32的双蓝牙通信是一种利用STM32微控制器进行数据传输的通信方式。通过选择适合的芯片和编写相应的程序,我们可以实现两台蓝牙设备之间的双向通信。这种通信方式可以应用于各种领域,例如物联网、智能家居等,具备广阔的应用前景。 ### 回答3: 基于STM32的双蓝牙通信是指通过STM32微控制器实现同时与两个蓝牙设备进行通信的技术。蓝牙通信是一种无线通信技术,通过短距离无线传输方式实现设备间的数据传输和通信STM32作为一种强大的微控制器,可以用来控制和管理蓝牙模块,从而实现双蓝牙通信。 在实现双蓝牙通信的过程中,首先需要选用合适的STM32微控制器和蓝牙模块,并将其连接在一起。然后,通过STM32上的GPIO引脚连接蓝牙模块的串口(UART)接口,从而建立起STM32蓝牙模块的通信通道。 在软件方面,需要编写适当的程序来控制STM32与两个蓝牙设备之间的数据传输。这通常包括以下几个主要步骤: 1. 初始化STM32的串口模块,使其能够与蓝牙模块进行通信。 2. 配置蓝牙模块的工作模式,如主从模式或广播模式。 3. 建立与两个蓝牙设备之间的连接,并分别为它们分配唯一的蓝牙地址。 4. 实现数据的收发功能,可以通过UART的发送接收中断来实现数据的异步传输。 5. 实现数据的处理和解析,根据通信协议进行数据的解码和编码。 6. 处理通信中的错误和异常情况,如信号弱或断开连接的处理。 通过以上步骤,可以使得STM32能够同时与两个蓝牙设备进行稳定的双向数据传输和通信。这样的双蓝牙通信系统可以应用于许多领域,如智能家居、智能医疗、工业控制等,实现设备之间的远程控制和数据传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值