基于STM32F1单片机、ESP8266WIFI模块、DHT11温湿度传感的WIFI网络温湿度传输系统

基于STM32F1单片机、ESP8266WIFI模块、DHT11温湿度传感的WIFI网络温湿度传输系统

基于STM32F1单片机、ESP8266WIFI模块、DHT11温湿度传感的WIFI网络温湿度传输系统完整工程

功能说明

基于嵌入式的温湿度网络传输系统包含:温湿度采集端与温湿度监控端。
温湿度采集端可实时采集温度与湿度数据,通过WIFI透传技术,将温湿度数据传送到温度监控端。温度监控端实时接收温湿度采集端所发送的温湿度数据,显示在网站上。
注:目前只是在局域网下测试。

温湿度采集端

  1. 嵌入式STM32微控制器实时读取DHT11温湿度传感器采集的温湿度数据。
  2. 嵌入式STM32微控制器通过ESP8266WIFI模块连接WIFI。
  3. 通过TCP协议连接到电脑服务器,将温湿度数据传输到服务器。

温湿度监控端

  1. 通过建立Serversocket监听指定端口,获得温湿度采集端的温湿度数据。
  2. 将获取的数据通过WebSocket建立与客户端web页面的实时连接,将数据传送到web页面
  3. web页面可实时显示温湿度数据、查询温湿度数据、将数值图形化用动态柱形图的形式展现。

在这里插入图片描述

硬件材料

温湿度采集端STM32F1单片机、DHT11温湿度传感器、ESP8266WIFI模块

硬件连接

ESP8266与STM32F103连接图:
在这里插入图片描述
DHT11与STM32F103连接图:
在这里插入图片描述

温湿度监控端普通电脑需要JAVA环境

主要代码

温湿度采集端

/************************************************************************************/
@file    main.c
@function   初始化各模块
*************************************************************************************/
#include "stm32f10x.h"
#include "bsp_usart1.h"
#include "bsp_SysTick.h"
#include "bsp_esp8266.h"
#include "test.h"
#include "bsp_dht11.h"

int main ( void )
{
  USARTx_Config ();
SysTick_Init (); 
ESP8266_Init ();
DHT11_Init (); 
  ESP8266_StaTcpClient_UnvarnishTest ();
  while ( 1 );
}
/****************************END OF FILE***************************/

/************************************************************************************/
@file    stm32f10x_conf.h
@function   调用库包含
*************************************************************************************/
#ifndef __STM32F10x_CONF_H
#define __STM32F10x_CONF_H
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_usart.h"
#include "misc.h" 
#ifdef  USE_FULL_ASSERT
#else
#define assert_param(expr) ((void)0)
#endif
#endif
/****************************END OF FILE***************************/




/************************************************************************************/
@file    stm32f10x_it.h
@function   中断头文件
*************************************************************************************/
#ifndef __STM32F10x_IT_H
#define __STM32F10x_IT_H
#ifdef __cplusplus
 extern "C" {
#endif 

void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
#ifdef __cplusplus
}
#endif
#endif
/****************************END OF FILE***************************/

/************************************************************************************/
@file    stm32f10x_it.c
@function   中断服务程序
*************************************************************************************/
#include "stm32f10x_it.h"
#include <stdio.h>
#include <string.h> 
#include "bsp_SysTick.h"
#include "bsp_esp8266.h"
#include "test.h"

void macESP8266_USART_INT_FUN ( void )
{	
	uint8_t ucCh;
	if ( USART_GetITStatus ( macESP8266_USARTx, USART_IT_RXNE ) != RESET )
	{
		ucCh  = USART_ReceiveData( macESP8266_USARTx );
		if(strEsp8266_Fram_Record.InfBit.FramLength<(RX_BUF_MAX_LEN-1)) 
strEsp8266_Fram_Record.Data_RX_BUF[strEsp8266_Fram_Record .InfBit .FramLength++]= ucCh;
	}
	if ( USART_GetITStatus( macESP8266_USARTx, USART_IT_IDLE ) == SET )
	{
    strEsp8266_Fram_Record .InfBit .FramFinishFlag = 1;
		ucCh = USART_ReceiveData( macESP8266_USARTx );
 "CLOSED\r\n" )
  }	
}
/****************************END OF FILE***************************/

/************************************************************************************/
@file    bsp_usart1.h
@function   USART头文件
*************************************************************************************/
#ifndef __USART1_H
#define	__USART1_H
#include "stm32f10x.h"
#include <stdio.h>
****/
#define             macUSART_BAUD_RATE                       115200
#define             macUSARTx                                USART1
#define             macUSART_APBxClock_FUN       RCC_APB2PeriphClockCmd
#define             macUSART_CLK                RCC_APB2Periph_USART1
#define             macUSART_GPIO_APBxClock_FUN  RCC_APB2PeriphClockCmd
#define             macUSART_GPIO_CLK          RCC_APB2Periph_GPIOA     
#define             macUSART_TX_PORT                         GPIOA   
#define             macUSART_TX_PIN             GPIO_Pin_9
#define             macUSART_RX_PORT                         GPIOA 
#define             macUSART_RX_PIN                GPIO_Pin_10
#define             macUSART_IRQ                   USART1_IRQn
#define             macUSART_INT_FUN              USART1_IRQHandler

void                USARTx_Config                           ( void );
#endif 
/****************************END OF FILE***************************/

/************************************************************************************/
@file    bsp_usart1.c
@function   USART配置
*************************************************************************************/
#include "bsp_usart1.h"

