
回复
作为一个经常用蓝牙连传感器和打印机的开发者,今天必须安利HarmonyOS的SPP协议!之前做项目时用它实现手机和硬件设备的数据传输,简直像搭了座无线桥梁,现在来分享这些超实用的技巧~
第一次接触SPP时,发现它就像蓝牙世界里的串口翻译官——能让两台设备像用数据线连接一样传数据。比如我之前做智能家居项目,温湿度传感器通过SPP把数据传给手机,不用连Wi-Fi也能实时同步,特别适合没网的场景。
SPP的核心就是建立蓝牙串口连接,常见用法包括:
服务端得先开个监听Socket等客户端连接,代码像这样:
// 创建设备监听,uuid是SPP的标准标识
let serverId = -1;
let sppOption = {
uuid: '00001101-0000-1000-8000-00805f9b34fb',
secure: true // 开启安全连接
};
socket.sppListen('server1', sppOption, (err, id) => {
if (err) {
console.error('监听失败啦:' + err.code);
return;
}
serverId = id;
console.log('监听成功,等客户端来连~');
});
// 等待客户端连接
let clientId = -1;
socket.sppAccept(serverId, (err, id) => {
if (err) {
console.error('客户端连接失败');
return;
}
clientId = id;
console.log('客户端连上啦!');
});
客户端得知道服务端的地址和UUID,比如连打印机时这样做:
// 填目标设备的蓝牙地址(像MAC地址一样的字符串)
let deviceAddr = '00:11:22:33:44:55';
socket.sppConnect(deviceAddr, {
uuid: '00001101-0000-1000-8000-00805f9b34fb',
secure: true
}, (err, socketId) => {
if (err) {
console.error('连接失败,检查地址对不对呀');
return;
}
console.log('连接成功!开始传数据~');
// 传一段数据,比如'ABCD'
let data = new Uint8Array([65, 66, 67, 68]);
socket.sppWrite(socketId, data.buffer);
});
整理了个对比表,方便大家根据场景选协议:
协议 | SPP | BLE(低功耗蓝牙) | A2DP(音频) |
---|---|---|---|
适合场景 | 传文件、传感器数据 | 智能手表同步、健康设备 | 蓝牙耳机听歌 |
速度 | 中等(比BLE快) | 较慢 | 适合音频流 |
耗电 | 中等(持续传数据费电) | 超省电(适合电池设备) | 听歌时耗电中等 |
我的常用场景 | 相机传照片到手机 | 智能手环传心率数据 | 无线耳机听歌 |
记得第一次用SPP连打印机时捣鼓了好久,后来发现关键是UUID要填对(就是那个很长的字符串)。现在我的开发板上常备SPP测试代码,调试硬件时特别方便~