6-低功耗蓝牙开发之建立连接

Android蓝牙开发—经典蓝牙和BLE(低功耗)蓝牙的区别       最近在做蓝牙开发,刚接触时傻傻的分不清经典蓝牙和低功耗蓝牙的区别,一直用开发低功耗蓝牙的方法去连接经典蓝牙设备,最后当然是一直连接不上了。在此记录下经典蓝牙和低功耗蓝牙的区别和联系。 Android中的蓝牙         说到Android中的蓝牙,大家听到的可能有蓝牙1.0、蓝牙2.0、蓝牙3.0、蓝牙4.0之类的以数字结尾的蓝牙版本号,而实际上,在最新的标准中,已经不再使用数... 阅读详情

目录

 

一、前言

二、连接到GATT Server

1.建立连接:

2.读取Gatt Characterstic

3.写入 Gatt Characteristics:

4.打开通知功能:

5.关闭Gatt Client:


一、前言

上一篇文章我们讲述了低功耗蓝牙设备开发过程中的广播数据解析,对于常见的应用场景而言,做到解析广播数据已经够了,况且一旦中心设备和外围设备建立连接的话,广播就会终止。但是对于蓝牙设备管理员而言,就需要连接上外围设备,然后进行设备参数的修改;

二、连接到GATT Server

连接到GATT Server,需要用到BluetoothGatt这个对象,它是蓝牙GATT配置文件的公共API.我们通过BluetoothGatt对象进行连接的建立和断开,Gatt Services数据的获取,Gatt Characteristics数据的获取和读写操作,Gatt Descriptor数据的读写操作等;

我们先看一下,BluetoothGatt的常用API:

  • connect():重连方法。当外围设备和中心设备蓝牙断开连接时,用于进行重新连接。如果外围设备超出范围,则等在范围内时就会触发重连;
  • connect(Boolean autoConnect, BluetoothGattCallback callback,Handler handler):

与支持蓝牙GATT的设备建立连接。第二个参数是否自动连接;

  • disconnect():断开连接。可以是已经建立的连接或取消正在建立的连接;
  • discoverServices():发现服务。一般用于当GATT连接建立之后,使用BluetoothGatt对象调用该方法来获取外围设备的Gatt Services,Gatt Characteristics,Gatt Descriptors数据。当服务数据发现完毕之后会回调BluetoothGattCallback的onServicesDiscovered方法,此时我们使用getServices就可以获取外围设备的Gatt Services数据。
  • getService(UUID uuid):返回特定UUID的BluetoothGattService。前提条件是必须针对特定外围设备去获取Gatt Service,也就是说建立连接,获取到BluetoothGatt对象才可以使用此方法。同时需要注意可能返回null,如果存在多个具有相同UUID的Gatt Service,默认返回第一个。
  • readCharacteristic(BluetoothGattCharacteristic characteristic):读取相关联外围设备的BluetoothGattCharacteristic.这是异步操作,该操作结果会在BluetoothGattCallback的onCharacteristicRead回调方法里返回。
  • writeCharacteristic(BluetoothGattCharacteristic characteristic):将BluetoothGattCharacteristic 写入相关联外围设备。一旦写操作完成会在BluetoothGattCallback的onCharacteristicWrite方法中回调。
  • readDescriptor(BluetoothGattDescriptor descriptor):读取相关联外围设备的BluetoothGattDescriptor。一旦读操作完成会在BluetoothGattCallback的onDescriptorRead方法进行回调。
  • writeDescriptor(BluetoothGattDescriptor descriptor):将BluetoothGattDescriptor写入相关联外围设备。一旦写操作完成会在BluetoothGattCallback的onDescriptorWrite方法里进行回调。
  • setCharacteristicNotification(BluetoothGattCharacteristic characteristic, boolean enable):

开启或禁用给定Gatt Characteristic的notifications(通知)/indications(指示)。一旦notifications设置为true的话,如果远程设备的Gatt Characteristic发生改变则BluetoothGattCallback的onCharacteristicChanged方法就会触发。

  • readRemoteRssi():读取已连接的远程设备的RSSI。当RSSI的值被读取之后,会回调BluetoothGattCallback的onReadRemoteRssi方法。
  • readPhy():读取连接的当前发送器PHY和接收器PHY。最终结果会在BluetoothGattCallback的onPhyRead方法里回调。
  • requestMtu(int mtu):针对当前连接请求MTU大小。当我们使用BluetoothGatt对象调用writeCharacteristic()方法进行数据写入操作时,如果数据大小超过MTU的默认大小时,会被分拆为多个小包进行数据写入的操作。该方法允许开发者修改MTU的大小。会触发BluetoothGattCallback的onMtuChanged方法回调。

 

