STM32单片机通过ESP8266WiFi模块与Android APP实现数据传输(二)---上位机搭建

news/2024/11/30 20:51:17/

事物的难度远远低于对事物的恐惧
完成对STM32单片机和ESP8266 WiFi模块的配置之后,接下来需要完成Android APP代码的编写以及实现。

1.添加网络权限

因为我们需要对WiFi进行操作,所以需要网络的权限,在AndroiManifest.xml文件中加入以下代码:

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

2.建立TCP连接

首先通过文本输入控件得到IP地址和端口号,然后建立Socket连接。

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;

上述代码是通过按钮点击事件获得到IP地址和端口号,然后通过创建一个ConnectThread类对象并调用里面的run()方法实现TCP连接。该类的代码如下:

private class ConnectThread extends Thread {private String ip;private int port;public ConnectThread(String ip, int port) {this.ip = ip;this.port = port;}@Overridepublic void run() {try {mSocket = new Socket(ip, port);out = new PrintStream(mSocket.getOutputStream());mBufferedReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));runOnUiThread(new Runnable() {@Overridepublic void run() {mBtn_turn.setText("断开");Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();}});} catch (IOException e) {e.printStackTrace();runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();}});}}}

在run()方法中不仅建立了连接,而且还获得了该连接的输出流对象 out (用于APP向单片机发送数据)和输入流对象 mBufferedReader (用于APP接收单片机发来的数据)。

3.APP发送数据

在上文中得到了输出流对象 out,利用它的print()和flush()方法完成数据的发送,代码如下:

case R.id.btn_send:final String str = mSend_text.getText().toString();if (str != null && out != null) {new Thread(new Runnable() {@Overridepublic void run() {out.print(str);out.flush();}}).start();}break;

4.APP接收数据

在这里本文使用了定时器,设置每隔一段时间就去判断数据输入流对象mBufferedReader的方法ready(),从而得知是否有数据到来了,如果有就存入到一个全局变量中,然后通过Handler对象发送消息,进而实现在UI线程中更新TextView控件,代码如下:

private class ReceiveDataTask extends TimerTask {@Overridepublic 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;}}

消息处理代码如下:

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

开启定时器和关闭定时器代码如下:

    @Overrideprotected void onStart() {super.onStart();startTimer();}@Overrideprotected void onStop() {super.onStop();stopTimer();}

现在就可以实现了数据的互相传输。

STM32单片机和Android APP源代码免费获取方式:
在这里插入图片描述

下位机硬件配置可以参考这个文章:
STM32单片机通过ESP8266WiFi模块与Android APP实现数据传输(一)—下位机硬件配置


http://www.ppmy.cn/news/35862.html

相关文章

python@调用系统命令行@os.system@subprocess@标准输入输出@sys.stdin@sys.stdout@input@print

文章目录python调用系统命令行os.system标准输入输出sys.stdinsys.stdoutinputprint概要os.systemdemoswindows命令解释器ComSpecsubprocessrecommended&#x1f388;基本用法demos标准输入输出sys.stdininput()sys.stdin.inputinput()交互模式小结sys.stdoutsys.stdout.wirte(…

pyhon部署注意事项

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

HTML5 Web SQL数据库

HTML5 Web SQL 数据库 Web SQL 是在浏览器上模拟数据库&#xff0c;可以使用 JS 来操作 SQL 完成对数据的读写。 Web SQL 数据库 API 并不是 HTML5 规范的一部分&#xff0c;但是它是一个独立的规范&#xff0c;引入了一组使用 SQL 操作客户端数据库的 APIs。 如果你是一个 …

[golang gin框架] 10.Gin 商城项目介绍

一.商城项目介绍 1.详细功能介绍图 2.数据库 ER 图 需要用到的数据表举例 二.MVC架构搭建以及执行流程分析 1.关于 MVC 模式的简单介绍 Gin 不是一个 MVC 的框架&#xff0c;所有的代码都可以写在 main.go 中。当我们的项目比较大的时候&#xff0c; 所有代码写在一个文件里面…

如何将pdf大小压缩?怎么缩小pdf的文件大小?

PDF文件常常会因为内容的多样和丰富而导致文件过大&#xff0c;这个时候我们可以选择将pdf压缩大小&#xff0c;这样即使你的电脑中有大量PDF文档也不怕占用太多内存啦&#xff0c;今天分享给大家的是使用pdf在线压缩工具进行pdf压缩&#xff08;https://www.yasuotu.com/pdfya…

GPT-4 介绍

1 简介 本文根据openAI的2023年3月的《GPT-4 Technical Report 》翻译总结的。 原文地址&#xff1a;https://arxiv.org/pdf/2303.08774.pdf 原文确实没有GPT-4 具体的模型结构&#xff0c;openAI向盈利组织、非公开方向发展了。也没透露硬件、训练成本、训练数据、训练方法等…

基于OpenCV的图片和视频人脸识别

目录 &#x1f969;前言 &#x1f356;环境使用 &#x1f356;模块使用 &#x1f356;模块介绍 &#x1f356;模块安装问题: &#x1f969;人脸检测 &#x1f356;Haar 级联的概念 &#x1f356;获取 Haar 级联数据 &#x1f357; 1.下载所需版本 &#x1f357; 2.安…

原神 Android 教程 —安卓版

准备材料 一台能读写 /system 分区的 Android 手机(或:一台安装了 Magisk 的 Android 手机) 有人搞出来免root端了,此条件不再必须私服客户端