You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows C++蓝牙OBEX套接字向Android传文件出错求助

Windows C++ OBEX客户端PUT请求失败排查与修复

问题背景

OBEX是蓝牙设备间常用的文件传输技术,我在Windows平台从零开发C++ OBEX客户端,目标是向Android设备发送文件并触发接收确认弹窗。目前Socket连接和OBEX CONNECT请求成功,但PUT请求返回0,Socket关闭,Android无弹窗。

当前实现情况

  • 使用UUID 00001105-0000-1000-8000-00805F9B34FB(OBEX Object Push服务)成功建立RFCOMM连接
  • CONNECT请求收到0xA0响应,会话建立成功
  • PUT请求构造后发送,收到0x00响应,请求失败

PUT请求核心错误分析

你的PUT请求数据包存在多处不符合OBEX规范的问题:

1. 长度字段不匹配

OBEX数据包长度是大端格式16位整数,包含操作码、长度字段及所有内容的总字节数。你设置的0x00 0x21(长度33)与实际数据包字节数(34)不符,直接导致Android端解析失败。

2. 头部格式错误

  • Name头部:Unicode Name头部标识为0x01,文件名ABCDE.TXT是11个Unicode字符,对应22字节,头部长度应为0x00 0x16,而非你写的0x00 0x17。
  • 无效字节混入:数据包末尾的0x49不是OBEX合法头部或数据,破坏了数据包结构。

3. 结构逻辑混乱

PUT请求的头部、文件数据顺序不符合规范,Android端无法识别完整的请求结构,直接关闭连接。

修正后的PUT请求示例

以下是符合OBEX规范的PUT请求数据包(文件名ABCDE.TXT,文件内容为t,1字节):

unsigned char putfile_req[] = {
    0x82,                    // PUT操作码,带Final标志(单包完成传输)
    0x00, 0x22,              // 总长度34(大端格式)
    0x01, 0x00, 0x16,        // Unicode Name头部:标识0x01,长度22
    0x00,0x41, 0x00,0x42, 0x00,0x43, 0x00,0x44, 0x00,0x45,
    0x00,0x2E, 0x00,0x54, 0x00,0x58, 0x00,0x54, // 文件名ABCDE.TXT的Unicode编码
    0xC3, 0x00, 0x00, 0x00, 0x01, // Length头部:标识0xC3,文件大小1字节
    0x74                      // 文件内容:'t'
};

额外注意事项

  • OBEX版本兼容:CONNECT请求中的版本字段0x10对应OBEX 1.0,建议改为0x14(OBEX 1.4),提升与Android设备的兼容性。
  • 传输完整性检查:务必检查send和recv的返回值,确认数据完整发送/接收,避免部分传输导致的解析错误。
  • Android权限设置:确保Android设备开启蓝牙接收权限,并允许来自该Windows设备的文件传输请求。

验证效果

替换PUT请求数据包后重新运行程序,应能收到Android端0xA2响应(PUT成功),同时触发接收确认弹窗。

内容的提问来源于stack exchange,提问作者CoderBittu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:35:56