1.建立连接:

中心设备(手机等)有时候需要与外围设备(低功耗蓝牙)建立连接,进行参数的修改等操作。当然并不是所有的低功耗蓝牙设备都能够被连接上,这个就要看硬件开发者设计的产品允不允许被连接。这些我们不在考虑。建立连接首先需要扫描到设备,设备的扫描不是本篇文章主要的讨论对象,不清楚的童鞋可以阅读低功耗蓝牙开发之设备扫描。扫描到设备之后拿到设备的信息,用来进行连接的建立。示例代码如下:

/**

     * Connects to the GATT server hosted on the Bluetooth LE device.

     *

     * @param address The device address of the destination device.

     * @return Return true if the connection is initiated successfully. The connection result

     * is reported asynchronously through the

     * {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}

     * callback.

     */

    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2)

    public boolean connect(@NonNull String address) {

        MLogger.i(TAG, TAG + " .. connect()~");

        if (TextUtils.isEmpty(address)) {

            MLogger.e(TAG, "unspecify address");

            return false;

        }


        if (mBluetoothAdapter == null) {

            MLogger.d(TAG, "BluetoothAdapter is not initialized");

            return false;

        }


        // Previously connected device.  Try to reconnect.

        if (!TextUtils.isEmpty(mBluetoothDeviceAddress) && address.equals(mBluetoothDeviceAddress)

                && mBluetoothGatt != null) {

            MLogger.d(TAG, "Trying to use an existing mBluetoothGatt for connection.");

            if (mBluetoothGatt.connect()) {

                mConnectionState = BeaconContants.GATT_STATE_CONNECTING;

                return true;

            } else {

                return false;

            }

        }


        final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);

        if (device == null) {

            MLogger.w(TAG, "Device not found.  Unable to connect.");

            return false;

        }


        // We want to directly connect to the device, so we are setting the autoConnect

        // parameter to false.

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

        MLogger.d(TAG, "Trying to create a new connection.");

        mBluetoothDeviceAddress = address;

        mConnectionState = BeaconContants.GATT_STATE_CONNECTING;

        return true;

    }

在这里需要用到外围设备的Mac地址用来连接Gatt服务。

当连接建立成功之后,会触发BluetoothGattCallback的onConnectionStateChange方法。在回调方法里我们就可以使用BluetoothGatt的对象,调用mBluetoothGatt.discoverServices()就可以发现外围设备Gatt的各种数据信息。当服务数据发现完毕之后会回调BluetoothGattCallback的onServicesDiscovered方法,此时我们使用getServices就可以获取外围设备的Gatt Services数据。

 

2.读取Gatt Characterstic

我们提供一个BluetoothGattCharacteristic对象就可以读取它的特征值。示例代码如下:

/**

     * Reads the requested characteristic from the associated remote device.

     *

     * <p>This is an asynchronous operation. The result of the read operation

     * is reported by the {@link BluetoothGattCallback#onCharacteristicRead}

     * callback.

     *

     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.

     *

     * @param characteristic The characteristic to read from.

     * @return true, if the read operation was initiated successfully

     * @see BluetoothGatt#readCharacteristic(BluetoothGattCharacteristic)

     */

    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2)

    public boolean readCharacteristic(@NonNull BluetoothGattCharacteristic characteristic) {

        if (mBluetoothAdapter != null && mBluetoothGatt != null) {

            if (mConnectionState == BeaconContants.GATT_STATE_CONNECTED) {

                final boolean state = mBluetoothGatt.readCharacteristic(characteristic);

                MLogger.d(TAG, "readCharacteristic..state : " + state);

                return state;

            } else {

                MLogger.e(TAG, "GATT client has disconnected from GATT server!");

            }

        } else {

            MLogger.d(TAG, "BluetoothAdapter not initialized");

        }

        return false;

    }

当我们读取操作成功之后,会回调BluetoothGattCallback的onCharacteristicRead方法。

 