void USARTx_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	macUSART_APBxClock_FUN(macUSART_CLK, ENABLE);
	macUSART_GPIO_APBxClock_FUN(macUSART_GPIO_CLK, ENABLE);
	GPIO_InitStructure.GPIO_Pin =  macUSART_TX_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(macUSART_TX_PORT, &GPIO_InitStructure);    
	GPIO_InitStructure.GPIO_Pin = macUSART_RX_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(macUSART_RX_PORT, &GPIO_InitStructure);	
	USART_InitStructure.USART_BaudRate = macUSART_BAUD_RATE;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No ;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_Init(macUSARTx, &USART_InitStructure);
	USART_Cmd(macUSARTx, ENABLE);
	
}

int fputc(int ch, FILE *f)
{
		USART_SendData(macUSARTx, (uint8_t) ch);
		while (USART_GetFlagStatus(macUSARTx, USART_FLAG_TXE) == RESET);
		return (ch);
}

int fgetc(FILE *f)
{
		while(USART_GetFlagStatus(macUSARTx,USART_FLAG_RXNE)==RESET);
		return (int)USART_ReceiveData(macUSARTx);
}
/**********************************END OF FILE*********************/
/************************************************************************************/
@file    bsp_SysTick.h
@function   软件定时头文件
*************************************************************************************/
#ifndef __SYSTICK_H
#define __SYSTICK_H
#include "stm32f10x.h"

#define Delay_ms(x) Delay_us(1000*x)	 

void SysTick_Init( void );
void TimingDelay_Decrement( void );
void Delay_us ( __IO u32 nTime );

#endif
/**********************************END OF FILE*********************/

/************************************************************************************/
@file    bsp_SysTick.c
@function   软件定时
*************************************************************************************/
#include "bsp_SysTick.h"
static __IO u32 TimingDelay = 0;

void SysTick_Init( void )
{
	if ( SysTick_Config(SystemCoreClock / 1000000) )	
	{ 
		 
		while (1);
	} 
	SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}

void Delay_us( __IO u32 nTime )
{ 
	TimingDelay = nTime;	 
	SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;
	while( TimingDelay != 0 );
}

void TimingDelay_Decrement(void)
{
	if ( TimingDelay != 0x00 )
	{ 
		TimingDelay --;
	}
}

/**********************************END OF FILE*******************/

/************************************************************************************/
@file    bsp_esp8266.h
@function   WIFI模块头文件
*************************************************************************************/
#ifndef  __BSP_ESP8266_H
#define	 __BSP_ESP8266_H
#include "stm32f10x.h"
#include "common.h"
#include <stdio.h>
#include <stdbool.h>

#if defined ( __CC_ARM   )
#pragma anon_unions
#endif

typedef enum{
	STA,
  AP,
  STA_AP  
} ENUM_Net_ModeTypeDef;

typedef enum{
	 enumTCP,
	 enumUDP,
} ENUM_NetPro_TypeDef;

typedef enum{
	Multiple_ID_0 = 0,
	Multiple_ID_1 = 1,
	Multiple_ID_2 = 2,
	Multiple_ID_3 = 3,
	Multiple_ID_4 = 4,
	Single_ID_0 = 5,
} ENUM_ID_NO_TypeDef;

typedef enum{
	OPEN = 0,
	WEP = 1,
	WPA_PSK = 2,
	WPA2_PSK = 3,
	WPA_WPA2_PSK = 4,
} ENUM_AP_PsdMode_TypeDef;

#define RX_BUF_MAX_LEN     1024                                

extern struct  STRUCT_USARTx_Fram                                  
{
	char  Data_RX_BUF [ RX_BUF_MAX_LEN ];
  union {
    __IO u16 InfAll;
    struct {
		  __IO u16 FramLength       :15;       
		  __IO u16 FramFinishFlag   :1;         
	  } InfBit;
  }; 
	
} strEsp8266_Fram_Record;

#define      macESP8266_CH_PD_APBxClock_FUN                   RCC_APB2PeriphClockCmd
#define      macESP8266_CH_PD_CLK                             RCC_APB2Periph_GPIOB  
#define      macESP8266_CH_PD_PORT                            GPIOB
#define      macESP8266_CH_PD_PIN                             GPIO_Pin_8

#define      macESP8266_RST_APBxClock_FUN                     RCC_APB2PeriphClockCmd
#define      macESP8266_RST_CLK                               RCC_APB2Periph_GPIOB
#define      macESP8266_RST_PORT                              GPIOB
#define      macESP8266_RST_PIN                               GPIO_Pin_9

#define      macESP8266_USART_BAUD_RATE                       115200

#define      macESP8266_USARTx                                USART3
#define      macESP8266_USART_APBxClock_FUN                   RCC_APB1PeriphClockCmd
#define      macESP8266_USART_CLK                             RCC_APB1Periph_USART3
#define      macESP8266_USART_GPIO_APBxClock_FUN              RCC_APB2PeriphClockCmd
#define      macESP8266_USART_GPIO_CLK                        RCC_APB2Periph_GPIOB     
#define      macESP8266_USART_TX_PORT                         GPIOB   
#define      macESP8266_USART_TX_PIN                          GPIO_Pin_10
#define      macESP8266_USART_RX_PORT                         GPIOB
#define      macESP8266_USART_RX_PIN                          GPIO_Pin_11
#define      macESP8266_USART_IRQ                             USART3_IRQn
#define      macESP8266_USART_INT_FUN                         USART3_IRQHandler

#define     macESP8266_Usart( fmt, ... )           USART_printf ( macESP8266_USARTx, fmt, ##__VA_ARGS__ ) 
#define     macPC_Usart( fmt, ... )                printf ( fmt, ##__VA_ARGS__ )
//#define     macPC_Usart( fmt, ... )                

#define     macESP8266_CH_ENABLE()                 GPIO_SetBits ( macESP8266_CH_PD_PORT, macESP8266_CH_PD_PIN )
#define     macESP8266_CH_DISABLE()                GPIO_ResetBits ( macESP8266_CH_PD_PORT, macESP8266_CH_PD_PIN )

