ESP8266安卓TCP客户端开发

最近在玩8266模块,想让它在局域网控制下开关,所以就搞开发一个安卓客户端调试的工具
直接上步骤:

第一步新建一个空白的Activity


工程名字自己可以改

第二先在AndroidManifest.xml加入网络权限

<uses-permission android:name="android.permission.INTERNET"/>

第三修改界面布局(注意这个布局必须要支持约束布局才能正常使用不然会报错,可以使用AS3.6以上版本):

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_send"android:layout_width="0dp"android:layout_height="wrap_content"android:background="@color/colorPrimary"android:text="@string/c"android:textColor="#F4F2F2"android:textSize="18sp"app:layout_constraintBottom_toTopOf="@+id/guideline2"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.0"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="@+id/guideline2"app:layout_constraintVertical_bias="0.52" /><EditTextandroid:id="@+id/et_port"android:layout_width="0dp"android:layout_height="wrap_content"android:autofillHints=""android:ems="10"android:hint="@string/s"android:inputType="number"app:layout_constraintBottom_toTopOf="@+id/guideline3"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.81"app:layout_constraintStart_toStartOf="@+id/guideline4"app:layout_constraintTop_toTopOf="@+id/guideline3"app:layout_constraintVertical_bias="0.555" /><EditTextandroid:id="@+id/et_ip"android:layout_width="0dp"android:layout_height="wrap_content"android:autofillHints=""android:ems="10"android:hint="@string/sip"android:inputType="date"app:layout_constraintBottom_toTopOf="@+id/guideline"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.81"app:layout_constraintStart_toStartOf="@+id/guideline4"app:layout_constraintTop_toTopOf="@+id/guideline"app:layout_constraintVertical_bias="0.555" /><TextViewandroid:id="@+id/textView"android:layout_width="0dp"android:layout_height="wrap_content"android:text="@string/ssip"android:textAlignment="textEnd"android:textSize="18sp"app:layout_constraintBottom_toTopOf="@+id/guideline"app:layout_constraintEnd_toStartOf="@+id/guideline4"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="@+id/guideline" /><TextViewandroid:id="@+id/textView2"android:layout_width="0dp"android:layout_height="wrap_content"android:text="@string/sd"android:textAlignment="textEnd"android:textSize="18sp"app:layout_constraintBottom_toTopOf="@+id/guideline3"app:layout_constraintEnd_toStartOf="@+id/guideline4"app:layout_constraintHorizontal_bias="0.51"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="@+id/guideline3"app:layout_constraintVertical_bias="0.526" /><androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"app:layout_constraintGuide_percent="0.3" /><androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline5"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"app:layout_constraintGuide_percent="0.6" /><androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline6"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"app:layout_constraintGuide_percent="0.9" /><androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"app:layout_constraintGuide_percent="0.2" /><androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"app:layout_constraintGuide_percent="0.75" /><androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"app:layout_constraintGuide_percent="0.38" /><androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline7"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"app:layout_constraintGuide_percent="0.5" /><androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline8"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"app:layout_constraintGuide_percent="0.45" /><Buttonandroid:id="@+id/btn_link"android:layout_width="0dp"android:layout_height="wrap_content"android:background="#16E6CE"android:text="@string/contenct"android:textColor="#F4EFEF"android:textSize="18sp"app:layout_constraintBottom_toTopOf="@+id/guideline8"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.0"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="@+id/guideline8" /><EditTextandroid:id="@+id/et_data"android:layout_width="255dp"android:layout_height="48dp"android:autofillHints=""android:ems="10"android:hint="@string/plesdata"android:inputType="date|text"app:layout_constraintBottom_toTopOf="@+id/guideline5"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="1.0"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="@+id/guideline5"app:layout_constraintVertical_bias="0.446"tools:ignore="LabelFor" /><TextViewandroid:id="@+id/tv_sendata"android:layout_width="0dp"android:layout_height="wrap_content"android:text="@string/senddata"android:textAlignment="textEnd"android:textSize="18sp"app:layout_constraintBottom_toTopOf="@+id/guideline5"app:layout_constraintEnd_toStartOf="@+id/guideline4"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="@+id/guideline5" /><TextViewandroid:id="@+id/textView4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/tcp"app:layout_constraintBottom_toTopOf="@+id/guideline6"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="@+id/guideline6" /></androidx.constraintlayout.widget.ConstraintLayout>