3.写入 Gatt Characteristics:

实际场景中我们会有修改外围设备参数的需求,我们只要通过特定的服务的UUID拿到需要服务对象就可以进行参数的修改。示例代码如下:

/**

     * Writes a given characteristic and its values to the associated remote device.

     *

     * <p>Once the write operation has been completed, the

     * {@link BluetoothGattCallback#onCharacteristicWrite} callback is invoked,

     * reporting the result of the operation.

     *

     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.

     *

     * @param characteristic Characteristic to write on the remote device.

     * @return true, if the write operation was initiated successfully

     * @see BluetoothGatt#writeCharacteristic(BluetoothGattCharacteristic)

     */

    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2)

    public boolean writeCharacteristic(@NonNull BluetoothGattCharacteristic characteristic) {

        if (mBluetoothAdapter != null && mBluetoothGatt != null) {


            if (mConnectionState == BeaconContants.GATT_STATE_CONNECTED) {

                final boolean state = mBluetoothGatt.writeCharacteristic(characteristic);

                MLogger.d(TAG, "writeCharacteristic..state : " + state

                        + "..writetype : " + characteristic.getWriteType());

                return state;

            } else {

                MLogger.e(TAG, "GATT client has disconnected from GATT server!");

            }


        } else {

            MLogger.d(TAG, "BluetoothAdapter not initialized");

        }

        return false;

    }

当我们的写操作成功之后会触发BluetoothGattCallback的onCharacteristicWrite回调方法,如果成功修改会回调onCharacteristicChanged方法。

iBeacon设备的参数修改就是基于该方法进行修改,不了解iBeacon设备的参数的童鞋,请阅读:iBeacon参数。

4.打开通知功能:

如果我们需要修改外围设备的参数,最好还是需要打开蓝牙的notification功能,这样的话修改特定的BluetoothGattCharacteristic就可以接收到通知。同时安全起见,打开通知功能会触发Android系统的输入配对码进行配对的功能。示例代码如下:

/**

     * Enable or disable notifications/indications for a given characteristic.

     *

     * @param characteristic The characteristic for which to enable notifications

     * @param enable         Set to true to enable notifications

     * @param uuid           TO get a descriptor with a given UUID out of the list of

     *                       descriptors for this characteristic.

     * @return true, if the requested notification status was set successfully

     * @see BluetoothGatt#setCharacteristicNotification(BluetoothGattCharacteristic, boolean)

     */

    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2)

    public boolean setCharacteristicNotification(@NonNull BluetoothGattCharacteristic characteristic,

                                                 @NonNull boolean enable, UUID uuid) {


        if (mBluetoothAdapter != null && mBluetoothGatt != null) {

            if (mConnectionState == BeaconContants.GATT_STATE_CONNECTED) {

                mBluetoothGatt.setCharacteristicNotification(characteristic, enable);

                final BluetoothGattDescriptor descriptor = characteristic.getDescriptor(uuid);

                if (descriptor != null) {


                    MLogger.d(TAG, "It's going to set notifition value : " + enable);


                    descriptor.setValue(enable ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE :

                            BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE);

                    final boolean state = mBluetoothGatt.writeDescriptor(descriptor);

                    MLogger.d(TAG, "setCharacteristicNotification..operation state : " + state);

                    return state;

                } else {

                    MLogger.e(TAG, "The descriptor is null or no descriptor with the given UUID was found! ");

                }

            } else {

                MLogger.e(TAG, "GATT client has disconnected from GATT server!");

            }


        } else {

            MLogger.d(TAG, "BluetoothAdapter not initialized");

        }

        return false;

    }

执行这段代码,会产生如下结果:

  • 当打开通知功能时,会触发Android系统的蓝牙配对功能,如果配对码输入正确且没有超时时onBondStateChanged方法会有配对状态的变化,onDescriptorWrite方法会有设置的状态值的数组,和设置状态;当配对码输入错误,取消配对或者配对超时,onBondStateChanged会返回配对状态变化,onConnectionStateChange会返回连接状态的变化;(注意:配对码错误或者配对超时,会导致连接断开!)
  • 当关闭Notify功能时,onDescriptorWrite会返回关闭Notify对应数组和状态;

 

5.关闭Gatt Client:

当我们使用完毕之后,需要关闭Gatt连接,同时释放掉资源。

/**

     * After using a given BLE device, the app must call this method to ensure resources are

     * released properly.

     */

    public void close() {

        MLogger.d(TAG, TAG + " .. close()~");

        if (mBluetoothGatt == null) {

            return;

        }

        mBluetoothGatt.close();

        mBluetoothGatt = null;

    }

>>下一篇:7-iBeacon参数

Uni-App使用低功耗蓝牙连接血压仪测量 1、Uni-APP蓝牙使用流程 在阅读这篇内容之前,建议您详细浏览一遍uni-app官方关于蓝牙和低功耗蓝牙(BLE)使用教程文档 uni-app官方低功耗蓝牙接口,如果您有微信小程序方面的开发经验,那您看这篇文章会很快上手,uni-app官方的蓝牙模块接口均是按照微信小程序的蓝牙模块接口编写。 思路流程 手机上打开蓝牙,设备打开蓝牙 APP初始化蓝牙模块 APP调用蓝牙搜寻设备 APP存储搜寻... 阅读详情

相关推荐

esp32c6 开发实战:低功耗蓝牙(BLE)开发

蓝牙栈在此程序流程中已经启动并运行,但是应用程序的功能尚未定义。功能的定义是通过响应事件来实现的,当其他设备尝试读取或写入参数以及建立连接时就会触发事件回调函数处理。BT控制器在控制器端实现主机控制器接口(HCI),链路层(LL)和物理层(PHY)。BT控制器对用户应用程序不可见,并处理BLE堆栈的较低层。蓝牙堆栈(Bluedroid stack)定义了经典蓝牙(BT Classic)和低功耗蓝牙(BLE)的通用定义和API。的判断)等对于启动低功耗蓝牙来说不重要的代码,函数初始化和启用BT控制器。

月入鱼饵的博客 2733

App Inventor 2 低功耗蓝牙(BLE) 硬件接入、数据通信及IO控制

低功耗蓝牙(BLE)以低功耗、低成本、开发简便逐渐被广泛应用,本文主要介绍一款较为通用、价格低廉的BLE设备从零开始如何利用App Inventor 2开发一款自己专属的手机蓝牙App应用。本文主要通过一款常见的BLE硬件接入控制,介绍硬件接入App Inventor 2 的通用方法,类似的硬件接入都是大同小异的。