#define     macESP8266_RST_HIGH_LEVEL()            GPIO_SetBits ( macESP8266_RST_PORT, macESP8266_RST_PIN )
#define     macESP8266_RST_LOW_LEVEL()             GPIO_ResetBits ( macESP8266_RST_PORT, macESP8266_RST_PIN )

void                     ESP8266_Init                        ( void );
void                     ESP8266_Rst                         ( void );
bool                     ESP8266_Cmd                         ( char * cmd, char * reply1, char * reply2, u32 waittime );
void                     ESP8266_AT_Test                     ( void );
bool                     ESP8266_Net_Mode_Choose             ( ENUM_Net_ModeTypeDef enumMode );
bool                     ESP8266_JoinAP                      ( char * pSSID, char * pPassWord );
bool                     ESP8266_BuildAP                     ( char * pSSID, char * pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode );
bool                     ESP8266_Enable_MultipleId           ( FunctionalState enumEnUnvarnishTx );
bool                     ESP8266_Link_Server                 ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id);
bool                     ESP8266_StartOrShutServer           ( FunctionalState enumMode, char * pPortNum, char * pTimeOver );
uint8_t                  ESP8266_Get_LinkStatus              ( void );
uint8_t                  ESP8266_Get_IdLinkStatus            ( void );
uint8_t                  ESP8266_Inquire_ApIp                ( char * pApIp, uint8_t ucArrayLength );
bool                     ESP8266_UnvarnishSend               ( void );
void                     ESP8266_ExitUnvarnishSend           ( void );
bool                     ESP8266_SendString                  ( FunctionalState enumEnUnvarnishTx, char * pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId );
char *                   ESP8266_ReceiveString               ( FunctionalState enumEnUnvarnishTx );

#endif

/**********************************END OF FILE*******************/

/************************************************************************************/
@file    bsp_esp8266.c
@function   WIFI模块功能文件
*************************************************************************************/
#include "bsp_esp8266.h"
#include "common.h"
#include <stdio.h>  
#include <string.h>  
#include <stdbool.h>
#include "bsp_SysTick.h"

static void             ESP8266_GPIO_Config                 ( void );
static void             ESP8266_USART_Config                ( void );
static void             ESP8266_USART_NVIC_Configuration    ( void );

struct  STRUCT_USARTx_Fram strEsp8266_Fram_Record = { 0 };

void ESP8266_Init ( void )
{
	ESP8266_GPIO_Config (); 
	ESP8266_USART_Config (); 
	macESP8266_RST_HIGH_LEVEL();
	macESP8266_CH_DISABLE();
}

static void ESP8266_GPIO_Config ( void )
{
	GPIO_InitTypeDef GPIO_InitStructure;
	macESP8266_CH_PD_APBxClock_FUN ( macESP8266_CH_PD_CLK, ENABLE ); 
	GPIO_InitStructure.GPIO_Pin = macESP8266_CH_PD_PIN;	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_Init ( macESP8266_CH_PD_PORT, & GPIO_InitStructure );	 
	macESP8266_RST_APBxClock_FUN ( macESP8266_RST_CLK, ENABLE ); 	 
	GPIO_InitStructure.GPIO_Pin = macESP8266_RST_PIN;
	GPIO_Init ( macESP8266_RST_PORT, & GPIO_InitStructure );	 
}

static void ESP8266_USART_Config ( void )
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
	macESP8266_USART_APBxClock_FUN ( macESP8266_USART_CLK, ENABLE );
	macESP8266_USART_GPIO_APBxClock_FUN ( macESP8266_USART_GPIO_CLK, ENABLE );
	
	GPIO_InitStructure.GPIO_Pin =  macESP8266_USART_TX_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(macESP8266_USART_TX_PORT, &GPIO_InitStructure);  
  
	GPIO_InitStructure.GPIO_Pin = macESP8266_USART_RX_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(macESP8266_USART_RX_PORT, &GPIO_InitStructure);
	
	USART_InitStructure.USART_BaudRate = macESP8266_USART_BAUD_RATE;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No ;
	USART_InitStructure.USART_HardwareFlowControl
USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_Init(macESP8266_USARTx, &USART_InitStructure);
	USART_ITConfig ( macESP8266_USARTx, USART_IT_RXNE, ENABLE ); 
	USART_ITConfig ( macESP8266_USARTx, USART_IT_IDLE, ENABLE ); 

	ESP8266_USART_NVIC_Configuration ();
	USART_Cmd(macESP8266_USARTx, ENABLE);
}

static void ESP8266_USART_NVIC_Configuration ( void )
{
	NVIC_InitTypeDef NVIC_InitStructure;  
	NVIC_PriorityGroupConfig ( macNVIC_PriorityGroup_x );
	NVIC_InitStructure.NVIC_IRQChannel = macESP8266_USART_IRQ;	 
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

void ESP8266_Rst ( void )
{
	#if 0
	 ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 );   	
	#else
	 macESP8266_RST_LOW_LEVEL();
	 Delay_ms ( 500 ); 
	 macESP8266_RST_HIGH_LEVEL();
	#endif
}

bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime )
{    
	strEsp8266_Fram_Record .InfBit .FramLength = 0;               
	macESP8266_Usart ( "%s\r\n", cmd );
	if ( ( reply1 == 0 ) && ( reply2 == 0 ) )        
		return true;
	Delay_ms ( waittime );               
	strEsp8266_Fram_Record.Data_RX_BUF[strEsp8266_Fram_Record.InfBit .FramLength ]='\0';
	macPC_Usart ( "%s", strEsp8266_Fram_Record .Data_RX_BUF );
	if ( ( reply1 != 0 ) && ( reply2 != 0 ) )
return((bool)strstr strEsp8266_Fram_Record .Data_RX_BUF,reply1)||
						 (bool)strstr ( trEsp8266_Fram_Record .Data_RX_BUF, reply2 )); 
	else if ( reply1 != 0 )
		return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) );
	else
		return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );
	
}

