HarmonyOS鸿蒙Next中到底有没有SPP经典蓝牙的demo

HarmonyOS鸿蒙Next中到底有没有SPP经典蓝牙的demo 服了 文档写的根本不行 为demo 而demo 没有实质意义

就比如 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/spp-development-guide 里面的 socket.SppOptions uuid 如果是真实设备怎么获取? 也不表明 写死个uuid就完事了

发送数据 socket.sppWrite(this.clientNumber, arrayBuffer); 不报错 也不生效 都不知道是哪里有问题

那么大的公司 就不能写个 SPP经典蓝牙的可运行的demo项目吗 ? 只弄个BLE 有啥用


更多关于HarmonyOS鸿蒙Next中到底有没有SPP经典蓝牙的demo的实战教程也可以访问 https://www.itying.com/category-93-b0.html

17 回复

【解决方案】
开发者您好,可参考传统蓝牙示例,您提出的问题请查看如下说明:

  1. connection.getRemoteProfileUuids 返回的是一个 Array<connection.ProfileUuids> 数组。这里的 UUID 指的是系统级定义的标准蓝牙Profile UUID(例如A2DP蓝牙音频、HFP免提通话、HID鼠标键盘等)。它的主要作用是让系统或应用判断这个设备是一个耳机、键盘还是车载,进而调用connection.connectAllowedProfiles去连接对应的系统音频或外设服务。
  2. 在经典蓝牙中,SPP分为两类:
    标准SPP: 几乎所有串口模块(如 HC-05、蓝牙打印机)都固定使用标准UUID:00001101-0000-1000-8000-00805F9B34FB。这个您不需要获取,直接硬编码写在SppOptions中即可。
    自定义SPP: 如果外设厂家修改了SPP的UUID,这属于应用层自定义服务,connection.getRemoteProfileUuids 作为系统基础连接模块,是无法扫描和解析出第三方厂商自定义的特定私有UUID的。使用手机下载蓝牙调试助手一类的APP,可以查看对应经典蓝牙设备的UUID。在经典蓝牙开发中,面向特定硬件通信时,UUID需要提前获知并固定写在代码中。
  3. 若sppWrite成功,而远端硬件没有动静,请排查是否为数据已传输,但未能解析。经典蓝牙设备(如单片机串口、热敏打印机)内部接收逻辑如下:
if (uart_receive_char == '\n') { 开始解析并执行命令(); }

(1)如果发送数据为纯文本,请在字符串末尾加上\r\n,然后运行验证。
(2)如果发送为结构化数据(如十六进制指令、Hex 字节):外设需要特定的帧头和帧尾(例如 0xAA 开头,0x55 结尾),请排查您的ArrayBuffer转换是否正确。(直接将字符换转成buffer,默认是UTF-8编码,而很多老旧外设只识别GBK或者是纯二进制Hex)

更多关于HarmonyOS鸿蒙Next中到底有没有SPP经典蓝牙的demo的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


以上评论都不对

经典蓝牙 可以通过

let uuids = await connection.getRemoteProfileUuids(mac);   

获取真实UUID列表 拿到第一个 就可以构建 socket.SppOptions

let option: socket.SppOptions = {
  uuid: "00001101-0000-1000-8000-00805f9b34fb"
  secure: false,
  type: socket.SppType.SPP_RFCOMM
};

也无法连接 真实设备 uuid 需要 添加代码获取

let uuids = await connection.getRemoteProfileUuids(mac);  

不是找到示例了,问题解决了?

开发者您好!可以使用自定义的服务UUID(可通过工具函数util.generateRandomUUID生成),也可以使用标准协议定义的Serial Port UUID服务(00001101-0000-1000-8000-00805F9B34FB)。

参考文档:

点击访问

UUID生成工具:

点击访问

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

SPP 这里的 UUID 不是从“真实设备上自动获取一个随机值”这么理解。两端要使用同一个服务 UUID:如果对端是标准串口服务,通常用 Serial Port Profile UUID;如果是你自己控制的设备/固件,就在服务端注册一个固定自定义 UUID,客户端用同一个 UUID 去连接。

