2540--第二天--特征值的添加和读写

BLE通信:特征值的添加与读写解析
本文深入探讨BLE通信中的特征值概念,分析GATT在数据管理中的作用,以及如何在peripheral设备上添加和获取特征值。通过对简单GATTprofile的实例分析,阐述了特征值在BLE通信中的核心地位,并提供了自定义特征值的方法。

1.GATT分析

  • 1.profole:可以理解为一种规范,一个标准的通信协议,profile存在于从机中。蓝牙组织规定了一系列的标准profile,例如防丢器,心率计等。每个profile中会包括多个Service,每个Service代表从机的一种能力。
  • 2.Service:可以理解为一个服务,在ble从机中,通常有多种服务,比如电量信息服务,系统信息服务等,每个Service中又包含多个Characteristic特征值。每个具体的特征值才是ble通信的主题。比如当前的电量是80%,所以会通过电量的特征值存储在从机的profile中,这样主机即也可以通过这个特征值来读取数据。
  • 3.特征值:ble通信是通过特征值来完成的,可以理解为一个标签,通过这个标签可以获取或者写入想要的内容。
  • 4.UUID:刚才我们提到的服务和特征值都需要一个唯一的UUID来标识。
  • 5.GATT:这个是管理数据的,数据的收发都要经过这一层来处理
  • 6.GAP:位于gatt的下层
  • 7.ATT:可以不用考虑
  • 举例分析:现有一个活动追踪的BLE设备和一个支持BLE的Android设备。Android设备支持Central角色,而BLE设备支持peripheral角色。创建一个BLE连接需要这两个角色都存在,都仅支持Central角色或者都仅支持peripheral角色则无法建立连接。当连接建立后,它们之间就需要传输GATT数据。谁做server,谁做client,则取决于具体数据传输的情况。例如,如果活动追踪的BLE设备需要向 Android设备传输sensor数据,则活动追踪器自然成为了server端;而如果活动追踪器需要从Android设备获取更新信息,则 Android设备作为server端可能更合适。
  • 关于整体的理解:这里涉及到handle,UUID等一并说完。我的理解,其实一个service就相当于一个结构体,这个profile中有很多个特征值,这些特征值也是一种数据类型,所以当一个profile只有一个service的时候,这个profile就相当于在内存中开辟了一段
### 关于 UniApp 蓝牙特征值读写 在 UniApp 开发中,蓝牙特征值(Characteristics)用于表示蓝牙设备的具体功能服务。通过读取或写入特征值,可以实现与蓝牙设备之间的数据交互。以下是详细的代码示例以及相关说明。 #### 初始化蓝牙模块 在使用蓝牙功能之前,需要先初始化蓝牙适配器。以下是一个简单的初始化代码: ```javascript // 【1】初始化蓝牙 function initBlue() { uni.openBluetoothAdapter({ success(res) { console.log('初始化蓝牙成功', res); }, fail(err) { console.error('初始化蓝牙失败', err); } }); } ``` 此代码片段展示了如何打开蓝牙适配器并处理其状态变化[^4]。 --- #### 扫描并连接蓝牙设备 完成初始化后,需扫描附近的蓝牙设备并与目标设备建立连接。以下为基本流程: ```javascript // 【2】开始扫描蓝牙设备 function startScan() { uni.startBluetoothDevicesDiscovery({ success(res) { console.log('开始扫描蓝牙设备'); } }); // 定期监听发现的设备 uni.onBluetoothDeviceFound((devices) => { devices.devices.forEach(device => { console.log('找到设备:', device.name, device.deviceId); }); }); } // 【3】连接到指定设备 function connectToDevice(deviceId) { uni.createBLEConnection({ deviceId, success(res) { console.log('连接设备成功', res); }, fail(err) { console.error('连接设备失败', err); } }); } ``` 以上代码实现了启动蓝牙设备扫描,并尝试连接至特定设备的功能[^1]。 --- #### 获取服务与特征值 一旦建立了与目标设备的连接,则需要获取该设备的服务及其特征值列表。 ```javascript // 【4】获取所有服务 function getServices(deviceId) { uni.getBLEDeviceServices({ deviceId, success(res) { const services = res.services; console.log('获取到的服务列表:', services); if (services.length > 0) { getServiceCharacteristics(deviceId, services[0].uuid); // 假设只关注第一个服务 } }, fail(err) { console.error('获取服务失败', err); } }); } // 【5】获取某个服务下的所有特征值 function getServiceCharacteristics(deviceId, serviceId) { uni.getBLEDeviceCharacteristics({ deviceId, serviceId, success(res) { const characteristics = res.characteristics.filter(char => char.properties.read || char.properties.write || char.properties.notify); console.log('获取到的特征值列表:', characteristics); if (characteristics.length > 0) { readCharacteristicValue(deviceId, serviceId, characteristics[0].uuid); // 尝试读取第一个特征值 } }, fail(err) { console.error('获取特征值失败', err); } }); } ``` 上述代码演示了如何检索蓝牙设备的服务特性,并筛选出具有 `read`、`write` 或 `notify` 权限的特征值[^1]。 --- #### 特征值读写操作 最后一步是对选定的特征值执行具体的读取或写入操作。 ##### (1)读取特征值 ```javascript // 【6】读取特征值 function readCharacteristicValue(deviceId, serviceId, characteristicId) { uni.readBLECharacteristicValue({ deviceId, serviceId, characteristicId, success(res) { console.log('读取特征值成功', res); }, fail(err) { console.error('读取特征值失败', err); } }); } ``` ##### (2)写入特征值 ```javascript // 【7】写入特征值 function writeCharacteristicValue(deviceId, serviceId, characteristicId, value) { const buffer = new ArrayBuffer(1); // 创建一个长度为1字节的缓冲区 const dataView = new DataView(buffer); dataView.setUint8(0, value); // 设置要发送的数据 uni.writeBLECharacteristicValue({ deviceId, serviceId, characteristicId, value: buffer, success(res) { console.log('写入特征值成功', res); }, fail(err) { console.error('写入特征值失败', err); } }); } ``` 这两个函数分别完成了对蓝牙设备特征值的读取写入操作[^3]^。 --- #### 注意事项 - **权限声明**:确保已在项目的 `manifest.json` 文件中配置了蓝牙权限。 - **错误处理**:实际应用中应增加更多异常捕获逻辑以提升稳定性。 - **平台差异**:不同操作系统可能会存在细微的行为差别,请测试兼容性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值