Android蓝牙通讯【转】

本文转载自:http://blog.csdn.net/vnanyesheshou/article/details/51554852

随着可穿戴设备的流行,研究蓝牙是必不可少的一门技术了。

总结了下蓝牙开发使用的一些东西分享一下。

首先需要AndroidManifest.xml文件中添加操作蓝牙的权限。

<uses-permissionandroid:name="Android.permission.BLUETOOTH" />

允许程序连接到已配对的蓝牙设备。

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

允许程序发现和配对蓝牙设备。

操作蓝牙主要用到的类 BluetoothAdapter类,使用时导包

import android.bluetooth.BluetoothAdapter;

源码具体位置frameworks/base/core/Java/android/bluetooth/BluetoothAdapter.java

 

BluetoothAdapter 代表本地设备的蓝牙适配器。该BluetoothAdapter可以执行基本的蓝牙任务,例如启

动设备发现,查询配对的设备列表,使用已知的MAC地址实例化一个BluetoothDevice类,并创建一个

BluetoothServerSocket监听来自其他设备的连接请求。

获取蓝牙适配器

[java] view plain copy

print?

  1. BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

开启蓝牙

[java] view plain copy

print?

  1. if(!mBluetoothAdapter.isEnabled()){
  2. //弹出对话框提示用户是后打开
  3. Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
  4. startActivityForResult(enabler, REQUEST_ENABLE);
  5. //不做提示,直接打开,不建议用下面的方法,有的手机会有问题。
  6. // mBluetoothAdapter.enable();
  7. }

获取本地蓝牙信息

[java] view plain copy

print?

  1. //获取本机蓝牙名称
  2. String name = mBluetoothAdapter.getName();
  3. //获取本机蓝牙地址
  4. String address = mBluetoothAdapter.getAddress();
  5. Log.d(TAG,"bluetooth name ="+name+" address ="+address);
  6. //获取已配对蓝牙设备
  7. Set<BluetoothDevice> devices = mBluetoothAdapter.getBondedDevices();
  8. Log.d(TAG, "bonded device size ="+devices.size());
  9. for(BluetoothDevice bonddevice:devices){
  10. Log.d(TAG, "bonded device name ="+bonddevice.getName()+" address"+bonddevice.getAddress());
  11. }

打印:

[java] view plain copy

print?

  1. D/MainActivity(16800): bluetooth name =Coolpad 8297 address =18:DC:56:D2:30:BD
  2. D/MainActivity(16800): bonded device size =1
  3. D/MainActivity(16800): bonded device name =小米手机 addressF8:A4:5F:02:B1:8F

搜索设备

mBluetoothAdapter.startDiscovery();

开始搜索设备,该过程是异步的,通过下面注册广播接受者,可以监听是否搜到设备。

[java] view plain copy

print?

  1. IntentFilter filter = new IntentFilter();
  2. //发现设备
  3. filter.addAction(BluetoothDevice.ACTION_FOUND);
  4. //设备连接状态改变
  5. filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
  6. //蓝牙设备状态改变
  7. filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
  8. registerReceiver(mBluetoothReceiver, filter);

监听扫描结果

[java] view plain copy

print?

  1. private BroadcastReceiver mBluetoothReceiver = new BroadcastReceiver(){
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. String action = intent.getAction();
  5. Log.d(TAG,"mBluetoothReceiver action ="+action);
  6. if(BluetoothDevice.ACTION_FOUND.equals(action)){//每扫描到一个设备,系统都会发送此广播。
  7. //获取蓝牙设备
  8. BluetoothDevice scanDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
  9. if(scanDevice == null || scanDevice.getName() == null) return;
  10. Log.d(TAG, "name="+scanDevice.getName()+"address="+scanDevice.getAddress());
  11. //蓝牙设备名称
  12. String name = scanDevice.getName();
  13. if(name != null && name.equals(VnApplication.BLUETOOTH_NAME)){
  14. mBluetoothAdapter.cancelDiscovery();
  15. //取消扫描
  16. mProgressDialog.setTitle(getResources().getString(R.string.progress_connecting));                   //连接到设备。
  17. mBlthChatUtil.connect(scanDevice);
  18. }
  19. }else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
  20. }
  21. }
  22. };

mBlthChatUtil.connect(scanDevice)连接到设备,

