事物的难度远远低于对事物的恐惧
完成对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实现数据传输(一)—下位机硬件配置

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

  1. 基于STM32F1单片机、ESP8266WIFI模块、DHT11温湿度传感的WIFI网络温湿度传输系统

    基于STM32F1单片机.ESP8266WIFI模块.DHT11温湿度传感的WIFI网络温湿度传输系统 功能说明 温湿度采集端 温湿度监控端 硬件材料 硬件连接 主要代码 温湿度采集端 温湿度监控端 ...

  2. STM32单片机与蓝牙模块HC-05通信数据帧处理

    本章将会详细讲述蓝牙模块(HC-05)和STM32单片机之间的通信收发的数据如何处理,在测试开始前首先在手机上下载好一个蓝牙调试APP,此APP可以是手机端和PC端口的,以我常用的手机端的为例. 在配 ...

  3. STM32单片机中WIFI模块数据传输问题(float->u32->u8/u8->u32->float)

    STM32单片机中WIFI模块数据传输问题(float->u32->u8/u8->u32->float)   最近在做毕业设计,在做wifi数据传输与接收时,涉及到了STM32 ...

  4. Android APP压力测试(二) 之Monkey信息自动收集脚本

    转载-原文地址:   http://www.cnblogs.com/findyou/p/3936063.html Android APP压力测试(二) 之Monkey信息自动收集脚本 前言: 本文重点 ...

  5. PIC单片机的AD数据传输和上位机C#串口界面实时显示

    PIC单片机的AD数据传输和上位机C#窗口界面实时显示 硬件:BK300开发板+PIC16F877A芯片+Pickit2 软件:MPLAB IDE v8.91.Visual Studio 2019 下 ...

  6. stm32 温湿度_基于STM32单片机大棚温湿度检测无线蓝牙APP控制设计

    本设计由STM32单片机+风扇控制电路+温湿度传感器电路+1602液晶显示电路+蓝牙模块电路+电源电路组成. 通过温湿度传感器检测温湿度,并在液晶上和APP上实时显示. 当湿度超过75度,APP发出报 ...

  7. 基于STM32单片机与wifi模块串口结合进行PC端或手机端无线通信(附项目资料包)

    项目所需材料: stm32f103系列最小系统开发板一块. WiFi模块. 具有WiFi功能的手机及PC机. 达普电池一包(或者学生电源一台).. 1k电阻4个,杜邦线若干. 一.硬件环境搭建 1.1 ...

  8. 单片机HC06蓝牙模块与手机APP

    学习HC06蓝牙模块遇到一些问题,特此写下作为记录. 用USB转TTL连接,插到电脑上,发AT怎么也不回 USB转TTL与蓝牙模块连接图 打开串口助手: 一开始用的是丁丁串口助手,发·AT不回OK. ...

  9. STM32单片机+LD3320语音识别模块+MP3模块或者nsy8266语音合成模块制作的语音插座

    自己利用空闲时间,用32单片机和一些模块做了一个语音插座,既有12V直流电输出,也有两路220交流输出(其中一路可以支持高低档切换,实现原理就是在两个继电器中间串一个1N5408二极管).本制作语音插 ...

最新文章

  1. class反编译成java_Spring Tools Suite(STS)安装反编译插件
  2. 主板支持最大内存查看软件
  3. C语言条件编译及编译预处理阶段
  4. Python 面向监狱编程,就靠它了
  5. 【Linux系统编程】进程间通信之命名管道
  6. SpringMVC的请求-获得请求参数-获得POJO类型参数
  7. 【报告分享】2021上半年短视频及电商生态研究报告.pdf(附下载链接)
  8. C++ multimap 用法总结 例子
  9. BZOJ3156 防御准备
  10. 计算机cad名词解释,CAD全部名词解释
  11. KYLO的JVM知识总结
  12. 如何填写台式计算机参数,教你如何看懂电脑各配置参数
  13. vmware下ubuntu从图形界面切换到控制台的快捷键
  14. 【COCI 2011】送票
  15. 改进杂草算法求解WSN节点分布优化问题
  16. 学习高博SLAM(1)
  17. GitHub重磅官宣!我总结了所有面试题,快来收藏!
  18. Buffer Overflow Vulnerability Prediction from x86 executables using Static Analysis and ML
  19. 有限体积法(10)——格式精度与待定系数法
  20. 洛阳理工JAVA期末考试_洛阳理工学院2010/2011学年第一学期基础体育理论期末考试试题答案...

热门文章

  1. 2021年中国互联网企业100强出炉(附全名单)
  2. RS笔记:传统推荐模型之FFM (引入特征域的概念) [2015 Criteo]
  3. 微信二次开发sdk非ipad/android协议(很好用)
  4. Java~大厂面试八股文~强烈推荐视频
  5. 第十三届蓝桥杯C++B组国赛D题——最大数字(AC)
  6. 柠檬班接口测试Tomcat+MySQL测试环境搭建
  7. 重定向时,将Unreal4骨骼调整为Tpose
  8. 解决Android Studio等开发软件出现更新TKK失败的两种方案
  9. Beyond Compare实现Class文件对比
  10. 百度网盘怎么批量改名(包含子文件夹)