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发送,绕过它的封装:
- 自己构造包含SMSC、目标号码、8901端口的用户数据头、payload内容的二进制短信PDU
- 把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)会把二进制短信当成垃圾短信拦截,你可以暂时关闭手机的短信拦截功能,或者用原生安卓系统测试,排除系统层面的拦截。




