首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在BLE通信中onCharacteristicWrite()晚于onCharacteristicChanged()

在BLE通信中,onCharacteristicWrite()晚于onCharacteristicChanged()是由于BLE通信的异步特性所导致的。

BLE(Bluetooth Low Energy)是一种低功耗蓝牙技术,它允许设备在低功耗下进行短距离通信。在BLE通信中,设备之间通过GATT(Generic Attribute Profile)协议进行数据交换。GATT协议定义了一组服务和特征,设备可以通过读取和写入特征的值来进行通信。

在BLE通信中,设备之间的通信是异步的,即发送和接收数据的过程是独立进行的。当一个设备写入一个特征的值时,会触发onCharacteristicWrite()回调函数。而当另一个设备的特征值发生变化时,会触发onCharacteristicChanged()回调函数。

由于BLE通信是异步的,设备之间的通信可能存在延迟。因此,在某些情况下,onCharacteristicWrite()回调函数可能会晚于onCharacteristicChanged()回调函数触发。这是因为写入特征值的操作可能需要更长的时间来完成,而特征值的变化可能会更快地被检测到。

在处理BLE通信时,开发人员需要注意这种异步特性,确保正确处理onCharacteristicWrite()和onCharacteristicChanged()回调函数。例如,可以使用回调函数来处理写入操作的结果,以确保数据的正确传输和处理。

总结起来,BLE通信中的onCharacteristicWrite()晚于onCharacteristicChanged()是由于BLE通信的异步特性所导致的,开发人员需要注意处理这种异步操作,以确保数据的正确传输和处理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android使用BLE(低功耗蓝牙,Bluetooth Low Energy)

(GATT)—GATT配置文件是一个通用规范,用于BLE链路上发送和接收被称为“属性”的数据块。...*Attribute Protocol(ATT)—GATTATT协议基础上建立,也被称为GATT/ATT。ATT对BLE设备上运行进行了优化,为此,它使用了尽可能少的字节。...你可以bluetooth.org 找到一个目前支持的基于GATT的配置文件和服务列表。 角色和责任 以下是Android设备与BLE设备交互时的角色和责任: *中央 VS 外围设备。...一般情况下Android4.3以后的手机具有蓝牙模块的话都会支持BLE,具体可以再代码中判断。 为了app中使用蓝牙功能,必须声明蓝牙权限BLUETOOTH。..."/> 代码中判断手机是否支持BLE特性: // 使用此检查确定BLE是否支持设备上,然后你可以有选择性禁用BLE相关的功能 if (!

