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
相关产品推荐
相关产品推荐

