# LaUniBlePlugin
**Repository Path**: liulog/LaUniBlePlugin
## Basic Information
- **Project Name**: LaUniBlePlugin
- **Description**: 原生蓝牙转 uniapp 插件
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-08-31
- **Last Updated**: 2025-09-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 呼吸家蓝牙插件 (LaUniBlePlugin)
一个专为呼吸家医疗设备设计的Android蓝牙通信插件,支持设备扫描、连接管理、数据采集和实时监控功能。后续可转换为UniApp插件,支持跨平台应用开发。
## 功能特性
- 🔍 **设备扫描**: 自动扫描附近的呼吸家蓝牙设备
- 🔗 **连接管理**: 稳定的设备连接和自动重连机制
- 📊 **数据解析**: 实时解析设备数据包,支持多种医疗指标
- 📱 **事件回调**: 完整的事件监听机制,支持异步通知
- 🛡️ **错误处理**: 完善的错误分类和处理机制
- 📝 **日志记录**: 详细的日志记录,支持文件输出
- 🔄 **UniApp兼容**: 设计时考虑了UniApp转换需求
## 系统要求
- Android 5.0+ (API Level 21+)
- 支持蓝牙低功耗 (BLE)
- 必要的蓝牙和位置权限
## 快速开始
### 1. 添加依赖
在 `app/build.gradle.kts` 中添加以下依赖:
```kotlin
dependencies {
// 蓝牙相关依赖
implementation("androidx.bluetooth:bluetooth:1.0.0-alpha02")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
// JSON解析
implementation("com.google.code.gson:gson:2.10.1")
// 权限处理
implementation("androidx.activity:activity-ktx:1.8.2")
implementation("androidx.fragment:fragment-ktx:1.6.2")
}
```
### 2. 配置权限
在 `AndroidManifest.xml` 中添加必要权限:
```xml
```
### 3. 基本使用
```kotlin
class MainActivity : ComponentActivity() {
private lateinit var plugin: LaUniBlePlugin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 初始化插件
plugin = LaUniBlePlugin.getInstance(this)
// 初始化插件
val initResult = plugin.initialize()
// 设置事件监听器
setupEventListeners()
// 开始扫描设备
plugin.startScan()
}
private fun setupEventListeners() {
// 设备发现事件
plugin.setEventCallback("onDeviceFound") { jsonData ->
// 处理发现的设备
Log.d("Plugin", "发现设备: $jsonData")
}
// 设备连接事件
plugin.setEventCallback("onDeviceConnected") { jsonData ->
// 处理设备连接
Log.d("Plugin", "设备已连接: $jsonData")
}
// 数据接收事件
plugin.setEventCallback("onDataReceived") { jsonData ->
// 处理接收到的数据
Log.d("Plugin", "接收数据: $jsonData")
}
// 错误事件
plugin.setEventCallback("onError") { jsonData ->
// 处理错误
Log.e("Plugin", "发生错误: $jsonData")
}
}
override fun onDestroy() {
super.onDestroy()
plugin.cleanup()
}
}
```
## API 接口
### 核心方法
#### 初始化插件
```kotlin
fun initialize(config: String = "{}"): String
```
- **参数**: `config` - 初始化配置(JSON字符串)
- **返回**: 初始化结果(JSON格式)
#### 检查蓝牙状态
```kotlin
fun checkBluetoothStatus(): String
```
- **返回**: 蓝牙状态信息(JSON格式)
#### 开始扫描设备
```kotlin
fun startScan(options: String = "{}"): String
```
- **参数**: `options` - 扫描选项(JSON字符串)
- `timeout`: 扫描超时时间(毫秒)
- `deviceName`: 设备名称过滤器
- **返回**: 扫描启动结果(JSON格式)
#### 停止扫描设备
```kotlin
fun stopScan(): String
```
- **返回**: 停止扫描结果(JSON格式)
#### 连接设备
```kotlin
fun connectDevice(deviceInfo: String): String
```
- **参数**: `deviceInfo` - 设备信息(JSON字符串)
- `deviceId`: 设备ID
- `macAddress`: MAC地址
- `deviceName`: 设备名称(可选)
- `autoReconnect`: 是否自动重连(默认true)
- **返回**: 连接结果(JSON格式)
#### 断开设备连接
```kotlin
fun disconnectDevice(deviceId: String): String
```
- **参数**: `deviceId` - 设备ID
- **返回**: 断开连接结果(JSON格式)
#### 发送数据到设备
```kotlin
fun sendData(deviceId: String, data: String): String
```
- **参数**:
- `deviceId`: 目标设备ID
- `data`: 要发送的数据(十六进制字符串)
- **返回**: 发送结果(JSON格式)
#### 获取已连接设备列表
```kotlin
fun getConnectedDevices(): String
```
- **返回**: 设备列表(JSON格式)
### 事件回调
#### 设置事件回调
```kotlin
fun setEventCallback(eventType: String, callback: (String) -> Unit)
```
#### 支持的事件类型
- `onDeviceFound`: 发现设备
- `onScanCompleted`: 扫描完成
- `onDeviceConnected`: 设备连接成功
- `onDeviceDisconnected`: 设备断开连接
- `onDataReceived`: 接收到数据
- `onError`: 发生错误
## 数据格式
### 设备信息格式
```json
{
"deviceId": "AA:BB:CC:DD:EE:FF",
"deviceName": "呼吸家设备",
"macAddress": "AA:BB:CC:DD:EE:FF",
"signalStrength": -45,
"signalDescription": "强"
}
```
### 数据记录格式
```json
{
"recordId": "record_12345",
"deviceId": "AA:BB:CC:DD:EE:FF",
"dataType": "呼吸频率",
"timestamp": 1640995200000,
"dataPoints": [
{
"metricName": "respiratory_rate",
"value": 18.5,
"unit": "次/分钟",
"formattedValue": "18.50 次/分钟"
}
],
"rawDataHex": "AA 01 12 34 55"
}
```
### 错误信息格式
```json
{
"success": false,
"error": {
"code": 1002,
"type": "BLUETOOTH_NOT_ENABLED",
"message": "请先开启蓝牙功能",
"details": "蓝牙未启用",
"timestamp": 1640995200000
}
}
```
## 支持的医疗数据类型
- **呼吸频率** (RESPIRATORY_RATE): 次/分钟
- **潮气量** (TIDAL_VOLUME): mL
- **分钟通气量** (MINUTE_VOLUME): L/min
- **血氧饱和度** (OXYGEN_SATURATION): %
- **心率** (HEART_RATE): 次/分钟
- **体温** (TEMPERATURE): °C
- **气道压力** (PRESSURE): cmH2O
- **流速** (FLOW_RATE): L/min
## 错误代码
| 错误代码 | 错误类型 | 描述 |
|---------|---------|------|
| 1001 | BLUETOOTH_NOT_SUPPORTED | 设备不支持蓝牙 |
| 1002 | BLUETOOTH_NOT_ENABLED | 蓝牙未启用 |
| 2001 | PERMISSION_DENIED | 权限被拒绝 |
| 3001 | SCAN_FAILED_ALREADY_STARTED | 扫描已在进行中 |
| 4001 | CONNECTION_FAILED_ESTABLISHMENT | 连接建立失败 |
| 4002 | CONNECTION_TIMEOUT | 连接超时 |
| 6001 | DATA_PARSING_FAILED | 数据解析失败 |
| 9001 | PLUGIN_NOT_INITIALIZED | 插件未初始化 |
## 日志配置
```kotlin
// 初始化日志系统
Logger.initialize(
logDir = getExternalFilesDir("logs"),
enableFile = true,
minLevel = LogLevel.DEBUG
)
// 记录日志
Logger.d("TAG", "调试信息")
Logger.i("TAG", "普通信息")
Logger.w("TAG", "警告信息")
Logger.e("TAG", "错误信息", exception)
```
## 最佳实践
### 1. 权限处理
```kotlin
private fun requestBluetoothPermissions() {
val permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
BluetoothConstants.BLUETOOTH_PERMISSIONS_API31
} else {
BluetoothConstants.BLUETOOTH_PERMISSIONS
}
val missingPermissions = permissions.filter {
ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED
}
if (missingPermissions.isNotEmpty()) {
requestPermissionLauncher.launch(missingPermissions.toTypedArray())
}
}
```
### 2. 连接管理
```kotlin
// 启用自动重连
val deviceInfo = mapOf(
"deviceId" to device.deviceId,
"macAddress" to device.macAddress,
"autoReconnect" to true
)
plugin.connectDevice(Gson().toJson(deviceInfo))
```
### 3. 错误处理
```kotlin
plugin.setEventCallback("onError") { jsonData ->
try {
val response = Gson().fromJson(jsonData, Map::class.java)
val error = response["error"] as? Map
val errorCode = error?.get("code") as? Double
when (errorCode?.toInt()) {
1002 -> showBluetoothEnableDialog()
2001 -> requestPermissions()
4002 -> retryConnection()
else -> showGenericError(error?.get("message") as? String)
}
} catch (e: Exception) {
Log.e("Error", "处理错误事件失败", e)
}
}
```
## UniApp 转换指南
### 1. 插件结构
插件已按照UniApp原生插件的结构设计,主要包括:
- 统一的JSON API接口
- 事件回调机制
- 错误处理规范
### 2. 接口映射
```javascript
// UniApp中的调用方式
const plugin = uni.requireNativePlugin('LaUniBlePlugin');
// 初始化
plugin.initialize({}, (result) => {
console.log('初始化结果:', result);
});
// 设置事件监听
plugin.setEventCallback('onDeviceFound', (data) => {
console.log('发现设备:', data);
});
// 开始扫描
plugin.startScan({ timeout: 10000 }, (result) => {
console.log('扫描结果:', result);
});
```
### 3. 事件处理
```javascript
// 在UniApp中处理事件
export default {
data() {
return {
devices: [],
connectedDevices: []
}
},
onLoad() {
this.initPlugin();
},
methods: {
initPlugin() {
const plugin = uni.requireNativePlugin('LaUniBlePlugin');
plugin.setEventCallback('onDeviceFound', (data) => {
const device = JSON.parse(data).data;
this.devices.push(device);
});
plugin.setEventCallback('onDataReceived', (data) => {
const record = JSON.parse(data).data;
this.handleDataReceived(record);
});
}
}
}
```
## 故障排除
### 常见问题
1. **扫描不到设备**
- 检查蓝牙是否开启
- 确认位置权限已授予
- 验证设备是否在广播模式
2. **连接失败**
- 检查设备是否已被其他应用连接
- 确认蓝牙连接权限
- 尝试重启蓝牙适配器
3. **数据解析失败**
- 检查设备协议是否匹配
- 验证数据包格式
- 查看详细错误日志
### 调试技巧
1. **启用详细日志**
```kotlin
Logger.setMinLogLevel(LogLevel.VERBOSE)
```
2. **查看错误历史**
```kotlin
val errorHistory = ErrorHandler.getErrorHistory()
Log.d("Debug", "错误历史: $errorHistory")
```
3. **检查插件状态**
```kotlin
val status = plugin.checkBluetoothStatus()
Log.d("Debug", "插件状态: $status")
```
## 许可证
MIT License
## 贡献
欢迎提交Issue和Pull Request来改进这个插件。
## 更新日志
### v1.0.0
- 初始版本发布
- 支持基本的蓝牙设备扫描和连接
- 实现数据解析和事件回调
- 添加完整的错误处理机制
- 提供详细的日志记录功能
## 联系方式
如有问题或建议,请通过以下方式联系:
- 项目地址: https://gitee.com/liulog/LaUniBlePlugin.git
- 邮箱: support@huxijia.cn
- 官网: www.huxijia.cn