|
本帖最后由 mushu 于 2020-4-13 08:57 編輯
希望通過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();
}
}
}
}
|
|