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

使用#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编码):050003XXYYZZ
    • 05: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:00:44