当前位置: 首页 > news >正文

esp32服务器与android客户端的tcp通讯

esp32

//esp32作为服务端
#include <WiFi.h>#define LED_BUILTIN 2 
// 创建热点
const char *ssid = "ESP32";
const char *password = "12345678";
const int port = 1122; //端口
WiFiServer server(port);
void setup() {delay(5000);pinMode(LED_BUILTIN, OUTPUT);digitalWrite(LED_BUILTIN, LOW);Serial.begin(115200);Serial.println();Serial.println("Configuring access point...");// You can remove the password parameter if you want the AP to be open.WiFi.softAP(ssid, password);IPAddress myIP = WiFi.softAPIP();Serial.print("AP IP address: ");Serial.print(myIP);Serial.print(":");Serial.println(port);server.begin();Serial.println("Server started!");
}void loop() {WiFiClient client = server.available();   // 监听新客户端if (client) {     digitalWrite(LED_BUILTIN, HIGH);                        // 如果有客户端接入Serial.println("New Client In.");           // 打印至串口String currentLine = "";                // 用来保存客户端发来的数据  一段指令以换行符结尾while (client.connected()) {            // 当有持续连接时循环if (client.available()) {             // 如果有信息待接收char c = client.read();             // read a byte, then  判断字符是不是\n  从而判断有没有结束// Serial.write(c);                    // 串口打印if(c != '\n'){   //一段指令以换行符结尾currentLine += c;}else{Serial.println(currentLine);client.print(currentLine); //返回数据到客户端currentLine = ""; }}}// close the connection:client.stop();digitalWrite(LED_BUILTIN, LOW);   Serial.println("Client Disconnected.");}
}
//esp32 tcp客户端
#include <Arduino.h>
#include <WiFi.h>const char *ssid = "Netcore_dsx";
const char *password = "dsx54254";
const IPAddress serverIP(192,168,0,3); //欲访问的地址
uint16_t serverPort = 1122;         //服务器端口号WiFiClient client; //声明一个客户端对象,用于与服务器进行连接//初始化wifi
void wifi_init()
{WiFi.mode(WIFI_STA);WiFi.setSleep(false); //关闭STA模式下wifi休眠,提高响应速度WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED){delay(500);Serial.println(".");}Serial.println("IP Address:");Serial.println(WiFi.localIP());
}void setup()
{Serial.begin(115200);wifi_init();
}void loop()
{if (client.connect(serverIP, serverPort)) //尝试访问目标地址{client.println("Hello Server,I Am ESP32!");while (client.connected() || client.available()) //如果已连接或有收到的未读取的数据{if (client.available()) //如果tcp网络有数据可读取 读取网络数据{String line = client.readStringUntil('\n'); //读取数据到换行符Serial.println(line);client.print(line);// 如果数据是服务器发送给esp32的 则通过串口发给esp32// if (line.substring(0,esp32_head.length()) == esp32_head)// {//     Serial.println(line);// }}}}else{Serial.println("Connect To Tcp Server Failed!After 10 Seconds Try Again!");client.stop(); //关闭客户端}delay(10000);
}

