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性能优化
场景:高并发情况下mybatis 动态sql 解析 锁问题优化 优化前 并发测试 XMLLanguageDriver 类 的 createSqlSource 方法有锁 而且 每次执行时都会走该方法 优化前 : 线程有Block 优化后的 LanguageDriver public class CustomXMLLanguageDriver im…...
DevEco Studio 鸿蒙(HarmonyOS)项目结构
DevEco Studio 鸿蒙(HarmonyOS)项目结构 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、项目结构 创建简单的Hello World移动应用项目结构如下图 由上到下说明各个文件夹的作用 .hvigor:存…...
Springboot整合篇Druid
一、概述 1.1简介 Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。 它本身还自带一个监控平台,可以查看时时产生的sql、uri等监控数据,可以排查慢sql、慢请求࿰…...
uniapp 微信小程序 封装axios 包含请求拦截、响应拦截、无感刷新令牌功能
前言: 1、为什么不适用uniapp自带的请求功能? 答:uniapp自带的请求功能,再刷新了令牌后,重新请求返回的数据无法返回给发起请求的方法。也就是说,刷新令牌后重新发起的请求和第一次发起请求的方法是割裂的。…...
C语言精选——选择题Day41
第一题 1. 有以下程序段: char *p, *q; p (char *)malloc(sizeof(char) * 20); q p; scanf("%s %s", p, q); printf("%s %s\n", p, q); 若从键盘输入:abc def↙,则输出结果是( ) A:d…...
Tomcat头上有个叉叉
问题原因: 这是因为它就是个空的tomcat,并没有导入项目运行 解决方案: war模式:发布模式,正式发布时用,将WEB工程以war包的形式上传到服务器 war exploded模式:开发时用,将WEB工程的文件夹直接…...
Linux shell编程学习笔记35:seq
0 前言 在使用 for 循环语句时,我们经常使用到序列。比如: 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;就是一个整数序列 。 为了方便我们使用数字序列,Linux提供了…...
Nougat:结合光学神经网络,引领学术PDF文档的智能解析、挖掘学术论文PDF的价值
Nougat:结合光学神经网络,引领学术PDF文档的智能解析、挖掘学术论文PDF的价值 这是Nougat的官方存储库,Nougat是一种学术文档PDF解析器,可以理解LaTeX数学和表格。 Project page: https://facebookresearch.github.io/nougat/ …...
涉密网络的IP查询防护策略
涉密网络的安全性对于维护国家、企业及个人的核心利益至关重要。在当今数字化时代,网络攻击日益猖獗,其中IP查询是攻击者获取目标信息的一种常见手段。本文将探讨涉密网络中防护IP查询的关键策略,以确保网络的机密性和安全性。 1. 专用VPN和…...
基础算法(1):排序(1):选择排序
今天对算法产生了兴趣,开始学习基础算法,比如排序,模拟,贪心,递推等内容,算法是很重要的,它是解决某个问题的特定方法,程序数据结构算法,所以对算法的学习是至关重要的&a…...
GeoTrust OV证书
当谈到网站安全性和可信度时,GeoTrust OV证书是一个备受推崇的选择。作为一家备受尊敬的数字证书颁发机构,GeoTrust以其卓越的品牌声誉和高质量的产品而闻名于世。GeoTrust OV证书提供了一系列的安全功能,同时还具有出色的性价比,…...
第一个“hello Android”程序
1、首先安装Android studio(跳过) Android Studio是由Google推出的官方集成开发环境(IDE),专门用于Android应用程序的开发。它是基于JetBrains的IntelliJ IDEA IDE构建的,提供了丰富的功能和工具࿰…...
docker-compose安装nacos和msql
docker-compose安装nacos和msql 前言前提已经安装docker-compose,如果没有安装,则可以查看上面系列文章中的安装教程。并且文章中使用的是mobaxterm连接虚拟机。 1、下载2、创建并运行 前言 前提已经安装docker-compose,如果没有安装&#x…...
AnythingLLM:基于RAG方案构专属私有知识库(开源|高效|可定制)
一、前言 继OpenAI和Google的产品发布会之后,大模型的能力进化速度之快令人惊叹,然而,对于很多个人和企业而言,为了数据安全不得不考虑私有化部署方案,从GPT-4发布以来,国内外的大模型就拉开了很明显的差距…...
常见的工作流编排引擎
常见工作流框架:微服务编排引擎 工作流框架还是比较多的,按照语言分类的话,有 Java: jBPM、Activiti、SWF PHP: Tpflow、PHPworkflow Go: Cadence(Cadence由Uber开发并开源,Maxim Fateev是Cadence的主架构师&#…...
期末总复习(重点!!!)
一、第6章异常处理 1、什么是异常、什么是异常处理异常是指程序在运行过程中发生的错误事件,影响程序的正常执行。异常并不是一定会发生,默认情况下,程序运行中遇到异常时将会终止,并在控制台打印出异常出现的堆栈信息。异常处理…...
input 获取焦点后样式的修改
一、实现目标 1.没有获取焦点时样子 2.获取焦点时 代码: <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…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
FOPLP vs CoWoS
以下是 FOPLP(Fan-out panel-level packaging 扇出型面板级封装)与 CoWoS(Chip on Wafer on Substrate)两种先进封装技术的详细对比分析,涵盖技术原理、性能、成本、应用场景及市场趋势等维度: 一、技术原…...
