当前位置: 首页 > news >正文

uniapp安卓原生插件实现开启ble Server[外围模式]

1. 功能概述

最近公司业务要实现安卓开启ble Server实现业务功能,最初用的是差价市场的一款外围插件,用下来真是一言难尽,服务打开慢、配置臃肿一点都不好用,于是自己便开发了一款插件。本模块实现了基于 Android BLE 外围模式(Bluetooth Low Energy)技术的蓝牙服务端功能,支持:

  • 开启/关闭蓝牙服务。
  • 向客户端发送数据。
  • 接收客户端写入的数据。
  • 动态管理设备连接状态。
  • 提供日志记录和回调通知机制。

2. 前后端交互接口

2.1 开启蓝牙服务

功能描述:初始化蓝牙服务端,设置服务 UUID、特征值 UUID 和设备名称,并开启 BLE 广播。

前端调用方法

openBleServer() {const options = {serviceUUID: "0000ff11-0000-1000-8000-00805f9b34fb", // 自定义服务 UUIDwriteCharacteristicUUID: "0000fff1-0000-1000-8000-00805f9b34fb", // 写特征值 UUIDdeviceName: "MyBLEDevice", // 蓝牙设备名称allowMultipleConnections: false, // 是否允许多设备连接dataType: 1, // 数据类型:字符编码发送charsetName: "UTF-8" // 字符集};bleServer.openBleServer(options, (res) => {if (res.code === 0) {console.log("蓝牙服务启动成功!");} else {console.error(`蓝牙服务启动失败: ${res.msg}`);}});
}
2.2 关闭蓝牙服务

功能描述:停止 BLE 广播,关闭 GATT Server,并清空已连接设备列表。

前端调用方法

closeBleServer() {bleServer.closeBleServer((res) => {if (res.code === 0) {console.log("蓝牙服务已关闭!");} else {console.error(`蓝牙服务关闭失败: ${res.msg}`);}});
}
2.3 向客户端写入数据

功能描述:通过指定设备地址和特征值 UUID,向客户端发送数据。

前端调用方法

writeDataToClient() {const options = {deviceAddress: this.deviceAddress, // 目标设备地址characteristicUUID: "0000fff1-0000-1000-8000-00805f9b34fb", // 写特征值 UUIDdata: "Hello BLE Client!", // 要发送的数据dataType: 1, // 数据类型:字符编码发送charsetName: "UTF-8" // 字符集};bleServer.writeCharacteristicToClient(options, (res) => {if (res.code === 0) {console.log("数据写入成功!");} else {console.error(`数据写入失败: ${res.msg}`);}});
}

后端实现

  • 根据 deviceAddress 查找目标设备。
  • 根据 characteristicUUID 获取对应的特征值。
  • 根据 dataTypecharsetName 对数据进行处理(原始数据、十六进制或字符编码)。
  • 调用 bluetoothGattServer.notifyCharacteristicChanged 方法通知客户端数据变更。

2.4 接收客户端写入的数据

功能描述:接收客户端写入的数据,并根据配置的 dataType 进行处理。

3. 配置参数说明

参数名类型默认值描述
serviceUUIDString"0000ff11-0000-1000-8000-00805f9b34fb"服务 UUID,用于标识蓝牙服务。
writeCharacteristicUUIDString"0000fff1-0000-1000-8000-00805f9b34fb"写特征值 UUID,用于写入数据。
deviceNameString"MyBLEDevice"蓝牙设备名称,可选配置。
allowMultipleConnectionsBooleantrue是否允许多设备连接。如果为 false,新设备连接时会断开已有连接。
dataTypeInteger-1数据类型:
-1:原始数据。
0:十六进制。
1:字符编码。
charsetNameString"UTF-8"字符集,仅在 dataType=1 时生效,默认为 UTF-8。

4. 回调通知机制

4.1 回调类型

所有回调均通过 JSON 格式返回,包含以下字段:

字段名类型描述
typeString回调类型(如 "connection_state_change")。
codeInteger状态码:
0:成功。
<0:失败。
msgString提示信息。
dataObject可选数据(如设备信息或数据负载)。
4.2 示例回调
{"type": "connection_state_change","code": 0,"msg": "客户端已连接","data": {"deviceInfo": {"deviceName": "Client Device","deviceAddress": "XX:XX:XX:XX:XX:XX"}}
}

5. 注意事项

  1. 权限管理

    • Android 6.0 及以上版本需要动态申请位置权限。
    • Android 12 及以上版本需要额外申请蓝牙广告权限。
  2. 多设备连接限制

    • 如果设置了 allowMultipleConnections=false,则只允许一个设备连接,新设备连接时会断开已有连接。
  3. 数据格式

    • 确保 dataTypecharsetName 配置正确,否则可能导致数据解析失败。
  4. 错误处理

    • 每个接口均返回codemsg,前端需根据返回值判断操作是否成功,并处理异常情况。

http://www.dtcms.com/a/390563.html

相关文章:

  • React 18.2中使用React Router 6.4
  • 人员在岗监测技术研究:基于计算机视觉的智能监管方案
  • 实测AI Ping,一个大模型服务选型的实用工具——行业实践与深度优化策略
  • 通过QuickAPI优化金融系统API:安全快捷的数据共享最佳实践
  • 第4节 添加视频字幕到剪映(Coze扣子空间剪映小助手零基础教程)
  • 算法 --- BFS 解决 FloodFill 算法
  • telnet 一个 ip+端口却无法退出 着急
  • UVa1602/LA3224 Lattice Animals
  • Docker BuildKit 实现 Golang 编译加速
  • [x-cmd] 在 Android 的 Termux 和 iOS 的 iSH 中安装 X-CMD
  • CTFSHOW 中期测评(一)web486 - web501
  • android-USB-STM32
  • 云原生周刊:MetalBear 融资、Chaos Mesh 漏洞、Dapr 1.16 与 AI 平台新趋势
  • Android音频学习(十九)——音频HAL层简介
  • Android之音乐列表播放管理类,控制音乐播放、暂停、播放模式的切换等
  • Docker Compose从入门到实战:配置与命令全指南
  • 10.1 输入子系统模型
  • Unity手游输入笔记
  • SpringCloud-注册中心Nacos[笔记3]
  • 关于MySQL与Python后端命令交互备份
  • 大模型上下文工程实践- 上下文管理策略
  • 资产测绘工具-Nmap
  • 智能体环境配置测试
  • 如何将非结构化文档智能解析高质量数据,并按照阅读顺序还原版面?
  • 第八章 惊喜11 认知觉醒
  • 嵌入式系统学习Day37(ARM)
  • 02-Media-10-video_decoder.py 对H.264或H.265格式视频解码并在液晶屏或外接HDMI显示屏上进行显示的示例程序
  • Go面试题及详细答案120题(61-80)
  • 第二部分:VTK核心类详解(第35章:vtkDataSetAttributes数据集属性类)
  • 智能文献分析系统:让AI成为学术研究助手