第四新建SendAsyncTask.java文件

package com.kizai.projects.esp8266;import android.os.AsyncTask;import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;//这个要根据自己的文件来导包,需要改这里
import static com.kizai.projects.esp8266.MainActivity.ip;//记得导包
import static com.kizai.projects.esp8266.MainActivity.port;public class SendAsyncTask extends AsyncTask<String, Void, Void> {//这里是连接ESP8266的IP和端口,连接手机可以看到IP地址private static final String IP = ip;//可以直接调用全局变量private static final int PORT = port;@Overrideprotected Void doInBackground(String... params) {String str = params[0];try {Socket client = new Socket(IP, PORT);client.setSoTimeout(5000);//获取Socket的输出流,用来发送数据给服务端PrintStream out = new PrintStream(client.getOutputStream());out.print(str);out.flush();out.close();client.close();} catch (IOException e) {e.printStackTrace();}return null;}
}

第五回到主活动代码MainActivity.java:

package com.kizai.projects.esp8266;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.Toast;import java.net.Socket;public class MainActivity extends AppCompatActivity implements View.OnClickListener {public static String ip, pport, sendData;//调用全局数据变量,方便调用public static int port;private EditText et_ip, et_port, et_data;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();//初始化控件}//初始化控件private void initView() {Button btn_send = findViewById(R.id.btn_send);Button btn_link = findViewById(R.id.btn_link);et_ip = findViewById(R.id.et_ip);et_port = findViewById(R.id.et_port);et_data = findViewById(R.id.et_data);btn_send.setOnClickListener(this);btn_link.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {//连接case R.id.btn_link:if (et_port.length() != 0 && et_ip.length() != 0) {ip = et_ip.getText().toString().trim();//获取输入的ip地址pport = et_port.getText().toString().trim();//由于EditText的输入类型是String类型,所以先把输入的内容获取到,再通过下面的代码进行Int类型转换,如果自己有更好的方法也可以自行修改port = Integer.parseInt(pport);//把端口的String类型的数据转换成int类型String str = "o\n";//这是连接8266时发送的测试数据,要在8266那边做对应的判断才会有反应,如果不是连接8266的可以把以下两行行代码注释掉new SendAsyncTask().execute(str);Toast.makeText(getApplicationContext(), "如果看到ESP8266的灯闪烁两次就代表连接成功!", Toast.LENGTH_SHORT).show();} else {Toast.makeText(getApplicationContext(), "请输入正确的ip和端口号!", Toast.LENGTH_SHORT).show();}break;//发送数据case R.id.btn_send:sendData = et_data.getText().toString().trim();//输入的数据if (!sendData.isEmpty()) {new SendAsyncTask().execute(sendData);} else {Toast.makeText(getApplicationContext(), "请输入数据!", Toast.LENGTH_SHORT).show();}break;}}
}

第六ESP8266 TCPServer服务端代码:

#include <ESP8266WiFi.h>//定义最多多少个client可以连接本server(一般不要超过4个)
#define MAX_SRV_CLIENTS 2
//以下三个定义为调试定义
#define DebugBegin(baud_rate)    Serial.begin(baud_rate)
#define DebugPrintln(message)    Serial.println(message)
#define DebugPrint(message)    Serial.print(message)const char* ssid = "KIZAI-HOME";//自己路由器的wifi名
const char* password = "700800900";//自己路由器的密码//创建server 端口号是23
WiFiServer server(23);
//管理clients
WiFiClient serverClients[MAX_SRV_CLIENTS];void setup() {DebugBegin(115200);//定义输出引脚pinMode(LED_BUILTIN, OUTPUT);//定义高低电平digitalWrite(LED_BUILTIN, HIGH); WiFi.mode(WIFI_STA);WiFi.begin(ssid, password);DebugPrint("\nConnecting to "); DebugPrintln(ssid);uint8_t i = 0;while (WiFi.status() != WL_CONNECTED && i++ < 20) {delay(500);}if (i == 21) {DebugPrint("Could not connect to"); DebugPrintln(ssid);while (1) {delay(500);}}//启动serverserver.begin();//关闭小包合并包功能,不会延时发送数据server.setNoDelay(true);DebugPrint("Ready! Use 'telnet ");DebugPrint(WiFi.localIP());DebugPrintln(" 23' to connect");
}void loop() {uint8_t i;//检测是否有新的client请求进来if (server.hasClient()) {for (i = 0; i < MAX_SRV_CLIENTS; i++) {//释放旧无效或者断开的clientif (!serverClients[i] || !serverClients[i].connected()) {if (serverClients[i]) {serverClients[i].stop();}//分配最新的clientserverClients[i] = server.available();DebugPrint("New client: "); DebugPrint(i);break;}}//当达到最大连接数 无法释放无效的client,需要拒绝连接if (i == MAX_SRV_CLIENTS) {WiFiClient serverClient = server.available();serverClient.stop();DebugPrintln("Connection rejected ");}}//检测client发过来的数据for (i = 0; i < MAX_SRV_CLIENTS; i++) {if (serverClients[i] && serverClients[i].connected()) {if (serverClients[i].available()) {//get data from the telnet client and push it to the UARTwhile (serverClients[i].available()) {//发送到串口调试器
//          Serial.write(serverClients[i].read());char data = serverClients[i].read();//接收到的数据可以做出不同的反应Serial.print(data);switch(data){case 'o'://闪烁两次digitalWrite(LED_BUILTIN, LOW); // 点亮LEDdelay(100);digitalWrite(LED_BUILTIN, HIGH); // 熄灭LEDdelay(100);digitalWrite(LED_BUILTIN, LOW); // 点亮LEDdelay(100);digitalWrite(LED_BUILTIN, HIGH); // 熄灭LEDdelay(100);digitalWrite(LED_BUILTIN, LOW); // 点亮LEDbreak;}}}}}if (Serial.available()) {//把串口调试器发过来的数据 发送给clientsize_t len = Serial.available();uint8_t sbuf[len];Serial.readBytes(sbuf, len);//push UART data to all connected telnet clientsfor (i = 0; i < MAX_SRV_CLIENTS; i++) {if (serverClients[i] && serverClients[i].connected()) {serverClients[i].write(sbuf, len);//向所有客户端发送数据delay(1);}}}
}
//连接情况 用led灯的状态显示
void blink()
{static long previousMillis = 0;static int currstate = 0;if (millis() - previousMillis > 200)  //200ms{previousMillis = millis();currstate = 1 - currstate;
//        digitalWrite(LED_BUILTIN, LOW); // 点亮LEDdigitalWrite(LED_BUILTIN, currstate);}
}

8266端口监视器:

第七现在运行软件(真机和虚拟机都可以实现连接:前提是连接在统一个局域网里面)


也可以看到串口监视器会有反应:New client:0o

测试发送数据:


看到串口监视器都是可以接收到数据的

希望这篇文章对你有所帮助,觉得还可以点赞收藏喔!也还可以点个关注,你们的支持是对我最大的鼓励!!!

