手机宇宙E806为什么彩信收不到

\u624b\u673a\u53ef\u4ee5\u4e0a\u7f51\u4e86 \u4e5f\u80fd\u6536\u5f69\u4fe1\u4e86 \u4f46\u662f\u5c31\u662f\u53d1\u4e0d\u51fa\u5f69\u4fe1 \u8bf7\u95ee\u8fd9\u662f\u600e\u4e48\u56de\u4e8b

1\u68c0\u67e5\u662f\u5426\u5f00\u901aGPRS\u529f\u80fd
2\u4fe1\u606f\u8bbe\u7f6e\u4e2d\u7684\u201c\u4fe1\u606f\u4e2d\u5fc3\u8bbe\u7f6e\u201d\u662f\u5426\u6b63\u786e
3\u5185\u5b58\u662f\u5426\u5df2\u6ee1
4\u5185\u90e8\u7a0b\u5e8f\u662f\u5426\u635f\u574f
5\u786c\u4ef6\u662f\u5426\u5b8c\u5584
6\u4fe1\u606f\u4e2d\u5fc3\u53f7\u7801\u8bbe\u5b9a\u662f\u5426\u6b63\u786e
\u5b9e\u5728\u4e0d\u884c\u5c31\u6062\u590d\u51fa\u5382\u8bbe\u7f6e

\u5728\u201c\u8bbe\u7f6e\u201d\u4e2d\u70b9\u51fb\u8fdb\u5165\u201c\u77ed\u4fe1\u201d\uff0c\u7136\u540e\u5728\u201c\u63a5\u53d7\u5f69\u4fe1\u201d\u4e0a\u70b9\u51fb\u5f00\u542f\u3002

\u7136\u540e\u201c\u8bbe\u7f6e\u201d\u4e2d\u7684\u201c\u9ad8\u7ea7\u8bbe\u7f6e\u201d\u4e2d\u70b9\u51fb\u8fdb\u53bb\uff0c\u7136\u540e\u70b9\u51fb\u8fdb\u5165\u201c\u79fb\u52a8\u7f51\u7edc\u8bbe\u7f6e\u201d\u3002

\u6700\u540e\u5728\u201c\u79fb\u52a8\u7f51\u7edc\u8bbe\u7f6e\u201d\u4e2d\u7684\u201cAPN\u201d\u4e2d\u70b9\u51fb\u8fdb\u53bb\uff0c\u7136\u540e\u5728\u201cChina Mobile\u201d\u4fee\u6539\u63a5\u5165\u70b9\uff0c\u4fee\u6539\u5b8c\u6210\u4ee5\u540e\u70b9\u51fb\u4fdd\u5b58\u3002\u5173\u673a\u4e09\u56db\u5206\u949f\u6253\u5f00\u540e\u5c31\u53ef\u4ee5\u53d1\u9001\u5f69\u4fe1\u4e86\u3002

\u62d3\u5c55\u8d44\u6599\uff1a\u5982\u679c\u8bf4\u4ee5\u4e0a\u8fd9\u4e9b\u539f\u56e0\u548c\u89e3\u51b3\u65b9\u6cd5\u90fd\u4e0d\u9002\u5408\u4f60\u7684\u8bdd\uff0c\u90a3\u4e48\u5c31\u53ea\u80fd\u8bf4\u662f\u4f60\u7684\u624b\u673a\u786c\u4ef6\u4e0a\u51fa\u73b0\u4e86\u4ec0\u4e48\u95ee\u9898\uff0c\u8fd9\u6837\u7684\u8bdd\u597d\u5353\u624b\u673a\u52a9\u624b\u5efa\u8bae\u62ff\u5230\u552e\u540e\u53bb\u7ef4\u4fee\u4e86\u3002

众所周知,现在大部分的好手机都是 GSM/WCDMA制式的,CDMA/EVDO在 国内基本上没有什么好看兼好用的机 器。偶尔有些好一点的WCDMA机型, 让电信的大爷们一“定制”,立刻变得歪 瓜裂枣巨丑无比,让我深深怀疑自己的 审美观价值观人生观是否正确并代表先 进的生产力方向。

众里寻他千google,终于找到了一款外 形和配置还算说得过去的机型。三星的 i500。但很遗憾的是,这款机型国内并 没有引进,某宝上买到的,都是美版的 机子。写号倒不是很麻烦,可水货机始 终不能接收彩信,却是一直困扰很多水 货机用户的大问题。

虽然彩信是上个世纪的东西了,但日常 生活中还是用得比较多的。比如我,虽 然一般是不发彩信的,但经常会收到电 信或其它商家发送的彩信,有些网上的 信息比如优惠券,也是以彩信的形式发 送的。作为一项手机功能,用不着的时 候无所谓,但一旦用着了却不能用,就 很让人郁闷了。

我一直坚持的生活原则就是,宁可千日 不用,但不能一日没有。。。。。。

