誰煮肉片 2025-10-30 10:12 采纳率: 0%
浏览 5

flutter 蓝牙广播 ios 发送uuid数据问题

使用 bluetooth_low_energy插件 使用蓝牙广播 ,安卓发送数据,通过 nRF52840 可以接收到是 13个值16位列表 但是ios发送数据 只是发送了一个 128位的值 ,是13个值中的第一个 ,但我使用别的 ios app 发送蓝牙广播 可以发送13个值16位列表

img

img

class UuidManager {
  // 动态生成 UUID,从广播包的十六进制字符串中截取
  static List<String> getDynamicServiceUuids({
    required int deviceId,
    required int opCode,
    required String broadcastPacketHex,
  }) {
    List<String> dynamicUuids = [];
    String protocolString =
        broadcastPacketHex.padLeft(52, '0').substring(0, 52);

    // 从协议字符串中每 2 字节截取生成动态 UUID
    for (int i = 0; i < protocolString.length; i += 4) {
      int end = i + 4;
      if (end > protocolString.length) {
        end = protocolString.length;
      }

      // 2 字节作为一个 UUID 部分
      String uuidPart = protocolString.substring(i, end);
      // 如果不足2 字节,用 0 填充
      if (uuidPart.length < 4) {
        uuidPart = uuidPart.padRight(4, '0');
      }
      dynamicUuids.add(uuidPart.toUpperCase());
    }
    while (dynamicUuids.length < 13) {
      // 当数据不足时,用0000填充剩余UUID
      dynamicUuids.add('0000');
    }
    int seed = (deviceId ^ opCode ^ dynamicUuids.length) & 0xFFFF;
    // 交换高低位
    int swappedSeed = ((seed & 0xFF) << 8) | ((seed >> 8) & 0xFF);
    String uuid = swappedSeed.toRadixString(16).padLeft(4, '0').toUpperCase();

    if (dynamicUuids.length > 13) {
      dynamicUuids = dynamicUuids.sublist(0, 13);
    }

    // 调试日志
    debugPrint(
        'UuidManager生成的动态UUID列表 (数量: ${dynamicUuids.length}): $dynamicUuids');

    return dynamicUuids;
  }
}

  // 将2字节值转换为16位蓝牙UUID
  UUID _convertToBluetoothUUID(int twoByteValue) {
    int swappedValue =
    ((twoByteValue & 0xFF) << 8) | ((twoByteValue >> 8) & 0xFF);
    return UUID.short(swappedValue);
  }

 // 动态城市uuid列表 
  List<UUID> uuidList = UuidManager.getDynamicServiceUuids( 
          deviceId: _currentDeviceId!,
          opCode: opCode,
          broadcastPacketHex: broadcastPacketHex)
          .map((uuid16) {
        int twoByteValue = int.parse(uuid16, radix: 16);
        return _convertToBluetoothUUID(twoByteValue);
      }).toList();
// 广播名称,包含操作码和广播包十六进制字符串
     final Advertisement advertisement  = Advertisement(
          name: 'MS',
          serviceUUIDs: uuidList,
        ); 

代码是生成的uuid

  • 写回答

4条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-10-30 10:16
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析:
      - 主要问题在于使用bluetooth_low_energy插件在iOS和安卓上进行蓝牙广播时,发送的数据格式存在差异。安卓发送的数据能被nRF52840接收到为13个值的16位列表,而iOS发送的数据是一个128位的值。
    2. 解决方案:
      - 首先,检查bluetooth_low_energy插件在iOS和安卓上的配置是否一致。确保在初始化和设置广播数据时,遵循相同的规范。
      - 对于iOS端,查看发送数据的代码逻辑。如果发送的是一个128位的值,可能需要将其转换为符合蓝牙广播规范的格式,比如16位的列表。
      - 示例代码(假设已经初始化了蓝牙广播):
      ```dart
      // 安卓端发送数据示例
      List dataToSendAndroid = [/ 13个16位的值 /];
      await bluetoothLowEnergy.startAdvertising(
      serviceUuid: ‘your_service_uuid’,
      serviceData: {
      ‘your_data_uuid’: dataToSendAndroid,
      },
      );

      // iOS端发送数据示例(假设原始数据是128位的值,这里进行转换)
      List original128BitData = [/ 128位的数据 /];
      List dataToSendIOS = [];
      for (int i = 0; i < original128BitData.length; i += 2) {
      int combined = (original128BitData[i] << 8) | original128BitData[i + 1];
      dataToSendIOS.add(combined);
      }
      await bluetoothLowEnergy.startAdvertising(
      serviceUuid: ‘your_service_uuid’,
      serviceData: {
      ‘your_data_uuid’: dataToSendIOS,
      },
      );
      `` 3. 不同解决方案的优缺点: - **方案一:检查插件配置** - **优点**:简单直接,如果是配置问题,容易快速定位和解决。 - **缺点**:如果配置本身没问题,可能无法解决数据格式差异的根本问题。 - **方案二:转换数据格式** - **优点**:能直接解决数据格式不一致导致接收异常的问题。 - **缺点**:需要了解蓝牙广播数据的格式规范,可能需要一定的调试和测试来确保转换正确。 4. 总结: - 首先排查bluetooth_low_energy`插件在iOS和安卓上的配置是否相同。若配置无误,重点检查iOS端发送数据的格式,将128位的数据转换为16位列表的格式进行发送,以确保接收端(nRF52840)能正确解析数据。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 修改了问题 10月30日
  • 修改了问题 10月30日
  • 创建了问题 10月30日