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

事物的难度远远低于对事物的恐惧
完成对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;
        }
        @Override
        public void run() {
            try {
                mSocket = new Socket(ip, port);
                out = new PrintStream(mSocket.getOutputStream());
                mBufferedReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mBtn_turn.setText("断开");
                        Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();
                    }
                });
            } catch (IOException e) {
                e.printStackTrace();
                runOnUiThread(new Runnable() {
                    @Override
                    public 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() {
                        @Override
                        public void run() {
                            out.print(str);
                            out.flush();
                        }
                    }).start();

                }
                break;

4.APP接收数据

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

private class ReceiveDataTask extends TimerTask {
        @Override
        public 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 {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1212:
                    mSend_text_dis.setText(readStrng);
                    break;
            }
        }
    }

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

    @Override
    protected void onStart() {
        super.onStart();
        startTimer();
    }

    @Override
    protected void onStop() {
        super.onStop();
        stopTimer();
    }

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/4184.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Liunx创建用户与授权大招以及Linux修改SSH端口

1、Liunx创建用户与授权 背景&#xff1a;大家个人建站学习的时候&#xff0c;经常会涉及到创建Linux用户&#xff0c;授权用户&#xff0c;网上一堆操作各种不好使&#xff0c;小编总结了一个最好用的写法供大家使用。 还有个人云服务遭受挖矿攻击的情况&#xff0c;建议大家也…

mac maven安装和配置本地仓库

首先我们需要下载&#xff1a;maven官网下载地址传送门 x.x.x-bin.zip(Windows系统的) 找到x.x.x-bin.tar.zip(mac系统的) 备注&#xff1a;下面的图截错了&#xff0c;抱歉 下载完成之后&#xff0c;可以在右下角的下载找到 然后双击这个 .zip 压缩包 &#xff0c;可以进行…

解决使用WinScp连接Ubantu系统失败的问题---SSH无法连接

起因 为了互通Linux系统和Windows系统的文件&#xff0c;以更好的实现文件管理和资源共享。 所以在查阅资料后&#xff0c;使用WinScp&#xff0c;WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端。它的主要功能就是在本地与远程计算机间安全的复制文件。winscp也可…

Python的23种设计模式(完整版带源码实例)

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; Python的23种设计模式 一 什么是设计模式 设计模式是面对各种问题进行提炼和抽象而形成的解决方案。这些设计方案是前人不断试验&…

猿创征文 | re:Invent 朝圣之路:“云“行业风向标

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; AWS 亚马逊云科技re:Invent全球大会 2022年亚马逊云科技re:Invent全球大会震撼来袭&#xff0c;即将于北京时间11月30日-12月2日在美国内华达州&#xff0c;拉斯维加斯…

【七】一文带你迅速掌握设计模式中的单例模式

1. 什么是设计模式 设计模式可以理解为就是一种固定套路&#xff0c;就好比你和对手下棋得时候&#xff0c;会有一些固定套路下法&#xff1b;而设计模式就是软件开发的棋谱~ 设计模式有很多种&#xff0c;接下来就介绍一种校招阶段&#xff0c;主要考察的两种设计模式: 单例…

centos 7安装mysql

今天在centos 7上安装mysql数据库&#xff0c;遇到了些问题以及解决方法&#xff0c;记录一下。1、下载mysql安装包wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm出现跟上面界面这样子&#xff0c;说明是ok的了&#xff0c;接下来&#xf…

LAMP架构之zabbix监控(2):zabbix基础操作

目录 一、zabbix监控节点添加和删除 &#xff08;1&#xff09;手动添加 &#xff08;2&#xff09;自动添加 &#xff08;3&#xff09;按照条件批量添加 &#xff08;4&#xff09;使用api工具进行管理 二、针对应用的zabbix监控 一、zabbix监控节点添加和删除 实验说明&a…

yolov5 优化系列(三):修改损失函数

1.使用 Focal loss 在util/loss.py中&#xff0c;computeloss类用于计算损失函数 # Focal lossg h[fl_gamma] # focal loss gammaif g > 0:BCEcls, BCEobj FocalLoss(BCEcls, g), FocalLoss(BCEobj, g)其中这一段就是开启Focal loss的关键&#xff01;&#xff01;&…

