一:蓝牙设备之间的通讯首要包含了四个进程

设置蓝牙设备
寻觅局域网内也许或许匹配的设备
衔接设备
设备之间的数据传输

二:详细编程完结

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详解)的更多相关文章

  1. 【转】ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解

    原文地址:http://blog.csdn.net/a396901990/article/details/36475213 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量—— ...

  2. (转)CentOS系统启动流程图文详解

    CentOS系统启动流程图文详解. 原文:http://www.linuxidc.com/Linux/2017-03/141966.htm 熟悉系统启动流程对于我们学习Linux系统是非常有帮助的,虽 ...

  3. ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解

    简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGroup中的位置 3. ...

  4. Struts2-整理笔记(一)介绍、搭建、流程、详解struts.xml

    Struts2是一种前端的技术框架 替代Servlet来处理请求   Struts2优势 自动封装参数 参数校验 结果的处理(转发|重定向) 国际化 显示等待页面 表单的防止重复提交   搭建框架:导 ...

  5. Mysql高手系列 - 第18篇:mysql流程控制语句详解(高手进阶)

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第18篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...

  6. struts2-环境搭建-访问流程-配置详解-常量配置-类详解

    1 struts2概述 1.1 概念  1.2 struts2使用优势 自动封装参数 参数校验 结果的处理(转发|重定向) 国际化 显示等待页面 表单的防止重复提交 struts2具有更加先进的架构以 ...

  7. 【转】ANDROID自定义视图——onLayout源码 流程 思路详解

    转载(http://blog.csdn.net/a396901990) 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局 ...

  8. JavaEE基础(04):会话跟踪技术,Session和Cookie详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.会话跟踪 1.场景描述 比如登录某个购物网站,身份识别成功后,在网站下单,支付 等操作,这些操作中当前登录用户信息必须是共享的,这样这些操 ...

  9. Gradle技术之四 - Gradle的Task详解

    1 Gradle的Task详解 1 Task定义和配置 2 Task的执行 3 Task的依赖和执行顺序 4 Task类型 5 Task结合gradle的生命周期 6 Task实战 1.1 Task定 ...

随机推荐

  1. ActionBar官方教程(7)自定义操作项的view,如何得到它及处理它的事件

    Adding an Action View An action view is a widget that appears in the action bar as a substitute for ...

  2. 【PythonChallenge】Level 3

    题目为正则表达式,需要注意EXACTLY的含义,即AAAAxBBB中x不满足条件,但aAAAxBBBa却满足条件.使用perl解决此题,利用s///替换字母,循环读取整个源码文件,结果为linkedl ...

  3. Android开发之通过Intent启动其他App的Service

    在Android5.0以前可以通过隐式Intent方式启动其他App的Service,就跟Activity启动隐式Intent一样的. 但是在5.0以后,只能使用显示的Intent方式启动了. 启动其 ...

  4. scaleform 注意事项

    在使用 自带的UI .fla 里面的组建时 需要把自己建立的fla进行如下设置.  文件-发布设置-flash-脚本actionscript3.0设置——舞台:自动声明舞台实例    

  5. C#中的try catch finally

    try中的程序块是有可能发生错误的程序块,catch中的程序块是当发生错误的时候才会执行的代码块,finally中的程序块是无论是否发生错误都会执行的代码块. 示例程序: ? 1 2 3 4 5 6 ...

  6. C#面向对象编程实例-猜拳游戏

    1.需求 现在要制作一个游戏,玩家与计算机进行猜拳游戏,玩家出拳,计算机出拳,计算机自动判断输赢. 2.需求分析 根据需求,来分析一下对象,可分析出:玩家对象(Player).计算机对象(Comput ...

  7. struct ifreq结构体与ip,子网掩码,网关等信息

    总结一下,今天学习的关于通过socket,ioctl来获得ip,netmask等信息,其中很多内容参照了很多网上的信息,我会一一列出的 我用的这个函数,就是下面这个函数,其中的有一些全局变量,很好懂, ...

  8. oracle 物化视图及创建索引

    物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询.这样对整体 ...

  9. 只需三步:使用C# 操作 Azure 队列

    Step 1 : 安装windows Azure package Step 2 : 配置文件增加: <appSettings> <add key="StorageConne ...

  10. ubuntu下git安装及连接github

    1.安装 sudo apt-get install git git-core git-gui git-doc git-svn git-cvs gitweb gitk git-email git-dae ...