Android-蓝牙(Bluetooth)

蓝牙(Bluetooth)

蓝牙(Bluetooth)是一种短距离的无线通信技术标准。

蓝牙协议

蓝牙协议分为4层,即核心替代层、电缆替代协议层、电话控制协议层和采纳的其他的协议层。这4种最重要的是核心协议层。蓝牙协议包括基带、链路管理、逻辑链路控制和适应协议四部分。其中链路管理(LMP)负责蓝牙组件间连接的建立。逻辑链路控制与适应协议(L2CAP)位于基带协议层上,属于数据链路层,是一个为高层传输和应用层协议屏蔽基带协议的适配协议。

蓝牙执行的操作

  1. 开关;
  2. 扫描;
  3. 获取已配对的设备;
  4. 连接通信(不同的协议发送不同的包)。

BluetoothAdapter

BluetoothAdapter代表了移动设备的本地的蓝牙适配器, 通过该蓝牙适配器可以对蓝牙进行基本操作。

BluetoothAdapter.getDefaultAdapter()//该静态方法可以获取该适配器

蓝牙权限

在AndroidManifest文件中添加需要的权限,高版本也需要动态授权:

android.permission.BLUETOOTH : 
允许程序连接到已配对的蓝牙设备,请求连接/接收连接/传输数据需要改权限, 主要用于对配对后进行操作;

android.permission.BLUETOOTH_ADMIN : 
允许程序发现和配对蓝牙设备, 该权限用来管理蓝牙设备, 有了这个权限, 应用才能使用本机的蓝牙设备, 主要用于对配对前的操作;

优先级 : BLUETOOTH权限是BLUETOOTH_ADMIN权限的前提, 如果没有BLUETOOTH权限,就不能使用BLUETOOTH_ADMIN权限;

蓝牙常量

开关状态值

蓝牙关闭    int STATE_OFF  //值为10,蓝牙模块处于关闭状态;

蓝牙打开中  int STATE_TURNING_ON //值为11,蓝牙模块正在打开;

蓝牙开启    int STATE_ON   //值为12,蓝牙模块处于打开状态

蓝牙开启中  int STATE_TURNING_OFF  //值为13,蓝牙模块正在关闭

蓝牙开关状态顺序STATE_OFF –> STATE_TURNING_ON –> STATE_ON –>STATE_TURNING_OFF –> STATE_OFF;

扫描状态值

无功能状态:int SCAN_MODE_NONE 
//值为20,查询扫描和页面扫描都失败,该状态下蓝牙模块既不能扫描其他设备,也不可见

扫描状态:  int SCAN_MODE_CONNECTABLE
 //值为21,查询扫描失效,页面扫描有效,该状态下蓝牙模块可以扫描其他设备,
 //从可见性来说只对已配对的蓝牙设备可见,只有配对设备才能主动连接本设备;

可见状态:  int SCAN_MODE_CONNECTABLE_DISCOVERABLE  
 //值为23,查询扫描和页面扫描都有效;

查询扫描功能:其它设备可以扫描到本设备,指的是可见性可见;
页面扫描功能:可以主动扫描其它设备;

蓝牙操作 请求的广播

开启蓝牙:

ACTION_REQUEST_ENABLE 打开蓝牙,值为android.bluetooth.adapter.action.REQUEST_ENABLE

Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, requestCode);
//可以在Activity中的onActivityResult()方法处理结果,如果蓝牙模块打开成功,则返回结果RESULT_OK;
// 如果蓝牙模块打开失败,则返回结果RESULT_CANCELED;
// 打开和关闭蓝牙模块,都可以通过ACTION_STATE_CHANCED广播来监听

蓝牙可见:

ACTION_REQUEST_DISCOVERABLE,使蓝牙可见,值为android.bluetooth.adapter.action.REQUEST_DISCOVERABLE,默认时间为120秒。

可以在广播中添加附加域,设置任意的可见时间,附加域为EXTRA_DISCOVERABLE_DURATION,需要蓝牙权限;

可以在Activity中的onActivityResult()方法中处理结果, 如果蓝牙模块设置可见成功, 则返回结果码RESULT_OK; 如果蓝牙模块设置可见失败, 则返回结果码RESULT_CANCELED;

Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300);
startActivityForResult(discoverableIntent,resultCode);

State状态有关的方法

State状态有关的方法

public static sychronized BluetoothAdapter getDefaultAdapter();
返回值:本地蓝牙适配器 BluetoothAdapter对象;

获取state状态方法

public int getState();
作用:获取是否可用

返回值:返回当前的State,STATE_ON, STATE_OFF, STATE_TURNING_ON, STATE_TURNING_OFF;

