HarmonyOS 鸿蒙Next中app通过蓝牙传输数据到安卓机
HarmonyOS 鸿蒙Next中app通过蓝牙传输数据到安卓机 打开蓝牙配对后,如何将数据发送给我已经开发号的安卓机的app,两端的接收方式是不一样的,鸿蒙app传输的数据是Uint8Array,而我安卓机的接收是一个JSON字符串
可以通过以下几种方案来实现数据统一
-
数据格式转换
-
鸿蒙端处理
-
将Uint8Array类型数据通过Base64编码转换为字符串
-
构造包含数据类型标识和内容的JSON对象:
// 鸿蒙端转换示例 const uint8Data = new Uint8Array([1,2,3,4]); const base64Str = base64.encodeToStringSync(uint8Data); const jsonData = JSON.stringify({ dataType: "binary", content: base64Str });
-
-
安卓端处理
- 接收JSON字符串后解析出数据类型标识
- 对content字段进行Base64解码还原二进制数据
-
-
采用固定格式的JSON协议体
-
鸿蒙端使用@kit.ConnectivityKit的bluetooth模块
-
安卓端使用标准Android Bluetooth API建立RFCOMM连接
-
固定格式的JSON协议体:
{ "version": 1, "dataType": "text|binary|file", "timestamp": 1650000000, "content": "Base64字符串或原始文本" }
-
鸿蒙端发送实现:
import { socket } from '[@kit](/user/kit).ConnectivityKit'; // 创建蓝牙Socket let clientSocket = socket.constructSocketInstance(); clientSocket.connect({ address: 'XX:XX:XX:XX:XX:XX', type: 1 }); // 发送数据 const writer = await clientSocket.getWriter(); await writer.write(new Uint8Array(JSON.stringify(jsonData).split('').map(c => c.charCodeAt(0))));
-
安卓端接收处理:
// 安卓端读取字节流 InputStream mmInStream = bluetoothSocket.getInputStream(); byte[] buffer = new byte; int bytes = mmInStream.read(buffer); String jsonStr = new String(buffer, 0, bytes); // 解析数据 JSONObject jsonData = new JSONObject(jsonStr); if ("binary".equals(jsonData.getString("dataType"))) { byte[] rawData = Base64.decode(jsonData.getString("content"), Base64.DEFAULT); }
-
更多关于HarmonyOS 鸿蒙Next中app通过蓝牙传输数据到安卓机的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
鸿蒙端序列化处理
// 将业务数据转换为JSON字符串
const payload = { key1: 'value1', key2: 123 };
const jsonStr = JSON.stringify(payload);
// 转换为Uint8Array字节流
const encoder = new TextEncoder();
const byteArray = encoder.encode(jsonStr);
// 通过蓝牙发送字节流---示例
const characteristic = await service.getCharacteristic(CHARACTERISTIC_UUID);
await characteristic.writeValue(byteArray);
安卓端反序列化处理(这里以Java示例)
// 接收字节数据后转换
byte[] receivedData = ...; // 蓝牙接收的字节数组
String jsonStr = new String(receivedData, StandardCharsets.UTF_8);
JSONObject jsonObject = new JSONObject(jsonStr);
在HarmonyOS Next中,应用通过蓝牙传输数据到安卓机需使用鸿蒙的蓝牙API。关键步骤:1. 使用@ohos.bluetooth
模块初始化蓝牙适配器;2. 通过startBluetoothDiscovery()
搜索安卓设备;3. 使用createBond()
配对目标设备;4. 建立RFCOMM或GATT连接;5. 通过writeCharacteristicValue()
或输出流传输数据。安卓端需实现相同协议(如SPP或自定义GATT服务)。传输前需确保双方蓝牙协议兼容。
在HarmonyOS Next中实现与安卓设备间的蓝牙数据传输,需要注意以下几点关键实现:
- 数据格式转换: 在鸿蒙端发送前,需要将Uint8Array转换为Base64字符串或直接转为JSON格式:
// Uint8Array转JSON示例
let jsonData = {
data: Array.from(uint8Array) // 转为普通数组
};
let jsonString = JSON.stringify(jsonData);
- 蓝牙传输实现:
// 获取蓝牙特征值后发送
characteristic.writeValue(jsonString).then(() => {
console.log("发送成功");
}).catch(err => {
console.error("发送失败:", err);
});
- 安卓端适配:
确保安卓端蓝牙服务配置了相同的UUID,并在接收后解析JSON:
// 安卓端接收处理
@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
String jsonString = new String(characteristic.getValue());
JSONObject json = new JSONObject(jsonString);
// 处理数据...
}
- 注意事项:
- 双方需约定相同的数据格式协议
- 传输的JSON数据不宜过大(建议小于512字节)
- 需要处理字符编码问题(建议统一使用UTF-8)
这种实现方式既保持了鸿蒙端Uint8Array的数据处理优势,又能兼容安卓端JSON格式的接收需求。