希望通过esp8266令APP显示数据,现在的情况是WIFI能与APP建立连接,通过电脑也能收到串口的数据,但是无法将数据通过wifi发送到手机上,请问如何解决呢? (电脑的传输线和esp8266使用的是一个串口)
相关程序如下:
单片机主函数:
#include<reg52.h>
#include"dht11.h"
#include "string.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char idata Rxbuff[50],Rxnum;
extern unsigned char F16T,F16RH; //温湿度数据
sbit LED1=P2^2;
sbit LED2=P2^4;
unsigned char getflag;//获取标志
void InitUART(void);
void delayms(unsigned int x);
void UART_send_byte(char dat);
void ESP8266_SERVER(void);
void Send_Str(unsigned char *buf);
void main()
{
unsigned char Tx_Buf[10];
delayms(500);
delayms(1000); //延时一段时间,让WIFI模块稳定
InitUART(); //初始化串口
ESP8266_SERVER(); //初始化ESP8266
LED1=0;
while(1)
{
getDHT11(); //获取温湿度值
Tx_Buf[0]=F16T/10%10+0x30; //帧头
Tx_Buf[1]=F16T%10+0x30; //将温湿度数据送往发送数组,送给模块让手机APP显示
Tx_Buf[2]= ';';
Tx_Buf[3]=F16RH/10%10+0x30;
Tx_Buf[4]=F16RH%10+0x30;
Send_Str("AT+CIPSEND=0,5\r\n");
delayms(300);
Send_Str(Tx_Buf);//发送数据
LED2=0;
}
}
void InitUART(void) //这是串口的基本配置,配置他的波特率是9600.这些参数都是标准的。
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void delayms(unsigned int x)
{
unsigned int i;
while(x--)
for(i=125;i>0;i--);
}
//UART 发送一字节
void UART_send_byte(char dat)
{
SBUF = dat; //发送
while (TI == 0); //等待发送完毕
TI = 0; //清发送完毕中断请求标志位
}
//UART 发送字符串
void Send_Str(unsigned char *buf)
{
while (*buf != '\0')
{
UART_send_byte(*buf++);
}
}
void ESP8266_SERVER(void)//建立服务器
{
ES = 0;
TI = 1;
Send_Str("AT\r\n");
delayms(500);
Send_Str("AT\r\n");
delayms(500);
Send_Str("AT+CWMODE=2\r\n"); //服务器搭建在WIFI模块上
delayms(500);
Send_Str("AT+CWSAP=\"WiFi_mushu\",\"12345678\",5,3\r\n"); //设置显示名称:wifi,密码:12345678
delayms(500);
Send_Str("AT+CIPMUX=1\r\n");//启动多连接,建立服务器都需要配置
delayms(500);
Send_Str("AT+CIPSERVER=1,5000\r\n");//建立服务器
delayms(500);
Send_Str("AT+CIPSTO=0\r\n");
TI = 0;
ES = 1;
}
APP相关程序
package com.example.wifi_mushu;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class MainActivity extends AppCompatActivity {
//定义控件
EditText edGateIp, edGateSn;
Button btnSearch, btnLogin;
//消息机制
private Handler messageHandler;
//开辟一个socket
Socket socket = null;
OutputStream OutputStream = null;//定义数据输出流,用于发送数据
BufferedReader bufferedReader;//声明输入流对象
InputStream InputStream = null;//定义数据输入流,用于接收数据
//定义逻辑变量,用于判断服务器连接状态
boolean isConnected = false;
//用于控制读数据线程是否执行
boolean RD = false;
//测试区域
Button fs;
EditText sjfs, sjjs;
@SuppressLint("HandlerLeak")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//控件绑定
edGateIp = findViewById(R.id.edGateIP);
edGateSn = findViewById(R.id.edGateSn);
btnSearch = findViewById(R.id.btnSearch);
btnLogin = findViewById(R.id.btnLogin);
//显示控件
final TextView wendu = (TextView)findViewById(R.id.wendu);
final TextView shidi = (TextView)findViewById(R.id.shidu);
final TextView kongqi = (TextView)findViewById(R.id.kongqi);
//自动填写按钮事件
btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//自动填写服务器固定的IP地址和端口
edGateIp.setText("192.168.4.1");
edGateSn.setText("5000");
}
});
//连接服务器按钮事件
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//容错机制
//取出文本框内容,用来判断输入框是否为空
String ip = edGateIp.getText().toString();
String sn = edGateSn.getText().toString();
if ((ip == null || ip.length() == 0) && (sn == null || sn.length() == 0)) {
Toast.makeText(MainActivity.this, "IP地址、端口号不能为空", Toast.LENGTH_SHORT).show();
} else if (ip == null || ip.length() == 0) {
Toast.makeText(MainActivity.this, "IP地址不能为空", Toast.LENGTH_SHORT).show();
} else if (sn == null || sn.length() == 0) {
Toast.makeText(MainActivity.this, "端口号不能为空", Toast.LENGTH_SHORT).show();
} else {
//判断服务器连接状态
if (isConnected != true) {
//创建一条新的Socket(以线程的方式)连接
new ClientThread().start();
//按钮文字改变
btnLogin.setText("断开连接");
//页面消息
Toast.makeText(MainActivity.this, "服务器连接成功", Toast.LENGTH_SHORT).show();
//二次判断,服务器是否已连接上
if (socket == null) {
//没连接上的话,按钮文字改为连接服务器,页面消息提示
btnLogin.setText("连接服务器");
Toast.makeText(MainActivity.this, "连接错误,请检查WiFi是否连上,IP、端口是否输入正确!", Toast.LENGTH_SHORT).show();
}
} else {
//按钮按下的时候已在连接情况下,服务器断开
if (socket != null) {
try {
//退出服务器
socket.close();
//服务器状态为空
socket = null;
//服务器连接转态改为空
isConnected = false;
//读数据线程不执行
RD = false;
btnLogin.setText("连接服务器");
//页面文字显示
Toast.makeText(MainActivity.this, "与服务器断开连接!", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
//
}
}
}
}
});
//消息处理机制
messageHandler = new Handler() { //等待socket连接成功
public void handleMessage(android.os.Message msgMessage) {
String receiveString = "";
switch (msgMessage.what) {
case 1:
receiveString = msgMessage.obj.toString();
String temp[] = DataString.split(";");
wendu.setText(temp[0]);
shidi.setText(temp[1]);
kongqi.setText(temp[2]);
}
}
};
}
//用线程创建Socket连接,线程不允许更新UI(用Handler实现)
public class ClientThread extends Thread {
public void run() {
//定义两个变量用于储存ip和端口号
InetAddress GateIp;
int GateSn;
try {
//判断socked的状态,防止重复执行
if (socket == null) {
//获取输入的IP地址
GateIp = InetAddress.getByName(edGateIp.getText().toString());
//获取输入的端口
GateSn = Integer.parseInt(edGateSn.getText().toString());
//新建一个socket连接
socket = new Socket(GateIp, GateSn);
//获得socket的输出流,接收数据
InputStream = socket.getInputStream();
//取得输入流、输出流
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
OutputStream = socket.getOutputStream();
//接收数据可用于主线程也可直接在此线程操作
char[] buffer = new char[265];//定义数组接收输入流数据
String bufferString = "";//定义一个字符接收字符串数组数据
int count = 0;//初始化buffer数组长度为0
int tag = 0;//初始写入数组的位置
//说明服务器已建立且连接
isConnected = true;
//无限循环重复接收输入流数据并进行处理
while (true) {
//当输入流写入buffer数组的长度大于0时,即为已收到数据
while ((count = bufferedReader.read(buffer)) > 0) {
//将buffer数组的数据全部写入bufferString字符类型
while (tag < buffer.length) {
bufferString = bufferString + buffer[tag];
tag++;
}
//将数据给messageHandler刷新UI界面
Message msgMessagr = new Message();
msgMessagr.obj = bufferString;
msgMessagr.what = 1;
messageHandler.sendMessage(msgMessagr);
//初始化数据,以便处理下一条输入流信息
tag = 0;
bufferString = "";
}
}
}
//出错提示
//UnknownHostExceptionDNS解析出错
//IOException读写文件异常
} catch (UnknownHostException e) {
//在命令行打印异常信息在程序中出错的位置及原因
e.printStackTrace();
} catch (IOException e) {
//在命令行打印异常信息在程序中出错的位置及原因
e.printStackTrace();
}
}
}
}
|