美文网首页
android开发:与蓝牙的第一次接触

android开发:与蓝牙的第一次接触

作者: 夏广成 | 来源:发表于2017-03-10 12:13 被阅读164次

    这里先奉上google的官方开发文档,因为本文目前所涉及到的大部分知识点都是从这篇文章中学到的,同时也强烈建议看到这篇文章的你,能够抽空看看这篇文档:https://developer.android.google.cn/guide/topics/connectivity/bluetooth.html


    蓝牙开发从无到有:

    蓝牙开发分为两种,一种是传统蓝牙开发,耗电量比较大。另一种是android4.3中引入的低功耗蓝牙开发。无论是哪一种,都要从无到有,从少到多的渐进开发。本文主要介绍通过在android.bluetooth包下的api的帮助下,通过设置蓝牙,查找蓝牙设备,连接设备,以及在设备间传输数据,来实现一个类似于客户端服务器这样的一个Demo。

    需求:

    拥有两台android手机,安装app,按照操作提示,一台选择服务器,一台选择客户端,客户端通过蓝牙连接服务器,并在按下发送按钮的时候,将用户填写在EditText中的信息,发送到服务器。服务器接受并显示在屏幕上。

    一:权限

    如果我们想使用蓝牙开发,那么以下的这两个权限一定要在Manifest中申请。

    “android.permission.BLUETOOTH”
    "android.permission.BLUETOOTH_ADMIN"
    

    第一个权限是用来请求蓝牙连接,传输数据。第二个权限用来启动设备发现和操作蓝牙设置。

    二:设置蓝牙

    1:蓝牙入口,要从android.bluetooth包中的BluetoothAdapter说起。BluetoothAdapter是所有蓝牙交互的入口点。利用它可以发现,查询蓝牙设备。那么如何获取到BluetoothAdapter呢?有两种方法:

    //第一种
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    //第二种 需要api 18以上才可以
    BluetoothManager bluetoothManager= (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter();
    

    2:启用蓝牙,当我们拿到bluetoothAdapter不为null时,如果为null,很不幸,你的手机不支持蓝牙。否则就可以通过下面这段代码判断并开启蓝牙。其中isEnabled是用来判断蓝牙是否已经开启。开启蓝牙,是通过系统的intent来实现。intent通过设置一个名为BluetoothAdapter.ACTION_REQUEST_ENABLE的action,将会打开system activity,而在这个system activity中,将会提示用户应用将会开始蓝牙,是否开启。如果允许开启,就会返回RESLUT_OK,如果拒绝或者其他错误就返回RESULT_CANCELED。

    private final int REQUEST_ENABLE_BLUETOOTH=201;
    if (!mBluetoothAdapter.isEnabled()) {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BLUETOOTH);
    }
    

    3:查找设备,这是一个蓝牙扫描的过程,需要注意三点:
    (1):当我们配对传递数据时,一定要记住关闭查找。因为扫描查找是一个很费资源的过程,如果在传递数据时开启,可能会导致传递失败。
    (2):蓝牙设备仅在其当前已启用可检查性时才会响应发现请求,当我们的设备发现其他的设备时,会收到被发现设备等mac地址,设备名称等。这些信息保存在android.bluetooth包下的BluetoothDevice中。
    (3):建立首次设备连接,将会自动显示配对请求。配对完成后,信息将会被系统保存,下次可以直接通过mac地址实现连接。

    4:配对设备,通过调用BluetoothAdapter中国年的getBondedDevices()方法,可以获取到已配对的蓝牙设备。如果目标设备已存在在列表中,那么我们可以直接通过此来执行连接操作。如果目标设别没有在已配对的蓝牙设备中,需要调用BluetoothAdapter中的startDiscovery()方法来发现设备。当我们连接设备时,需要调用

    mBluetoothAdapter.cancelDiscovery()
    

    关闭发现操作。

    5:启用可检测性,前面已经提到,只有当设备启动可检测性,才能被其他设备检测到。可检测性有一个持续时间,这个持续时间在android sdk 25版本中,和谷歌官方文档中有出入:

    谷歌官方文档.png
    sdk 25.png
    当用户允许设备设为可检测到时,返回的成功结果码是设置的持续时间,拒绝和错误是RESULT_CANCELED

    6:连接设备
    服务器和客户端分别以不同的方法获得BluetoothSocket。通过分别获得到的BluetoothSocket,服务端可以从中读取客户端发过来的数据,客户端可以通过其写入数据。
    (1)客户端获得BluetoothSocket关键代码

    //device 当客户端通过startDiscovery() 扫描设备,并且在广播中接受到手机扫描到的设备,
    //或者是通过getBondedDevices()得到了已经保存的设备时,都可以获得BluetoothDevice.
    //MY_UUID 是通过网络任意uuid生成器生成的字符串,然后通过UUID.fromString(string)得到。
    //这个MY_UUID需要服务端与客户端保持一致。
    BluetoothSocket mmSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
    

    (2) 服务端货的BluetoothSocket关键代码

    //Name 可以是任意字符串,当然也可以是包名
     BluetoothServerSocket   tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
    
    项目地址:

    https://github.com/fengfutong/BluetoothS2C

    您能读到这里,对我已是莫大鼓励,点个喜欢,请勿打赏####

    相关文章

      网友评论

          本文标题:android开发:与蓝牙的第一次接触

          本文链接:https://www.haomeiwen.com/subject/lruebttx.html