android客户端

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"android:orientation="vertical"><TextViewandroid:id="@+id/server_ip_kj"android:layout_width="match_parent"android:layout_height="40dp"android:text="192.168.4.1" /><TextViewandroid:id="@+id/server_port_kj"android:layout_width="match_parent"android:layout_height="40dp"android:text="1122" /><Buttonandroid:id="@+id/connect_btn_kj"android:layout_width="match_parent"android:layout_height="40dp"android:text="连接服务器" /><TextViewandroid:id="@+id/recv_data_kj"android:layout_width="match_parent"android:layout_height="200dp"android:text="" /><EditTextandroid:id="@+id/send_data_kj"android:layout_width="match_parent"android:layout_height="40dp"android:ems="10"android:inputType="text"android:text="Name" /><Buttonandroid:id="@+id/send_btn_kj"android:layout_width="match_parent"android:layout_height="40dp"android:text="发送" /></LinearLayout>
package com.example.esp32_tcp_client;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
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.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class MainActivity extends AppCompatActivity {private TextView server_ip_kj,server_port_kj,recv_data_kj;private Button connect_btn_kj,send_btn_kj;private EditText send_data_kj;private Socket socket;InputStream inputStream;OutputStream outputStream;MyHandle myHandle;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);server_ip_kj = findViewById(R.id.server_ip_kj);server_port_kj = findViewById(R.id.server_port_kj);connect_btn_kj = findViewById(R.id.connect_btn_kj);send_btn_kj = findViewById(R.id.send_btn_kj);send_data_kj = findViewById(R.id.send_data_kj);recv_data_kj = findViewById(R.id.recv_data_kj);myHandle = new MyHandle();
//        连接服务器connect_btn_kj.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {new Thread(new Runnable() {@Overridepublic void run() {try {socket = new Socket(server_ip_kj.getText().toString(),Integer.valueOf(server_port_kj.getText().toString()));if(socket.isConnected()){//连接成功outputStream = socket.getOutputStream();inputStream = socket.getInputStream();Log.i("Connect","OK");Message msg = new Message();msg.what = 0;msg.obj = "连接服务器成功!";myHandle.sendMessage(msg);RecvData();}else{Message msg = new Message();msg.what = 1;msg.obj = "连接服务器失败!";myHandle.sendMessage(msg);//连接失败Log.i("Connect","Fail");}} catch (IOException e) {//连接失败Message msg = new Message();msg.what = 1;msg.obj = "连接服务器失败!";myHandle.sendMessage(msg);Log.i("Connect","Fail");throw new RuntimeException(e);}}}).start();}});
//        发送信息send_btn_kj.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {new Thread(new Runnable() {@Overridepublic void run() {try {//向byte数组msg的最后添加'\n'byte[] msg = send_data_kj.getText().toString().getBytes();
//                            msg数组的最后添加'\n'结束标志 存在tmp数组中byte[] tmp = new byte[msg.length +1];for(int i=0;i<msg.length;i++){tmp[i] = msg[i];}tmp[msg.length] = '\n';outputStream.write(tmp);Log.i("sendmsg","OK");} catch (IOException e) {Log.i("sendmsg","Fail");throw new RuntimeException(e);}}}).start();}});}
//  接收消息private void RecvData(){new Thread(new Runnable() {@Overridepublic void run() {while(socket != null && socket.isConnected() == true){byte[] recv_buff = new byte[255];try {int len = inputStream.read(recv_buff);if(len != -1){byte[] tmp = new byte[len];System.arraycopy(recv_buff,0,tmp,0,len);Log.i("RecvDataLength",String.valueOf(len)); // len是接收到的字符个数Log.i("RecvData",new String(tmp));Message msg = new Message();msg.what = 2;msg.obj = new String(tmp);myHandle.sendMessage(msg);}} catch (IOException e) {throw new RuntimeException(e);}}}}).start();}public class MyHandle extends Handler{@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);switch (msg.what){case 0:Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();break;case 1:Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();break;case 2:recv_data_kj.setText(msg.obj.toString());Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();break;default:break;}}}protected void onDestroy(){super.onDestroy();try {socket.close();inputStream.close();outputStream.close();} catch (IOException e) {throw new RuntimeException(e);}}
}
<uses-permission android:name="android.permission.INTERNET" />

相关文章:

esp32服务器与android客户端的tcp通讯

esp32 //esp32作为服务端 #include <WiFi.h>#define LED_BUILTIN 2 // 创建热点 const char *ssid "ESP32"; const char *password "12345678"; const int port 1122; //端口 WiFiServer server(port); void setup() {delay(5000);pinMode(LED_…...

自定义Mybatis LanguageDriver性能优化

场景&#xff1a;高并发情况下mybatis 动态sql 解析 锁问题优化 优化前 并发测试 XMLLanguageDriver 类 的 createSqlSource 方法有锁 而且 每次执行时都会走该方法 优化前 &#xff1a; 线程有Block 优化后的 LanguageDriver public class CustomXMLLanguageDriver im…...

DevEco Studio 鸿蒙(HarmonyOS)项目结构

DevEco Studio 鸿蒙&#xff08;HarmonyOS&#xff09;项目结构 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、项目结构 创建简单的Hello World移动应用项目结构如下图 由上到下说明各个文件夹的作用 .hvigor&#xff1a;存…...

Springboot整合篇Druid

一、概述 1.1简介 Druid 是阿里巴巴开源平台上一个数据库连接池实现&#xff0c;结合了 C3P0、DBCP 等 DB 池的优点&#xff0c;同时加入了日志监控。 它本身还自带一个监控平台&#xff0c;可以查看时时产生的sql、uri等监控数据&#xff0c;可以排查慢sql、慢请求&#xff0…...

uniapp 微信小程序 封装axios 包含请求拦截、响应拦截、无感刷新令牌功能

前言&#xff1a; 1、为什么不适用uniapp自带的请求功能&#xff1f; 答&#xff1a;uniapp自带的请求功能&#xff0c;再刷新了令牌后&#xff0c;重新请求返回的数据无法返回给发起请求的方法。也就是说&#xff0c;刷新令牌后重新发起的请求和第一次发起请求的方法是割裂的。…...

C语言精选——选择题Day41

第一题 1. 有以下程序段&#xff1a; char *p, *q; p (char *)malloc(sizeof(char) * 20); q p; scanf("%s %s", p, q); printf("%s %s\n", p, q); 若从键盘输入&#xff1a;abc def↙&#xff0c;则输出结果是&#xff08; &#xff09; A&#xff1a;d…...

Tomcat头上有个叉叉

问题原因&#xff1a; 这是因为它就是个空的tomcat,并没有导入项目运行 解决方案&#xff1a; war模式&#xff1a;发布模式&#xff0c;正式发布时用&#xff0c;将WEB工程以war包的形式上传到服务器 war exploded模式&#xff1a;开发时用&#xff0c;将WEB工程的文件夹直接…...

Linux shell编程学习笔记35:seq

