热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

android实现手机与单片机蓝牙模块通信

这篇文章主要为大家详细介绍了android实现手机与单片机蓝牙模块通信的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了android实现手机与单片机蓝牙模块通信的具体代码,供大家参考,具体内容如下

我是参考原博客的内容去写的,由于原博客写的不全,少了关键的几个类,然后我就凭借自己扎实的功底补出来了,现在蓝牙工作正常,能发能收!在看这边文章之前你要先了解一下蓝牙的工作状态,我的代码里面可能解释的不是很详细,但是我自己是能看懂的!

package com.example.fsl.bluetooth; 
 
import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothSocket; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Handler; 
import android.os.Message; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.ProgressBar; 
import android.widget.TextView; 
import android.widget.Toast; 
 
import java.util.ArrayList; 
import java.util.List; 
import java.util.UUID; 
 
public class MainActivity extends AppCompatActivity { 
 private Toolbar toolbar; 
 private TextView status; 
 private StringBuilder mstringbuilder; 
 private static final UUID MY_UUID=UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");//没有用到 
 BluetoothReceiver receiver; 
 BluetoothAdapter mBtAdapter; 
 BluetoothSocket mBtSocket; 
 private BlueToothTool client; 
 private ListView mListView; 
 private List ListDevice; 
 private ArrayAdapter mAdapter; 
 private Button mbutton; 
 private EditText editText; 
 private ProgressBar progressBar; 
 private LoopProgressBar loopProgressBar; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_main); 
 toolbar=(Toolbar)findViewById(R.id.toolbar); 
 status=(TextView)findViewById(R.id.textView2); 
 mListView=(ListView)findViewById(R.id.listView); 
 mbutton=(Button)findViewById(R.id.button); 
 editText=(EditText)findViewById(R.id.editText); 
 progressBar=(ProgressBar)findViewById(R.id.progressBar); 
 progressBar.setVisibility(View.INVISIBLE); 
 loopProgressBar=(LoopProgressBar)findViewById(R.id.loop); 
 ListDevice=new ArrayList(); 
 mstringbuilder=new StringBuilder(); 
 setSupportActionBar(toolbar); 
 enablebluetooth(); 
 mbutton.setOnClickListener(new View.OnClickListener() { 
 @Override 
 public void onClick(View v) { 
 BlueToothTool.WriteTask W=client.new WriteTask(editText.getText().toString()); 
 W.start(); 
 } 
 }); 
 mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
 @Override 
 public void onItemClick(AdapterView<&#63;> parent, View view, int position, long id) { 
 mBtAdapter.cancelDiscovery();//停止搜索 
 progressBar.setVisibility(View.INVISIBLE); 
 String str = ListDevice.get(position); 
 String macAdress = str.split("\\|")[1]; 
 BluetoothDevice device = mBtAdapter.getRemoteDevice(macAdress); 
 client=new BlueToothTool(device,handler); 
 try{ 
  client.connect(); 
 }catch (Exception e){ 
  e.printStackTrace(); 
 } 
 } 
 }); 
 } 
 
 /** 
 *开启蓝牙且被发现 
 */ 
 private void enablebluetooth(){ 
 mBtAdapter=BluetoothAdapter.getDefaultAdapter(); 
 
 /** 
 *if(!mBtAdapter.isEnabled()){这里可以先使能,可以在REQUEST_DISCOVERABLE处使能,这样的话可以连使能和请求被发现一块完成 
 // mBtAdapter.enable(); 
 Intent enableIntent=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
 startActivityForResult(enableIntent,REQUEST_ENABLE); 
 } 
 else { 
 show("蓝牙已开启"); 
 }*/ 
 Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
 enable.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); 
 startActivityForResult(enable, REQUEST_DISCOVERABLE); 
 } 
 
 /** 
 * 销毁事件,注销广播 
 */ 
 @Override 
 protected void onDestroy() { 
 unregisterReceiver(receiver); 
 super.onDestroy(); 
 } 
 private final Handler handler = new Handler() { 
 @Override 
 public void handleMessage(Message msg) { 
 switch (msg.what) { 
 case BlueToothTool.CONNECT_FAILED: 
  show("连接失败"); 
  try { 
  client.connect(); 
  } catch (Exception e) { 
  Log.e("TAG", e.toString()); 
  } 
  break; 
 case BlueToothTool.CONNECT_SUCCESS: 
  show("连接成功"); 
  mListView.setVisibility(View.INVISIBLE); 
  break; 
 case BlueToothTool.READ_FAILED: 
  show("读取失败"); 
  break; 
 case BlueToothTool.WRITE_FAILED: 
  show("写入失败"); 
  break; 
 case BlueToothTool.DATA: 
  mstringbuilder.append(msg.obj.toString()); 
  show(mstringbuilder.toString()); 
  break; 
 } 
 } 
 }; 
 /** 
 * 请求响应结果 
 * @param requestCode 
 * @param resultCode 
 * @param data 
 */ 
 @Override 
 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
 switch (requestCode){ 
 
 /** 
 *case REQUEST_ENABLE: 
 if(requestCode!= Activity.RESULT_OK){ 
  show("蓝牙未开启"); 
 } 
 else 
  show("蓝牙已开启"); 
 break;*/ 
 case REQUEST_DISCOVERABLE: 
 if(resultCode==Activity.RESULT_CANCELED){ 
  show("蓝牙未开启"); 
 } 
 else 
  show("蓝牙已开启"); 
 break; 
 default: 
  break; 
 } 
 } 
 public boolean onCreateOptionsMenu(Menu menu){ 
 getMenuInflater().inflate(R.menu.menu,menu); 
 return true; 
 } 
 private static final int REQUEST_ENABLE=1; 
 private static final int REQUEST_DISCOVERABLE=2; 
 
 /** 
 * 注册广播事件 
 */ 
 @Override 
 public void onResume(){ 
 super.onResume(); 
 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
 receiver = new BluetoothReceiver(); 
 registerReceiver(receiver, filter); 
 filter=new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
 registerReceiver(receiver,filter); 
 } 
 
 /** 
 * 广播 
 */ 
 private class BluetoothReceiver extends BroadcastReceiver { 
 @Override 
 public void onReceive(Context context, Intent intent) { 
 String action = intent.getAction(); 
 if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
 String str = device.getName() + "|" + device.getAddress(); 
 if (ListDevice.indexOf(str) == -1)// 防止重复添加 
  ListDevice.add(str); // 获取设备名称和mac地址 
 if (mAdapter != null) { 
  mAdapter.notifyDataSetChanged(); 
 } 
 showDevices(); 
 } 
 else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){ 
 progressBar.setVisibility(View.INVISIBLE); 
 show("已停止寻找"); 
 } 
 
 } 
 }; 
 /** 
 * 菜单栏点击事件 
 * @param item 
 * @return 
 */ 
 @Override 
 public boolean onOptionsItemSelected(MenuItem item) { 
 switch (item.getItemId()){ 
 case R.id.search: 
 if(!mBtAdapter.isEnabled()){ 
  show("蓝牙未开启"); 
 } 
 else { 
  mBtAdapter.startDiscovery(); 
  show("正在寻找设备"); 
  progressBar.setVisibility(View.VISIBLE); 
 } 
 break; 
 case R.id.about: 
 Toast.makeText(MainActivity.this,"关于我们",Toast.LENGTH_SHORT).show(); 
 break; 
 default: 
 } 
 return true; 
 } 
 private void showDevices() { 
 mAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, 
 ListDevice); 
 mListView.setAdapter(mAdapter); 
 } 
 /** 
 * 更新UI方法 
 * @param string 
 */ 
 private void show(final String string){ 
 runOnUiThread(new Runnable() { 
 @Override 
 public void run() { 
 status.setText(string); 
 } 
 }); 
 } 
}

 然后我的读任务和写任务以及连接任务是在另一个类里面实现的,也就是BlueToothTool类,这个类一个原博客是没有写的,只是MainActivity中用到了这个类的一些方法,但是没有给出,所以就让一些同学很蛋疼。我看完之后是自己补全的这个类!

