澳门新葡亰app

澳门新葡亰app 4
澳门新葡亰app80端口占用
图片 1
安徽省二零一八年六月法定传染病疫情通报

Android BLE

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

澳门新葡亰app 1

@beautifulzzzz
智能硬件、物联网,热爱技术,关注产品
博客:http://blog.beautifulzzzz.com
园友交流群:414948975

EGL10

类:

BluetoothA2dp:那么些类提供调节Bluetooth( Bluetooth® 卡塔尔(英语:State of Qatar)A2DP profile的公共APIs

BluetoothAdapter:代表本地设备的蓝牙5.0adapter.
BluetoothAssignedNumbers:蓝牙( Bluetooth® 卡塔尔(英语:State of Qatar)分配号码

BluetoothClass:代表八个蓝牙( Bluetooth® 卡塔尔(英语:State of Qatar)类。它形容汇报了设施的相同特征(characteristics卡塔尔(قطر‎和本事(capabilities卡塔尔国

BluetoothClass.Device:定义全体设施类的常量

BluetoothClass.Device.Major:定义全部至关心珍重要道具类的常量

BluetoothClass.Service:定义全体服务类的常量

BluetoothDevice:代表一个长途Bluetooth设备

=============================================================================================

BluetoothGatt:蓝牙GATT
Profile的公共APIs

BluetoothGattCallback:这一个抽象类用于落实蓝牙( Bluetooth® 卡塔尔( Bluetooth® 卡塔尔Gatt回调

BluetoothGattCharacteristic:代表叁个蓝牙GATT Characteristic.

                                              多少个GATT
Characteristic是用来组织二个GATT
service,BluetoothGattService的着力数据成分

BluetoothGattDescriptor:代表二个Bluetooth( Bluetooth® 卡塔尔(قطر‎GATT Descriptor.

                                           GATT Descriptor饱含壹个GATT
characteristic,BluetoothGattCharacteristic的附加消息和属性.

Classes


BluetoothA2dp This class provides the public APIs to control the Bluetooth A2DP profile. 
BluetoothAdapter Represents the local device Bluetooth adapter. 
BluetoothAssignedNumbers Bluetooth Assigned Numbers. 
BluetoothClass Represents a Bluetooth class, which describes general characteristics and capabilities of a device. 
BluetoothClass.Device Defines all device class constants. 
BluetoothClass.Device.Major Defines all major device class constants. 
BluetoothClass.Service Defines all service class constants. 
BluetoothDevice Represents a remote Bluetooth device. 
BluetoothGatt Public API for the Bluetooth GATT Profile. 
BluetoothGattCallback This abstract class is used to implement BluetoothGatt callbacks. 
BluetoothGattCharacteristic Represents a Bluetooth GATT Characteristic

A GATT characteristic is a basic data element used to construct a GATT service,BluetoothGattService

BluetoothGattDescriptor Represents a Bluetooth GATT Descriptor

GATT Descriptors contain additional information and attributes of a GATT characteristic,BluetoothGattCharacteristic

BluetoothGattServer Public API for the Bluetooth GATT Profile server role. 
BluetoothGattServerCallback This abstract class is used to implement BluetoothGattServer callbacks. 
BluetoothGattService Represents a Bluetooth GATT Service

Gatt Service contains a collection of BluetoothGattCharacteristic, as well as referenced services. 

BluetoothHeadset Public API for controlling the Bluetooth Headset Service. 
BluetoothHealth Public API for Bluetooth Health Profile. 
BluetoothHealthAppConfiguration The Bluetooth Health Application Configuration that is used in conjunction with the BluetoothHealthclass. 
BluetoothHealthCallback This abstract class is used to implement BluetoothHealth callbacks. 
BluetoothManager High level manager used to obtain an instance of an BluetoothAdapter and to conduct overall Bluetooth Management. 
BluetoothServerSocket A listening Bluetooth socket. 
BluetoothSocket A connected or connecting Bluetooth socket. 

BluetoothGattServer:蓝牙( Bluetooth® 卡塔尔国GATT Profileserver剧中人物的公共APIs.

BluetoothGattServerCallback:那些抽象类用于贯彻BluetoothGattServer回调.

BluetoothGattService:代表三个BluetoothGATT Service.

================================================================================

BluetoothHeadset:调整蓝牙( Bluetooth® 卡塔尔(英语:State of Qatar)动铁耳机(Headset卡塔尔(英语:State of Qatar)服务的公共API.

BluetoothHealth:蓝牙Health
Profile的公共API.

BluetoothHealthAppConfiguration:The
Bluetooth Health Application
Configuration(配置)用来与BluetoothHealth类结合.

BluetoothHealthCallback:用于贯彻BluetoothHealth回调的抽象类

BluetoothManager:用来获取BluetoothAdapter的实例的经营管理者,举行完备的蓝牙5.0管理

BluetoothServerSocket:一个监听蓝牙( Bluetooth® 卡塔尔国的socket

BluetoothSocket:二个已连接或正在连接的蓝牙5.0socket.

注重术语和概念

Here is a summary of key BLE terms and concepts:
以下是有关BLE的第后生可畏术语和定义的摘要

  • Generic Attribute Profile (GATT)—The GATT profile is a general
    specification for sending and receiving short pieces of data known
    as “attributes” over a BLE link. All current Low Energy application
    profiles are based on GATT.
    通用属性配置文件(GATT)–通用属性配置文件是三个经过BLE链接发送或接纳短小一些数据或被称呼“属性”的通用规范。当前抱有的低耗能应用配置文件都依照GATT。

    • The Bluetooth SIG defines many profiles for Low Energy devices.
      A profile is a specification for how a device works in a
      particular application. Note that a device can implement more
      than one profile. For example, a device could contain a heart
      rate monitor and a battery level detector.
    • 蓝牙5.0本事结盟为低功耗设备定义了好些个从属文件。配置文件是二个在一定应用中设施怎么着行事的科班。请在意,叁个配备能够兑现四个布局文件。比如:一个设施得以包涵叁个心跳检查实验器和三个电量检查实验器
  • Attribute Protocol (ATT)—GATT is built on top of the Attribute
    Protocol (ATT). This is also referred to as GATT/ATT. ATT is
    optimized to run on BLE devices. To this end, it uses as few bytes
    as possible. Each attribute is uniquely identified by a Universally
    Unique Identifier (UUID), which is a standardized 128-bit format for
    a string ID used to uniquely identify information. The attributes
    transported by ATT are formatted as characteristics and services.
    属性公约(ATT)——GATT创立在质量公约(ATT)之上。那也被叫做GATT/ATT。ATT经过优化,可在BLE设备上运营。为此,它应用尽可能少的字节。每一个属性由通用唯风度翩翩标记符(UUID)唯生龙活虎标记,该标志符是用于唯意气风发标记消息的尺度128-bit格式的字符串ID。由ATT传输的品质被格式化为特征和劳动

  • Characteristic—A characteristic contains a single value and 0-n
    descriptors that describe the characteristic’s value. A
    characteristic can be thought of as a type, analogous to a class.
    性子——三个表征蕴涵贰个值和0至多个描述特征的汇报符。一个特征能够被感觉是生机勃勃种等级次序,相符于二个类。

  • Descriptor—Descriptors are defined attributes that describe a
    characteristic value. For example, a descriptor might specify a
    human-readable description, an acceptable range for a
    characteristic’s value, or a unit of measure that is specific to a
    characteristic’s value.
    汇报符——描述符是描述特征值的定义属性。举例:描述符可能能够钦点二个生人可读的描述,特征值的可采纳范围,或特征值特有的单位

  • Service—A service is a collection of characteristics. For example,
    you could have a service called “Heart Rate Monitor” that includes
    characteristics such as “heart rate measurement.” You can find a
    list of existing GATT-based profiles and services on
    bluetooth.org.
    服务——服务是贰特本性的晤面。比方:你可以利用二个叫做“心跳检查评定器”的劳动,在那之中包蕴“心跳衡量”等性子。你能够在bluetooth.org上找到一个已经存在的依据GATT的布署文件和服务的列表

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.

澳门新葡亰app 2

Qualcomm

关闭顾客端app

Once your app has finished using a BLE device, it should call close() so
the system can release resources appropriately:
设若你的应用程序完成使用BLE设备,它应当调用close(卡塔尔国,以便系统能够准确释放能源:

public void close() {
    if (mBluetoothGatt == null) {
        return;
    }
    mBluetoothGatt.close();
    mBluetoothGatt = null;
}

后记:本文翻译自google开拓者网站。链接如下:
https://developer.android.google.cn/guide/topics/connectivity/bluetooth-le.html
应接转发,但请尊重作者职业,留下本文后记
作者:Jaesoon
邮箱:jayyuz@163.com
日期:2017-09-17

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]

索性就用三星手机自带的服务做测验了~

[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相应的服务如下图:

澳门新葡亰app 3

咱俩筛选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

澳门新葡亰app 4

 

4.连连在别的设备上钦命的sockets

Key Terms And Concepts

1、前言

上一篇讲了怎么着编写翻译安吹嘘lueZ-5,本篇首要在于玩BlueZ,用命令行去操作BLE设备:

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

澳门新葡亰app 5

Use the
Daydream View controller and
headset

android.bluttooth

Closing the Client App

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

 

3.建立RFCOMM channels/sockets.

接收GATT通知

It’s common for BLE apps to ask to be notified when a particular
characteristic changes on the device. This snippet shows how to set a
notification for a characteristic, using the
setCharacteristicNotification() method:
当设备上一个一定的性状产生变动时,BLE应用去供给被公告很宽泛。这段代码展现了怎么通过运用setCharacteristicNotification(卡塔尔(قطر‎方法,去为一个表征设置二个通报:

private BluetoothGatt mBluetoothGatt;
BluetoothGattCharacteristic characteristic;
boolean enabled;
...
mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
...
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
        UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
mBluetoothGatt.writeDescriptor(descriptor);

Once notifications are enabled for a characteristic, an
onCharacteristicChanged() callback is triggered if the characteristic
changes on the remote device:
若是二个特色被使能布告,尽管远程设备上的这些特点发生了改观,一个onCharacteristicChanged(卡塔尔(قطر‎回调被触发。

@Override
// Characteristic notification
public void onCharacteristicChanged(BluetoothGatt gatt,
        BluetoothGattCharacteristic characteristic) {
    broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}

澳门新葡亰app 6

Touch

接口:

BluetoothAdapter.LeScanCallback
:用来提供LE扫描结果的回调接口

BluetoothProfile:Bluetooth
Profiles的公共APIs

BluetoothProfile.ServiceListener:BluetoothProfile
IPC client与service的连接和断开时的三个通告接口

Roles and Responsibilities

HID-over-GATT

Note: Not all Android-powered devices provide Bluetooth
functionality.

Finding BLE Devices

寻找BLE设备

To find BLE devices, you use the startLeScan() method. This method takes
a BluetoothAdapter.LeScanCallback as a parameter. You must implement
this callback, because that is how scan results are returned. Because
scanning is battery-intensive, you should observe the following
guidelines:
要物色BLE设备,你能够使用startLeScan(卡塔尔国方法。那么些方法满含贰个蓝牙Adapter.LeScanCallback作为参数。你一定要要完成这么些回调,因为那是怎样回到扫描结果的(因为扫描结果是通过那么些重返的)。因为扫描是电瓶密集型的,你须求根据以下的因循古板:

  • As soon as you find the desired device, stop scanning.
    若是你意气风发找到了想要的装备,就告大器晚成段落扫描
  • Never scan on a loop, and set a time limit on your scan. A device
    that was previously available may have moved out of range, and
    continuing to scan drains the battery.
    切勿在循环里扫描,且要设置三个扫描时间节制。
    多个事情未发生前能够拿到的设施只怕已经移出了约束,持续围观消功耗瓶。

The following snippet shows how to start and stop a scan:
澳门新葡亰app,上边的代码片段体现了怎么着领头和甘休扫描:

/**
 * Activity for scanning and displaying available BLE devices.
 */
public class DeviceScanActivity extends ListActivity {

    private BluetoothAdapter mBluetoothAdapter;
    private boolean mScanning;
    private Handler mHandler;

    // Stops scanning after 10 seconds.
    private static final long SCAN_PERIOD = 10000;
    ...
    private void scanLeDevice(final boolean enable) {
        if (enable) {
            // Stops scanning after a pre-defined scan period.
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mScanning = false;
                    mBluetoothAdapter.stopLeScan(mLeScanCallback);
                }
            }, SCAN_PERIOD);

            mScanning = true;
            mBluetoothAdapter.startLeScan(mLeScanCallback);
        } else {
            mScanning = false;
            mBluetoothAdapter.stopLeScan(mLeScanCallback);
        }
        ...
    }
...
}

If you want to scan for only specific types of peripherals, you can
instead call startLeScan(UUID[], BluetoothAdapter.LeScanCallback),
providing an array of UUID objects that specify the GATT services your
app supports.
大器晚成经你想扫描特定类型的外设,你能够替换调用startLeScan(UUID[],
蓝牙5.0( Bluetooth® 卡塔尔(英语:State of Qatar)Adapter.LeScanCallback卡塔尔国,提供三个特定的您的app扶助的GATT服务UUID设备数组。

Here is an implementation of the BluetoothAdapter.LeScanCallback, which
is the interface used to deliver BLE scan results:
这里有一个蓝牙5.0( Bluetooth® 卡塔尔国Adapter.LeScanCallback的兑现,它是叁个接口,用来传输BLE扫描结果:

private LeDeviceListAdapter mLeDeviceListAdapter;
...
// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
        new BluetoothAdapter.LeScanCallback() {
    @Override
    public void onLeScan(final BluetoothDevice device, int rssi,
            byte[] scanRecord) {
        runOnUiThread(new Runnable() {
           @Override
           public void run() {
               mLeDeviceListAdapter.addDevice(device);
               mLeDeviceListAdapter.notifyDataSetChanged();
           }
       });
   }
};

Note: You can only scan for Bluetooth LE devices or scan for Classic
Bluetooth devices, as described in Bluetooth. You cannot scan for both
Bluetooth LE and classic devices at the same time.

静心:你能够扫描低功耗Bluetooth设备或精粹蓝牙( Bluetooth® 卡塔尔(قطر‎设备,如Bluetooth所述。你不可能并且扫视低功耗蓝牙5.0设备和经文蓝牙( Bluetooth® 卡塔尔(قطر‎设备。

Tracer
for OpenGL
ES

6.与BLE设备交换。比方近似传感器,心率监视器,强健体魄设备,等等

Reading BLE Attributes

读取BLE属性

Once your Android app has connected to a GATT server and discovered
services, it can read and write attributes, where supported. For
example, this snippet iterates through the server’s services and
characteristics and displays them in the UI:
假定您的Android应用连接到GATT服务器并开掘了服务,假若GATT服务器扶持,它就足以读取和写入属性了。举个例子:这一片段代码遍历了这么些服务器的服务和特色,,并将其出示在UI中:

public class DeviceControlActivity extends Activity {
    ...
    // Demonstrates how to iterate through the supported GATT
    // Services/Characteristics.
    // In this sample, we populate the data structure that is bound to the
    // ExpandableListView on the UI.
    private void displayGattServices(List<BluetoothGattService> gattServices) {
        if (gattServices == null) return;
        String uuid = null;
        String unknownServiceString = getResources().
                getString(R.string.unknown_service);
        String unknownCharaString = getResources().
                getString(R.string.unknown_characteristic);
        ArrayList<HashMap<String, String>> gattServiceData =
                new ArrayList<HashMap<String, String>>();
        ArrayList<ArrayList<HashMap<String, String>>> gattCharacteristicData
                = new ArrayList<ArrayList<HashMap<String, String>>>();
        mGattCharacteristics =
                new ArrayList<ArrayList<BluetoothGattCharacteristic>>();

        // Loops through available GATT Services.
        for (BluetoothGattService gattService : gattServices) {
            HashMap<String, String> currentServiceData =
                    new HashMap<String, String>();
            uuid = gattService.getUuid().toString();
            currentServiceData.put(
                    LIST_NAME, SampleGattAttributes.
                            lookup(uuid, unknownServiceString));
            currentServiceData.put(LIST_UUID, uuid);
            gattServiceData.add(currentServiceData);

            ArrayList<HashMap<String, String>> gattCharacteristicGroupData =
                    new ArrayList<HashMap<String, String>>();
            List<BluetoothGattCharacteristic> gattCharacteristics =
                    gattService.getCharacteristics();
            ArrayList<BluetoothGattCharacteristic> charas =
                    new ArrayList<BluetoothGattCharacteristic>();
           // Loops through available Characteristics.
            for (BluetoothGattCharacteristic gattCharacteristic :
                    gattCharacteristics) {
                charas.add(gattCharacteristic);
                HashMap<String, String> currentCharaData =
                        new HashMap<String, String>();
                uuid = gattCharacteristic.getUuid().toString();
                currentCharaData.put(
                        LIST_NAME, SampleGattAttributes.lookup(uuid,
                                unknownCharaString));
                currentCharaData.put(LIST_UUID, uuid);
                gattCharacteristicGroupData.add(currentCharaData);
            }
            mGattCharacteristics.add(charas);
            gattCharacteristicData.add(gattCharacteristicGroupData);
         }
    ...
    }
...
}

com.google.vr.vrcore

选用那么些APIs来终结Bluetooth之间的调换,一个应用程序必得评释BLUETOOTH权限。对于部分特别的功效。如乞求设备开掘,也非得BLUETOOTH_ADMIN权限。

剧中人物和天职

Here are the roles and responsibilities that apply when an Android
device interacts with a BLE device:
此地是Android设备与BLE设备人机联作时适用的剧中人物和天职:

  • Central vs. peripheral. This applies to the BLE connection itself.
    The device in the central role scans, looking for advertisement, and
    the device in the peripheral role makes the advertisement.
    中心和外设。那适用于BLE连接本人。主旨设备剧中人物扫描,搜索广告,同期外剧中人物设备成立广告。

  • GATT server vs. GATT client. This determines how two devices talk to
    each other once they’ve established the connection.
    GATT服务器和GATT顾客端。那决定了多个器械建构连接之后什么通信。

To understand the distinction, imagine that you have an Android phone
and an activity tracker that is a BLE device. The phone supports the
central role; the activity tracker supports the peripheral role (to
establish a BLE connection you need one of each—two things that only
support peripheral couldn’t talk to each other, nor could two things
that only support central).
为了知道那几个性情,借让你有着二个Android手提式无线电电话机和二个BLE活动追踪器设备。手机担负中心角色;活动追踪器担当外设角色(为了创制BLE连接,你必要有个别的如此的配备。只扶助外设剧中人物的四个设备不可能互相通讯,同样,仅支持中心角色的四个设施也无法相互近信)

Once the phone and the activity tracker have established a connection,
they start transferring GATT metadata to one another. Depending on the
kind of data they transfer, one or the other might act as the server.
For example, if the activity tracker wants to report sensor data to the
phone, it might make sense for the activity tracker to act as the
server. If the activity tracker wants to receive updates from the phone,
then it might make sense for the phone to act as the server.
手提式有线电话机和移动追踪器生龙活虎旦确立了连接,他们就起来互相传输GATT元数据。信任于她们传输的数额,此中的一个发端担任服务器。比如:假设运动追踪器希望将传感器数据报告给手提式有线电话机,那么活动追踪器大概会担负服务器。怎样运动追踪器想要从手提式有线电电话机械收割到更新,那么手提式有线电话机大概会担当服务器。

In the example used in this document, the Android app (running on an
Android device) is the GATT client. The app gets data from the GATT
server, which is a BLE heart rate monitor that supports the Heart Rate
Profile. But you could alternatively design your Android app to play the
GATT server role. See BluetoothGattServer for more information.
其一文书档案中应用的例证中,Android
应用软件(启动在Android设备上)是GATT顾客端。App从叁个GATT服务器中获取数据,GATT服务器是三个提供心跳配置文件的BLE心跳检查评定器。然则你也可以设计你的安卓App当做GATT服务器的剧中人物。有关详细新闻,请查看蓝牙5.0( Bluetooth® 卡塔尔国GattServer。

Tools

  • Scan for other Bluetooth devices (including BLE devices).
  • Query the local Bluetooth adapter for paired Bluetooth devices.
  • Establish RFCOMM channels/sockets.
  • Connect to specified sockets on other devices.
  • Transfer data to and from other devices.
  • Communicate with BLE devices, such as proximity sensors, heart rate
    monitors, fitness devices, and so on.
  • Act as a GATT client or a GATT server (BLE).

Receiving GATT Notifications

Daydream Performance
HUD

The Bluetooth APIs let applications:

Setting Up BLE

设置BLE
Before your application can communicate over BLE, you need to verify
that BLE is supported on the device, and if so, ensure that it is
enabled. Note that this check is only necessary if
<uses-feature…/> is set to false.
在你利用能够通过BLE通讯在此之前,你须要证实那个装置是或不是扶助BLE,借使能够,确认BLE是使能的。供给专心的是独有当<uses-feature…/>设置为false这一个是检查须要的

If BLE is not supported, then you should gracefully disable any BLE
features. If BLE is supported, but disabled, then you can request that
the user enable Bluetooth without leaving your application. This setup
is accomplished in two steps, using the BluetoothAdapter.
假设BLE不被支持,则你须要文雅的除能全数的BLE天性。即使BLE被辅助,然则被除能了,则你必要诉求客商使能Bluetooth而不偏离的应用。该装置使用蓝牙5.0Adapter在五个步骤中达成。

  1. Get the BluetoothAdapter
    获取BluetoothAdapter
    The BluetoothAdapter is required for any and all Bluetooth activity.
    The BluetoothAdapter represents the device’s own Bluetooth adapter
    (the Bluetooth radio). There’s one Bluetooth adapter for the entire
    system, and your application can interact with it using this object.
    The snippet below shows how to get the adapter. Note that this
    approach uses getSystemService() to return an instance of
    BluetoothManager, which is then used to get the adapter. Android 4.3
    (API Level 18) introduces BluetoothManager:
    具有的蓝牙5.0Activity中都亟需蓝牙( Bluetooth® 卡塔尔国适配器。蓝牙5.0适配器表示了这一个设备自带的Bluetooth适配器(蓝牙( Bluetooth® 卡塔尔国有线电)。整个种类有八个蓝牙5.0适配器,你的施用能够经过那一个目的和它人机联作。上面包车型客车代码片段展示了什么得到那一个适配器。须要专一的是其一形式运用getSystemService(卡塔尔去拿到BluetoothManager的一个实例,然后用于获取适配器。Android
    4.3(API Level 18)介绍了蓝牙( Bluetooth® 卡塔尔(قطر‎( Bluetooth® 卡塔尔Manager。

    private BluetoothAdapter mBluetoothAdapter;
    ...
    // Initializes Bluetooth adapter.
    final BluetoothManager bluetoothManager =
            (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    mBluetoothAdapter = bluetoothManager.getAdapter();
    
  2. Enable Bluetooth
    使能蓝牙5.0
    Next, you need to ensure that Bluetooth is enabled. Call isEnabled()
    to check whether Bluetooth is currently enabled. If this method
    returns false, then Bluetooth is disabled. The following snippet
    checks whether Bluetooth is enabled. If it isn’t, the snippet
    displays an error prompting the user to go to Settings to enable
    Bluetooth:
    接下去,你必要认同蓝牙5.0是使能的。调用isEnable(卡塔尔(قطر‎去反省是或不是蓝牙( Bluetooth® 卡塔尔国当下是或不是使能。假如那一个主意再次回到false,则蓝牙5.0是除能的。接下来的代码片段检查是否蓝牙( Bluetooth® 卡塔尔国是是能的。若无使能,代码片段博览会示三个客户去设置开启蓝牙( Bluetooth® 卡塔尔国的错误提醒。

    // Ensures Bluetooth is available on the device and it is enabled. If not,
    // displays a dialog requesting user permission to enable Bluetooth.
    if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    }
    

Note: The REQUEST_ENABLE_BT constant passed to
startActivityForResult(android.content.Intent, int) is a
locally-defined integer (which must be greater than 0) that the system
passes back to you in your onActivityResult(int, int,
android.content.Intent) implementation as the requestCode parameter.

注意:传送给startActivityForResult()的常量REQUEST_ENABLE_BT是一个本土定义的卡尺头(必需大于0),那么些大背头系统会贯彻为requestCode参数,在您的onActivityResult(卡塔尔(قطر‎方法中,回传给您。

How do I
fix my Daydream
controller

5.与别的设施之间数据传输

Connecting to a GATT Server

连接GATT服务器

The first step in interacting with a BLE device is connecting to it—
more specifically, connecting to the GATT server on the device. To
connect to a GATT server on a BLE device, you use the connectGatt()
method. This method takes three parameters: a Context object,
autoConnect (boolean indicating whether to automatically connect to the
BLE device as soon as it becomes available), and a reference to a
BluetoothGattCallback:
与BLE设备的交互作用的第一步是连选用它-更具象的说,连接在这么些BLE设备上的GATT服务器。为了连接上在这里个BLE设备上的GATT服务器,你能够运用connectGatt(卡塔尔(英语:State of Qatar)方法。那么些措施有七个参数:三个上下文对象,是不是自动连接(叁个布尔值,注脚只要这一个BLE设备是能够得到的,是还是不是自动的连天上它),叁个指向BluetoothGattCallback的引用。

mBluetoothGatt = device.connectGatt(this, false, mGattCallback);

This connects to the GATT server hosted by the BLE device, and returns a
BluetoothGatt instance, which you can then use to conduct GATT client
operations. The caller (the Android app) is the GATT client. The
BluetoothGattCallback is used to deliver results to the client, such as
connection status, as well as any further GATT client operations.
那会连采用由BLE设备管理的GATT服务器,并回到三个BluetoothGatt实例,然后您能够应用它来扩充GATT客户端操作。调用者(Android
app)是GATT顾客端。蓝牙GattCallback用来传送结果给顾客端,比方连接景况,以致其余进一层的GATT客商端操作。

In this example, the BLE app provides an activity
(DeviceControlActivity) to connect, display data, and display GATT
services and characteristics supported by the device. Based on user
input, this activity communicates with a Service called
BluetoothLeService, which interacts with the BLE device via the Android
BLE API:
其一事例中,这几个BLE应用提供二个活动(DeviceControlActivity)用于连接装置,呈现由器材提供的数码,GATT服务和特征。基于顾客输入,那么些活动与八个名叫Bluetooth( Bluetooth® 卡塔尔国LeService的服务通信,该服务通过Android
BLE API与BLE设备开展相互作用:

// A service that interacts with the BLE device via the Android BLE API.
public class BluetoothLeService extends Service {
    private final static String TAG = BluetoothLeService.class.getSimpleName();

    private BluetoothManager mBluetoothManager;
    private BluetoothAdapter mBluetoothAdapter;
    private String mBluetoothDeviceAddress;
    private BluetoothGatt mBluetoothGatt;
    private int mConnectionState = STATE_DISCONNECTED;

    private static final int STATE_DISCONNECTED = 0;
    private static final int STATE_CONNECTING = 1;
    private static final int STATE_CONNECTED = 2;

    public final static String ACTION_GATT_CONNECTED =
            "com.example.bluetooth.le.ACTION_GATT_CONNECTED";
    public final static String ACTION_GATT_DISCONNECTED =
            "com.example.bluetooth.le.ACTION_GATT_DISCONNECTED";
    public final static String ACTION_GATT_SERVICES_DISCOVERED =
            "com.example.bluetooth.le.ACTION_GATT_SERVICES_DISCOVERED";
    public final static String ACTION_DATA_AVAILABLE =
            "com.example.bluetooth.le.ACTION_DATA_AVAILABLE";
    public final static String EXTRA_DATA =
            "com.example.bluetooth.le.EXTRA_DATA";

    public final static UUID UUID_HEART_RATE_MEASUREMENT =
            UUID.fromString(SampleGattAttributes.HEART_RATE_MEASUREMENT);

    // Various callback methods defined by the BLE API.
    private final BluetoothGattCallback mGattCallback =
            new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status,
                int newState) {
            String intentAction;
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                intentAction = ACTION_GATT_CONNECTED;
                mConnectionState = STATE_CONNECTED;
                broadcastUpdate(intentAction);
                Log.i(TAG, "Connected to GATT server.");
                Log.i(TAG, "Attempting to start service discovery:" +
                        mBluetoothGatt.discoverServices());

            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                intentAction = ACTION_GATT_DISCONNECTED;
                mConnectionState = STATE_DISCONNECTED;
                Log.i(TAG, "Disconnected from GATT server.");
                broadcastUpdate(intentAction);
            }
        }

        @Override
        // New services discovered
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
            } else {
                Log.w(TAG, "onServicesDiscovered received: " + status);
            }
        }

        @Override
        // Result of a characteristic read operation
        public void onCharacteristicRead(BluetoothGatt gatt,
                BluetoothGattCharacteristic characteristic,
                int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
            }
        }
     ...
    };
...
}

When a particular callback is triggered, it calls the appropriate
broadcastUpdate() helper method and passes it an action. Note that the
data parsing in this section is performed in accordance with the
Bluetooth Heart Rate Measurement profile specifications:
当特定的回调被触发时,它调用相应的broadcastUpdate(卡塔尔国支持方法并传递二个动作。请介意,本节中的数据解析是依靠Bluetooth心率衡量配置文件规范试行的:

private void broadcastUpdate(final String action) {
    final Intent intent = new Intent(action);
    sendBroadcast(intent);
}

private void broadcastUpdate(final String action,
                             final BluetoothGattCharacteristic characteristic) {
    final Intent intent = new Intent(action);

    // This is special handling for the Heart Rate Measurement profile. Data
    // parsing is carried out as per profile specifications.
    if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {
        int flag = characteristic.getProperties();
        int format = -1;
        if ((flag & 0x01) != 0) {
            format = BluetoothGattCharacteristic.FORMAT_UINT16;
            Log.d(TAG, "Heart rate format UINT16.");
        } else {
            format = BluetoothGattCharacteristic.FORMAT_UINT8;
            Log.d(TAG, "Heart rate format UINT8.");
        }
        final int heartRate = characteristic.getIntValue(format, 1);
        Log.d(TAG, String.format("Received heart rate: %d", heartRate));
        intent.putExtra(EXTRA_DATA, String.valueOf(heartRate));
    } else {
        // For all other profiles, writes the data formatted in HEX.
        final byte[] data = characteristic.getValue();
        if (data != null && data.length > 0) {
            final StringBuilder stringBuilder = new StringBuilder(data.length);
            for(byte byteChar : data)
                stringBuilder.append(String.format("%02X ", byteChar));
            intent.putExtra(EXTRA_DATA, new String(data) + "n" +
                    stringBuilder.toString());
        }
    }
    sendBroadcast(intent);
}

Back in DeviceControlActivity, these events are handled by a
BroadcastReceiver:
回到DeviceControlActivity,这么些事件都被贰个布罗兹castReceiver选择管理:

// Handles various events fired by the Service.
// ACTION_GATT_CONNECTED: connected to a GATT server.
// ACTION_GATT_DISCONNECTED: disconnected from a GATT server.
// ACTION_GATT_SERVICES_DISCOVERED: discovered GATT services.
// ACTION_DATA_AVAILABLE: received data from the device. This can be a
// result of read or notification operations.
private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {
            mConnected = true;
            updateConnectionState(R.string.connected);
            invalidateOptionsMenu();
        } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) {
            mConnected = false;
            updateConnectionState(R.string.disconnected);
            invalidateOptionsMenu();
            clearUI();
        } else if (BluetoothLeService.
                ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {
            // Show all the supported services and characteristics on the
            // user interface.
            displayGattServices(mBluetoothLeService.getSupportedGattServices());
        } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {
            displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));
        }
    }
};

IQS525-B000

Bluetooth APIs 能够使得应用具备上边功效:

BLE 权限


In order to use Bluetooth features in your application, you must declare
the Bluetooth permission BLUETOOTH. You need this permission to perform
any Bluetooth communication, such as requesting a connection, accepting
a connection, and transferring data.
为了在您的接收中接纳蓝牙( Bluetooth® 卡塔尔国特色,你必需求表明蓝牙( Bluetooth® 卡塔尔国权限 BLUETOOTH
。你要此权限技巧实行此外Bluetooth通讯,如:央浼一个一而再再三再四,选择一个三回九转,和传输数据。

If you want your app to initiate device discovery or manipulate
Bluetooth settings, you must also declare the BLUETOOTH_ADMIN
permission. Note: If you use the BLUETOOTH_ADMIN permission, then you
must also have the BLUETOOTH permission.
万风华正茂你想要你的app运转设备发掘或调节蓝牙5.0设置,你必得也要评释BLUETOOTH_ADMIN 权限。注意:要是您用了 BLUETOOTH_ADMIN
权限,则还必得有 BLUETOOTH 权限。

Declare the Bluetooth permission(s) in your application manifest file.
For example:
宣称蓝牙5.0权限在您的运用manifest文件,比如:

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

If you want to declare that your app is available to BLE-capable devices
only, include the following in your app’s manifest:
如若您想要注脚你的app仅扶植有BLE成效的装置,在你的app的manifest中填上如下内容:

<uses-feature android:name=”android.hardware.bluetooth_le”
android:required=”true”/>
However, if you want to make your app available to devices that don’t
support BLE, you should still include this element in your app’s
manifest, but set required=”false”. Then at run-time you can determine
BLE availability by using PackageManager.hasSystemFeature():
下一场,假让你想要你的app能够被不补助BLE的器材得到,你照样需求包含那个成分在您的app的manifest文件中,不过,供给安装required为false。然后在你的代码运营时,你能够经过行使确认PackageManager.hasSystemFeature(卡塔尔(英语:State of Qatar)方法来确认BLE是还是不是可获取。

// Use this check to determine whether BLE is supported on the device. Then
// you can selectively disable BLE-related features.
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
    Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
    finish();
}

Note: LE Beacons are often associated with location. In order to use
BluetoothLeScanner without a filter, you must request the user’s
permission by declaring either the ACCESS_COARSE_LOCATION or
ACCESS_FINE_LOCATION permission in your app’s manifest file. Without
these permissions, scans won’t return any results.

留意:LE信标平常与岗位相关联。
为了在未有过滤器的景观下行使蓝牙( Bluetooth® 卡塔尔(قطر‎LeScanner,您必得通过评释应用程序的清单文件中的ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限来呼吁客商的权力。

Analysis
of Latency Performance of Bluetooth Low Energy (BLE)
Networks

2.为配对的蓝牙5.0设备查询本地蓝牙( Bluetooth® 卡塔尔国适配器

 

To perform Bluetooth communication using these APIs, an application must
declare the BLUETOOTH permission. Some additional functionality, such
as requesting device discovery, also requires
the BLUETOOTH_ADMIN permission.

Google
Inc. Daydream
(Daydream)

提供管理Bluetooth功效的类,举例对道具的扫视,连接装置,和保管设施之间的传输数据。BluetoothAPI扶持优异蓝牙5.0和低功耗Bluetooth。

Virtual
Reality High
Performance

1.对于任何的蓝牙( Bluetooth® 卡塔尔(قطر‎设备的扫视(包含BLE设备卡塔尔国

ATW

关于比非常多别的的经文蓝牙( Bluetooth® 卡塔尔(قطر‎音讯。能够看蓝牙指南。有关相当多别样的低耗能Bluetooth的音讯,能够看BLE指南。

dotPeek

提醒:不是漫天的Android设备都提供了蓝牙( Bluetooth® 卡塔尔功效。

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图