void ESP8266_AT_Test ( void )
{
	char count=0;
	
	macESP8266_RST_HIGH_LEVEL();	
	Delay_ms ( 1000 );
	while ( count < 10 )
	{
		if( ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ) return;
		ESP8266_Rst();
		++ count;
	}
}

bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode )
{
	switch ( enumMode )
	{
		case STA:
			return ESP8266_Cmd ( "AT+CWMODE=1", "OK", "no change", 2500 ); 
		
	  case AP:
		  return ESP8266_Cmd ( "AT+CWMODE=2", "OK", "no change", 2500 ); 
		
		case STA_AP:
		  return ESP8266_Cmd ( "AT+CWMODE=3", "OK", "no change", 2500 ); 
		
	  default:
		  return false;
  }
	
}

bool ESP8266_JoinAP ( char * pSSID, char * pPassWord )
{
	char cCmd [120];

	sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord );
	
	return ESP8266_Cmd ( cCmd, "OK", NULL, 5000 );
	
}

bool ESP8266_BuildAP ( char * pSSID, char * pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode )
{
	char cCmd [120];

	sprintf ( cCmd, "AT+CWSAP=\"%s\",\"%s\",1,%d", pSSID, pPassWord, enunPsdMode );
	
	return ESP8266_Cmd ( cCmd, "OK", 0, 1000 );
	
}
bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx )
{
	char cStr [20];
	
	sprintf ( cStr, "AT+CIPMUX=%d", ( enumEnUnvarnishTx ? 1 : 0 ) );
	
	return ESP8266_Cmd ( cStr, "OK", 0, 500 );
	
}

bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id)
{
	char cStr [100] = { 0 }, cCmd [120];

  switch (  enumE )
  {
		case enumTCP:
		  sprintf ( cStr, "\"%s\",\"%s\",%s", "TCP", ip, ComNum );
		  break;
		case enumUDP:
		  sprintf ( cStr, "\"%s\",\"%s\",%s", "UDP", ip, ComNum );
		  break;
		default:
			break;
  }

  if ( id < 5 )
    sprintf ( cCmd, "AT+CIPSTART=%d,%s", id, cStr);
  else
	  sprintf ( cCmd, "AT+CIPSTART=%s", cStr );
	return ESP8266_Cmd ( cCmd, "OK", "ALREAY CONNECT", 4000 );
}

bool ESP8266_StartOrShutServer ( FunctionalState enumMode, char * pPortNum, char * pTimeOver )
{
	char cCmd1 [120], cCmd2 [120];
	if ( enumMode )
	{
		sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 1, pPortNum );
		sprintf ( cCmd2, "AT+CIPSTO=%s", pTimeOver );
		return ( ESP8266_Cmd ( cCmd1, "OK", 0, 500 ) &&
						 ESP8266_Cmd ( cCmd2, "OK", 0, 500 ) );
	}
	else
	{
		sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 0, pPortNum )
	return ESP8266_Cmd ( cCmd1, "OK", 0, 500 );
	}
uint8_t ESP8266_Get_LinkStatus ( void )
{
	if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) )
	{
		if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:2\r\n" ) )
			return 2;
		
		else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:3\r\n" ) )
			return 3;
		
		else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:4\r\n" ) )
			return 4;		

	}
	
	return 0;
	
}
uint8_t ESP8266_Get_IdLinkStatus ( void )
{
	uint8_t ucIdLinkStatus = 0x00;
	
	
	if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) )
	{
		if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:0," ) )
			ucIdLinkStatus |= 0x01;
		else 
			ucIdLinkStatus &= ~ 0x01;
		
		if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:1," ) )
			ucIdLinkStatus |= 0x02;
		else 
			ucIdLinkStatus &= ~ 0x02;
		
		if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:2," ) )
			ucIdLinkStatus |= 0x04;
		else 
			ucIdLinkStatus &= ~ 0x04;
		
		if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:3," ) )
			ucIdLinkStatus |= 0x08;
		else 
			ucIdLinkStatus &= ~ 0x08;
		
		if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:4," ) )
			ucIdLinkStatus |= 0x10;
		else 
			ucIdLinkStatus &= ~ 0x10;	

	}
	
	return ucIdLinkStatus;
	
}


uint8_t ESP8266_Inquire_ApIp ( char * pApIp, uint8_t ucArrayLength )
{
	char uc;
	
	char * pCh;
	
	
  ESP8266_Cmd ( "AT+CIFSR", "OK", 0, 500 );
	
	pCh = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "APIP,\"" );
	
	if ( pCh )
		pCh += 6;
	
	else
		return 0;
	
	for ( uc = 0; uc < ucArrayLength; uc ++ )
	{
		pApIp [ uc ] = * ( pCh + uc);
		
		if ( pApIp [ uc ] == '\"' )
		{
			pApIp [ uc ] = '\0';
			break;
		}
		
	}
	
	return 1;
	
}
bool ESP8266_UnvarnishSend ( void )
{
	if ( ! ESP8266_Cmd ( "AT+CIPMODE=1", "OK", 0, 500 ) )
		return false;
	
	return 
	  ESP8266_Cmd ( "AT+CIPSEND", "OK", ">", 500 );
	
}