package com.example.fsl.bluetooth; 
 
import android.app.Notification; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothSocket; 
import android.content.Context; 
import android.os.Handler; 
import android.os.Message; 
import android.support.v4.app.NotificationCompat; 
import android.util.Log; 
 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.lang.reflect.Method; 
 
import java.util.logging.LogRecord; 
 
/** 
 * Created by Fsl on 2017/12/22. 
 */ 
 
public class BlueToothTool { 
 private BluetoothDevice device; 
 private Handler mhandler; 
 BluetoothSocket socket; 
 static final int CONNECT_FAILED=1; 
 static final int CONNECT_SUCCESS=5; 
 static final int READ_FAILED=2; 
 static final int WRITE_FAILED=3; 
 static final int DATA=4; 
 private boolean isCOnnect=false; 
 
 public BlueToothTool(BluetoothDevice device,Handler handler){ 
 this.device=device; 
 this.mhandler=handler; 
 } 
 /** 
 *开辟连接线程任务 
 */ 
 public void connect(){ 
 Thread thread = new Thread(new Runnable() { 
 @Override 
 public void run() { 
 BluetoothSocket tmp = null; 
 Method method; 
 try { 
  method = device.getClass().getMethod("createRfcommSocket", new Class[]{int.class}); 
  tmp = (BluetoothSocket) method.invoke(device, 1); 
 } catch (Exception e) { 
  setState(CONNECT_FAILED); 
  Log.e("TAG", e.toString()); 
 } 
 socket = tmp; 
 try { 
  socket.connect(); 
  isCOnnect= true; 
  setState(CONNECT_SUCCESS); 
  Readtask readtask = new Readtask(); //连接成功后开启读取数据的线程 
  readtask.start(); 
 } catch (Exception e) { 
  setState(CONNECT_FAILED); 
  Log.e("TAG", e.toString()); 
 } 
 } 
 }); 
 new Thread(thread).start(); 
 } 
 /** 
 *开辟线程读任务 
 */ 
 public class Readtask extends Thread{ 
 @Override 
 public void run(){ 
 byte[] buffer = new byte[1024]; 
 int bytes; 
 InputStream inputStream ; //建立输入流读取数据 
 while (true) { 
 try { 
  inputStream = socket.getInputStream(); 
  if ((bytes = inputStream.read(buffer)) > 0) { 
  byte[] buf_data= new byte[bytes]; 
  for (int i = 0; i 

以上就是我的蓝牙与单片机连接通信的全过程,顺便说一下,这个连接是自动连接的,不需要什么秘钥什么的,直接搜索到HC-05蓝牙直接就可以确定连接,亲测有效。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
author-avatar
sysv
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有