AppInventor2中文网(https://www.fun123.cn)技术。 5724

Android 低功耗蓝牙BLE连接通信

简介 蓝牙(Bluetooth®):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4—2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案。蓝牙可连接多个设备,克服了数据同步的难题。 蓝牙 4.0 蓝牙技术联盟于2010年6月30日正式推出蓝牙核心规格4.0 。它包...

hwx865的专栏 3154

CSR8675学习笔记:新建一个GATT server

写在最前面: 很多读者反馈希望可以有硬件平台配合学习。现与思度科技联合推出CSR867x学习板【淘宝链接:思度科技CSR867x学习板】,进QQ群获取激活码购买学习板享受如下优惠: 1. 价格优惠 2. 免费提供开发教程和项目源码 3. 免费提供入门级技术支持 QQ群号:743434463 —————————–正文分割线——————————— 1. 引言 公司的新项目需要CSR...

wzz4420381的博客 1万+

经典蓝牙与低功耗蓝牙的区别(4)

文章所有资料全部已经打包整理好,另外小编手头上整理了大量Android架构师全套学习资料,Android核心高级技术PDF文档+全套高级学习资料+视频+2021 BAT 大厂面试真题解析资料展示:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取![外链图片转存中…(img-SEsPuU4S-1715355730334)]《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

2401_84009317的博客 1911

Android 从开发角度来看经典蓝牙和低功耗(BLE)蓝牙的区别

1. 开发分类 直接看图。 从图中可以看到,对于数据量较大的传输,如音视频等开发,需要使用经典蓝牙模式。而对于现在兴起的 AIOT 物联网、智能家居等领域,则会选择低功耗蓝牙 BLE,因为成本和功耗更低,并对实时性要求更高。 从现如今手机的实际体验来看,手机上的蓝牙应该是双模蓝牙,以小米手机为例,它可以连接蓝牙耳机进行听音乐,也可以连接智能家居设备,控制家电。 所以,根据上图划分,按照应用划分的...

记录移动开发相关的知识 2723

基于BLE低功耗蓝牙实现与蓝牙设备的连接和数据通信

基于BLE低功耗蓝牙实现与蓝牙设备的连接和数据通信

qq_42500408的博客 3493

经典蓝牙与低功耗蓝牙的区别(2)

低功耗蓝牙中则有一个主设备(Central)和从设备(Peripheral,也叫外围设备)的概念。主设备作为发现方,调用发现设备的方法,通过BluetoothAdapter的startLeScan()方法实现。从设备则作为被发现方,发出广播,以供发现。同样,这个startLeScan()方法也仅能够发现低功耗蓝牙从设备。不过,在Android系统蓝牙搜索界面,两种蓝牙设备都是可以被发现的。只有当两种蓝牙设备被某设备(包括当前的设备)配对/绑定后,才不会再被扫描到。有很多小伙伴都不太理解配对和绑定究竟有什么区

2301_79600088的博客 1334

低功耗蓝牙BLE之连接建立

连接使用数据信道在两个设备之间可靠地发送信息

zzfenglin的博客 1万+

用deepseek对GPU服务器进行压力测试

利用 DeepSeek 模型对 GPU 服务器进行压力测试,核心思路是通过,验证 GPU 服务器在计算、显存、网络等维度的承载能力,同时观察稳定性与性能瓶颈。

weixin_42795092的博客 1595

Opencv相机校准之棋盘格标定

Reference: https://yq.aliyun.com/articles/62472

y459541195的博客 3万+

[Android][BLE] 获取连接中的RSSI信号强度值

调用接口:readRemoteRssi() BluetoothGatt mBluetoothGattTemp = mDevice.connectGatt(mContext, false, mGattCallback); mBluetoothGattTemp.readRemoteRssi(); 收到回调: private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { @Override

凡人的专栏 1836

AI 编程助手新玩法:用 Claude Code 一键调用国产大模型(DeepSeek/Kimi/GLM 对比)

本文深入评测了Claude Code与三大国产大模型(DeepSeek、Kimi、智谱GLM)的集成效果,详细对比了它们在代码生成质量、响应速度和特殊场景支持度等方面的差异。通过实测数据和实战技巧,帮助开发者选择最适合的AI编程助手组合,提升开发效率。

weixin_30955617的博客 472

Android蓝牙bt/ble开发

参看文档: 蓝牙开发:https://www.jianshu.com/p/4ecc99679451 蓝牙bt/ble区别:https://zhuanlan.zhihu.com/p/59907996 安卓BLE蓝牙开发详解:https://www.jianshu.com/p/a27f3ca027e3 安卓蓝牙开发之坑:https://www.jianshu.com/p/71116665fd08 目录 1:经典蓝牙开发 1.1:经典蓝牙简介 1.2:基础知识 1.3:经典蓝牙模块 2:.

juzi_zg的博客 2891

MiFlash Prime免授权刷机实战:解锁小米9008 EDL救砖新方案

MiFlash Prime作为免授权刷机工具,有效解决了小米设备在9008 EDL模式下因账号验证无法救砖的难题。本文详细介绍了从驱动安装、进入EDL模式到固件刷写的完整流程,帮助用户安全快速地恢复变砖设备,是维修人员和极客的实用解决方案。

5f4d3s2a1q的博客 2789

历年CSP-J(NOIP普及组)考点分析与分类汇总(纯干货)

noip/csp-j历年真题考点分类

weixin_42358969的博客 1万+

Android 低功耗蓝牙开发(扫描、连接)

Android 低功耗蓝牙开发(扫描、连接)前言正文一、项目配置二、权限请求三、扫描低功耗蓝牙四、显示扫描设备五、连接设备六、源码 前言   之间我写过蓝牙开发的文章,只不过是针对于经典蓝牙,可以理解为普通蓝牙,连接的对象是经典蓝牙,列如手机蓝牙、蓝牙耳机等设备。而也有读者说在学习低功耗蓝牙,因此就有了这篇文章,一方面是为了丰富蓝牙的使用,一方面也是为了帮助看我文章的读者,我会讲的很细,很多人也说我在记流水账,不过这不重要,重要的是你从流水账里学到了什么。 正文   首先明白低功耗蓝牙是什么?   蓝牙低能

晨曦 1万+

Xilinx XDMA驱动代码分析及用法

Xilinx XDMA驱动代码分析及用法 先简单的介绍一下,赛灵思的XDMA的驱动是用于做什么的、他的主要功能就类似与网卡pcie接口的网卡驱动、用于控制主机与fpga设备进行pcie的通讯。通讯的主要方式是设备文件的读写,这里不清楚的同学可以看一下我上一篇文章。通过控制设备文件的读写,操作驱动与fpga设备进行数据传输。 1、目录结构 zacha@Superman:~/nfs/xdma-debug/dma_ip_drivers-master/XDMA/linux-kernel$ tree -C . ├──

恍恍惚惚的大穷猫的博客 3万+

【Android】蓝牙开发——BLE(低功耗蓝牙)(附完整Demo)

目录 前言 一、相关概念介绍 二、实战开发 三、项目演示 四、Demo案例源码地址 前言 之前的几篇文章,主要介绍了经典蓝牙开发相关的知识,今天我们就来看看低功耗蓝牙的开发。如果小伙伴们对之前的文章感兴趣兴趣,也可以看看,欢迎提出不足或者建议。 【Android】蓝牙开发——经典蓝牙(附Demo源码) 【Android】蓝牙开发——经典蓝牙配对介绍(通过手机系统蓝牙演示) ...

好记性不如烂笔头,用文档记录技术,方便自己和他人。 3万+

智能检查点优化:动态频率与差异化存储的断点续训实践(模型训练丨容错机制丨人工智能)

本文深入探讨了大规模模型训练中智能检查点优化的核心实践。针对传统固定频率保存导致的存储浪费与恢复缓慢问题,提出了基于损失变化率的动态频率算法与分层差异化存储策略。通过PyTorch代码示例,详细展示了如何实现动态调度与增量保存,有效降低存储成本,并确保训练中断后能快速、可靠地恢复,显著提升训练任务的容错能力与经济效益。

weixin_29072299的博客 330

【Transformer 相关理论深入理解】注意力机制、自注意力机制、多头注意力机制、位置编码

transformer原理

qq_38253797的博客 2万+

蓝牙的配对和连接的建立过程

蓝牙的建立过程是一个复杂的过程,即使有过相当一段工作和使用经验的人,如果不仔细去了解还是理解不全。 平时我们用蓝牙耳机听音乐,和不同的设备共享文件,打电话等,都有一个配对--连接--传输数据的过程。 配对,其实就是一个认证的过程。 1. 为什么不配对便无法建立连接? 任何无线通信技术都存在被监听和破解的可能,蓝牙SIG为了保证蓝牙通信的安全性,采用认证的方式进行数据交互。同时为了保证...

langze的专栏 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android 低功耗蓝牙开发简述

低功耗蓝牙是在传统蓝牙的基础上开发的,但它与传统模块不同。最大的特点是降低了成本和功耗。可以快速搜索并快速连接。它保持连接并以超低功耗传输数据,低功耗蓝牙是专门针对基于物联网(IoT)设备构建的功能和应用程序设计的蓝牙版本。蓝牙BLE允许短期远程无线电连接并延长电池寿命。目前,蓝牙低功耗技术已被广泛使用,例如耳机、手环、电子秤、鼠标、键盘、灯、音箱等设备。蓝牙分为传统蓝牙和低功耗蓝牙。蓝牙4.0及更高版本被称为蓝牙低功耗,其中蓝牙4.0标准包括传统的蓝牙模块部分和蓝牙低功耗模块部分,这是双模式标准。

晨曦 5941

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

BLE低功耗蓝牙技术及手机端蓝牙的开发解读

GATT,即通用属性配置文件,是一种在低功耗蓝牙(BLE)设备间进行数据传输的协议框架。它定义了两个核心组件:服务(Services)和特性(Characteristics),它们共同构成了BLE通信的基础。GATT建立在属性协议(Attribute Protocol, ATT)之上,后者负责存储服务、特性以及相关数据,这些数据被组织在一个简单的查找表中,该表通过16位的标识符(ID)进行索引。

zzlyx99的专栏 5582

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: 5-BLE广播数据解析
下一篇: 7-iBeacon参数
心灵行者
博客等级 码龄15年 504粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心灵行者

你的鼓励是我最大的创作动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值