物联网的迅速发展,加上自己对这方面的好奇,于是买了ESP8266模块,已经学习了几天,写了几篇博客,感觉学习使人快乐。因为之前都是别人写的APP调试助手,或者别人写的APP(他们写的功能是挺好的),但自己想往深了学习就需要自己动手学习Android,写一个属于自己的APP,这样对以后才有更好的发展。因为Android程序刚开始学习,写的效果也不好,大家请看,^_^:
这样先点击连接,就可以连接到WIFI模块了,然后通过按键来操作单片机上的LED灯。
效果如图所示:
实现的代码如下:
硬件方面的:
#include
#include
#include
sbit P20_LED=P2^0;
sbit P32=P3^2;
char Recive_table[20]=""; //接收缓冲,最大20个字节
char Recive_state = 0; //接收完成标志
void WIFI_Init(void);
void Uart_Init(void);
void ms_delay(int t);
void LED(void);
int main (void)
{
/********************功能初始化***********************/
Uart_Init();//串口初始化,波特率为9600
ms_delay(1000) ;
WIFI_Init(); //wifi初始化
P20_LED=0;
/****************************************************/
/**********************主循环************************/
while(1)
{
ms_delay(10) ;
if(Recive_state == 1)
{
ES=0; //清空接收标志位
if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//接收到的字符串形式为+IPD,x,x:y
{
if((Recive_table[3]=='D')&&(Recive_table[6]==','))
{
if(Recive_table[9]=='0')
P20_LED = 0;
if(Recive_table[9]=='1')
P20_LED = 1;
}
}
memset(Recive_table,'\0',20);
Recive_state = 0;
ES=1; //打开接收标志位
}
/*if(0 == P32) // 通过串口给手机发送字符串 wantin
{
ms_delay(400);
if(0 == P32)
{
ES = 0;
TI = 1;
printf("AT+CIPSEND=?\r\n");
LED();
ms_delay(1000) ;
printf("AT+CIPSEND=0,10\r\n");
LED();
ms_delay(1000) ;
printf("wangting\r\n");
LED();
ms_delay(1000) ;
LED();
ms_delay(1000) ;
LED();
ms_delay(1000) ;
while(!TI);
TI = 0;
ES = 1;
}
while(0 == P32);
} */
}
/****************************************************/
}
/******************************************************************
函 数: void Uart_Interrupt() interrupt 4
功 能: 串口中断函数,将收到的字符存到Recive_table[]数组中
参 数: 无
返回值: 无
*******************************************************************/
void Uart_Interrupt() interrupt 4
{
static char i=0; //因为是一位一位接收,所以用static
if(RI==1)
{
ES = 0;
RI=0;
Recive_table[i]=SBUF;
i++;
if((Recive_table[i-1] == '\n'))
{
Recive_table[i]='\0';
i=0;
Recive_state = 1;
}
ES = 1;
}
else
TI = 0;
}
/******************************************************************
函 数: void Uart_Init(void)
功 能: 串口初始化,波特率为9600(这个不会,上网百度)
参 数: 无
返回值: 无
*******************************************************************/
void Uart_Init(void)
{
TMOD=0x20;
TH1=0xfD;
TL1=0xfD;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
/******************************************************************
函 数: void ms_delay(int t)
功 能: 毫秒级延时
参 数: 无
返回值: 无
*******************************************************************/
void ms_delay(int t)
{
int i,j;
for(i=t;i>0;i--)
for(j=110;j>0;j--);
}
/******************************************************************
函 数: void LED(void)
功 能: 发送完命令后显示用的函数
参 数: 无
返回值: 无
*******************************************************************/
void LED(void)
{
P2 = 0;
ms_delay(100);
P2 = 0xff;
ms_delay(100);
}
/******************************************************************
函 数: void WIFI_Init(void)
功 能: wifi初始化(名字:esp8266;密码:1234567890)
参 数: 无
返回值: 无
*******************************************************************/
void WIFI_Init(void)
{
ES = 0;
TI = 1;
printf("AT+RST\r\n");
LED();
ms_delay(1000) ;
printf("AT+CWMODE=3\r\n");
LED();
ms_delay(1000) ;
printf("AT+CIPMUX=1\r\n");
LED();
ms_delay(1000) ;
printf("AT+CIPSERVER=1,8080\r\n");
LED();
ms_delay(1000) ;
printf("AT+CIOBAUD=9600\r\n"); // 设置与单片机一致的波特率
LED();
ms_delay(1000) ;
while(!TI);
TI = 0;
ES = 1;
}
Android APP部分:
package com.open_open.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private EditText mIp; // IP
private EditText mPort; // 端口号
private String mStrIp; // 字符串类型ip
private int miPort; // 字符类型端口
private Button mBtnConnect; // 连接
private Button mLedON; // 按钮LED灯开
private Button mLedOFF; // 按钮LED灯关
private Socket mSocket; // 套接字
private PrintStream out; // 打印输出流
private ConnectThread mConnectThread; // TCP连接线程
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtnConnect=(Button)findViewById(R.id.mBt1);
mLedON=(Button)findViewById(R.id.mBt2);
mLedOFF=(Button)findViewById(R.id.mBt3);
mIp=(EditText)findViewById(R.id.mEtIP);
mPort=(EditText)findViewById(R.id.mEtPort);
mBtnConnect.setOnClickListener(this);
mLedON.setOnClickListener(this);
mLedOFF.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.mBt1:
// 连接
if(mSocket == null || !mSocket.isConnected()){
mStrIp=mIp.getText().toString();
miPort=Integer.valueOf(mPort.getText().toString());
mConnectThread = new ConnectThread(mStrIp,miPort);
mConnectThread.start();
}
if(mSocket != null && mSocket.isConnected()){
try{
mSocket.close();
mSocket=null; // 清空mSocket
mBtnConnect.setText("连接");
Toast.makeText(MainActivity.this,"连接已关闭",Toast.LENGTH_LONG).show();
}catch (IOException e){
e.printStackTrace();
}
}
break;
case R.id.mBt2:
if(out!=null){
out.print("0");
out.flush();
}
break;
case R.id.mBt3:
if (out!=null){
out.print("1");
out.flush();
}
break;
}
}
private class ConnectThread extends Thread{
private String ip;
private int port;
public ConnectThread(String ip,int port){
this.ip=ip;
this.port=port;
}
@Override
public void run(){
try {
mSocket=new Socket(ip,port);
out = new PrintStream(mSocket.getOutputStream());
runOnUiThread(new Runnable() {
@Override
public void run() {
mBtnConnect.setText("断开");
Toast.makeText(MainActivity.this,"连接成功",Toast.LENGTH_LONG).show();
}
});
//new HeartBeatThread().start();
}catch (IOException e){
e.printStackTrace();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"连接失败",Toast.LENGTH_LONG).show();
}
});
}
}
}
/*
private class HeartBeatThread extends Thread{
@Override
public void run(){
while (true){
try {
Thread.sleep(3000);
if (!mSocket.isConnected()){
runOnUiThread(new Runnable() {
@Override
public void run() {
mBtnConnect.setText("连接");
Toast.makeText(MainActivity.this,"连接已关闭",Toast.LENGTH_LONG).show();
}
});
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}*/
}
还有布局和权限的就不多说了,很简单,只要有点Android基础就可以搞定了,学习一直在路上。
APP源码,大家可以下载:https://download.csdn.net/download/xiaocaidayong/11215942 MyApplication17.rar