彩信的发送就不用说了,设置正确的 apn,即可发送彩信,这个比较简单。 下面主要说一下彩信的接收问题。 1、不能接收彩信的 原因

在大量搜索网上资料的基础上,经过几 天的测试和分析,找到了不能接收彩信 的初步原因。

彩信,按照电信规范,是分两步发送 的。 第一步,发送WAP-PUSH格式的短信通 知,该短信通知含有一个url,该url指向 彩信内容的存储地址。 第二步,手机解析出这个url,向url发送 获取请求,下载彩信内容到本地,完成 彩信的接收。

向手机发送彩信之后,手机上没有任何 的反映,说明第一步的彩信通知都没有 接收到。

我写了一个Receiver,拦截系统中广播 的 android.provider.Telephony.WAP_PUS H_RECEIVED消息,结果没有收到这个 广播。证明彩信通知并没有上传到app 应用层,那么有可能在framework框架 层,彩信通知就被拒绝了。

在Receiver中添加 android.provider.Telephony.SMS_REJ ECTED,收到了系统广播的消息。说明 彩信通知确实是被framework层给reject 了。

取出/system/framework/framework.jar,解压出classes.dex, 对dex文件进行baksmali,再对照 android系统源码进行流程分析(虽然 只是简单的一句话,但确实够我忙活了 一段时间。。。。。。),最终确定, 问题在 com.android.internal.telephony.cdma. CdmaSMSDispatcher.smali中。

对照android源码,找出问题的关键代 码段:

if (SmsEnvelope.TELESERVICE_WAP == teleService) { return processCdmaWapPdu(sms.getUserDa ta(), sms.messageRef, sms.getOriginatingAddress()); }

复制代码

查找smali中对应的 TELESERVICE_WAP,发现其设定的值 是0x1004,换算成10进制就是4100。

修改CdmaSMSDispatcher.smali,使之 在返回sms rejected的原因时,填入彩 信通知的TeleServiceId,发现电信的 TeleServiceId确实是65002,中国电信 CDMA终端规范也证实了这个判断。

那么原因找到了,由于TeleServiceId的 不同,导致手机自带的美版ROM无法识 别65002的电信Id,所以拒绝接收彩信 通知。

2、彩信接收解决方 案

找出原因来了,当时我就想,这应该就 比较简单了吧。。。。。。

2.1 修改TeleServiceId

定位CdmaSMSDispatcher.smali中判断 TeleServiceId的语句:

const v10, 0x1004

复制代码

把const/16 0x1004(4100)修改成 const 0xfdea(65002),使之识别出 这是一个WAP-PUSH,进而转入 processCdmaWapPdu流程,处理彩信 通知的pdu。

编译所有的smali文件,更新 classes.dex,替换本机中的 framework.jar,重启手机。

怀着激动的心情发送彩信,一直在等。 。。。。。终于等来了。。。。。。 “您的手机终端不支持接收彩信,请到 mmbox.vnet.cn中提取”。。。。。。

2.2 修改pdu处理流程

我很郁闷,明明把TeleServiceId改过来 了,为什么还是收不到。

问题一定出在processCdmaWapPdu这 个方法里。又经过了一段时间的调试和 分析(又是简单的一句话,背后是N个 小时的连续奋战和N元钱的彩信发送费 用。。。。。。),终于发现,pdu解 析有问题。

processCdmaWapPdu传入的第一个参 数,sms.getUserData(),获取的是pdu 中的包括msg identifier在内的完整 userData,而processCdmaWapPdu中 的代码,对传入的参数是按照CHARi来 进行处理的,所以导致获取的 totalSegments和segment完全是错 的,系统认为收到的彩信通知只是一个 片断,所以把这个片断存入数据库,等 待后面的片断。可后面永远都不会再有 任何相关的片断了。。。。。。

知道了原因,无论解决方案有多困难, 也总算是有解决的希望了。

解决方案用java写出来是这样的:

userData = sms.getUserData(); BitwiseInputStream bis = BitwiseInputStream.new(userData); bis.skip(69); userData = bis.readByteArray(userData.length * 8 - 72); processCdmaWapPdu(userData,......)

复制代码

意思就是说,把byte[]数组的userData 转化成bit流,跳过最前面的69个 bit(头部数据),取bit流(CHARi数 据),扔掉最后的3个bit的000填充 位,把取到的bit流再转化成byte[]数 组。

然后,把这段java代码人肉编译成 dalvik虚拟机的字节码。。。。。。。

move-object/from16 v11, v10 # v10: userData array-length v11, v11 # v11: userData.length new-instance v12, Lcom/android/internal/util/BitwiseInputStream; invoke-direct {v12, v10}, Lcom/android/internal/util/BitwiseInputStream;-><init>([B)V # v12: bis const/16 v8, 0x45 invoke-virtual {v12, v8}, Lcom/android/internal/util/BitwiseInputStream;->skip(I)V mul-int/lit8 v11, v11, 0x8 add-int/lit8 v11, v11, -0x48 # userData.length*8 - 72 invoke-virtual {v12, v11}, Lcom/android/internal/util/BitwiseInputStream;->readByteArray(I) [B move-result-object v10