基于opencv的边缘检测方法

1、梯度运算 用OpenCV的形态变换&#xff08; 膨胀、腐蚀、开运算和闭运算&#xff09;函数morphologyEx 梯度运算即膨胀结果-腐蚀结果&#xff1a; 【注意】对于二值图像来说&#xff0c;必须是前景图像为白色&#xff0c;背景为黑色&#xff0c;否则需要进行反二值化处理 …

axios介绍和使用

简介 本文主要讲解axios的概念和基本使用。 axios时目前最流行的ajax封装库之一&#xff0c;用于很方便地实现ajax请求的发送。 支持的功能&#xff1a; 从浏览器发出 XMLHttpRequests请求。从 node.js 发出 http 请求。支持 Promise API。能拦截请求和响应。能转换请求和响…

中文文献怎么查找,带你了解中文文献查找途径及方法

在我们撰写论文和科研工作时经常会查找文献资料&#xff0c;今天带大家了解中文文献查找途径及方法。 查找中文文献常用网站有&#xff1a; 文献党下载器&#xff08;wxdown.org&#xff09;:是一个几乎整合了所有中外文献数据库资源的文献下载平台&#xff0c;因为资源最多&a…

手机(Android)刷NetHunter安装指南,无需ssh执行kali命令, NetHunter支持的无线网卡列表!

一、安装NetHunter 前提&#xff1a;确保手机已经root&#xff0c;已装上magisk。如果没有root&#xff0c;可用尝试magisk root 后执行此文 1、下载Nethunter&#xff1a;Get Kali | Kali Linux 然后push 到sdcard 里&#xff0c; 2、打开magisk&#xff0c;选择刚刚下好的…

【Python学习笔记】b站@同济子豪兄 用pytorch搭建全连接神经网络,对Fashion-MNIST数据集中的时尚物品进行分类

【Python学习笔记】原作b站同济子豪兄 用pytorch搭建全连接神经网络&#xff0c;对Fashion-MNIST数据集中的时尚物品进行分类 跟着b站同济子豪兄的视频自学写的代码&#xff0c;内容是用pytorch搭建全连接神经网络&#xff0c;对Fashion-MNIST数据集中的时尚物品进行分类 视频…

Spring整体架构包含哪些组件?

Spring是一个轻量级java开源框架。Spring是为了解决企业应用开发的复杂性而创建的&#xff0c;它使用基本的JavaBean来完成以前只可能由EJB完成的事情。 Spring的用途不仅限于服务器端的开发&#xff0c;从简单性、可测试性和松耦合的角度而言&#xff0c;任何java应用都可以从…

原神 Android 教程 —安卓版

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

小米应用商店上架app隐私不合规自查整改办法

目前各大应用商店都上线了上架app隐私合规检测机制&#xff0c;以小米应用商店为例&#xff0c;只有符合法律法规及应用隐私合规上架标准要求的app才能顺利上架并展示给用户下载使用。已上架app在巡检中如果发现不满足应用隐私合规要求的&#xff0c;也会被下架处理。app隐私不…

ActiveMQ(三)

协议配置 ActiveMQ 支持的协议有 TCP 、 UDP、NIO、SSL、HTTP(S) 、VM 这是activemq 的activemq.xml 中配置文件设置协议的地方 <transportConnector name"openwire" uri"tcp://0.0.0.0:61616?maximumCon nections1000&amp;wireFormat.maxFrameSiz…

利用摄影测量进行地形建模的介绍

一、前言 从一个地方到另一个地方的地球表面由连续和突然的海拔变化组成&#xff0c;个人和社会都必须应对这些变化。 水从高山和丘陵向下流&#xff0c;从溪流流入河流&#xff0c;形成三角洲&#xff0c;最终汇入大海。 三维 (3D) 地面信息的获取和表示一直是与行星表面相关的…

RK3568平台开发系列讲解(调试篇)Linux 内核的日志打印

🚀返回专栏总目录 文章目录 一、dmseg 命令二、查看 kmsg 文件三、调整内核打印等级沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将 Linux 内核的日志打印进行梳理。 一、dmseg 命令 在终端使用 dmseg 命令可以获取内核打印信息,该命令的具体使用方法如下所…