0 前言 在使用 for 循环语句时&#xff0c;我们经常使用到序列。比如&#xff1a; for i in 1 2 3 4 5 6 7 8 9 10; do echo "$i * 2 $(expr $i \* 2)"; done 其中的 1 2 3 4 5 6 7 8 9 10;就是一个整数序列 。 为了方便我们使用数字序列&#xff0c;Linux提供了…...

Nougat:结合光学神经网络,引领学术PDF文档的智能解析、挖掘学术论文PDF的价值

Nougat&#xff1a;结合光学神经网络&#xff0c;引领学术PDF文档的智能解析、挖掘学术论文PDF的价值 这是Nougat的官方存储库&#xff0c;Nougat是一种学术文档PDF解析器&#xff0c;可以理解LaTeX数学和表格。 Project page: https://facebookresearch.github.io/nougat/ …...

涉密网络的IP查询防护策略

涉密网络的安全性对于维护国家、企业及个人的核心利益至关重要。在当今数字化时代&#xff0c;网络攻击日益猖獗&#xff0c;其中IP查询是攻击者获取目标信息的一种常见手段。本文将探讨涉密网络中防护IP查询的关键策略&#xff0c;以确保网络的机密性和安全性。 1. 专用VPN和…...

基础算法(1):排序(1):选择排序

今天对算法产生了兴趣&#xff0c;开始学习基础算法&#xff0c;比如排序&#xff0c;模拟&#xff0c;贪心&#xff0c;递推等内容&#xff0c;算法是很重要的&#xff0c;它是解决某个问题的特定方法&#xff0c;程序数据结构算法&#xff0c;所以对算法的学习是至关重要的&a…...

GeoTrust OV证书

当谈到网站安全性和可信度时&#xff0c;GeoTrust OV证书是一个备受推崇的选择。作为一家备受尊敬的数字证书颁发机构&#xff0c;GeoTrust以其卓越的品牌声誉和高质量的产品而闻名于世。GeoTrust OV证书提供了一系列的安全功能&#xff0c;同时还具有出色的性价比&#xff0c;…...

第一个“hello Android”程序

1、首先安装Android studio&#xff08;跳过&#xff09; Android Studio是由Google推出的官方集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于Android应用程序的开发。它是基于JetBrains的IntelliJ IDEA IDE构建的&#xff0c;提供了丰富的功能和工具&#xff0…...

docker-compose安装nacos和msql

docker-compose安装nacos和msql 前言前提已经安装docker-compose&#xff0c;如果没有安装&#xff0c;则可以查看上面系列文章中的安装教程。并且文章中使用的是mobaxterm连接虚拟机。 1、下载2、创建并运行 前言 前提已经安装docker-compose&#xff0c;如果没有安装&#x…...

AnythingLLM:基于RAG方案构专属私有知识库(开源|高效|可定制)

一、前言 继OpenAI和Google的产品发布会之后&#xff0c;大模型的能力进化速度之快令人惊叹&#xff0c;然而&#xff0c;对于很多个人和企业而言&#xff0c;为了数据安全不得不考虑私有化部署方案&#xff0c;从GPT-4发布以来&#xff0c;国内外的大模型就拉开了很明显的差距…...

常见的工作流编排引擎

常见工作流框架&#xff1a;微服务编排引擎 工作流框架还是比较多的&#xff0c;按照语言分类的话&#xff0c;有 Java: jBPM、Activiti、SWF PHP: Tpflow、PHPworkflow Go: Cadence&#xff08;Cadence由Uber开发并开源&#xff0c;Maxim Fateev是Cadence的主架构师&#…...

期末总复习(重点!!!)

一、第6章异常处理 1、什么是异常、什么是异常处理异常是指程序在运行过程中发生的错误事件&#xff0c;影响程序的正常执行。异常并不是一定会发生&#xff0c;默认情况下&#xff0c;程序运行中遇到异常时将会终止&#xff0c;并在控制台打印出异常出现的堆栈信息。异常处理…...

input 获取焦点后样式的修改

一、实现目标 1.没有获取焦点时样子 2.获取焦点时 代码&#xff1a; <input class"input"placeholder"请输入关键字" input"loadNode" />css .input {border-radius: 14px;border:1px solid #e4e4e4;margin: 5px;margin-top: 10px;wi…...

持续集成交付CICD:Jenkins使用GitLab共享库实现自动上传前后端项目Nexus制品

目录 一、实验 1.GitLab本地导入前后端项目 2.Jenkins新建前后端项目流水线 3.Sonarqube录入质量阈与质量配置 4.修改GitLab共享库代码 5.Jenkins手动构建前后端项目流水线 6.Nexus查看制品上传情况 7.优化代码获取RELEASE分支 8.优化Jenkins流水线项目名称 一、实验 …...

50mA、24V、超低 IQ、低压降稳压器

一、Description The TPS715 low-dropout (LDO) voltage regulators offer the benefits of high input voltage, low-dropout voltage, low-power operation, and miniaturized packaging. The devices, which operate over an input range of 2.5 V to 24 V, are stable wit…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...