权限 : BLUETOOTH_ADMIN权限;

蓝牙是否可用

public boolean isEnable();
作用:获取当前设备蓝牙模块是否可用;
返回值:返回当前蓝牙模块是否可用,true可用,false不可用
权限 : BLUETOOTH_ADMIN权限;

打开蓝牙

public boolean enable();
作用:打开本地蓝牙适配器;
返回值:如果打开成功则返回true,如果打开失败则返回false;
权限 : BLUETOOTH_ADMIN权限;

关闭蓝牙

public boolean disable();
作用:关闭本地设备蓝牙;
返回值:如果关闭蓝牙成功,返回true;如果蓝牙关闭失败,返回false;
权限 : BLUETOOTH_ADMIN权限;

扫描相关的方法

开始扫描

public boolean startDiscovery();
作用:开始查找远程蓝牙设备,先进行12秒的查询扫描(被动可见),之后进行页面扫描(主动搜索);
搜索过成功不能尝试对远程蓝牙设备的连接,同时已连接的设备的带宽也会被压缩,等待时间变长;使用canceDiscovery()可以终止搜索;

返回值:如果成功返回true,失败返回false;

权限 : BLUETOOTH_ADMIN权限;

是否在扫描中

public boolean isDiscovering();
作用:是否正在搜索
返回值:如果设备正在搜索,返回true;如果设备没有进行蓝牙搜索,则返回false;
权限 : BLUETOOTH_ADMIN权限;

取消查找

public boolean cancelDiscovery();
作用:取消蓝牙搜索;在进行connect()方法的时候,必须调用这个方法,蓝牙搜索是一个服务进行,在搜索中的时候,不能进行连接;
返回值:如果取消成功,则返回true;如果取消失败,返回false;

获取扫描模式

public int getScanMode();
作用:获取当前蓝牙扫描模式;
返回值 : SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_DISCOVERABLE;

与蓝牙设备相关的方法

检查蓝牙地址

public boolean checkBluetoothAddress(String address);
作用 : 检查蓝牙地址是否合法, 蓝牙地址字母必须大写, 例如 : "00:43:A8:23:10:F0";
参数 : 17位的字符串, 例如 : "00:43:A8:23:10:F0";
返回值 : 如果蓝牙地址合法返回true, 反之返回false;

获取本地蓝牙地址

public String getAddress();
作用 : 返回本地蓝牙的MAC地址;
返回值 : 本地的硬件地址;

获取本地蓝牙名称

public String getName();
返回值 : 本地蓝牙设备的名称;

获取绑定的蓝牙集合

public Set<BluetoothDevice> getBoundedDevices();
作用 : 获取已经配对的蓝牙设备的集合, 如果蓝牙未被打开, 则返回null;

获取远程蓝牙设备

public BluetoothDevice getRemoteDevice(String address);
作用 : 根据蓝牙的物理地址获取远程的蓝牙设备, 如果地址不合法, 就会产生异常;
返回值 : 获取到的BluetoothDevice对象;

创建监听

publicBluetoothServerSocket listenUsingRfcommonWithServiceRecord(String name, UUID uuid);

作用 : 创建一个监听Rfcommon端口的蓝牙监听, 使用accept()方法监听, 并获取BluetoothSocket对象; 
该系统会根据一个服务名称(name)和唯一的识别码(uuid)来创建一个SDP服务, 远程蓝牙设备可以根据唯一的UUID来连接这个SDP服务器;

参数 : name : SDP服务器名称, UUID, SDP记录下的UUID;

返回值 : 正在监听蓝牙端口;

权限 : BLUETOOTH权限;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • 描述 最近公司有个项目,App从后台获取到数据,App连接打印机,将数据在打印机上打印。公司提供的测试设备是蓝牙打...
    So_ProbuING阅读 1,587评论 1 2
  • 普通蓝牙设备官方文档 Android 平台包含蓝牙网络堆栈支持,凭借此支持,设备能以无线方式与其他蓝牙设备交换数据...
    sydMobile阅读 69,169评论 5 44
  • 声明 普通蓝牙设备官方文档 Android 平台包含蓝牙网络堆栈支持,凭借此支持,设备能以无线方式与其他蓝牙设备交...
    bug喵喵阅读 603评论 0 0
  • 最近项目使用蓝牙,之前并没有接触,还是发现了很多坑,查阅了很多资料,说的迷迷糊糊,今天特查看官方文档。 说下遇到的...
    King9527阅读 1,692评论 0 1
  • 蓝牙 注:本文翻译自https://developer.android.com/guide/topics/conn...
    RxCode阅读 8,468评论 11 99