sppWrite 不报错但对端没收到时,建议按链路分段查:

  1. 确认当前拿到的是已连接的 clientNumber,不是扫描/配对阶段的设备标识;
  2. 服务端是否真的监听了同一个 UUID 的 SPP 服务;
  3. 写入前连接状态是否仍有效,断连后 clientNumber 不能复用;
  4. ArrayBuffer 的编码和协议帧是否符合对端要求,例如换行符、长度头、大小端;
  5. 先用标准串口工具或另一台已知可用客户端验证外设服务,再回到 HarmonyOS 代码。

指南:了解每个功能 api文档:api详细信息 最佳实践:各种demo,

然后完整demo你应该到最佳实践里面找,这里才是实践区,指南是分模块,分步骤讲的,给你个链接,文档最后面就是gitcode的链接,拉下来签个名就能跑的。

https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-bluetooth-low-energy#section2172947845,

这个依旧是 BLE 你要区分 BLE 和经典蓝牙SPP 的区别

参考嘛,确实只有低功耗蓝牙,

这个uuid就是可以写死啊,你自己定义你自己服务的uuid,

真实设备 哪里能写死 你只能获取到设备的UUID 列表 才能连接通

鸿蒙Next当前未提供SPP经典蓝牙的官方demo。其蓝牙能力主要集中于BLE,经典蓝牙SPP未在公开API中支持。

官方确实没有提供一个独立的、可直接运行的SPP完整Demo工程,目前文档中只有关键代码片段的示例。但开发所需的核心流程已经足够清晰,主要在以下几点:

  1. UUID问题
    SPP经典蓝牙基于RFCOMM,使用的服务UUID通常是标准值00001101-0000-1000-8000-00805F9B34FB。客户端直接配置这个固定UUID即可,不需要从对端设备动态获取,文档中的硬编码正是正式用法。

  2. 发送数据不生效
    常见根因是连接状态管理或API调用时序问题。必须先建立SPP连接并拿到正确的clientNumber,示例:

    import { socket } from '';
    
    let sppClient: socket.Socket | null = null;
    let clientNumber: number = 0;
    
    function createAndConnect() {
      let options: socket.SppOptions = {
        uuid: '00001101-0000-1000-8000-00805F9B34FB',
        secure: false,
        type: 'rfcomm'
      };
      sppClient = socket.createSppClient();
      sppClient.on('sppConnect', (data) => {
        clientNumber = data.clientNumber; // 必须在此回调中获取,否则下发必无效
      });
      sppClient.on('error', (err) => {
        console.error(`error: ${JSON.stringify(err)}`);
      });
      let remoteAddr = 'xx:xx:xx:xx:xx:xx'; // 替换为实际配对设备的MAC
      sppClient.sppConnect(remoteAddr, options);
    }
    
    function sendData(arrayBuffer: ArrayBuffer) {
      if (sppClient && clientNumber > 0) {
        sppClient.sppWrite(clientNumber, arrayBuffer).then(() => {
          console.info('write success');
        }).catch((err) => {
          console.error(`write failed: ${JSON.stringify(err)}`);
        });
      }
    }
    
    • sppWrite是异步Promise,需要.then/catch处理结果,否则即使报错也可能被吞掉。
    • 发送前确保已配对、已建立RFCOMM链路。如果clientNumber为0或未在sppConnect回调后调用,会静默失败。
  3. 与BLE的区别
    BLE的Demo多是因为GATT相关的profile示例丰富,但经典蓝牙SPP同样是HarmonyOS Next支持的能力,只是没有打包为一个完整的CodeLab。上述代码稍作封装即可在真实设备上跑通,建议直接用带SPP功能的外设(如HC-05)验证。

问题不在UUID,而在连接状态和clientNumber的获取时点,按上面流程可解决“发送不生效”。

回到顶部