Android蓝牙开发

近期做蓝牙小车,须要Android端来控制小车的运动。以此文记录开发过程。

使用HC-06无线蓝牙串口透传模块。对于其它的蓝牙设备本文相同适用。


蓝牙开发的流程:


获取本地蓝牙适配器    ——>     打开蓝牙    ——>    搜索设备  ——>   连接设备  ——>   发送信息

首先为了避免以往我们先写入蓝牙权限:

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

要用到的蓝牙对象:

private BluetoothAdapter adapter = null;//用于获取蓝牙适配器
private BluetoothDevice mBtDevice = null;//用于获取蓝牙设备
private BluetoothSocket mBtSocket = null;//用于建立通信

获取蓝牙适配器:


adapter = BluetoothAdapter.getDefaultAdapter();

打开蓝牙:

boolean enabled = adapter.enable();
if(!enabled){
adapter.enable();
}

搜索设备:


adapter.startDiscovery();

搜索到的设备会以广播的形式返回,所以我们须要定义一个广播接收器:

private BroadcastReceiver blueRevever = new BroadcastReceiver(){

			@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if(action.equals(BluetoothDevice.ACTION_FOUND)){
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if(device.getBondState()!=BluetoothDevice.BOND_BONDED){
//获取未配对的设备名称和MAC地址
//依据搜索到的蓝牙设备的MAC地址,得到该设备
mBtDevice = adapter.getRemoteDevice(device.getAddress());
//假设设备名称是指定的设备则给出提示
if(device.getName().equals("HC-06")){
Toast.makeText(MainActivity.this,device.getName(),Toast.LENGTH_LONG).show();
}
}
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { Toast.makeText(MainActivity.this,"检測完成",Toast.LENGTH_LONG).show();
}
}}};

广播返回不同设备及其所处的状态。getAction()方法用于获取状态,BOND_BONDED表示是已经配对的状态。(注意配对和连接是两个全然不同的概念,配对成功并非连接成功,只配对成功不可以发送信息)

当然是用广播机制要注意注冊广播:
 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);

	    registerReceiver(blueRevever, filter);

	    filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

	    registerReceiver(blueRevever, filter);

连接设备:


由于堵塞连接会堵塞线程,所以我们须要重开一个新的线程用于建立连接:


private class clientThread extends Thread{
public void run(){
try {
//取消搜索设备的动作。否则接下来的设备连接会失败
adapter.cancelDiscovery();
//依据device获取socket
mBtSocket = mBtDevice.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
//连接socket
mBtSocket.connect();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(MainActivity.this,"连接失败!。。! ! ! !!!",Toast.LENGTH_LONG).show();
}
}
}


此处的UUID用于连接HC-06是可行的。其它的设备未測试
想使用时仅仅需创建一个clientThread对象,然后运行其run()方法就可以,例如以下:

//创建连接的进程
Thread mBtClientConnectThread = new clientThread();
//开启进程
mBtClientConnectThread.start();

发送信息:


public void sendMessageHandle(String msg)
{
if (mBtSocket == null)
{
Toast.makeText(MainActivity.this,"没有连接!。",Toast.LENGTH_LONG).show();
return;
} try {
OutputStream os = mBtSocket.getOutputStream();
os.write(msg.getBytes()); //发送出去的值为:msg
Toast.makeText(MainActivity.this,"发送成功! ! ",Toast.LENGTH_LONG).show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(MainActivity.this,"发送失败! !! 。!! !!! ",Toast.LENGTH_LONG).show();
}
}






此处的UUID用于连接HC-06是可行的,其它的设备未測试

