You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android Jetpack Compose调用SmsManager.sendDataMessage发送二进制短信失败,错误码111求助

Android Jetpack Compose调用SmsManager.sendDataMessage发送二进制短信失败,错误码111求助

兄弟,我之前折腾过类似的二进制短信问题,看到你的错误码111(调制解调器异常响应),结合你已经做的排查,给你几个实际可落地的方向试试:

先优先排查运营商限制

很多运营商现在确实会默认屏蔽带端口寻址的二进制短信——毕竟早年这类短信被SP滥用搞扣费,不少运营商直接一刀切了。你可以先做个交叉验证:

  • 找另一台同运营商的安卓手机,在上面监听8901端口,然后用你的App发sendDataMessage过去。如果两台手机之间都收不到,那基本实锤是运营商的问题,要么换运营商试试,要么联系客服申请开通(不过大概率客服会说没听过这功能)。
  • 如果两台安卓手机之间能正常收发,那问题就出在SIM800L的接收配置或者你App的发送逻辑细节上。

绕过SmsManager封装,手动发Raw PDU试试

sendDataMessage底层会帮你封装PDU,但有些手机的基带对它的封装逻辑有bug,导致调制解调器返回异常。你可以试试手动构造二进制短信PDU,用sendRawPdu发送,绕过它的封装:

  1. 自己构造包含SMSC、目标号码、8901端口的用户数据头、payload内容的二进制短信PDU
  2. 把PDU转成字节数组,调用SmsManager.getDefault().sendRawPdu(pduBytes, null, sentPI, null)
    如果手动发Raw PDU能成功,那就是sendDataMessage的封装有问题;如果还是报错111,那大概率是基带或者运营商的问题。

换个常见测试端口试试

你用的8901是自定义端口,有些运营商只会放行早年常用的端口(比如2345、5000这类),可以换几个常见端口测试,比如把端口改成2345.toShort()再试试,说不定就通了。

排查手机基带的兼容性

有些新机型的LTE基带对老式二进制短信的支持很差,哪怕你切到2G/3G,基带固件的逻辑还是有问题。你可以换一台不同品牌的老机型(比如小米6、华为Mate 9这种)测试,看看能不能发送成功。如果老机型能发,那就是你当前手机的基带固件bug,只能等系统更新或者换设备。

再核对一遍SIM800L的接收配置

如果安卓手机之间能发,但SIM800L收不到,那要仔细检查模块的配置:

  • 确认模块处于PDU模式:发送AT+CMGF=0,返回OK才算设置成功
  • 开启短信主动上报:发送AT+CNMI=2,1,这样有新短信时模块会主动推送通知
  • 确认SMSC号码和你手机上的一致:发送AT+CSCA?,如果不对就用AT+CSCA="+xxxxxxx"修正

最后提个小细节:有些定制ROM(比如MIUI、ColorOS)会把二进制短信当成垃圾短信拦截,你可以暂时关闭手机的短信拦截功能,或者用原生安卓系统测试,排除系统层面的拦截。

火山引擎 最新活动