此方法中主要是获取socket客户端,并连接。

BluetoothSocket  mmSocket = device.createRfcommSocketToServiceRecord(MY_UUID);

mmSocket.connect();

当然有客户端就有服务端了,服务端应先开启,并一直等待客户端连接。直到连接成功。

[java] view plain copy

print?

  1. private class AcceptThread extends Thread {
  2. // serverSocket
  3. private final BluetoothServerSocket mServerSocket;
  4. public AcceptThread() {
  5. BluetoothServerSocket tmp = null;
  6. // 创建一个新的侦听服务器套接字
  7. try {
  8. tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
  9. } catch (IOException e) {
  10. Log.e(TAG, "listen() failed", e);
  11. }
  12. mServerSocket = tmp;
  13. }
  14. public void run() {
  15. if (D) Log.d(TAG, "BEGIN mAcceptThread" + this);
  16. setName("AcceptThread");
  17. BluetoothSocket socket = null;
  18. // 循环,直到连接成功
  19. while (mState != STATE_CONNECTED) {
  20. try {
  21. // 这是一个阻塞调用和将只返回一个
  22. // 成功的连接或例外
  23. socket = mServerSocket.accept();
  24. } catch (IOException e) {
  25. Log.e(TAG, "accept() failed", e);
  26. break;
  27. }
  28. // 如果连接被接受
  29. if (socket != null) {
  30. synchronized (BluetoothChatUtil.this) {
  31. switch (mState) {
  32. case STATE_LISTEN:
  33. case STATE_CONNECTING:
  34. // 正常情况。启动连接螺纹。
  35. connected(socket, socket.getRemoteDevice());
  36. break;
  37. case STATE_NONE:
  38. case STATE_CONNECTED:
  39. // 没有准备或已连接。socket终止。
  40. try {
  41. socket.close();
  42. } catch (IOException e) {
  43. Log.e(TAG, "Could not close unwanted socket", e);
  44. }
  45. break;
  46. }
  47. }
  48. }
  49. }
  50. if (D) Log.i(TAG, "END mAcceptThread");
  51. }
  52. }

当连接成功后,connected(mmSocket, mmDevice); 获取输入输出流,从而进行通信。

private  InputStream mmInStream = socket.getInputStream();

private  OutputStream mmOutStream =socket.getOutputStream();

mmOutStream.write(buffer);发送信息。

mmInStream.read(buffer); 收到消息。

有时候扫描不到设备,需要设备蓝牙可见,这样才能被搜索到。

设置蓝牙可见性

[java] view plain copy

