安卓蓝牙技术Bluetooth使用流程(Bluetooth详解)
一:蓝牙设备之间的通讯首要包含了四个进程
设置蓝牙设备
寻觅局域网内也许或许匹配的设备
衔接设备
设备之间的数据传输
二:详细编程完结
1. 发动蓝牙功用
首要经过调用静态办法getDefaultAdapter()获取蓝牙适配器BluetoothAdapter,假如回来为空,则无法继续执行了。例如安卓源码:
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter == null) { // Device does not support Bluetooth }
其次,调用isEnabled()来查询当时蓝牙设备的状况,假如回来为false,则表明蓝牙设备没有敞开,接下来你需求封装一个ACTION_REQUEST_ENABLE恳求到intent里面,调用startActivityForResult()办法使能蓝牙设备,例如:
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
2. 查找设备
运用BluetoothAdapter类里的办法,你能够查找远端设备(大约十米以内)或许查询在你手机上现已匹配(或许说绑定)的别的设备了。当然需求断定对方蓝牙设备现已敞开或许现已敞开了“被发现使能”功用(对方设备是能够被发现的是你能够建议衔接的前提条件)。假如该设备是能够被发现的,会反馈回来一些对方的设备信息,比方姓名、MAC地址等,运用这些信息,你的设备就能够挑选去向对方初始化一个衔接。
假如你是首次与该设备衔接,那么一个配对的恳求就会主动的显示给用户。当设备配对好今后,他的一些根本信息(首要是姓名和MAC)被保留下来并能够运用蓝牙的API来读取。运用已知的MAC地址就能够对远端的蓝牙设备建议衔接恳求。
匹配好的设备和衔接上的设备的不同点:匹配好仅仅阐明对方设备发现了你的存在,并具有一个一起的识别码,而且能够衔接。衔接上:表明当时设备同享一个RFCOMM信道而且两者之间能够交换数据。也即是是说蓝牙设备在树立RFCOMM信道之前,有必要是现已配对好了的。
3. 查询匹配好的设备
在树立衔接之前你有必要先查询配对好了的蓝牙设备集以便挑选一个设备进行通讯,例如你能够你能够查询一切配对的蓝牙设备,并运用一个数组适配器将其打印显示出来:
SetpairedDevices =mBluetoothAdapter.getBondedDevices(); // If there are paired devices
if (pairedDevices.size() > 0) {
//Loop through paired devices
for (BluetoothDevice device : pairedDevices) {
// Add the name and address to an array adapter to show in a ListView
mArrayAdapter.add(device.getName() + "\n" + device.getAddress()); }
}
树立一个蓝牙衔接只需求MAC地址就现已满足。
4. 扫描设备
扫描设备,只需求调用startDiscovery()办法,这个扫描的进程大约继续是12秒,应用程序为了ACTION_FOUND动作需求注册一个BroadcastReceiver来承受设备扫描到的信息。关于每一个设备,体系都会播送ACTION_FOUND动作。
// 用ACTION_FOUND为action注册播送接收器 private final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) {
String action = intent.getAction(); // 发现设备 if (BluetoothDevice.ACTION_FOUND.equals(action)) { // 从Intent中获取蓝牙设备 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // 增加姓名和地址到设备适配器中 mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
}
}
}; //注册播送接收器 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); //在onDestroy时记住刊出播送接收器
5. 使能被发现
假如你想使你的设备能够被别的设备发现,将ACTION_REQUEST_DISCOVERABLE动作封装在intent中并调用startActivityForResult(Intent, int)办法就能够了。它将在不使你应用程序退出的情况下使你的设备能够被发现。缺省情况下的使能时刻是120秒,当然你能够能够经过增加EXTRA_DISCOVERABLE_DURATION字段来改动使能时刻(最大不超越300秒)例如:
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivity(discoverableIntent);
运转该段代码今后,体系会弹出一个对话框来提示你发动设备使能被发现(此进程中假如你的蓝牙功用没有敞开,体系会帮你敞开),而且假如你预备对该远端设备发现一个衔接,你不需求敞开设备被发现功用,由于该功用仅仅在你的应用程序作为效劳器端的时分才需求。
6. 衔接设备
在应用程序中,想树立两个蓝牙设备之间的衔接,有必要完结客户端和效劳器端的代码(由于任何一个设备都有必要能够作为效劳端或许客户端)。一个敞开效劳来监听,一个建议衔接恳求(运用效劳器端设备的MAC地址)。当他们都具有一个蓝牙套接字在同一RFECOMM信道上的时分,能够以为他们之间现已衔接上了。效劳端和客户端经过不同的办法或别的们的蓝牙套接字。当一个衔接监听到的时分,效劳端获取到蓝牙套接字。当客户可翻开一个FRCOMM信道给效劳器端的时分,客户端获取到蓝牙套接字。
注意:在此进程中,假如两个蓝牙设备还没有配对好的,android体系会经过一个通知或许对话框的方式来通知用户。RFCOMM衔接恳求会在用户挑选之前堵塞。
7. 效劳端的衔接
当你想要衔接两台设备时,一个有必要作为效劳端(经过持有一个翻开的BluetoothServerSocket),目的是监听外来衔接恳求,当监听到今后提供一个衔接上的BluetoothSocket给客户端,当客户端从BluetoothServerSocket得到BluetoothSocket今后就能够毁掉BluetoothServerSocket,除非你还想监听更多的衔接恳求。
树立效劳套接字和监听衔接的根本进程:
首要经过调用listenUsingRfcommWithServiceRecord(String, UUID)办法来获取BluetoothServerSocket目标,参数String代表了该效劳的称号,UUID代表了和客户端衔接的一个标识(128位格局的字符串ID,相当于PIN码),UUID有必要两边匹配才能够树立衔接。
其次调用accept()办法来监听也许到来的衔接恳求,当监听到今后,回来一个衔接上的蓝牙套接字BluetoothSocket。
最后,在监听到一个衔接今后,需求调用close()办法来封闭监听程序。(通常蓝牙设备之间是点对点的传输)
注意:accept()办法不应该放在主Acitvity里面,由于它是一种堵塞调用(在没有监听到衔接恳求之前程序就一向停在那里)。解决办法是新建一个线程来办理。例如:
8. 客户端的衔接
为了初始化一个与远端设备的衔接,需求先获取代表该设备的一个BluetoothDevice目标。经过BluetoothDevice目标来获取BluetoothSocket并初始化衔接,详细进程:
运用BluetoothDevice目标里的办法createRfcommSocketToServiceRecord(UUID)来获取BluetoothSocket。UUID即是匹配码。然后,调用connect()办法来。假如远端设备接收了该衔接,他们将在通讯进程中同享RFFCOMM信道,而且connect回来。
注意:conncet()办法也是堵塞调用,通常树立一个独立的线程中来调用该办法。在设备discover进程中不应该建议衔接connect(),这么会显着减慢速度以至于衔接失败。且数据传输完结只要调用close()办法来封闭衔接,这么能够节约体系内部资源。
9. 办理衔接
当设备衔接上今后,每个设备都具有各自的BluetoothSocket。就能够完结设备之间数据的同享了。
首要经过调用getInputStream()和getOutputStream()办法来获取输入输出流。
然后经过调用read(byte[]) 和write(byte[]).办法来读取或许写数据。
完结细节:以为读取和写操作都是堵塞调用,需求树立一个专用线程来办理。
10. 权限设置
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permissionandroid:name="android.permission.BLUETOOTH" />
安卓蓝牙技术Bluetooth使用流程(Bluetooth详解)的更多相关文章
- 【转】ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解
原文地址:http://blog.csdn.net/a396901990/article/details/36475213 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量—— ...
- (转)CentOS系统启动流程图文详解
CentOS系统启动流程图文详解. 原文:http://www.linuxidc.com/Linux/2017-03/141966.htm 熟悉系统启动流程对于我们学习Linux系统是非常有帮助的,虽 ...
- ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解
简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGroup中的位置 3. ...
- Struts2-整理笔记(一)介绍、搭建、流程、详解struts.xml
Struts2是一种前端的技术框架 替代Servlet来处理请求 Struts2优势 自动封装参数 参数校验 结果的处理(转发|重定向) 国际化 显示等待页面 表单的防止重复提交 搭建框架:导 ...
- Mysql高手系列 - 第18篇:mysql流程控制语句详解(高手进阶)
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第18篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...
- struts2-环境搭建-访问流程-配置详解-常量配置-类详解
1 struts2概述 1.1 概念 1.2 struts2使用优势 自动封装参数 参数校验 结果的处理(转发|重定向) 国际化 显示等待页面 表单的防止重复提交 struts2具有更加先进的架构以 ...
- 【转】ANDROID自定义视图——onLayout源码 流程 思路详解
转载(http://blog.csdn.net/a396901990) 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局 ...
- JavaEE基础(04):会话跟踪技术,Session和Cookie详解
本文源码:GitHub·点这里 || GitEE·点这里 一.会话跟踪 1.场景描述 比如登录某个购物网站,身份识别成功后,在网站下单,支付 等操作,这些操作中当前登录用户信息必须是共享的,这样这些操 ...
- Gradle技术之四 - Gradle的Task详解
1 Gradle的Task详解 1 Task定义和配置 2 Task的执行 3 Task的依赖和执行顺序 4 Task类型 5 Task结合gradle的生命周期 6 Task实战 1.1 Task定 ...
随机推荐
- php include include_once require require_once 的区别与联系
一.require 与 include 的区别: The require() function is identical to include(), except that it handles er ...
- c#集合类的线程安全
即位于System.Collections命名空间下的集合,如Hashtable,ArrayList,Stack,Queue等.其均提供了线程同步的一个实现 集合线程同步的问题 public clas ...
- GML、SVG、VML的比较
转自:http://www.cnblogs.com/3echo/archive/2009/02/19/1394399.html GML.SVG和VML都是基于XML的可用来描述矢量图形的标记语言,都是 ...
- 查看ssh服务开启状态
root@dbaudit-desktop:/etc/init.d# /etc/init.d/ssh status * sshd is running 或者这样检查:root@dbaudit-deskt ...
- ModelSim仿真
(1)出现“Fatal: SDF files require Altera primitive library” 书上的方法是在ModelSim-SE下的使用,而我用的是ModelSim-Alter ...
- hive的安装步骤
在node2里安装一下hive1.2.1,步骤如下: 1.解压hive的安装包 2.改变目录:mv apache-hive-1.2.1-bin /home/install/hive-1.2 3.vi ...
- MFC之RTTI与动态创建
本人能力.精力有限,所言所感都基于自身的实践和有限的阅读.查阅,如有错误,欢迎拍砖,敬请赐教——博客园:钱智慧. 在说RTTI之前需要明白c++中类静态成员的初始化特点:类的静态数据成员需要在类体外显 ...
- eclipse svn安装
SVN插件下载地址及更新地址,你根据需要选择你需要的版本.现在最新是1.8.x Links for 1.8.x Release: Eclipse update site URL: http://sub ...
- Extjs 4.x 得到form CheckBox的值
CheckBox(复选框)主要用来接收用户选择的选项 如图所示(请忽略UI的不好看): 该弹出窗口的主要代码如下: var win = new Ext.Window({ modal : true, t ...
- c++学习_2
这里承接上一篇文章,继续记录关于继承的那些事儿... NVI(non-Virtual Interface)和strategy模式 NVI模式和strategy模式是两种不同的方法,可以用来替代virt ...