zxj123

zxj123

0个粉丝

92

问答

0

专栏

0

资料

zxj123  发布于  2012-12-24 14:23:17
采纳率 0%
92个问答
4737

MMS短信编解码

 
随着技术的进步,在收发短信方面,按时间产生先后,共产生了三种模式:Block   Mode、基于AT指令的Text   Mode、基于AT指令的PDU   Modem,   Text   Mode比较简单,多款诺基亚手机均支持该模式。西门子的手机大多只支持PDU模式,PDU模式是发送或接收手机SMS信息的一种方法,短信息正文经过十六进制编码后被传送。目前,PDU已取代Block   Mode,因我们主要探讨PDU模式的发送.以西门子3508手机为例。   
  SMS是由Etsi所制定的一个规范(GSM   03.40   和   GSM   03.38)。当使用7-bits编码时,它可以发送最多160个字符;但用8-bit编码,最多可以发送140个字符,通常无法直接通过手机显示;还有用16-bit编码时,最多70个字符,被用来显示Unicode(UCS2)文本信息,可以被大多数的手机所显示。我们今天讨论的是UCS2编码,也就是说,最多只能发送70个字符,不管英文还是中文。   
  现例如我们现在要发送如下信息,向我的手机13715342642发送“你好,Hello!”。在没有发送之前,你要清楚,手机SIM卡所在地的短信中心号,并不是你现在所在地方的短信中心号,像我在深圳,深圳的短信中心号是:8613800755000,即使我现在到外地,短信中心号仍是深圳。从上面我们得到了下面的信息:   
   
  接收的手机号:13715342642   
  短信中心号:8613800755000   
  短信内容:你好,Hello!   
  在实际使用中,上面这些信息并不为手机所执行,要进行编码手机才会执行,先不管,看看编码后的信息:   
  0891683108705500F011000D91683117352446F2000800124F60597DFF0C00480065006C006C006F0021   
  看不懂吧,我来解释一下:   
  08   –   指的是短信中心号的长度,也就是指(91)+(   683108705500F0)的长度   
   
  91   –   指的是短信息中心号码类型。91是TON/NPI遵守International/E.164标准,指在号码前需加‘+’号;此外还有其它数值,但91最常用。   
   
  683108705500F0   -   短信息中心号码。由于位置上略有处理,实际号码应为:8613800731500(字母F是指长度减1)。这需要根据不同的地域作相应的修改。前面的(08)+(91)+(   683108705500F0)实际上就构成了整个短信的一部份,通称短消息中心地址(Address   of   the   SMSC)。   
   
  11   -   文件头字节   
   
  00   -   信息类型(TP-Message-Reference)   
   
  0D   -   被叫号码长度   
   
  91   -   被叫号码类型   
   
  其实在实际处理中,我们通常把11000D91写死在程序中,因为在国内,这些数据都是不会改变的。   
   
  683117352446F2   -被叫号码,经过了位移处理,实际号码为“8613715342642”。上面的(00)+(0D)+(91)+(   683117352446F2),构成了整个短信的第二部份目的地址(TP-Destination-Address)。   
   
  00   -   协议标识TP-PID,这里一般为00   
   
  08   -   数据编码方案TP-DCS(TP-Data-Coding-Scheme),采用前面说的USC2(16bit)数据编码   
   
  00   -   有效期TP-VP(TP-Valid-Period)   
   
  12-长度TP-UDL(TP-User-Data-Length),也就是4F60597DFF0C00480065006C006C的长度   36   /   2   =   18   的十六进   12   
   
  4F60597DFF0C00480065006C006C   006F0021–   这里就是短信内容了,实际内容为:“你好,Hello!”   
  程序实现,请参考本文章所带源程序的PDUdecoding.cs,并下载示例程序PDUEconding.rar   


