zoukankan      html  css  js  c++  java
  • [原]BluetoothDevice详解

    一. BluetoothDevice简介

    1. 继承关系

    public static Class BluetoothDevice extends Object implement Parcelable

    该类实现了Parcelable接口, 实现了Parcelable接口的类的对象可以封装到Parcel对象中, 封装后的数据可以通过Intent或者IPC传递;


    实现Parcelable接口要点

    a. 实现writeTpParcl()方法 : 将数据写入到Parcel对象中;

    public void writeToParcel(Parcel out, int arg1)  {       // TODO Auto-generated method stub       out.writeBundle(this.mBundle);  }

    b. 实现describeContents()方法 : 

    public int describeContents()  {          // TODO Auto-generated method stub          return 0;  }

    c.实现Parcelable.Creator接口 : 

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {          public TrainInfo createFromParcel(Parcel in)          {              SampleBean ti=new SampleBean();              ti.mBundle=in.readBundle();              return ti;          }         public SampleBean[] newArray(int size)          {              return new SampleBean[size];          }  };


    2. 该类简介


    BluetoothDevice对象代表了一个远程的蓝牙设备, 通过这个类可以查询远程设备的物理地址, 名称, 连接状态等信息;


    对这个类的操作, 会执行在远程蓝牙设备的硬件上.


    对象获取途径 : 

    a. 调用BluetoothAdapter的getRemoteDevice(address)方法获取物理地址对应的该类对象;

    b. 调用BluetoothAdapter的getBoundedDevices()方法, 可以获取已经配对的蓝牙设备集合;


    3. 需要权限


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

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


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


    二 API详解


    1. 常量介绍


    广播的小规律 : 根据广播的名称可以猜测广播的类型, 如果广播常量名称后面带着ED, 是过去时, 那么这个广播是需要注册接收的广播, 如ACTION_DISCOVERY_STARTED, 这是蓝牙设备开始搜索发出的广播;

    如果广播常量名称不是ED结尾的, 那么这个是可以自己发送的广播, 例如蓝牙开启广播 : ACTION_REQUEST_ENABLE(蓝牙可用), ACTION_REQUEST_DISCOVERABLE(蓝牙可见); 


    低级连接与高级连接 : ACL连接是低级连接, RFCOMM, L2CAP等连接是高级连接; 高级别的连接基于低级别的连接;


    (1)ACL连接相关广播常量


    ACL连接 : 该连接是一种低级别的连接, ACL连接通过Android蓝牙栈自动进行管理;


    String ACTION_ACL_CONNECTED : android.bluetooth.device.action.ACL_CONNECTED,与远程设备建立了ACL连接发出的广播, 包含EXTRA_DEVICE附加域, 该附加域中存放的是BluetoothDevice对象, 需要BLUETOOTH权限;


    String ACTION_ACL_DISCONNECTED : android.bluetooth.device.action.ACL_DISCONNECTED,与远程设备断开ACL连接后发出的广播, 包含EXTRA_DEVICE附加域, 需要BLUETOOTH权限;


    String ACTION_ACL_DISCONNECT_REQUESTED : android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED, 底层发出断开连接请求,ACL连接即将断开; 友好的断开连接时都会发出这个广播, 低级连接即将断开的时候, 应该马上中断高级连接; 需要BLUETOOTH权限;


    (2)远程设备的其它广播常量


    String ACTION_BOND_STATE_CHANGED : android.bluetooth.device.action.BOND_STATE_CHANGED, 远程蓝牙设备状态改变的时候发出这个广播, 例如设备被匹配, 或者解除配对; 该广播包含的附加域有 : EXTRA_DEVICE, EXTRA_BOND_STATE, EXTRA_BOND_PREVIOUS_STATE; 需要BLUETOOTH权限;


    String ACTION_CLASS_CHANGED : android.bluetooth.device.action.CLASS_CHANGED, 一个远程设备的绑定状态发生改变时发出广播, 该广播附加域有 EXTRA_DEVICE, EXTRA_BOND_STATE; 需要BLUETOOTH权限;


    String ACTION_FOUND : android.bluetooth.device.action.FOUND,发现一个远程设备的时候发出该广播; 这个广播总是包含EXTRA_DEVICE, EXTRA_CLASS附加域, 如果这个蓝牙可用的话, 还会包含EXTRA_NAME, EXTRA_RSSI附加域; 需要BLUETOOTH权限;


    String ACTION_NAME_CHANGED : android.bluetooth.device.action.NAME_CHANGED,远程蓝牙设备的名称被发现改变 或者 第一次发现远程蓝牙设备的名称的时候发出该广播, 该广播包含附加域 EXTRA_DEVICE , EXTRA_NAME附加域; 需要BLUETOOTH权限;


    (3)绑定状态常量


    已绑定 : intBOND_BONDED , 值为12; 远程设备已经匹配; 本地存储了一个该远程设备的共享连接, 本地设备和远程设备之间的通信可以被认证和加密; 这个连接不是已经连接成功, 时刻保持连接状态, 这个连接的作用是, 下次连接的时候不用再次建立新的蓝牙连接;


    绑定中 : intBOND_BONDING, 值为11; 本地设备与远程设备正在匹配中;

     

    未匹配 : intBOND_NONE, 值为10; 本地设备与远程设备没有连接, 本地不存在与远程设备共享的连接, 设备间的通信不能被认证和加密;


    (4)附加域常量


    绑定状态 : StringEXTRA_BOND_STATE, int附加域, 值为android.bluetooth.device.extra.BOND_STATE, 这个附加域是ACTION_BOND_STATE_CHANGED的附加域, 可能的值为 BOND_BONDED, BOND_BONDING, BOND_NONE;


    上一个绑定状态 : StringACTION_PREVIOUS_BOND_STATE, int附加域, 存放远程设备绑定状态, 值为"android.bluetooth.device.extra.PREVIOUS_BOND_STATE", 该附加域是ACTION_BOND_STATE_CHANGED广播的附加域;


    BluetoothClass : StringEXTRA_CLASS, Parcelable BluetoothClass附加域, 存放BluetoothClass对象; 值为android.bluetooth.device.extra.CLASS, 这个附加域是ACTION_FOUND , ACTION_CLASS_CHANGED 广播的附加域;


    BluetoothDevice : StringEXTRA_DEVICE, Parcelable BluetoothDevice附加域, 存放BluetoothDevice对象, 值为"android.bluetooth.device.extra.DEVICE",  几乎该类中的每个广播都有该附加域;


    蓝牙名称 : StringEXTRA_NAME, 蓝牙名称附加域, 存放蓝牙名称, 值为"android.bluetooth.device.extra.NAME", 这个附加域是ACTION_NAME_CHANGED , ACTION_FOUND广播的附加域;


    信号强度 : StringEXTRA_RSSI, 短整型附加域, 存放远程设备信号强度值; 值为"android.bluetooth.device.extra.NAME";


    2. 公共方法介绍


    (1)封装到Parcel方法

    public void writeToParcel (Parcel out, int flags)
    作用 : 将对象写出到Parcel对象中, 这是实现的Parcelable接口的方法

    参数 : out , 要封装到的目的对象; flags , 对象如何被写入的附加标志;


    (2)描述内容

    public int describeContents ()
    作用 : 实现Parcelable接口;


    (2)建立BluetoothSocket连接

    public BluetoothSocket createRfcommSocketToServiceRecord (UUID uuid)


    作用 : 创建BluetoothSocket连接对象, 该方法创建的BluetoothSocket连接对象与 BluetoothAdapter的listenUsingRfcommWithServiceRecord方法创建的BluetoothServerSocket连接是对应的, 调用BluetoothSocket对象的connect()方法创建一个连接, 通过UUID执行对应信道的SDP查找动作; 


    如果两个安卓手机之间进行连接需要生成专用的UUID, 如果是对蓝牙串口进行连接, 就使用总所周知的SPP UUID 00001101-0000-1000-8000-00805F9B34FB


    参数 : 用来识别远程蓝牙设备的UUID, 该UUID用来查询RFCOMM通道的服务记录;

    返回值 : 创建的BluetoothSocket连接对象


    (3)比较方法

    public boolean equals (Object o)
    作用 : 比较调用该方法的对象与 o 对象, 如果相等, 返回true, 反之返回false;

    参数 : 对比的对象

    返回值 : 如果两个对象相等, 返回true, 反之返回false;


    (4)获取蓝牙地址

    public String getAddress ()
    作用 : 返回设备的蓝牙地址, 这个蓝牙地址是17位的, 并且字母都是大写字母;


    (5)获取蓝牙类

    public BluetoothClass getBluetoothClass ()
    作用 : 获取远程设备的蓝牙类, 需要BLUETOOTH权限, 如果出现错误, 返回null;


    (6)获取设备的绑定状态

    public int getBondState ()

    作用 : 获取远程设备的状态, 可能会是BOND_BONDED, BOND_BONDING, BOND_NONE中的一个;


    (7)获取设备的蓝牙名称

    public String getName ()

    作用 : 获取远程的蓝牙设备名称


    (8)获取哈希值

    public int hashCode ()

    作用 : 获取哈希值, 可以重写这个方法


    (9)字符串方法

    public int hashCode ()
    作用 : 默认情况下返回的蓝牙的物理地址;









    ,









    ,





    ,


  • 相关阅读:
    BZOJ 3205 [Apio2013]机器人 ——斯坦纳树
    BZOJ 3782 上学路线 ——动态规划 Lucas定理 中国剩余定理
    HDU 1423 Greatest Common Increasing Subsequence ——动态规划
    BZOJ 3309 DZY Loves Math ——莫比乌斯反演
    POJ 1038 Bugs Integrated, Inc. ——状压DP
    POJ 3693 Maximum repetition substring ——后缀数组
    POJ 2699 The Maximum Number of Strong Kings ——网络流
    POJ 2396 Budget ——有上下界的网络流
    BZOJ 4650 [Noi2016]优秀的拆分 ——后缀数组
    源码安装python
  • 原文地址:https://www.cnblogs.com/java20131201/p/3472369.html
Copyright © 2011-2022 走看看