print?

  1. Intent discoveryIntent = new Intent(
  2. BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
  3. discoveryIntent.putExtra(
  4. BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);//时间300s,
  5. startActivity(discoveryIntent);

demo下载

时间: 2024-10-14 05:46:51

Android蓝牙通讯【转】的相关文章

android 蓝牙通讯编程 备忘

1.启动App后: 判断->蓝牙是否打开(所有功能必须在打牙打开的情况下才能用) 已打开: 启动代码中的蓝牙通讯Service 未打开: 发布 打开蓝牙意图(系统),根据Activity返回进场操作 打开成功,启动代码中的蓝牙通讯Service 用户点back或失败 退出App 2.蓝牙设备列表: 2.1显示已经配对列表: 注册蓝牙设备发现广播 广播中将发现的设备添加到列表2.2当用户点Scan时,启动蓝牙发现,发现设备时会收到广播事件. 2.3用户点某个条目时,将改条目的 MAC返回给主Act

Android bluetooth介绍(二): android 蓝牙代码架构及其uart 到rfcomm流程

关键词:蓝牙blueZ  UART  HCI_UART H4  HCI  L2CAP RFCOMM  版本:基于android4.2之前版本 bluez内核:linux/linux3.08系统:android/android4.1.3.4作者:xubin341719(欢迎转载,请注明作者,请尊重版权谢谢)欢迎指正错误,共同学习.共同进步!!一.Android Bluetooth Architecture蓝牙代码架构部分(google 官方蓝牙框架) Android的蓝牙系统,自下而上包括以下一些

[Android]蓝牙系统

1.1 蓝牙技术简介 蓝牙(Bleuetooth)原是十世纪统一了丹麦的一个国王的名字,现取其"统一"的含义,用来意在统一无线局域网通讯的标准的蓝牙技术.蓝牙技 术是爱立信,IBM,Intel等世界5家著名大公司在1998年联合推出的一项无线通讯规范.随后成立的蓝牙技术特殊兴趣组织(SIG)来负责该技术的 开发和技术协议的制定,如今全世界已有1800多家公司加盟该组织,最近微软公司也正式加盟并成为SIG组织的领导成员之一.它以低成本的近距离无线连接 为基础,为移动通信设备建立一个短程无

Android蓝牙开发入门

目录: 1. 蓝牙简史,现状 2. 蓝牙的应用场景 3. 蓝牙相关概念 4. Android蓝牙开发 1. 蓝牙简史: 蓝牙( Bluetooth)是一种无线技术标准,可以实现短距离(通常是几米范围之内)的无线通信.蓝牙技术始于1994年,迄今已经发展了超过20年.本质上它和其它几种射频通信技术类似,比如手机移动通信,近场通信技术(NFC),都是通过电磁波来实现不同设备的信息交换.区别在于无线电波的频率和发射功率不一样,从而传输距离也不一样. 2. 蓝牙的应用场景: l 移动电话和免提设备之间的

深入了解Android蓝牙Bluetooth——《基础篇》

什么是蓝牙? ??也可以说是蓝牙技术.所谓蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,是由爱立信公司公司发明的.利用"蓝牙"技术,能够有效地简化掌上电脑.笔记本电脑和移动电话手机等移动通信终端设备之间的通信,也能够成功地简化以上这些设备与因特网Internet之间的通信,从而使这些现代通信设备与因特网之间的数据传输变得更加迅速高效,为无线通信拓宽道路. 蓝牙版本的介绍 ??蓝牙发展至今经历了8个版本的更新.1.1.1.2.2.0.2.1.3.0.4.0.4.1.4.2

深入了解Android蓝牙Bluetooth ——《总结篇》

在我的上两篇博文中讲解了有关android蓝牙的认识以及API的相关的介绍,蓝牙BLE的搜索,连接以及读取. 没有了解的童鞋们请参考: 深入了解Android蓝牙Bluetooth--<基础篇> 深入了解Android蓝牙Bluetooth--<进阶篇> 目前项目中的效果图: 接下来我们就对蓝牙BLE4.0进行一下总结. 蓝牙API Android ble 蓝牙4.0,也就是说API level >= 18,且支持蓝牙4.0的手机才可以使用,如果手机系统版本API level

Android蓝牙4.0之玩爆智能穿戴、家具(二)【进阶篇】

闲话中心 这几天最大的事可能就是美国总统的上任,双十一,还有乐视股价了,乍一看,好像和我们没什么关系,其实肯定是有的了,要不然他也成不了新闻啊,有一点我们得改变,就是我们必须要希望我们自己国家的企业能过强大,我们必须支持他们,哪怕他做的不够好,这个问题其实就像一个国家一样,我们都知道许多政策是不合理的,或者说有很多制度是坑人的,但是我们不能因为这些而不爱我们的国家,那么企业也是一样,就拿乐视来说,股价跌了,公司遇到资金问题了,你看看这些媒体都在报道什么,全是负面消息,马上倒闭了,或者说是撑不住了

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

        蓝牙( Bluetooth®):是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据 交换(使用2.4-2.485GHz的ISM波段的UHF无线电波).蓝牙设备最多可以同时和7个其它蓝牙设备建立连接,进 行通信,当然并不是每一个蓝牙都可以达到最大值.下面,我们从蓝牙的基本概念开始,一步一步开始了解蓝牙. 基本概念: 安卓平台提供对蓝牙的通讯栈的支持,允许设别和其他的设备进行无线传输数据.应用程序层通过安卓API来调用蓝牙的相关功 能,这些API使程序无线连接

Android 蓝牙通信

Android 蓝牙传文件比较常见,但是官方也给出了基于蓝牙通讯做了个聊天室的sample,BluetoothChat.有兴趣的可以下载看下,很有意思.通讯那块用了特殊的BluetoothSocket.思路跟一般socket通讯一样.必须有服务端和客户端.sample有三个类:BluetoothChat,BluetoothChatService,DeviceListActivity. BluetoothChat是主界面,可以看到聊天的内容,BluetoothChatService是功能类,实现了