Android学习——蓝牙(Bluetooth)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengxu_kuangrexintu/article/details/82993950

蓝牙(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权限;

猜你喜欢

转载自blog.csdn.net/chengxu_kuangrexintu/article/details/82993950