ESP8266安卓TCP客户端开发(含全部源码)相关推荐

  1. 史上最全的2022年最新版Android安卓面试题集锦(含答案+源码)

    金三银四,又到了一年一度的黄金跳槽季,想必也许有不少Android程序员开始摩拳擦掌,蠢蠢欲动了.而网络上的面试题大部分已经过时甚至是错误成堆,漏洞百出,今天结合自己这段时间的面试经验和几个Andro ...

  2. (转)无需安装SDK,3部完成Android客户端开发(附源码)

    一.下载示例文件 下载地址:http://www.eduan.mobi/sdk/sample.zip 二.修改文件 1.做一个Logo 2.做一个启动画面 3.在示例上调整界面 三.上传编译 提交,等 ...

  3. 网狐荣耀源码(含内核源码)可二次开发

    网狐荣耀版本,可以二次开发. 含内核源码(可自定义消息包加解密),含约战服务(房卡模式),十几个子游戏源码,网站源码(网站前台,网站后台,房卡后台). PS:这几天熬夜弄这个,可算能好好睡一下了! 转 ...

  4. C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码...

    C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码 原文:C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码 前言 系列 ...

  5. [附源码]计算机毕业设计Python+uniapp安卓门禁系统appo8yd7(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp安卓门禁系统appo8yd7(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境配置: Pyt ...

  6. android 快传 源码_安卓APP仿茄子快传源码,Android项目源码类似茄子快传的快传项目包括服务端...

    适用范围:安卓APP仿茄子快传源码,Android项目源码类似茄子快传的快传项目包括服务端 演示地址:(以截图为准) 运行环境:Android+PC+web 其他说明: 本项目是一个基于安卓的类似茄子 ...

  7. 【附源码】计算机毕业设计Python安卓手机销售网站2651d(源码+程序+LW+调试部署)

    [附源码]计算机毕业设计Python安卓手机销售网站2651d(源码+程序+LW+调试部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境配置: Python3.7.7 ...

  8. 【附源码】计算机毕业设计Python安卓高校智慧食堂app71q97(源码+程序+LW+调试部署)

    [附源码]计算机毕业设计Python安卓高校智慧食堂app71q97(源码+程序+LW+调试部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境配置: Python3. ...

  9. wp实例开发精品文章源码推荐

    qianqianlianmeng wp实例开发精品文章源码推荐 WP8 启动媒体应用         这个示例演示了如何选择正确的msAudioCategory类别的音像(AV)流来配置它作为一个音频 ...

最新文章

  1. 自动飞行控制系统_波音737MAX,安全评估竟是自己做的!飞行员仅用iPad学习驾驶!...
  2. 鸟哥的私房菜 第0章
  3. 获取android屏幕大小
  4. [RHEL] RHEL7.0 下 Postfix + Dovecot 实现邮件发送
  5. jquery的each()详细介绍
  6. python慢在哪里_求大神分析一下我的python脚本慢在哪里?
  7. linux安装网卡驱动tgz,Linux安装网卡驱动
  8. 04-linux下安装neo4j
  9. 在ehlib的DBGridEh控件中使用过滤功能(可以不用 MemTableEh 控件 适用ehlib 5.2 ehlib 5.3)...
  10. three.js 05-04 之 BoxGeometry 几何体
  11. linux下安装sg11,Linux安装SG11加密扩展组件教程
  12. java4android 教程_《Java4Android视频教程》学习笔记(三)
  13. openLayers 学习思维导图
  14. k8s学习笔记4--搭建dashboard
  15. 基于msm8916移植lcd流程
  16. ios html格式转换,如何使用HTML模版和iOS中的UIPrintPageRenderer来生成PDF文档
  17. Threaded Binary Tree
  18. 一位8421BCD码转5421码,2421码,余3码组合电路(附思路)
  19. C Primer Plus中文 第6版勘误表
  20. 离婚率离婚率离婚率离婚率

热门文章

  1. Lisp语言:循环控制
  2. portraiture4图片修图磨皮滤镜插件支持Win和Mac
  3. 又一巨头告急!曾年赚500亿,如今连房租都付不起!
  4. linux微信原生版2.1.5,优麒麟版重新打包,适用于debian内核系统
  5. C语言中的strstr函数的用法
  6. Mozilla 开源稍后阅读应用 Pocket 代码
  7. 7-104 三天打鱼两天晒网
  8. SAP 移动类型 与 账户 字段选择不一致
  9. 参数化扫描——Comsol中的灵敏度分析功能
  10. 量化 计算机 金融,金融数据量化分析(上)