使用#32feet库蓝牙发送PDU格式拼接短信失败问题排查
问题
用C#开发Windows应用,通过#32feet库蓝牙连接手机,使用AT+CMGS命令发送短信。单条短信发送正常,但发送长拼接短信时,消息被拆分为独立单条,无法合并。已完成以下排查:
- 采用UCS2编码,PDU包含GSM规范的UDH头,经在线工具验证格式正确
- 切换HandsFree、RFCOMM协议测试,问题依旧
- 多款三星手机测试均失败
- 运营商确认支持长短信合并
相关SendPDU方法代码:
private static void SendPDU(string length, string pdu) { string receivedString = string.Empty; Byte[] dcB = Encoding.ASCII.GetBytes("AT+CMGS=" + length + (char)13); peerStream.Write(dcB, 0, dcB.Length); while (!receivedString.Contains(">")) { peerStream.Read(dcB, 0, dcB.Length); receivedString = Encoding.ASCII.GetString(dcB).TrimEnd('\0'); } dcB = Encoding.ASCII.GetBytes(pdu + (char)26); peerStream.Write(dcB, 0, dcB.Length); receivedString = string.Empty; while (!receivedString.Contains("OK")) { peerStream.Read(dcB, 0, dcB.Length); receivedString = Encoding.ASCII.GetString(dcB).TrimEnd('\0'); } }
解决思路与修复方案
1. 严格校验UDH头格式
长短信合并的核心是UDH(用户数据头)必须统一且正确,格式需符合GSM 03.40规范:
- UDH示例(UCS2编码):
050003XXYYZZ05:UDH总长度(固定5字节)00:长短信类型标识03:后续参考参数长度(固定3字节)XX:参考编号(0-255,所有分片必须用同一个值)YY:总分片数ZZ:当前分片序号(从1开始)
- 所有分片PDU的UDH必须保持参考编号一致,序号连续,总条数匹配
2. 修正PDU长度参数
AT+CMGS后的length是TP-DU(传输协议数据单元)的字节数,计算规则:
- 包含UDH时,
length = UDH字节数 + UD(用户数据)字节数(UCS2每个字符占2字节) - 避免手动计算错误,建议用PDU解析工具核对
length与PDU实际长度是否匹配
3. 修复蓝牙流读取逻辑
当前代码的Read操作可能仅读取部分响应,导致循环提前退出,引发分片发送时序错误:
// 优化读取响应的逻辑(替换原循环) StringBuilder responseBuilder = new StringBuilder(); byte[] buffer = new byte[1024]; int bytesRead; // 等待">"提示符 while (!responseBuilder.ToString().Contains(">")) { bytesRead = peerStream.Read(buffer, 0, buffer.Length); if (bytesRead > 0) { responseBuilder.Append(Encoding.ASCII.GetString(buffer, 0, bytesRead)); } } // 等待"OK"响应同理 responseBuilder.Clear(); while (!responseBuilder.ToString().Contains("OK")) { bytesRead = peerStream.Read(buffer, 0, buffer.Length); if (bytesRead > 0) { responseBuilder.Append(Encoding.ASCII.GetString(buffer, 0, bytesRead)); } }
4. 配置手机AT指令参数
部分三星手机需额外配置才能正确识别长短信:
- 发送
AT+CMGF=0:强制设置为PDU模式 - 发送
AT+CSMP=17,167,0,8:启用UDH支持(最后一位8对应TP-UDHI=1) - 发送
AT+CSMS=1:确认启用短信服务
5. 控制分片发送时序
发送多个分片时,必须确保前一个分片收到OK响应后,再发送下一个分片,避免蓝牙流数据乱序导致手机无法关联分片
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