void ESP8266_ExitUnvarnishSend ( void )
{
	Delay_ms ( 1000 );
	macESP8266_Usart ( "+++" );
	Delay_ms ( 500 ); 
}
bool ESP8266_SendString ( FunctionalState enumEnUnvarnishTx, char * pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId )
{
	char cStr [20];
	bool bRet = false;	
	if ( enumEnUnvarnishTx )
	{
		macESP8266_Usart ( "%s", pStr );
		bRet = true;
	}

	else
	{
		if ( ucId < 5 )
			sprintf ( cStr, "AT+CIPSEND=%d,%d", ucId, ulStrLength + 2 );

		else
			sprintf ( cStr, "AT+CIPSEND=%d", ulStrLength + 2 );
		ESP8266_Cmd ( cStr, "> ", 0, 1000 );
		bRet = ESP8266_Cmd ( pStr, "SEND OK", 0, 1000 );
  }
	
	return bRet;

}
char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx )
{
	char * pRecStr = 0;
	
	
	strEsp8266_Fram_Record .InfBit .FramLength = 0;
	strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0;
	
	while ( ! strEsp8266_Fram_Record .InfBit .FramFinishFlag );
	strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0';
	
	if ( enumEnUnvarnishTx )
		pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;
	
	else 
	{
		if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) )
			pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;
	}
	return pRecStr;	
}

/*******************************************************************/
@file    common.h
@function   通用功能头文件
********************************************************************/
#ifndef __COMMON_H
#define __COMMON_H
#include "stm32f10x.h"
#define   macNVIC_PriorityGroup_x     NVIC_PriorityGroup_2
void  USART_printf    ( USART_TypeDef * USARTx, char * Data, ... );
#endif
/*******************************END OF FILE************************/

/********************************************************************
@file    common.c
@function   通用功能
********************************************************************/
#include "common.h"
#include "stm32f10x.h"
#include <stdarg.h>
static char * itoa       ( int value, char * string, int radix );
void USART_printf ( USART_TypeDef * USARTx, char * Data, ... )
{
	const char *s;
	int d;   
	char buf[16];
	va_list ap;
	va_start(ap, Data);
	while ( * Data != 0 )    
	{				                          
		if ( * Data == 0x5c )  
		{									  
			switch ( *++Data )
			{
				case 'r':							
				USART_SendData(USARTx, 0x0d);
				Data ++;
				break;
				case 'n':							       
				USART_SendData(USARTx, 0x0a);	
				Data ++;
				break;
				default:
				Data ++;
				break;
			}			 
		}
		else if ( * Data == '%')
		{									
			switch ( *++Data )
			{				
				case 's':										
				s = va_arg(ap, const char *);
				for ( ; *s; s++) 
				{
					USART_SendData(USARTx,*s);
					while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
				}
				Data++;
				break;
				case 'd':			
				d = va_arg(ap, int);
				itoa(d, buf, 10);
				for (s = buf; *s; s++) 
				{
					USART_SendData(USARTx,*s);
					while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
				}
				Data++;
				break;
				default:
				Data++;
				break;
			}		 
		}
		else USART_SendData(USARTx, *Data++);
		while ( USART_GetFlagStatus ( USARTx, USART_FLAG_TXE ) == RESET );
	}
}
static char * itoa( int value, char *string, int radix )
{
	int     i, d;
	int     flag = 0;
	char    *ptr = string;
	/* This implementation only works for decimal numbers. */
	if (radix != 10)
	{
		*ptr = 0;
		return string;
	}
	if (!value)
	{
		*ptr++ = 0x30;
		*ptr = 0;
		return string;
	}
	/* if this is a negative value insert the minus sign. */
	if (value < 0)
	{
		*ptr++ = '-';
		/* Make the value positive. */
		value *= -1;
	}
	for (i = 10000; i > 0; i /= 10)
	{
		d = value / i;
		if (d || flag)
		{
			*ptr++ = (char)(d + 0x30);
			value -= (d * i);
			flag = 1;
		}
	}
	/* Null terminate the string. */
	*ptr = 0;
	return string;
}
/**********************************END OF FILE*********************/




/*******************************************************************/
@file    bsp_dht11.h
@function   温湿度度采集模块头文件
********************************************************************/
#ifndef __DHT11_H
#define	__DHT11_H
#include "stm32f10x.h"

typedef struct
{
	uint8_t  humi_int;		
	uint8_t  humi_deci;	 	
	uint8_t  temp_int;	 	
	uint8_t  temp_deci;	 	
	uint8_t  check_sum;	 	
		                 
} DHT11_Data_TypeDef;

#define    macDHT11_Dout_SCK_APBxClock_FUN     RCC_APB2PeriphClockCmd
#define    macDHT11_Dout_GPIO_CLK       RCC_APB2Periph_GPIOE
#define      macDHT11_Dout_GPIO_PORT                      GPIOE
#define      macDHT11_Dout_GPIO_PIN                       GPIO_Pin_6
#define      macDHT11_Dout_0	                            GPIO_ResetBits ( macDHT11_Dout_GPIO_PORT, macDHT11_Dout_GPIO_PIN ) 
#define      macDHT11_Dout_1	                            GPIO_SetBits ( macDHT11_Dout_GPIO_PORT, macDHT11_Dout_GPIO_PIN ) 
#define      macDHT11_Dout_IN()	                          GPIO_ReadInputDataBit ( macDHT11_Dout_GPIO_PORT, macDHT11_Dout_GPIO_PIN ) 
void                     DHT11_Init                      ( void );
uint8_t DHT11_Read_TempAndHumidity( DHT11_Data_TypeDef * DHT11_Data );

#endif
/**********************************END OF FILE*********************/


/*******************************************************************/
@file    bsp_dht11.c
@function   温湿度度采集模块功能文件
********************************************************************/