///组成结构:包含四个函数:   
  ///                     smsDecodedCenterNumber(string   srvCenterNumber)                         短信中心号编码   
  ///                     smsPDUEncoded(string   srvContent)                                                     短信内容编码   
  ///                     smsDecodedNumber(string   srvNumber)                                                 接收短信手机号编码   
  ///                     smsDecodedsms(string   strCenterNumber,   string   strNumber,   string   strSMScontent)       整个短信的编码   
  ///                     一个字段   
  ///                     string   nLength;       //要发送内容的长度,由两部分组成,接收手机号加上要发送的内容   
  ///                       
  ///版         本:1.0.20031020   
  ///用         法:   
  ///                   1,把文件拷贝到你的项目中,添加引用     using   SMS;   
  ///                   2,定义本类,例如:PDUdecoding   ss   =   new   SMS.PDUdecoding();   
  ///                   3,现在你就可以使用本类了,例如:   
  ///                   textBox2.Text   =   ss.smsDecodedsms(txtCenterNumber.Text,txtNumber.Text,textBox1.Text);   
  ///                     
  ///本类库大家可以自由拷贝,必须保留以上版权信息。   
  ///本类仅供研究学习之用,在没有得到作者本人同意   
  ///下,请不要用于任何商业利益用途。作者本人保留   
  ///一切追究权利。   
  ///版权归作者所有   
  ////////////////////////////////////   
  using   System;   
  using   System.Text;   
   
  namespace   SMS   
  {   
  public   class   PDUdecoding   
  {   
   
  public   string   nLength;       //要发送内容的长度,由两部分组成,接收手机号加上要发送的内容   
  ///      
  ///   函数功能:短信内容编码   
  ///   函数名称:smsPDUEncoded(string   srvContent)   
  ///   参         数:srvContent   要进行转换的短信内容,string类型   
  ///   返 回 值:编码后的短信内容,string类型   
  ///   程 序 员:[email]sillnet@163.net[/email]   
  ///   编制日期:2003-10-15   
  ///   函数说明:   
  ///                     1,采用Big-Endian   字节顺序的   Unicode   格式编码,也就说把高低位的互换在这里完成了   
  ///                     2,将转换后的短信内容存进字节数组   
  ///                     3,去掉在进行Unicode格式编码中,两个字节中的"-",例如:00-21,变成0021   
  ///                     4,将整条短信内容的长度除2,保留两位16进制数   
  ///   
   
  public   string   smsPDUEncoded(string   srvContent)   
  {   
  Encoding   encodingUTF   =   System.Text.Encoding.BigEndianUnicode;   
  string   s   =   null;   
  byte   []   encodedBytes   =   encodingUTF.GetBytes(srvContent);   
  for   (int   i   =0;i   <   encodedBytes.Length;i++)   
  {   
  s   +=   BitConverter.ToString(encodedBytes,i,1);   
  }   
  s   =   String.Format("{0:X2}{1}",s.Length   /   2,s);   
   
  return   s;   
  }   
   
  ///      
  ///   函数功能:短信中心号编码   
  ///   函数名称:smsDecodedCenterNumber(string   srvCenterNumber)   
  ///   参         数:srvCenterNumber   要进行转换的短信中心号,string类型   
  ///   返 回 值:编码后的短信中心号,string类型   
  ///   程 序 员:[email]sillnet@163.net[/email]   
  ///   编制日期:2003-10-15   
  ///   函数说明:   
  ///                     1,将奇数位和偶数位交换。   
  ///                     2,短信中心号奇偶数交换后,看看长度是否为偶数,如果不是,最后添加F   
  ///                     3,加上短信中心号类型,91为国际化   
  ///                     4,计算编码后的短信中心号长度,并格化成二位的十六进制   
  ///   
   
  public   string   smsDecodedCenterNumber(string   srvCenterNumber)   
  {   
  string   s   =   null;   
  int   nLength   =   srvCenterNumber.Length;   
  for(int   i   =   1   ;   i   <   nLength;i   +=   2)                                               //奇偶互换   
  {   
  s   +=   srvCenterNumber;   
  s   +=   srvCenterNumber[i-1];   
  }   
  if(!(nLength   %   2   ==   0))                                                       //是否为偶数,不是就加上F,并对最后一位与加上的F位互换   
  {   
  s   +=   'F';   
  s   +=   srvCenterNumber[nLength   -   1];   
  }   
  s   =   String.Format("91{0}",s);                                         //加上91,代表短信中心类型为国际化   
  s   =   String.Format("{0:X2}{1}",s.Length   /   2,s);       //编码后短信中心号长度,并格式化成二位十六制   
  return   s;   
  }   
   
  ///      
  ///   函数功能:接收短信手机号编码   
  ///   函数名称:smsDecodedNumber(string   srvNumber)   
  ///   参         数:srvCenterNumber   要进行转换的短信中心号,string类型   
  ///   返 回 值:编码后的接收短信手机号,string类型   
  ///   程 序 员:[email]sillnet@163.net[/email]   
  ///   编制日期:2003-10-15   
  ///   函数说明:   
  ///                     1,检查当前接收手机号是否按标准格式书写,不是,就补上“86”   
  ///                     1,将奇数位和偶数位交换。   
  ///                     2,短信中心号奇偶数交换后,看看长度是否为偶数,如果不是,最后添加F   
  ///   
   
  public   string   smsDecodedNumber(string   srvNumber)   
  {   
  string   s   =   null;   
  if   (!(srvNumber.Substring(0,2)   ==   "86"))   
  {   
  srvNumber   =   String.Format("86{0}",srvNumber);           //检查当前接收手机号是否按标准格式书写,不是,就补上“86”   
  }   
  int   nLength   =   srvNumber.Length;   
  for(int   i   =   1   ;   i   <   nLength   ;   i   +=   2)                                   //将奇数位和偶数位交换   
  {   
  s   +=   srvNumber;   
  s   +=   srvNumber[i-1];   
  }   
  if(!(nLength   %   2   ==   0))                                                             //是否为偶数,不是就加上F,并对最后一位与加上的F位互换   
  {   
  s   +=   'F';   
  s   +=   srvNumber[nLength   -   1];   
  }   
  return   s;   
  }   
   
  ///      
  ///   函数功能:整个短信的编码   
  ///   函数名称:smsDecodedsms(string   strCenterNumber,   string   strNumber,   string   strSMScontent)   
  ///   参         数:strCenterNumber   要进行转换的短信中心号,string类型   
  ///                       strNumber               接收手机号码,string类型   
  ///                       strSMScontent       短信内容   
  ///   返 回 值:完整的短信编码,可以在AT指令中执行,string类型   
  ///   程 序 员:[email]sillnet@163.net[/email]   
  ///   编制日期:2003-10-15   
  ///   函数说明:   
  ///                       11000D91和000800       在国内,根据PDU编码原则,我们写死在此,详细解释请看我的文章               
  ///   
   
  public   string   smsDecodedsms(string   strCenterNumber,   string   strNumber,   string   strSMScontent)   
  {   
  string   s   =   String.Format("{0}11000D91{1}000800{2}",smsDecodedCenterNumber(strCenterNumber),smsDecodedNumber(strNumber),smsPDUEncoded(strSMScontent));   
  nLength   =String.Format("{0:D2}",   (s.Length   -   smsDecodedCenterNumber(strCenterNumber).Length)   /   2   );       //获取短信内容加上手机号码长度   
  return   s;   
  }   
  }   
  }  
我来回答
回答0个
时间排序
认可量排序
易百纳技术社区暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区