首页 > 其他分享 >ESP8266WiFi模块与Android实现数据通信

ESP8266WiFi模块与Android实现数据通信

时间:2023-05-28 17:31:35浏览次数:64  
标签:Toast 数据通信 void private new import ESP8266WiFi null Android

ESP8266模块三种模式:

       1、STA模式(客户端模式): ESP8266模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制

       2、AP 模式(接入点模式):ESP8266 模块作为热点,手机或电脑直接与模块连接,实现局域网无线控制

       3、STA+AP模式(两种模式并存):ESP8266 模块即可作为一个客户端连接区域网内的路由,也可以设置成是一个服务器

本文主要介绍一下ESP8266WiFi模块与Andriod实现数据通信的AP模式通讯。

1.ESP8266模块设定:

(1)准备阶段:

操作步骤:       

1、选择对应串口,波特率为115200;

2、硬件接线完成后,将RST接低电平重置,观察串口接收到ready;

3、串口调试助手输入AT。

ESP8266WiFi模块与Android实现数据通信_android

注意:你手中的模块是哪个厂家的,我这款是上海海枫的。在出厂的时候已经默认了初始参数,你们可以到开发手册查看一下。

ESP8266WiFi模块与Android实现数据通信_Text_02

发送+++,三秒之内发送a,返回ok进入AT指令配置。

ESP8266WiFi模块与Android实现数据通信_Text_03

因为我手上这款模块已经完成了初始化配置,所以不再需要使用AT指令配置。

其他款模块可以参考以下指令:

1.AT        //观察是否回传OK
2.AT+CWMODE=2        //配置成AP模式
3.AT+CWSAP="ESP8266","123456789",11,0        //配置WiFi名称、密码等
4.AT+CIPMUX=1        //开启多连接
5.AT+CIPSERVER=1,8080        //开启TCP服务器,端口号设置成8080
6.AT+CIFSR        //查询模块自身的IP地址

ESP8266WiFi模块与Android实现数据通信_ide_04

2.Android手机端APP设置:

操作步骤:

1、打开手机WiFi,连接ESP8266WiFi热点;

2、手机APP输入ESP8266WiFi模块IP地址;

3、点击连接,可从串口助手上观察到手机端APP的IP地址、CONNECT。

activity_main:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    
    <EditText
        android:id="@+id/edit_ip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:hint="请输入IP地址"
        android:text="10.10.100.000"
        android:inputType="none"
        android:textSize="20sp"></EditText>

    <EditText
        android:id="@+id/edit_port"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:hint="请输入端口号"
        android:text="8899"
        android:inputType="number"
        android:textSize="20sp"></EditText>

    <TextView
        android:id="@+id/send_text_dis"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:hint="接收到的消息"
        android:textColor="@color/colorPrimaryDark"
        android:textSize="20sp"></TextView>

    <EditText
        android:id="@+id/send_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="1234"
        android:hint="请输入要发送的内容"
        android:textSize="20sp"></EditText>

    <Button
        android:id="@+id/btn_send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        android:text="发送"
        android:textSize="25sp"></Button>

    <Button
        android:id="@+id/btn_turn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        android:text="连接"
        android:textSize="25sp"></Button>

</LinearLayout>

MainActivity:

package com.example.esp8266;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
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.PrintStream;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private static final String TAG = "hello";
    private TextView mSend_text;
    private TextView mSend_text_dis;
    private Button mBtn_send;
    private Socket mSocket;
    private PrintStream out;
    private ConnectThread mConnectThread;
    private String mip = "192.168.4.1";
    private int mport = 8089;
    private Button mBtn_turn;
    private BufferedReader mBufferedReader;
    private String readStrng;
    private String tempStrng;
    private myHandler mHandler = new myHandler();
    private Timer mTimer;
    private ReceiveDataTask mReceiveDataTask;
    private EditText mText_ip;
    private EditText mText_port;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    @Override
    protected void onStart() {
        super.onStart();
        startTimer();
    }

    @Override
    protected void onStop() {
        super.onStop();
        stopTimer();
    }

    private class myHandler extends Handler {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1212:
                    mSend_text_dis.setText(readStrng);//接收
                    break;
            }
        }
    }

    private void initView() {
        mSend_text_dis = findViewById(R.id.send_text_dis);
        mSend_text = findViewById(R.id.send_text);
        mBtn_send = findViewById(R.id.btn_send);
        mBtn_turn = findViewById(R.id.btn_turn);
        mText_ip = findViewById(R.id.edit_ip);
        mText_port = findViewById(R.id.edit_port);

        mBtn_send.setOnClickListener(this);
        mBtn_turn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_turn:
                if (mSocket == null || !mSocket.isConnected()) {
                    if(!TextUtils.isEmpty(mText_ip.getText()) && !TextUtils.isEmpty(mText_port.getText())){
                        mip = mText_ip.getText().toString();
                        mport = Integer.parseInt(mText_port.getText().toString());
                        Log.i(TAG, "onClick: "+mport);
                        mConnectThread = new ConnectThread(mip, mport);
                        mConnectThread.start();
                    }else if(TextUtils.isEmpty(mText_ip.getText())){
                        Toast.makeText(this,"请输入IP地址",Toast.LENGTH_SHORT).show();
                    }else if(TextUtils.isEmpty(mText_port.getText())){
                        Toast.makeText(this,"请输入端口号",Toast.LENGTH_SHORT).show();
                    }
                }
                if (mSocket != null && mSocket.isConnected()) {
                    try {
                        mSocket.close();
                        mSocket = null;
                        mBtn_turn.setText("连接");
                        Toast.makeText(this, "连接已断开", Toast.LENGTH_SHORT).show();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                break;
            case R.id.btn_send:
                final String str = mSend_text.getText().toString();
                if (str != null && out != null) {
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            out.print(str);//发送
                            out.flush();
                        }
                    }).start();

                }
                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());
                mBufferedReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mBtn_turn.setText("断开");
                        Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();
                    }
                });
            } catch (IOException e) {
                e.printStackTrace();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        }
    }


    private class ReceiveDataTask extends TimerTask {
        @Override
        public void run() {
            try {
                if (mBufferedReader != null && (mBufferedReader.ready())) {
                    char[] readbuff = new char[30];
                    byte[] readByte = new byte[30];
                    mBufferedReader.read(readbuff, 0, readbuff.length);
                    tempStrng = String.valueOf(readbuff);
                    readByte = tempStrng.getBytes();
                    readStrng = new String(readByte, 0, readByte.length, "GB2312");
                    Message message = Message.obtain();
                    message.what = 1212;
                    mHandler.sendMessage(message);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

    private void startTimer() {
        Log.i(TAG, "startTimer:");
        if (mTimer == null) {
            mTimer = new Timer();
        }
        if (mReceiveDataTask == null) {
            mReceiveDataTask = new ReceiveDataTask();
        }
        mTimer.schedule(mReceiveDataTask, 0, 10);
    }

    private void stopTimer() {
        Log.i(TAG, "stopTimer: ");
        if (mReceiveDataTask != null) {
            mReceiveDataTask.cancel();
            mReceiveDataTask = null;
        }
        if (mTimer != null) {
            mTimer.cancel();
            mTimer = null;
        }
    }
}

APP效果图:

ESP8266WiFi模块与Android实现数据通信_android_05

标签:Toast,数据通信,void,private,new,import,ESP8266WiFi,null,Android
From: https://blog.51cto.com/u_15887619/6365724

相关文章

  • Unity的IPostGenerateGradleAndroidProject:深入解析与实用案例
    UnityIPostGenerateGradleAndroidProjectUnity是一款流行的跨平台游戏引擎,它支持多种平台,包括Android。在Unity中,我们可以使用IPostGenerateGradleAndroidProject接口来自定义Gradle构建过程。本文将介绍如何使用IPostGenerateGradleAndroidProject接口,并提供三个使用例子。IPos......
  • 给Android开发者Flutter上手指南
    [给Android开发者Flutter上手指南_慕课手记](https://www.imooc.com/article/315337)目录LinearLayout在Flutter中等价于什么(Android)?RelativeLayout在Flutter中等价于什么(Android)?如何使用widget定义布局属性?如何分层布局?如何设置布局样式?ScrollView在Flutter......
  • 【Android基础】【001】Android不同版本介绍
    基本介绍安卓(Android)是谷歌推出的一种基于Linux操作系统的开源智能手机操作系统。下面是各个版本的简要介绍:Android1.0:2008年9月发布,是第一个正式发布的版本。Android1.5:2009年4月发布,命名为“Cupcake”,新增了虚拟键盘、相机等功能。Android1.6:2009年9月发布,命名为“Donut......
  • Android 服务Service详解
    Android服务(Service)是一种在后台运行的组件,它可以在不与用户交互的情况下执行长时间运行的操作。服务通常用于在后台播放音乐、下载数据、执行网络操作等。服务的特点如下:1.服务是一种后台运行的组件,可以在不与用户交互的情况下执行长时间运行的操作。2.服务可以在应用程序的......
  • YOLOv8目标检测实战:Android手机部署 (视频课程)
    课程链接:https://edu.51cto.com/course/33890.htmlYOLOv8目标检测基于先前YOLO版本的成功,引入了新功能和改进,进一步提升了性能和灵活性。本课程在Windows上手把手演示YOLOv8(YOLOv8n和YOLOv8s)目标检测在Android(安卓)手机进行部署的过程。内容包括:安装软件环境、安装PyTorch,克隆和......
  • Android平台如何实现外部RTSP|RTMP流注入轻量级RTSP服务模块(内网RTSP网关)
     技术背景今天分享的是外部RTSP或RTMP流,拉取后注入到本地轻量级RTSP服务模块,供内网小并发场景下使用,这里我们叫做内网RTSP网关模块。内网RTSP网关模块,系内置轻量级RTSP服务模块扩展,完成外部RTSP/RTMP数据拉取并注入到轻量级RTSP服务模块工作,多个内网客户端直接访问内网轻量级RTSP......
  • Android平台GB28181设备接入模块如何对接NV21、YV12、RGB、YUV等外部数据
    技术背景我们在对接Android平台GB28181设备接入模块的开发者时,遇到这样的场景,除了Android设备(如执法记录仪、智能安全帽等)自带的camera或camera2前后摄像头数据外,还有些场景是需要外部编码前或编码后数据,比如对接OTG类似的外置数据源,如NV12、NV21、YV12、RGB或YUV等格式,这里做个简......
  • 前端检测手机系统是iOS还是android(可实现根据手机系统跳转App下载链接)
    快速实现前端检测手机系统是iOS还是android(可实现根据手机系统跳转App下载链接);下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12652效果图如下:   实现代码如下:#使用方法####HTML代码部分```html<template><viewclass="conten......
  • 检测手机系统是iOS还是android(可实现根据手机系统跳转App下载链接)
    快速实现检测手机系统是iOS还是android(可实现根据手机系统跳转App下载链接);下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12652效果图如下:   实现代码如下:#使用方法####HTML代码部分```html<template><viewclass="content">......
  • [Android 逆向]旅行青蛙破解
    1.旅行青蛙V1.0,4apk安装到手机,可以运行2.jadx打开apk存在这两个dll,说明是unity开发的3.导出Assembly-CSharp.dll,使用DnSpy打开Ctrl+Shift+K全局搜索clover(四叶草的意思)ps:这里的5000是我修改的,选中408行,邮件编辑IL指令,直接改C#编译后的代码4.......