复制代码

编译,替换,重启,搞定。

事后,我有一点点小纳闷,这套原始代 码是美版ROM用的,难道美帝国主义 CDMA运营商的彩信,传过来的 userData,直接就是CHARi吗,不包括 头部的数据?否则按照ROM中的代码, 他们也肯定是无法接收彩信的。这个问 题看来还要美帝自己来回答了。我们自 己的好用就行,不去解放水深火热受剥 削受压迫中的美国人民了。。。。。。

3、自动接收和发送 彩信

搞定了彩信的接收,现在发送和接收都 没有问题了。但还有一个小小的缺憾, 就是发送和接收彩信时,需要先手动连 接3G,不能做到自动收发。

除了我个人的完美主义倾向在作怪之 外,我承认我也喜欢上了这种修改工 作,身心俱疲的同时,身心俱爽。。。 。。。

3.1 不能自动收发的原因

经过一段时间的研究(这个研究时间倒 不是很长,比上面研究彩信接收的时间 短多了),发现在收发彩信时,系统会 自动进行3G网络连接,然后另起一个线 程收发彩信。

但关键问题是,3G网络连接是需要时间 的,在ppp拨号的客户端还在和服务端 卿卿我我互传数据包确认关系的时候, 收发彩信的线程就已经开始工作了,所 以当然,在连接10.0.0.200的MMSC 时,是会被refused的,然后程序抛出 ioexception异常,收发事务被标记失 败,最后系统断开3G连接。彩信的收发 企图就这样被扼杀了。

3.2 解决方案

知道了原因,再解决就只是时间问题 了。解决方案有很多种,我采用的是, 在getPdu和sendPdu这两个方法的最前 部,加入ensureRouteToHost方法,同 时修改ensureRouteToHost,加入一个 带有超时退出的循环,判断 requestRouteToHost的值。

如果3G尚未连接,就sleep(1000)之后 再试,直到从route上判断3G建立连接 成功,退出ensureRouteToHost,进入 收发彩信的流程。

如果60秒内3G仍未成功建立连接(要么 信号不好,要不就是你欠费了。。。。 。。),抛出ioexception异常,通知系 统收发彩信失败,系统自动进入内置的 重试排期计划。

于这种循环写起来比较麻烦,所以没有 写java,直接写dalvik字节码:

const/16 v10, 0x3c :cond_4 add-int/lit8 v10, v10, -0x1 if-eqz v10, :cond_5 invoke-virtual {v0, v7, v1}, Landroid/net/ConnectivityManager;->requestRouteToHost(II)Z move-result v4 if-nez v4, :cond_3 const-wide v11, 0x3e8 invoke-static {v11, v12}, Ljava/lang/Thread;->sleep(J)V goto :cond_4 :cond_5

复制代码

无法接收彩信业务的原因如下:
1.手机不支持彩信功能或彩信参数设置不正确;
2.号码未开通上网功能;
3.手机关机或不在服务区的时间已超出手机报的下发时限;
4.彩信内容过大或格式不符:每条彩信大小限制在100K以内,常用的格式为图片:jpg、gif、bmp,声音为:midi、mp3、wav,文本为:txt;
5.受网络和高峰时段等情况影响,接收彩信可能会有一定时间的延时,或信息丢失的情况,如果超过应下发时间2个小时,您还没有收到业务,请联系当地的人工客服咨询详情。

请先确定一下自己的手机卡有没有开通GPRS服务

  • 澶╄E806鍜屽ぉ璇璚806鏈浠涔鍖哄埆鍟
    绛旓細缁间笂鎵杩帮紝涓ゆ鏈哄瀷纭欢閰嶇疆宸紓涓嶅ぇ锛屽睘浜庡悓绫讳骇鍝侊紝涓昏鏄湅缁忓父浣跨敤浠涔缃戠粶锛E806鏄數淇″畾鍒舵満鍨嬶紝鍙兘鐢ㄧ數淇″崱涓婄綉锛屽崱浜屽彧鑳芥敹鍙褰╀俊锛學806鍙互鏀寔鑱旈氭垨鏄Щ鍔ㄤ笂缃戯紝鐢ㄦ埛鍙牴鎹娇鐢ㄤ粈涔堢綉缁滆岄夋嫨璐拱銆傚笇鏈涗互涓婄瓟澶嶅鎮ㄦ湁鎵甯姪锛屾劅璋㈡偍瀵瑰ぉ璇骇鍝佺殑鏀寔~...
  • 扩展阅读:1068开头短信号码查询 ... 1065是什么短信平台 ... 1065短信是正规吗 ... 彩信发送视频截图诈骗 ... 1068发的彩信能下载吗 ... 手机彩信设置在哪里 ... 1068开头短信是诈骗吗 ... 1065的彩信能看吗 ... 1065发彩信老让下载什么 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网