HarmonyOS 鸿蒙Next中app通过蓝牙传输数据到安卓机

HarmonyOS 鸿蒙Next中app通过蓝牙传输数据到安卓机 打开蓝牙配对后,如何将数据发送给我已经开发号的安卓机的app,两端的接收方式是不一样的,鸿蒙app传输的数据是Uint8Array,而我安卓机的接收是一个JSON字符串

4 回复

可以通过以下几种方案来实现数据统一

  1. 数据格式转换

    • 鸿蒙端处理

      • 将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解码还原二进制数据
  2. 采用固定格式的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中实现与安卓设备间的蓝牙数据传输,需要注意以下几点关键实现:

  1. 数据格式转换: 在鸿蒙端发送前,需要将Uint8Array转换为Base64字符串或直接转为JSON格式:
// Uint8Array转JSON示例
let jsonData = {
  data: Array.from(uint8Array) // 转为普通数组
};
let jsonString = JSON.stringify(jsonData);
  1. 蓝牙传输实现:
// 获取蓝牙特征值后发送
characteristic.writeValue(jsonString).then(() => {
  console.log("发送成功");
}).catch(err => {
  console.error("发送失败:", err);
});
  1. 安卓端适配:

确保安卓端蓝牙服务配置了相同的UUID,并在接收后解析JSON:

// 安卓端接收处理
@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
  String jsonString = new String(characteristic.getValue());
  JSONObject json = new JSONObject(jsonString);
  // 处理数据...
}
  1. 注意事项:
  • 双方需约定相同的数据格式协议
  • 传输的JSON数据不宜过大(建议小于512字节)
  • 需要处理字符编码问题(建议统一使用UTF-8)

这种实现方式既保持了鸿蒙端Uint8Array的数据处理优势,又能兼容安卓端JSON格式的接收需求。

回到顶部