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. Xamarin iOS项目找不到模拟器

    Xamarin iOS项目找不到模拟器 在Visual Studio中,突然找不到模拟器,并且项目提示试用期过期:Trial period has expired.出现这种情况,是由于苹果系统中Xam ...

  2. Python - 字符和字符值之间的转换

    字符和字符值之间的转换 Python中, 字符和字符值, 直接的转换, 包含ASCII码和字母之间的转换,Unicode码和数字之间的转换; 也可以使用map, 进行批量转换, 输出为集合, 使用jo ...

  3. hdu 5961 传递 (2016ccpc 合肥站 A题)

    传递 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  4. luogu 6月月赛 E 「数学」约数个数和

    题面在这里! 第一眼感觉炒鸡水啊...只要把N质因数分解一下,因为k次约数相当于求k+2元一次方程的非负整数解,所以答案就是和每个质因子指数有关的一些组合数乘起来. 但是要用pillard's rho ...

  5. 【树形dp】Godfather

    [POJ3107]Godfather Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7212   Accepted: 253 ...

  6. SPOJ Time Limit Exceeded(高维前缀和)

    [题目链接] http://www.spoj.com/problems/TLE/en/ [题目大意] 给出n个数字c,求非负整数序列a,满足a<2^m 并且有a[i]&a[i+1]=0, ...

  7. Problem F: 调用函数,判断各位数字立方和是否等于它本身

    #include<stdio.h> #include<math.h> int is(int number)//定义函数 { ; ) { s=number%; sum=sum+p ...

  8. [原创]Java中字符串、数组、集合及JSONArray的长度属性

    前言:数组没有length()这个方法,有length的属性.String有有length()这个方法. 1.String字符串 String str = "abcdefg";st ...

  9. [转]Java中子类调用父类构造方法的问题分析

    在Java中,子类的构造过程中,必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来,通过什么手段做到的? 答案如下:    当你new一个子类对象的时候,必须首先要new一个 ...

  10. [典型漏洞分享]exported Android content provider引发的隐私泄露问题

    YS android手机APP对外开放多余的content provider,可任意增.删.改和查images数据库表格,导致隐私泄露 问题描述: YS android手机APP使用SQLITE数据库 ...