3.4K00
  • Android BLE 快速上手指南

    扫描时还需要我们到’设置 > 安全性和位置信息 > 位置信息‘处打开位置信息, //否则将会搜索不到周围的设备 可能有人会问为什么使用低功耗蓝牙还需要位置权限?...还原特征的写入类型 characteristic.setWriteType(parentWriteType); 接下来我们来看看回调 @Override public void onCharacteristicChanged...中我们就收不到newState为BluetoothProfile.STATE_DISCONNECTED的状态回调,因此,可以收到断开连接的回调后关闭GATT客户端。...如果大家需要了解更多更详细的使用方法,这里给大家推荐2个开源的ble库: Android-BLE-Library:NordicSemiconductor官方的Android ble库。...BLELib:我自己封装的ble库,大家喜欢的话可以顺手star一下。

    2.5K20

    蓝牙API介绍及基本功能实现

    adapter.getBondedDevices(); 开启扫描/关闭扫描 adapter.startDiscovery();//开启蓝牙扫描功能 adapter.cancelDiscovery();//关闭蓝牙扫描功能 扫描到设备时系统会发送...低功耗蓝牙 获取蓝牙适配器的步骤同上,扫描ble设备的方法如下: //开启蓝牙扫描 mBluetoothAdapter.startLeScan(mLeScanCallback); //结束蓝牙扫描 mBluetoothAdapter.stopLeScan...BluetoothGatt.GATT_SUCCESS) {                 //接收到数据回调             }         }          @Override          public void onCharacteristicWrite...characteristic, int status) {           //发送数据回调          }              @Override         public void onCharacteristicChanged...characteristic); //写数据 mBluetoothGatt.writeCharacteristic(characteristic,value); 关于低功耗蓝牙的理论知识可以参考 Android蓝牙BLE

    1.5K10

    BLE低功耗蓝牙开发相关概念问题记录

    关于ble通信的demo可以参考蓝牙API介绍及基本功能实现 Ble概念相关 ble对于数据的传输有一个字节上的限制,默认情况下是20个字节,但并不是不可修改的。...同样,ble属于传输时对于每个包之间的时间间隔也有一定的限制,大多数从机的连接时间间隔为7.5ms–4s(以1.25ms为一个单位,也就是6-0x0C80个单位)。...而协议栈是具体的一些实现函数,开发人员调用协议栈函数进行通信(相当于各种API) 连接事件:两个ble设备的连接中使用调频机制,两个设备使用特定的信道收发数据,过段时间再使用新的信道(链路层处理信道切换...主机主动读数据调用readCharacteristic方法,读之后会触发 onCharacteristicRead方法 主机主动写数据调用writeCharacteristic方法,写之后会触发 onCharacteristicWrite...方法(可以进行下一次的写数据) 主机被动获取到数据(从机通过notify方法发送数据),当监听到有数据过来时会触发 onCharacteristicChanged方法(但是要想该方法回调,必须在主机端程序中为要监听的

    2.4K60

    Android 低功耗蓝牙开发(数据交互)

    通过onCharacteristicWrite。 先修改一下这个回调方法中的内容。BleCallback中, 下面运行一下: 下面来看看控制栏的日志打印: 写入成功。...这里当我们进行有响应的数据写入时,设备收到后会先触发onCharacteristicChanged然后再触发onCharacteristicWrite。...其实说起来这个方法比较的鸡肋,这可能也是为什么使用的比较少的原因了,因为当我能知道特性是什么的时候,我直接就能拿到特性对象所携带的信息,根本不需要再去通过gatt.readCharacteristic(...这里可以看到我写入了0102之后设备的地址会发生改变,所以我退出了当前页面,再连接设备之后,发送了010200,这里我们看到了RSSI和描述符的UUID,不过特性的UUID并没有打印出来,这是为什么呢...运行打印一下: 那么来看看为什么会是false。

    2K30

    物联网来了,你还不会蓝牙开发?

    安卓4.3(API 18)为BLE的核心功能提供平台支持和API,App可以利用它来发现设备、查询服务和读写特性。相比传统的蓝牙,BLE更显著的特点是低功耗。...2 原生API的详细讲解 BLE协议中,有两个角色,周边(Periphery)和中央(Central);周边是数据提供者,中央是数据使用/处理者,一个中央可以同时连接多个周边,但是一个周边某一时刻只能连接一个中央...(characteristic, true); 该方法一般是发现服务后,进行设置的,设置该方法的目的是让硬件在数据改变的时候,发送数据给app,app则通过onCharacteristicChanged...readCharacteristic对应onCharacteristicRead; gatt.readCharacteristic(characteristic); (3) writeCharacteristic对应onCharacteristicWrite...必须要先通过gatt对象去获取服务discoverServices()可以。

    97320

    Android BlueToothBLE入门(三)——数据的分包发送和接收(源码已更新)

    ——《微卡智享》 本文长度为3675字,预计阅读12分钟 前言 接上篇《Android BlueToothBLE入门(二)——设备的连接和通讯(附Demo源码地址)》最后提到过蓝牙BLE通讯每次默认发送的数据为...前面说过,BLE通讯默认是20字节,最大也只有512字节,所以既然申请MTU,那就往最大申请即可,代码中还是在当时BlueToothBLEUtil的类中先定义一个mtuSize,用于记录当前的mtu值,...其实这里主要要说为什么是前4个字节来记录总包数和当前包,1个byte的数字范围是-128到127,总共就256个数字存储,考虑到每个包最大512字节,如果数据量特别大,拆分的包数大于256就有问题了,而正常的...当接收完后从hashtable中获取到Array数组,然后将数组组合成一个ByteArray返回,并且hasttable中删除即可。...回调的onCharacteristicChanged中 override fun onCharacteristicChanged( gatt: BluetoothGatt

    2.2K10

    Android 原生 BLE 开发

    关键术语和概念 ---- Generic Attribute Profile(GATT)— GATT 配置文件是一个通用规范,用于 BLE 链路上发送和接收被称为“属性”的数据块。...Attribute Protocol(ATT)— GATT ATT 协议基础上建立,也被称为 GATT/ATT。ATT 对 BLE 设备上运行进行了优化,为此,它使用了尽可能少的字节。...你可以bluetooth.org 找到一个目前支持的基于GATT的配置文件和服务列表。 角色和责任 以下是Android设备与BLE设备交互时的角色和责任: 中央 VS 外围设备(外设)。...BLE 权限 ---- 为了app中使用蓝牙功能,必须声明蓝牙权限 BLUETOOTH 。利用这个权限去执行蓝牙通信,例如请求连接、接受连接、和传输数据。...// 使用此检查确定 BLE 是否支持设备上,然后你可以有选择性禁用 BLE 相关的功能 if (!

    4.1K20

    蓝牙项目开发流程

    0参考代码 蓝牙(BLE)模块及协议.pdf:电脑内,有助于理解ble BLE蓝牙Android开发中的应用 - Android移动开发技术文章_手机开发 - 红黑联盟 Android...Split区分一个或多个空格 - liruizhuang的专栏 - 博客频道 - CSDN.NET Java,byte数组和字符串互转,不可打印字符_jfeiyi_新浪博客 请问为什么把...是接口的bug,我的解决方案是当出现129的时候我通过代码将蓝牙重启来避免这个问题 android 蓝牙4.0 BLE 为什么回调onServicesDiscovered方法返回的status参数一直是...需要特别注意的是,同时只能有一个操作(有些贴这说只能同时有一个writeCharacteristic(),这个我并没有严格验证),也就是等上一个操作回调(例如onCharacteristicWrite(...BLE开发的各种坑 - Wave的专栏 - 博客频道 - CSDN.NET 解决方案:public voidonCharacteristicWrite(BluetoothGatt

    3.5K100

    智联未来系列 | AIoT加速落地,无线通信IC是关键

    广域网通信中,NB-IoT和LoRa相爱相杀,相互竞争的同时又在多个场景下保持互补。...整体市场规模上,全球BLE市场规模将达到55.2亿美元,但国内企业的竞争力不足。...Nordic BLE芯片市场几乎保持垄断地位,其市场份额几乎一直保持40%以上,而TI、SiLabs、Dialog等国外厂商也第一梯队。...国内BLE芯片主要厂商有博集成、恒玄科技等,市场份额较少,其中博集成掌握无线射频领域降噪、滤波唤醒等关键技术,覆盖大疆科技、摩托罗拉、LG 等客户,有较强竞争力。...; 博集成产品 7271能够支持4种不同的协议:FM,BT,BLE,WiFi,同时集成了非常强大的DSP处理功能,可以做麦克风的消噪,声波回声的消除,人工智能的语言识别,并且支持星型的、树型的、麦氏的不同组网方式

    94540

    Android 低功耗蓝牙开发(扫描、连接、数据交互)Kotlin版

    扫描设备 ① 绑定视图 ② 检查Android版本 ③ 打开蓝牙 ④ 请求权限 ⑤ 扫描结果 ⑥ 设备适配器编写 ⑦ 数据渲染 ⑧ 开始和停止扫描 四、连接和数据交互 ① 绑定视图 ② 初始化连接 ③ Ble...connectGatt(this, false, bleCallback) } ③ Ble回调 这里有一个bleCallback,所以你的代码会报红,这很正常,只不过我们现在没有这个类,新建一个..."开启通知属性异常" } else "发现了服务") } /** * 特性改变回调 */ override fun onCharacteristicChanged...uiCallback.state("特性改变: 收到内容:$content") } /** * 特性写入回调 */ override fun onCharacteristicWrite...value = ByteUtils.hexStringToBytes(command) }) } ⑤ UI回调 首先在DataExchangeActivity中创建变量: //Ble

    1.8K20

    Android 低功耗蓝牙开发(扫描、连接、数据交互)Kotlin版

    扫描设备 ① 绑定视图 ② 检查Android版本 ③ 打开蓝牙 ④ 请求权限 ⑤ 扫描结果 ⑥ 设备适配器编写 ⑦ 数据渲染 ⑧ 开始和停止扫描 四、连接和数据交互 ① 绑定视图 ② 初始化连接 ③ Ble...connectGatt(this, false, bleCallback) } ③ Ble回调 这里有一个bleCallback,所以你的代码会报红,这很正常,只不过我们现在没有这个类,新建一个..."开启通知属性异常" } else "发现了服务") } /** * 特性改变回调 */ override fun onCharacteristicChanged...uiCallback.state("特性改变: 收到内容:$content") } /** * 特性写入回调 */ override fun onCharacteristicWrite...value = ByteUtils.hexStringToBytes(command) }) } ⑤ UI回调 首先在DataExchangeActivity中创建变量: //Ble

    2.9K31

    超低功耗操作系统的设计经验

    无论是MTK的2601还是高的2100,保证512MRAM和其他一些周边器件供电的情况下,待机底电流都会到1mA甚至更多。...选取MTK的2601或者高的2100,肯定达不到长续航且高颜值易操控的设计目标。为什么?因为什么功能都不用,5天下来也会消耗100-200毫安时的电量,留给用户使用的电量极为有限。...4)消息封装与透传 上一节有聊到双核通信的时序问题,这里简要介绍双核通信中消息的封装与打包拆包。双核之间所有的数据与指令,我们都通过自定义消息来封装与透传。...所以怀疑是蓝牙非传输状态下的通讯周期长短的问题。这个很多产品中都有类似的经历。 原因分析:BLE 连接间隔时间较短,BLE持续的通讯导致功耗过高。...解决方案:动态调节BLE的连接间隔时间,需要BLE通讯时将连接间隔调低,数据传输完成后,将连接间隔调高,让系统休眠下去。 就是ble的各种状态下要设置好正确的连接间隔。

    2.2K30

    防止物联网项目误入歧途的5条建议

    任务是用BLE移动应用替换电灯开关。不幸的是,我们的客户雇用了设计支持BLE的设备方面经验不足的固件和硬件开发人员,因此我们无法将移动应用程序连接到云。物联网平台的选择是另一个加剧因素。...由于当地政府的限制,Google Firebase无法固件团队所在的国家/地区使用。...由于丰富的特性需求,公司管理项目的范围和持续时间方面存在一些困难。尽管晚于最初的预期,但最终还是发货了。 从最小可行产品(MVP)开始是物联网开发的最佳实践。...为什么物联网对网络罪犯来说是个天堂?和所有的罪犯一样,黑客也寻找容易攻击的目标,而大多数物联网技术都是低效的。...希望物联网开发中取得成功的公司应遵循“设计安全”的原则。首先,对存储设备上或在IoT系统的组件之间传播的数据进行加密。

    28200

    对某款智能手表的分析与攻击

    抓包不熟悉的小伙伴,这里再以手机和手表为例,介绍一下为什么能够抓到 BLE 的空口数据,首先要明确一点,BLE 的通信是跳频的,也就是说如果你的设备只能抓取一个信道的数据,那你百分百是抓不全的,那上面那些方案是咋实现空口抓包的呢...的广播信道也是 37、38、39 这三个信道跳频的,你抓包工具怎么就能保证抓到手机连接手表的数据包呢?...sniff_receiver.py -m 21:23:10:21:05:43 -o 1.pcapng 开始抓包后就可以用手机正常连接手表,然后操作对应的功能了,这时候要考虑好,想通过这次抓包来分析什么,别上来一乱点...,最后看着满屏的数据包不知道啥是啥,带着目的去抓,比如我想分析手环震动(查找设备)的数据包,那这次抓包我就只点查找设备这一个功能,多点几次,这样流量包里面好定位哪一条数据包是该功能的 BLE 流量 这里还要吐槽一点感觉很多...BLE 的设备上并没有区分出来 BLE 的连接、配对的概念,我的理解中,配对是要走 SMP 协议的,但是这个手环的配对显然仅仅是做了一个 BLE 的连接,更像是他自己应用层进行的手机与手表的牵手配对

    9510
    领券