Android CDMA SMS编解码相关类简介

写在开始,这是一篇非常非常不完善的笔记类的文章,只是我初步的认识,可能会有错误,仅供参考!

最近在做Android CDMA 短信编解码相关的工作,记录一下Android对CDMA Sms的编解码操作。包括Android CDMA SMS相关类结构,数据结构,数据处理流程等内容,持续更新。

类结构图

Android CDMA SMS编解码相关类简介_第1张图片

以下是短信地址相关的数据结构

  • SmsAddress:存储短信电话号码的数据结构,主要数据单元:
    • address:String,address用于存储解码好的电话号码用于终端显示。
    • origBytes:byte[].其中origByets用于存放编码好的电话号码,用于网络传输。
    • ton,TON_INTERNATIONAL / TON_NATIONAL等标识地址类型
    • toa,自定义成员,非3GPP2规范定义
  • CdmaSmsAddress:作为SmsAddress的子类,用于存放CDMA短信电话号码的数据结构。因为其父类已经包含电话号码所需的数据单元,因此该类只为符合CDMA编码规范存储控制单元。
    • digitMode,用于存储电话号码编码格式,有4bit和8bit编码。例如135,使用4bit编码可以表示0x13,0x50两个byte就可以表示。但是如果8bit编码就是0x01,0x03,0x05需要三个bit才可以编码。0代表4bit,1代表8bit
    • numberMode,numberMode用于标识当前地址是否是一个data network address(0,不是。1,是)
    • numberOfDigits,标识当前地址长度。
    • numberPlan, 如果numberMode是0,digitMode是1则numberPlan应该被定义(4bit)。可选值NUMBERING_PLAN_UNKNOWN , NUMBERING_PLAN_TELEPHONY
  • CdmaSmsSubAddress ,CdmaSms的子地址
    • origBytes包含子地址的真实地址数据

以下是短信头相关的类

短信头的作用,举个例子就是对于长短信,(英文大于160字符,Unicode字符大于70)需要分成多条发送,此时就需要在每条短信前面加上短信头,短信头的长度不固定,并且需要占用短信内容长度。例如短信头占用5byte,Unicode字符就只能存放(140-5)/2 = 67个了。

  • SmsHeader::ConcatRef做长短信连接的短信头数据结构。负责标识当前短信是长短信的第几条,隶属于哪一条长短信。
    • refNumber 当前短信的序列号,类似ID
    • seqNumber 当前短信的序号,类似3/5中的3,意思是五条短信中的第三条
    • msgCount 当前长短信的总条数,类似3/5中的5.
    • isEightBits 标识当前refNumber是8bit还是16bit,在编解码的时候都会根据这个变量确定refNumber的真实值

其他几个短信头类还没遇到过,作用不了解,遇到之后补上

  • SmsHeader 包含短信头各个子数据和一些附属属性的短信头总括
    • mPortAddrs 端口地址
    • mConcatRef 长短新拼接需要的数据结构
    • languageTable GSM定义的字符表,编码和解码都通过查表解决.字符表定义可以参考GSMAplhaBet.java
    • languageShiftTable 扩展字符表,用于基础字符表的补充

至此短信地址和短信头的数据结构就简单罗列完毕,下面就说短信内容相关的类

  • UserData 包含短信头,短信内容,编码方式,消息类型等数据,可以看到数据越来越丰富了
    • userDataHeader 短信头,具体作用见SmsHeader的介绍
    • msgEncoding 短信编码方式,常见编码方式7bit_ascii,UNICODE_16等等.这里说道的编码方式就会影响到一条短信最终可以成在内容的数量了.例如对于ascii码的内容,范围在0x00~0x7F.最高位为0,所以需要7bit就可以编码一个字符.最终140byte里面就可以保存160个ascii字符.
    • msgType 并不知道这个是干啥用的
    • paddingBits 对于不满8bit的数据占用8bit后剩余的部分.
    • numFields 短信长度(包括短信头的部分和短信内容的长度)
    • payloadStr 字符串类型的短信内容
  • BearerData 包含UserData(短信内容+短信头),时间戳,优先级,ID,短信类型,发送报告,已读报告,电话号码等字段的数据结构.BearerData负责这些数据单元的编码和解码工作.既可以通过encode将数据转换为pdu也可以通过decode将pdu转换成数据字段.
    • messageType DELIVERY,SUBMIT, DELIVERY_REPORT,SUBMIT_REPORT, USER_ACK,READ_ACK以上可能的几个取值,发送报告,阅读报告,发送等类型
    • messageId 信息ID,目前没有发现Android哪里在用.
    • priority 信息优先级
    • privacy 私密等级,无,有,机密,绝密
    • displayMode 定义显示短信的时间,立刻现实/默认设置/用户自定义
    • language 语种
    • errorCalss/messageStatus 消息状态,错误状态封装状态码
    • userData 封装了短信内容和短信头的数据
    • userResponseCode 用户在收到短信之后回复给服务器的响应码
    • msgCenterTimeStamp 短信中心时间戳
    • userAckReq/deliveryAckReq/readAckReq/reportReq 各种响应码的标志
    • depositIndex 看不懂描述系列~,有兴趣的可以去看BearerData.java注释内容有写
    • callbackNumber 可以回拨电话的地址

简单介绍BearerData.java里面包含的几个成员.可以看到BearerData已经包含了电话号码,短信内容,编码方式,时间戳等基本信息,也包含了像是优先级,是否需要发送报告等控制信息,可以说已经包含了一条短信的基本要素.BearerData的作用就是将这些基本要素编码成pdu发送,或者从pdu中解码出这些基本信息.

  • SmsEnvelope 这个是信封?丰富了消息类型,收件人,发件人,消息内容(bearerData),状态码
    • messageType 这里的信息类型就是具体短信类型了.Point_To_Point(点对点信息),Broadcast(广播),Acknowledge(通知)
    • teleService 这个..teleService,不知道干啥用
    • origAddress 发送端地址
    • destAddress 收件人地址
    • bearerData bearerData的pdu数据,byte[]

到这里CDMASms编解码相关的类就介绍完了,包含了CDMA短信所需要的数据块.后面我会再尝试更新CDMA短信的编码方式和具体的代码流程.

    -

你可能感兴趣的:(Android CDMA SMS编解码相关类简介)