#include "bsp_dht11.h"
#include "bsp_SysTick.h"
static void                           DHT11_GPIO_Config                       ( void );
static void                           DHT11_Mode_IPU                          ( void );
static void                           DHT11_Mode_Out_PP                       ( void );
static uint8_t        DHT11_ReadByte           ( void );
void DHT11_Init ( void )
{
	DHT11_GPIO_Config ();
	
	macDHT11_Dout_1;             
}
static void DHT11_GPIO_Config ( void )
{		
	GPIO_InitTypeDef GPIO_InitStructure;
  macDHT11_Dout_SCK_APBxClock_FUN ( macDHT11_Dout_GPIO_CLK, ENABLE ); 
  	GPIO_InitStructure.GPIO_Pin = macDHT11_Dout_GPIO_PIN;	
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  	GPIO_Init ( macDHT11_Dout_GPIO_PORT, &GPIO_InitStructure );	
}
static void DHT11_Mode_IPU(void)
{
 	  GPIO_InitTypeDef GPIO_InitStructure;
	  GPIO_InitStructure.GPIO_Pin = macDHT11_Dout_GPIO_PIN;
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; 
	  GPIO_Init(macDHT11_Dout_GPIO_PORT, &GPIO_InitStructure);	 
	
}
static void DHT11_Mode_Out_PP(void)
{
 	GPIO_InitTypeDef GPIO_InitStructure;
  	GPIO_InitStructure.GPIO_Pin = macDHT11_Dout_GPIO_PIN;	
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_Init(macDHT11_Dout_GPIO_PORT, &GPIO_InitStructure);	 	 
}
static uint8_t DHT11_ReadByte ( void )
{
	uint8_t i, temp=0;
	for(i=0;i<8;i++)    
	{	 
		while(macDHT11_Dout_IN()==Bit_RESET);
		Delay_us(40);
		if(macDHT11_Dout_IN()==Bit_SET)
		{
			while(macDHT11_Dout_IN()==Bit_SET);

			temp|=(uint8_t)(0x01<<(7-i)); 
		}
		{			   
			temp&=(uint8_t)~(0x01<<(7-i)); 
		}
	}
	return temp;
}
uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
{  
	DHT11_Mode_Out_PP();
	macDHT11_Dout_0;
	/*延时18ms*/
	Delay_ms(18);

	/*总线拉高 主机延时30us*/
	macDHT11_Dout_1; 
	Delay_us(30);  
	DHT11_Mode_IPU();
	if(macDHT11_Dout_IN()==Bit_RESET)     
	{  
		while(macDHT11_Dout_IN()==Bit_RESET);
		while(macDHT11_Dout_IN()==Bit_SET);
		DHT11_Data->humi_int= DHT11_ReadByte();
		DHT11_Data->humi_deci= DHT11_ReadByte();
		DHT11_Data->temp_int= DHT11_ReadByte();
		DHT11_Data->temp_deci= DHT11_ReadByte();
		DHT11_Data->check_sum= DHT11_ReadByte();
		DHT11_Mode_Out_PP();
		macDHT11_Dout_1;
		if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)
			return SUCCESS;
		else 
			return ERROR;
	}
	else
		return ERROR;
}
/*****************************END OF FILE***************************/

/*******************************************************************/
@file    test.h
@function   TCP连接配置功能文件
********************************************************************/
#ifndef  __TEST_H
#define	 __TEST_H
#include "stm32f10x.h
#define  macUser_ESP8266_ApSsid "test"         //要连接的热点的名称
#define macUser_ESP8266_ApPwd "xuhao123456"   //要连接的热点的密钥
#define macUser_ESP8266_TcpServer_IP   "192.168.1.100"      
//要连接的服务器的 IP
#define macUser_ESP8266_TcpServer_Port  "8888"               
//要连接的服务器的端口extern volatile uint8_t ucTcpClosedFlag;

void   ESP8266_StaTcpClient_UnvarnishTest  ( void );
#endif
/**********************************END OF FILE*********************/

/*******************************************************************/
@file    test.c
@function   TCP连接发送
********************************************************************/
#include "test.h"
#include "bsp_esp8266.h"
#include "bsp_SysTick.h"
#include <stdio.h>  
#include <string.h>  
#include <stdbool.h>
#include "bsp_dht11.h"

volatile uint8_t ucTcpClosedFlag = 0;

void ESP8266_StaTcpClient_UnvarnishTest ( void )
{
	uint8_t ucStatus;
	char cStr [ 100 ] = { 0 };
	DHT11_Data_TypeDef DHT11_Data;
  printf ( "\r\n正在配置 ESP8266 ......\r\n" );
	macESP8266_CH_ENABLE();
	ESP8266_AT_Test ();
	ESP8266_Net_Mode_Choose ( STA );
  while ( ! ESP8266_JoinAP ( macUser_ESP8266_ApSsid, macUser_ESP8266_ApPwd ) );	
	ESP8266_Enable_MultipleId ( DISABLE );
	while ( !	ESP8266_Link_Server ( enumTCP, macUser_ESP8266_TcpServer_IP, macUser_ESP8266_TcpServer_Port, Single_ID_0 ) );
	while ( ! ESP8266_UnvarnishSend () );
	printf ( "\r\n配置 ESP8266 完毕\r\n" );
	while ( 1 )
	{		
		if ( DHT11_Read_TempAndHumidity ( & DHT11_Data ) == SUCCESS )  
			sprintf ( cStr, "Hy%d.%d%%RH Te%d.%dC\r\n", 
								DHT11_Data .humi_int, DHT11_Data .humi_deci, DHT11_Data .temp_int, DHT11_Data.temp_deci );
		ESP8266_SendString ( ENABLE, cStr, 0, Single_ID_0 );  
		Delay_ms ( 1000 );
		if ( ucTcpClosedFlag )       
		{
			ESP8266_ExitUnvarnishSend ();     
			do ucStatus = ESP8266_Get_LinkStatus ();        
			while ( ! ucStatus );
			if ( ucStatus == 4 )        
			{
				printf ( "\r\n正在重连热点和服务器 ......\r\n" );
				while ( ! ESP8266_JoinAP ( macUser_ESP8266_ApSsid, macUser_ESP8266_ApPwd ) );
				while ( !	ESP8266_Link_Server ( enumTCP, macUser_ESP8266_TcpServer_IP, macUser_ESP8266_TcpServer_Port, Single_ID_0 ) );
				printf ( "\r\n重连热点和服务器成功\r\n" );
			}
			while ( ! ESP8266_UnvarnishSend () );		
		}
	}	
}
/**********************************END OF FILE*********************/

