当前位置: 首页 > 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" />

http://www.lryc.cn/news/259370.html

相关文章:

  • 自定义Mybatis LanguageDriver性能优化
  • DevEco Studio 鸿蒙(HarmonyOS)项目结构
  • Springboot整合篇Druid
  • uniapp 微信小程序 封装axios 包含请求拦截、响应拦截、无感刷新令牌功能
  • C语言精选——选择题Day41
  • Tomcat头上有个叉叉
  • Linux shell编程学习笔记35:seq
  • Nougat:结合光学神经网络,引领学术PDF文档的智能解析、挖掘学术论文PDF的价值
  • 涉密网络的IP查询防护策略
  • 基础算法(1):排序(1):选择排序
  • GeoTrust OV证书
  • 第一个“hello Android”程序
  • docker-compose安装nacos和msql
  • AnythingLLM:基于RAG方案构专属私有知识库(开源|高效|可定制)
  • 常见的工作流编排引擎
  • 期末总复习(重点!!!)
  • input 获取焦点后样式的修改
  • 持续集成交付CICD:Jenkins使用GitLab共享库实现自动上传前后端项目Nexus制品
  • 50mA、24V、超低 IQ、低压降稳压器
  • 【Python测试开发】文件上传操作
  • 深兰科技AI医疗健康产品获3000台采购订单
  • 金鸣表格文字识别的图片转word,模块不同,效果有何差异?
  • Qt Creator设置IDE的字体、颜色、主题样式
  • SpringBootWeb入门、HTTP协议、Web服务器-Tomcat
  • 【Jenkins】Centos环境安装Jenkins(通过rpm安装)
  • 华为数通---配置基本QinQ示例
  • 利用poi实现将数据库表字段信息导出到word中
  • 深入浅出分析kafka客户端程序设计 ----- 生产者篇----万字总结
  • 粗到细语义(Coarse-to-Fine Semantics)
  • 小程序开发实战案例四 | 小程序标题栏如何设置