Android蓝牙开发的更多相关文章

  1. Android 蓝牙开发(整理大全)

    Android蓝牙开发 鉴于国内Android蓝牙开发的例子很少,以及蓝牙开发也比较少用到,所以找的资料不是很全. (一): 由于Android蓝牙的通信都需要用到UUID,如果由手机发起搜索,当搜索 ...

  2. Android蓝牙开发教程(三)——蓝牙设备相互通讯

    在上一篇中已经介绍如何连接我们搜索到的蓝牙设备,如果你还没阅读过,建议先看看上一篇文章Android蓝牙开发教程(二)——连接蓝牙设备 在上一篇文章中,无论是自动连接还是被动连接,连接成功后,都是将获 ...

  3. Android 蓝牙开发(3)——蓝牙的详细介绍

    前面的两篇文章,主要是在 Android 官网关于蓝牙介绍的基础上加上自己的理解完成的.主要针对的是 Android 开发中的一些 API 的使用. 第一篇文章 Android 蓝牙开发(1) 主要是 ...

  4. Qt on Android 蓝牙开发

    版权声明:本文为MULTIBEANS ORG研发跟随文章,未经MLT ORG允许不得转载. 最近做项目,需要开发安卓应用,实现串口的收发,目测CH340G在安卓手机上非常麻烦,而且驱动都是Java版本 ...

  5. 【转】android蓝牙开发---与蓝牙模块进行通信--不错

    原文网址:http://www.cnblogs.com/wenjiang/p/3200138.html 近半个月来一直在搞android蓝牙这方面,主要是项目需要与蓝牙模块进行通信.开头的进展很顺利, ...

  6. Android 蓝牙开发

    今天给大家带来蓝牙开发的基础,主要展示的是程序搜到蓝牙会通过list展示出来,并实时排序,远近与信号强弱 首先我们要有次jar包 watermark/2/text/aHR0cDovL2Jsb2cuY3 ...

  7. android蓝牙开发---与蓝牙模块进行通信

    近半个月来一直在搞android蓝牙这方面,主要是项目需要与蓝牙模块进行通信.开头的进展很顺利,但因为蓝牙模块不在我这里,所以只能用手机测试.一开头就发现手机的蓝牙不能用,为了证明这点,我刷了四次不同 ...

  8. Android 蓝牙开发之搜索、配对、连接、通信大全

            蓝牙( Bluetooth®):是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据 交换(使用2.4-2.485GHz的ISM波段的UHF无线电波).蓝牙设备最 ...

  9. Android蓝牙开发浅谈(转)

    http://www.eoeandroid.com/thread-18993-1-1.html 对于一般的软件开发人员来说,蓝牙是很少用到的,尤其是Android的蓝牙开发,国内的例子很少     A ...

随机推荐

  1. 【UOJ #131】【NOI 2015】品酒大会

    http://uoj.ac/problem/131 求出后缀数组和height数组后,从大到小扫相似度进行合并,每次相当于合并两个紧挨着的区间. 合并区间可以用并查集来实现,每个区间的信息都记录在这个 ...

  2. [P4064][JXOI2017]加法(贪心+树状数组+堆)

    题目描述 可怜有一个长度为 n 的正整数序列 A,但是她觉得 A 中的数字太小了,这让她很不开心. 于是她选择了 m 个区间 [li, ri] 和两个正整数 a, k.她打算从这 m 个区间里选出恰好 ...

  3. 【记忆化搜索】codevs2823锁妖塔

    [codevs2823]锁妖塔 Description 琐妖塔会在一会儿后倒塌.大量妖魔涌出塔去,塔内的楼梯都挤满了人(哦,错了,是妖),(那他们怎么不飞下去--)要求是,景天一行一定要下塔,琐妖塔一 ...

  4. MySQL v5.7.18 版本解压安装

    下载MySQL https://dev.mysql.com/downloads/mysql/5.1.html#downloads 个人机子是64位的,所以选择下载:Windows (x86, 64-b ...

  5. Java字节码文件结构---概述

    一.Class文件的结构概述: 是一连串的字节流(以自节为基本单位划分),里面包含的数据项按照固定的次序依次排列组成Class文件,文件内部不含分割符 当数据项的长度大于1B时候,按照高位在前的方式存 ...

  6. HDU 5636 Shortest Path 暴力

    Shortest Path 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5636 Description There is a path graph ...

  7. 【java】LIst切割----划分 List为几个LIst的几种工具类 1.按照目标份数划分 2.按照目标容量划分 【适用场景:mybatis分批次In查询,放置In拼接sql过长】

    如题,示例代码如下: /** * 1> 按照份数---划分list * @param source * @param num 想要划分成多少份 * @return */ public stati ...

  8. sql语句 -- 倒序 升序

  9. mybatis批量操作-xml方式

    在实际项目中,我们一般都会用到批量insert.delete.update等操作,由于使用频率还是蛮高的,这里就做个简单的记录,供以后学习和参考. 批量insert 在数据库中,批量插入可以是多条in ...

  10. iview2.x版本升级3.x版本icon修改清单

    当前公司使用有一个旧项目的前端组件库是iview2.x,入职以来维护该项目过程中碰到2.x版本无数的坑. 最近需求不多,闲来无事把2.x升级到3.x版本了. 新版本除了网上轻易可查到的button组件 ...