温湿度监控端

/****************************************************************************
@file    index.html-
@function    通过WebSocket获取到的数据的页面显示
*****************************************************************************/
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Data Monitoring</title>
    <link rel="stylesheet" href="css/style.css">
    <script type="text/javascript">

        var data = [];
        var count = 0;
        var humidity = 0;
        var temperature = 0;
        var time = 0;
        window.onload = function () {
            var websocket = null;
            if ('WebSocket' in window) {
                websocket = new WebSocket("ws://localhost:8080/index");//向要显示数据的网页发送websocket连接请求
            } else {
                alert('当前浏览器不支持Websocket')
            }
            websocket.onerror = function () {
                alert(window.location.href);
            };
            websocket.onopen = function () {
                //alert("Websocket建立成功");
            }
            websocket.onmessage = function (event) {
                setMessageInnerHTML(event.data);
            }

            websocket.onclose = function () {
                //alert("Websocket连接关闭")
            }

            window.onbeforeunload = function () {
                closeWebSocket();
            }

            function getTime() {
                var dateObj = new Date();
                var year = dateObj.getFullYear();
                var month = dateObj.getMonth()+1;
                var day = dateObj.getDate();
                var hour = dateObj.getHours();
                var min = dateObj.getMinutes();
                return year + "-" + month + "-" + day + "-" + hour + "-" + min;
            }


            function setMessageInnerHTML(innerHTML) {
                var json = {};
                json.time = getTime();
                json.message = innerHTML;
                data[count++] = json;
                //document.getElementById('text').innerHTML += JSON.stringify(data[count]) + '<br/>';
                var str = JSON.stringify(json.message);
                time = JSON.stringify(json.time);
                humidity = parseFloat(JSON.stringify(json.message).substring(str.indexOf("y") + 1, str.indexOf("R")-1));
                temperature = parseFloat(JSON.stringify(json.message).substring(str.indexOf("e") + 1, str.indexOf("C")));
                document.getElementById('text').innerHTML += "时间:"+ time + "\t湿度:" + humidity.toString() + '%RH\t温度:'+ temperature.toString() + '℃\n';
                var chart = new CanvasJS.Chart("chartContainer", {
                    title: {
                        text: "温度湿度动态显示图"
                    },
                    data: [{
                        type: "column",
                        yValueFormatString: "#,###.#",
                        indexLabel: "{y}",
                        dataPoints: [
                            {label: "boiler1", y: humidity},
                            {label: "boiler2", y: temperature},
                        ]
                    }]
                });

                function updateChart() {
                    var boilerColor, yVal;
                    var dps = chart.options.data[0].dataPoints;
                    for (var i = 0; i < dps.length; i++) {
                        yVal = dps[i].y;
                        boilerColor1 = yVal > 120 ? "#FF2500" : yVal >= 91 ? "#FF6000" : yVal >= 20 ? "#6B8E23 " : null;
                        boilerColor2 = yVal > 37 ? "#FF2500" : yVal >= 27 ? "#FF6000" : yVal >= 0 ? "#6B8E23 " : null;
                        if (i === 0) {
                            dps[i] = {label: "湿度 %RH", y: yVal, color: boilerColor1};
                        } else if (i === 1) {
                            dps[i] = {label: "温度 ℃", y: yVal, color: boilerColor2};
                        }
                    }
                    chart.options.data[0].dataPoints = dps;
                    chart.render();
                };
                updateChart();
            }

        }

        function search() {
            var count = 1;
            var str = '"'+ document.getElementById('val').value + '"';
            for (var i = 0 ;i<data.length;i++){
                if (JSON.stringify(data[i].time) == str){
                    if (count == 1){
                        document.getElementById('text').innerHTML = "";
                        document.getElementById('text').innerHTML = "搜索结果如下:\n";
                        count = 0;
                    }
                    var temp = JSON.stringify(data[i].message);
                    var H = temp.substring(temp.indexOf('y')+1,temp.indexOf('R')-1);
                    var T = temp.substring(temp.indexOf('e')+1,temp.indexOf('C'));
                    document.getElementById('text').innerHTML += str + ": 湿度为"+H+"%RH  温度为"+T+"℃\n";
                }
            }
        }

        function closeWebSocket() {
            websocket.close();
        }

    </script>
    <script src="js/canvasjs.min.js"></script>
</head>
<body>

<div id="message">
    <div id="chartContainer" style="height: 370px; max-width: 850px; margin: 0px auto;"></div>
    <div class="parent">
        <input id="val" type="text" value="">
        <input id="search" type="button" value="按时间搜索" onclick="search()">
    </div>
    <textarea id="text" readonly></textarea>
</div>
</body>
</html>
/******************************END OF FILE************************************/

/****************************************************************************
@file    style.css -
@function    前端页面样式*****************************************************************************/
*{
    padding: 0;
    margin: 0;
    box-sizing: border-box;
}

body{
    background-repeat: no-repeat;
    background-attachment: fixed;
    overflow: hidden;
    bottom: 0px;
    background-color: #c6ecd9;
}


.parent {
    width: 100%;
    height: 42px;
    top: 4px;
    position: relative;
}

#val{
    width: 750px;
    height: 40px;
    margin-left: 530px;
    border: 1px solid #ccc;
    font-size: 16px;
    outline: none;
    border-radius: 1.2rem;
}

