彩世界平台-彩世界时时app-彩世界开奖app苹果下载

热门关键词: 彩世界平台,彩世界时时app,彩世界开奖app苹果下载

您的位置:彩世界平台 > 网站首页 > Android 蓝牙搜索,配对,连接发送数据

Android 蓝牙搜索,配对,连接发送数据

发布时间:2019-11-03 22:53编辑:网站首页浏览(52)

    星期三, 05. 九月 2018 02:03上午 - beautifulzzzz

    首先需要在清单配置里面添加两个权限:

    图片 1

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    

    1、前言

    上一篇讲了如何编译安装BlueZ-5,本篇主要在于玩BlueZ,用命令行去操作BLE设备:

    • [BlueZ] 1、Download install and use the BlueZ and hcitool on PI 3B+

    图片 2

    android里面蓝牙是通过BluetoothAdapter来进行操作的,所以首先我们需要获取到BluetoothAdapter的实例

    2、gatttool —— 老工具趟坑

    刚开始跟着 Get Started with Bluetooth Low Energy on Linux 操作gatttool,发现坑太多(主要原因是工具老了):

    采用sudo gatttool -b 4D:69:98:0E:91:5E -I去连接
    发现会报错:Error: connect error: Connection refused (111)
    最终参考LINK-11发现需要加random选项([#1](https://stackoverflow.com/questions/32947807/cannot-connect-to-ble-device-on-raspberry-pi))

    ➜  ~  sudo gatttool -b 4D:69:98:0E:91:5E -I
    [4D:69:98:0E:91:5E][LE]> connect
    Attempting to connect to 4D:69:98:0E:91:5E
    Error: connect error: Connection refused (111)
    [4D:69:98:0E:91:5E][LE]> exit
    ➜  ~  sudo gatttool  -t random  -b 4D:69:98:0E:91:5E -I
    [4D:69:98:0E:91:5E][LE]> connect
    Attempting to connect to 4D:69:98:0E:91:5E
    Connection successful
    [4D:69:98:0E:91:5E][LE]> 
    (gatttool:3104): GLib-WARNING **: Invalid file descriptor.
    

    过一回会10S自动断开,网上说这个工具老了,不建议用了([#2](https://www.spinics.net/lists/linux-bluetooth/msg67617.html)):

    There are new tools to use with GATT, bluetoothctl/bluetoothd is the preferred since with that you have GAP, etc, 
    but if want to use a stand alone tool then I suggest you use btgatt-client.
    

    图片 3

    //先获取BlueToothAdapter的实例
    BluetoothAdapter blueToothAdapter = BluetoothAdapter.getDefaultAdapter();
    

    3、bluetoothctl——NB的新工具

    命令行进入bluetoothctl操作环境([#6](https://mcuoneclipse.com/2016/12/19/tutorial-ble-pairing-the-raspberry-pi-3-model-b-with-hexiwear/))

    bluetoothctl
    

    我在手机上用lightblue模拟一个BLE设备ty_prod,之后对其service进行修改,调用scan on进行搜索还是老的,
    最终发现要先用remove移除之前的设备,之后再scan就会出现[NEW] Device 72:3B:E1:81:4E:4F ty_prod设备
    注: 用lightblue模拟的设备的MAC不是固定的
    注: 我发现在lightblue中无论怎么模拟BLE设备,一旦被连上搜索到的service都是IPone的

    [bluetooth]# devices
    Device 28:ED:6A:A0:26:B7 ty_prod
    Device 58:71:33:00:00:24 Bluetooth Keyboard
    Device 00:1A:7D:DA:71:0A SHEN-PC
    Device 94:87:E0:B3:AC:6F Mi Phone
    [bluetooth]# remove 28:ED:6A:A0:26:B7 
    ...
    [bluetooth]# scan on
    Discovery started
    [NEW] Device 72:3B:E1:81:4E:4F ty_prod
    [bluetooth]# scan off
    ...
    Discovery stopped
    [bluetooth]# connect 72:3B:E1:81:4E:4F
    Attempting to connect to 72:3B:E1:81:4E:4F
    [CHG] Device 72:3B:E1:81:4E:4F Connected: yes
    Connection successful
    [ty_prod]
    

    索性就用IPhone自带的服务做测试了~

    [ty_prod]# info
    Device 28:ED:6A:A0:26:B7 (public)
        Name: tuya_mdev_test
        Alias: tuya_mdev_test
        Appearance: 0x0040
        Icon: phone
        Paired: yes
        Trusted: no
        Blocked: no
        Connected: yes
        LegacyPairing: no
        UUID: Fax                       (00001111-0000-1000-8000-00805f9b34fb)
        UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
        UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
        UUID: Current Time Service      (00001805-0000-1000-8000-00805f9b34fb)
        UUID: Device Information        (0000180a-0000-1000-8000-00805f9b34fb)
        UUID: Battery Service           (0000180f-0000-1000-8000-00805f9b34fb)
        UUID: Vendor specific           (7905f431-b5ce-4e99-a40f-4b1e122d00d0)
        UUID: Vendor specific           (89d3502b-0f36-433a-8ef4-c502ad55f8dc)
        UUID: Vendor specific           (9fa480e0-4967-4542-9390-d343dc5d04ae)
        UUID: Vendor specific           (d0611e78-bbb4-4591-a5f8-487910ae4366)
    [CHG] Device 28:ED:6A:A0:26:B7 ServicesResolved: no
    [CHG] Device 28:ED:6A:A0:26:B7 Connected: no
    

    我们用Current Time Service,列出所有attributes操作如下:

    [tuya_mdev_test]# menu gatt
    [tuya_mdev_test]# list-attributes 28:ED:6A:A0:26:B7
    ...
    Primary Service
        /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041
        00001805-0000-1000-8000-00805f9b34fb
        Current Time Service
    Characteristic
        /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char0045
        00002a0f-0000-1000-8000-00805f9b34fb
        Local Time Information
    Characteristic
        /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char0042
        00002a2b-0000-1000-8000-00805f9b34fb
        Current Time
    Descriptor
        /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char0042/desc0044
        00002902-0000-1000-8000-00805f9b34fb
        Client Characteristic Configuration
    ...
    

    上面Current Time Service对应的服务如下图:

    图片 4

    我们选择Current Time进行操作UUID:0x2A2B

    [ty_prod]# select-attribute /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char0042
    [tuya_mdev_test:/service0041/char0042]# read
    Attempting to read /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char0042
    [CHG] Attribute /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char0042 Value:
      e2 07 09 05 01 24 11 03 f1 02                    .....$....      
      e2 07 09 05 01 24 11 03 f1 02                    .....$.... 
    [tuya_mdev_test:/service0041/char0042]# attribute-info
    Characteristic - Current Time
        UUID: 00002a2b-0000-1000-8000-00805f9b34fb
        Service: /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041
        Value:
      e2 07 09 05 01 2e 01 03 f5 02                    ..........      
        Notifying: yes
        Flags: read
        Flags: notify
    

    读出结果大致意思应该是:2018-9/5-1:36:17 周三

    读取一下0x180A的Device Information:

    [tuya_mdev_test:/service0006/char0007]# select-attribute /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0047/char004a
    [tuya_mdev_test:/service0047/char004a]# attribute-info
    Characteristic - Model Number String
        UUID: 00002a24-0000-1000-8000-00805f9b34fb
        Service: /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0047
        Flags: read
    [tuya_mdev_test:/service0047/char004a]# read
    Attempting to read /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0047/char004a
    [CHG] Attribute /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0047/char004a Value:
      69 50 68 6f 6e 65 36 2c 32                       iPhone6,2       
      69 50 68 6f 6e 65 36 2c 32                       iPhone6,2    
    

    当然写、使能notify也很简单,看help即可。最后断开连接、并退出!!!

    [tuya_mdev_test:/service0047/char004a]# disconnect 28:ED:6A:A0:26:B7
    Attempting to disconnect from 28:ED:6A:A0:26:B7
    [CHG] Device 28:ED:6A:A0:26:B7 ServicesResolved: no
    Successful disconnected
    [CHG] Device 28:ED:6A:A0:26:B7 Connected: no
    [bluetooth]# quit
    

    图片 5

    在搜索之前,我们可以先获取与我们配对过的设备

    LINKS

    [1].Cannot connect to BLE device on Raspberry Pi
    [2].Invalid file descriptor gatttool of bluez 5.32
    [3].Get Started with Bluetooth Low Energy on Linux
    [4].Reverse Engineering a Bluetooth Low Energy Light Bulb
    [5].Doing Bluetooth Low Energy on Linux
    [6].Tutorial: BLE Pairing the Raspberry Pi 3 Model B with Hexiwear

    图片 6

    @beautifulzzzz
    智能硬件、物联网,热爱技术,关注产品
    博客:http://blog.beautifulzzzz.com
    园友交流群:414948975
    
    //获取已经配对过的设备的集合
    Set<BluetoothDevice> bondedDevices = blueToothAdapter.getBondedDevices()
    

    但是想要获取到配对过的设备,我们必须是在

    //手机有蓝牙设备并且蓝牙是打开的
    blueToothAdapter != null && blueToothAdapter.isEnabled()
    

    下面我们谈一下蓝牙的<b>打开方式</b>,目前作者知道的方式有3种
    第一种:

    //强制打开蓝牙
    blueToothAdapter.enable();
    

    第二种:

    //会以dialog的形式打开一个activity,并且如果我们通过startActivityForResult的形式的话
    //还能查看蓝牙是否被打开,或者处理蓝牙被打开之后的操作
    //如果是result_ok的话那么是打开,反之打开失败
    startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE));
    

    第三种:

    //设置本地设备可以被其它设备搜索,可被搜索的时间是有限的,最多为300s
    //效果和第二种类似
    Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
    discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
    startActivity(discoverableIntent);
    

    <b>关闭蓝牙</b>我们可以调用

    blueToothAdapter.disable();
    

    接下来是<b>蓝牙搜索</b>
    首先如果想要开启蓝牙搜索,那么只需要调用

    blueToothAdapter.startDiscovery();
    

    但是我们该如何接收我们搜索到的设备呢,很明显当然是通过接收广播的形式来接收。所以我们应该自定义一个广播接收器,

    class BluetoothReceiver extends BroadcastReceiver {
    
            @Override
            public void onReceive(Context context, Intent intent) {
    
                if (intent.getAction().equals(BluetoothDevice.ACTION_FOUND)) {
                    Log.e(getPackageName(), "找到新设备了");
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                }
            }
        }
    

    如上代码,我们可以获取到搜索到的蓝牙设备。我们只需在代码里面注册这个广播接收器,在调用蓝牙的搜索方法,就能够进行蓝牙的搜索了。

    本文由彩世界平台发布于网站首页,转载请注明出处:Android 蓝牙搜索,配对,连接发送数据

    关键词:

上一篇:Windows程序设计:格式化对话框的宏图

下一篇:没有了