#search {
    /*button按钮border并不占据外围大小,设置高度42px*/
    width: 100px;
    height: 40px;
    position: absolute;
    background: #317ef3;
    border: 1px solid #317ef3;
    color: #fff;
    font-size: 16px;
    outline: none;
    border-radius: 1.2rem;
}

#message{
    width: auto;
    height: auto;
}

#text{
    width: 850px;
    height: 500px;
    margin-left: 530px;
    padding: 0;
    font-size: 18px;
    border-radius: 1.1rem;
    /*cursor: pointer;*/
    resize: none;
    outline: none;

}
/******************************END OF FILE************************************/

/****************************************************************************
@file   WebSocketServer.java -
@function    集成ServerSocket以及WebSocket 通过ServerSocket监听获取的数据以WebSocket传送到页面显示
*****************************************************************************/
package com.example.tcpwebsocket;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/index")
@Component
public class WebSocketServer extends Thread {
    //与某个客户端的连接会话,需要通过它来给客户端发送数据
    Session session;
    /**
     * 连接建立成功调用的方法
     *
     * @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
     */
    @OnOpen
    public void onOpen(Session session) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.print("输入待监听的端口:");
        int port = scanner.nextInt();
        WebSocketServer server = new WebSocketServer(port, session);
        server.start();
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message) throws IOException {
        System.out.println("来自客户端的消息:" + message);

    }
    /**
     * 发生错误时调用
     *
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("发生错误");
    }
    /**
     * @param message
     * @throws IOException
     */
    //给客户端传递消息
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }

    ServerSocket server = null;
    Socket socket = null;
    public WebSocketServer() {
    }
    public WebSocketServer(int port, Session session) {
        try {
            this.session = session;
            server = new ServerSocket(port);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        super.run();
        try {
            while (true) {
                socket = server.accept();
                if (socket != null) {
                    InputStream in = socket.getInputStream();
                    int len = 0;
                    byte[] buf = new byte[1024];
                    while ((len = in.read(buf)) != -1) {
                        sendMessage(new String(buf, 0, len));
                    }

                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
/******************************END OF FILE************************************/

/****************************************************************************
@file   HelloController.java
@function    SpringBoot主程序web首页设定*****************************************************************************/
package com.example.tcpwebsocket.controller;

import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class HelloController implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("forward:/index.html");
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    }
}
/******************************END OF FILE************************************/

/****************************************************************************
@file   WebSocketConfig.java
@function    WebSocket的配置部分*****************************************************************************/
package com.example.tcpwebsocket.Config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
public class WebSocketConfig {

    /**
     * ServerEndpointExporter 作用
     *
     * 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint
     *
     * @return
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}
/******************************END OF FILE************************************/

测试

在这里插入图片描述
在这里插入图片描述

  • 24
    点赞
  • 211
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
以下是基于Arduino IDE的ESP8266模块读取DHT11温湿度并上传至阿里云的示例代码,其中包含了一些必要的库和变量设置,请根据自己的实际需求进行修改: ``` #include <ESP8266WiFi.h> #include <PubSubClient.h> #include <DHT.h> // WiFi参数 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; // MQTT服务器参数 const char* mqtt_server = "your_MQTT_SERVER"; const int mqtt_port = 1883; const char* mqtt_user = "your_MQTT_USERNAME"; const char* mqtt_password = "your_MQTT_PASSWORD"; // 阿里云产品参数 const char* productKey = "your_PRODUCT_KEY"; const char* deviceName = "your_DEVICE_NAME"; const char* deviceSecret = "your_DEVICE_SECRET"; // DHT11引脚 #define DHTPIN D1 // DHT11类型 #define DHTTYPE DHT11 // DHT11对象 DHT dht(DHTPIN, DHTTYPE); // WiFi客户端对象和MQTT客户端对象 WiFiClient espClient; PubSubClient client(espClient); // MQTT订阅和发布的主题 const char* subTopic = "/sys/" + String(productKey) + "/" + String(deviceName) + "/thing/event/property/post"; const char* pubTopic = "/sys/" + String(productKey) + "/" + String(deviceName) + "/thing/event/property/post"; // 上一次更新时间 unsigned long lastUpdate = 0; // 温湿度数据 float temperature = 0; float humidity = 0; void setup() { // 初始化串口和DHT11 Serial.begin(9600); dht.begin(); // 连WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("WiFi connected!"); // 连MQTT服务器 client.setServer(mqtt_server, mqtt_port); client.setCallback(callback); while (!client.connected()) { if (client.connect(deviceName, mqtt_user, mqtt_password)) { Serial.println("MQTT connected!"); client.subscribe(subTopic); } else { Serial.println("MQTT connection failed!"); delay(1000); } } } void loop() { // 每隔10秒读取一次温湿度数据,并上传至阿里云 if (millis() - lastUpdate > 10000) { lastUpdate = millis(); // 读取温湿度 temperature = dht.readTemperature(); humidity = dht.readHumidity(); // 将温湿度数据转换为JSON格式 String payload = "{\"id\":\"1\",\"params\":{\"Temperature\":{\"value\":\"" + String(temperature) + "\",\"unit\":\"C\"},\"Humidity\":{\"value\":\"" + String(humidity) + "\",\"unit\":\"%\"}},\"method\":\"thing.event.property.post\"}"; // 发布温湿度数据 client.publish(pubTopic, payload.c_str()); } // 处理MQTT消息 client.loop(); } void callback(char* topic, byte* payload, unsigned int length) { // 处理MQTT消息 // ... } ``` 注意:在使用此代码前,请确保已经创建了阿里云物联网平台产品、设备和Topic,并将设备的三元组(ProductKey、DeviceName和DeviceSecret)、WiFi参数、MQTT服务器参数和Topic参数正确填写到代码中。同时,为了保证代码正常运行,请确保已经安装了ESP8266WiFi、PubSubClient和DHT库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值