CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
【经验总结】不能实施并行处理的情况 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  移动平台 >  开发应用

开放 mm1接口发送彩信(也就是GPRS modem发送彩信) 代码 c#版

楼主oldnew(冬日暖阳)2006-11-28 00:01:32 在 移动平台 / 开发应用 提问

mm1接口也就是手机终端和mmsc(中国移动就是http://mmsc.monternet.com)用来发送mms   message的接口,   GPRS   modem当然也是可以使用这一接口发送的.  
   
  using   System;  
  using   System.Net;  
  using   System.IO;  
  using   System.Diagnostics;  
  using   System.Threading;  
  using   System.Collections;  
  using   System.Text;  
   
  namespace   MMSLib  
  {  
  ///   <summary>  
  ///   MMSender   的摘要说明。  
  ///    
  ///   </summary>  
  public   class   MMSender  
  {  
  //   设置参数  
  string   sMmscUrl="http://mmsc.monternet.com";  
  string   sProxyUrl="10.0.0.172:80";  
   
  public   MMSender()  
  {  
  //  
  //   TODO:   在此处添加构造函数逻辑  
  //  
  }  
  public   void   SetMMSC(string   szUrl)  
  {  
  sMmscUrl   =szUrl;  
  }  
  public   void   SetProxy(string   szUrl)  
  {  
  sProxyUrl   =   szUrl;  
  }  
   
   
  /*   发送MMS的过程  
  1>   创建消息发送接口  
      MMSender   ms   =   new   MMSender();  
  2>   设置参数属性  
      默认属性已经是中国移动参数,因此如果是中国移动用户,以下两个操作可以不需要  
      ms.SetMMSC("http://mmsc.monternet.com");  
      ms.SetProxy("10.0.0.172:80");  
  3>   创建消息  
      MMessage   mm=   new   MMessage();  
  4>   设置消息内容  
      mm.SetSubject("标题");             //   设置标题  
      mm.AddTo("13825271511");         //   添加接收号码,调用一次添加一个接收号码  
      mm.AddFile("FileName");           //   添加发送文件,包含文件路径,调用一次添加一个发送文件  
  5>   发送消息  
        string   szReult   =ms.Send(mm);  
         
  6>   继续发送其他号码  
      mm.ClearTo();  
      mm.AddTo("13812345678");  
      ms.Send(mm);            
  */  
   
   
  /*   避免协议冲突的设置  
  <configuration>  
  <system.net>  
  <settings>  
  <httpWebRequest   useUnsafeHeaderParsing="true"/>  
  </settings>  
  </system.net>  
  </configuration>  
          */  
  public   string   Send(MMessage   mm)  
  {  
  try  
  {  
  //   验证参数有效性  
  WebRequest   wReq   =   WebRequest.Create(sMmscUrl);  
  HttpWebRequest   hReq   =   (HttpWebRequest)wReq;  
  wReq.Headers.Clear();  
  if(   sProxyUrl.Length   >0)  
  wReq.Proxy   =   new   WebProxy(sProxyUrl);  
   
  wReq.ContentType   ="application/vnd.wap.mms-message";  
  hReq.Accept   ="application/vnd.wap.mms-message,text/plain,*/*";  
  wReq.Method   ="POST";  
  hReq.KeepAlive   =   false;  
  hReq.UserAgent   =   "Nokia6681/2.0   (4.00.15)   SymbianOS/8.0   Series60/2.6   Profile/MIDP-2.0   Configuration/CLDC-1.1";  
  //   Write   Post   Dat  
  byte[]   byMM   =   mm.GetContent();  
  hReq.ContentLength   =   byMM.Length;  
  Stream   sReq   =   wReq.GetRequestStream();  
  sReq.Write(byMM,0,byMM.Length);  
  sReq.Close();  
  //   Http   Request  
  WebResponse   wRes=   wReq.GetResponse();  
  HttpWebResponse   hRes   =   (HttpWebResponse)wRes;  
  if   (   hRes.StatusCode   ==   HttpStatusCode.OK)  
  {  
  Stream   sRes   =   wRes.GetResponseStream();  
  StreamReader   sr   =   new   StreamReader(sRes);  
  string   szResult   =sr.ReadToEnd();     //   发送结果  
  //   Parse   result   sring  
  return   szResult;  
  }  
  }  
  catch(Exception   e)  
  {  
  throw   new   Exception(e.Message);  
  }  
  return   string.Empty;  
  }  
  }  
  }  
  问题点数:0、回复次数:29Top

1 楼oldnew(冬日暖阳)回复于 2006-11-28 00:01:41 得分 0

public   class   MMessage  
  {  
  string   Subject   ="";  
  int   nSeconds   =0;   //   设置送达的时间,当前相对时间,以秒为单位  
  ArrayList   lFile   =   new   ArrayList();       //   彩信文件列表  
  ArrayList   lDest   =   new   ArrayList();       //   发送号码集合  
   
  static   long   nSeq   =0;  
   
  public   MMessage()  
  {  
  //  
  //   TODO:   在此处添加构造函数逻辑  
  //  
  }  
   
  public   void   SetSubject(string   szSubject)  
  {  
  Subject   =szSubject;  
  }  
  public   void   SetDeliverTime(int   nSec)  
  {  
  nSeconds   =   nSec;  
  }  
  //    
  public   void   AddTo(string   Dest)  
  {  
  lDest.Add(Dest);  
  }  
   
  public   void   AddFile(string   File)  
  {  
  lFile.Add(File);  
  }  
   
  public   void   ClearTo()  
  {  
  lDest.Clear();  
  }  
   
  //   得到二进制编码字节  
  public   byte[]   GetContent()  
  {  
   
  byte[]   byMms   =   new   byte[0];  
  //   消息头开始  
  //X-Mms-Message-Type  
  byMms   =   AppendOct(new   byte[]{0x8C,0x80},byMms);  
  //X-Mms-Transaction-ID  
  byMms   =   AppendOct(new   byte[]{0x98},byMms);  
  byMms=   AppendOct(nSeq.ToString(),byMms);  
  nSeq++;   //   序列号加1  
   
  byMms=   AppendOct(new   byte[]{0x0},byMms);  
   
  //X-Mms-MMS-Version  
  byMms   =   AppendOct(new   byte[]{0x8D,0x90},byMms);  
  //Date  
   
  //From,设置为   Insert-address-token  
  byMms   =   AppendOct(new   byte[]{0x89,0x01,0x81},byMms);  
   
  //To  
  for(int   i=0;i<lDest.Count;i++)  
  {  
  byMms=   AppendOct(new   byte[]{0x97},byMms);  
  byMms=   AppendOct("+86"+   (string)lDest[i]   +"/TYPE=PLMN",byMms);  
  byMms=   AppendOct(new   byte[]{0x0},byMms);  
  }  
  //Subject  
  if(Subject.Length   >0)     //   使用Utf8编码  
  {  
  byMms=   AppendOct(new   byte[]{0x96},byMms);  
  //   Value-length   Char-set   Text   -string  
  byte[]   byLen=   new   byte[1];  
  byLen[0]   =   (byte)   (Encoding.UTF8.GetByteCount(Subject)   +2);  
  byMms=   AppendOct(byLen,byMms);  
  //   Char-set   为utf-8  
  byMms=   AppendOct(new   byte[]{0xEA},byMms);  
  byMms=   AppendOct(Encoding.UTF8.GetBytes(Subject),byMms);  
  byMms=   AppendOct(new   byte[]{0x0},byMms);  
  }  
  //   X-Mms-Delivery-Time,递送时间   =   Relative-token   Delta-seconds-value  
  //   Relative-token   =   0x81  
  //   Delta-seconds-value   =Long-integer  
  //   Long-integer   =   Short-length   Multi-octet-integer  
  if(   nSeconds   >0)  
  {  
  byMms=   AppendOct(new   byte[]{0x87},byMms);  
  byte[]   bfTime   =   BitConverter.GetBytes(nSeconds);     //   默认使用Big-endian,需用改为Little-endian  
  //   bfTime改为Little-endian  
  Array.Reverse(bfTime);  
  byte[]   bfTimeLen   =   new   byte[3];  
  bfTimeLen[0]   =   (byte)   (bfTime.Length   +   2);  
  bfTimeLen[1]   =   0x81;     //   相对时间格式  
  bfTimeLen[2]   =   (byte)bfTime.Length;  
  byMms=   AppendOct(bfTimeLen,byMms);  
  byMms=   AppendOct(bfTime,byMms);  
  }  
   
  //Content-Type:application/vnd.wap.multipart.mixed  
  byMms   =   AppendOct(new   byte[]{0x84,0xA3},byMms);  
  //   消息体开始(MIME   multipart)  
  //   8.5.2   Multipart   Header  
  //   nEntries   Uintvar   The   number   of   entries   in   the   multipart   entity  
  byte[]   byFileCount   =   new   byte[1];  
  byFileCount[0]   =   (byte)lFile.Count;  
  byMms   =   AppendOct(byFileCount,byMms);  
  //   8.5.3   Multipart   Entry,逐个加入媒体文件  
  for(int   j=0;j<lFile.Count;j++)  
  {  
  byMms   =   AppendOct(GetMmsContent(lFile[j].ToString()),byMms);  
  }  
  return   byMms;  
  }  
   
  //   Tools  
  //   加入媒体文件到彩信内容中去  
  private   byte[]   GetMmsContent(string   FileName)  
  {  
  //   每一个Multipart   Entry由5个部分组成  
  /*   HeadersLen  
    *   DataLen  
    *   ContentType  
    *   Headers  
    *   Data  
    *   */  
  byte[]   byHeaders   =   new   byte[0];       //   ContentType和Headers组合  
  byte[]   byData   =   ReadFromFile(FileName);  
   
  string   FileID   =   getContentId(FileName);  
  //   Set   content-type  
  if(   FileName.EndsWith(".txt"))  
  {  
  byHeaders   =   new   byte[1];  
  byHeaders[0]   =   (byte)   (Encoding.ASCII.GetByteCount(FileID)+5);  
  byHeaders   =   AppendOct(new   byte[]{0x83,0x85},byHeaders);       //   Utf-8  
  byHeaders   =   AppendOct(Encoding.ASCII.GetBytes(FileID),byHeaders);  
  byHeaders   =   AppendOct(new   byte[]{0x00},byHeaders);  
  byHeaders   =   AppendOct(new   byte[]{0x81,0xEA},byHeaders);  
  }  
  else   if(   FileName.EndsWith(".gif"))  
  {  
  byHeaders   =   new   byte[]{0x9D};  
  }  
  else   if(   FileName.EndsWith(".mid")   ||   FileName.EndsWith(".midi"))  
  {  
  byHeaders   =   Encoding.ASCII.GetBytes("audio/midi");  
  byHeaders   =   AppendOct(new   byte[]{0x00},byHeaders);     //   文本需要以0x00结尾  
  }  
   
  //   加入Content-ID和Content-Location  
  byHeaders   =   AppendOct(new   byte[]{0xC0,0x22,0x3C},byHeaders);  
  byHeaders   =   AppendOct(Encoding.ASCII.GetBytes(FileID),byHeaders);  
  byHeaders   =   AppendOct(new   byte[]{0x3E,0x00},byHeaders);  
  //加入Content-Location  
  byHeaders   =   AppendOct(new   byte[]{0x8E},byHeaders);  
  byHeaders   =   AppendOct(Encoding.ASCII.GetBytes(FileID),byHeaders);  
  byHeaders   =   AppendOct(new   byte[]{0x00},byHeaders);  
   
  byte[]   byHeaderLen   =   encodeUintvar(   byHeaders.Length);  
  byte[]   byDataLen   =   encodeUintvar(byData.Length);  
   
  byte[]   byMmc   =   new   byte[   byHeaderLen.Length   +   byDataLen.Length   +   byHeaders.Length   +     byData.Length   ];  
  Array.Copy(   byHeaderLen,byMmc,byHeaderLen.Length);  
  Array.Copy(   byDataLen,0,byMmc,byHeaderLen.Length,byDataLen.Length);  
  Array.Copy(   byHeaders,0,byMmc,byHeaderLen.Length+byDataLen.Length,byHeaders.Length);  
  Array.Copy(   byData,0,byMmc,byHeaderLen.Length   +byDataLen.Length   +byHeaders.Length,byData.Length);  
   
  return   byMmc;  
  }  
   
  private   byte[]     encodeUintvar(int   n)  
  {  
  byte[]   buf   =   new   byte[8];  
  int   l=0;  
  while(n   >=128)  
  {  
  byte   b   =   (byte)(n   &0x7F);  
  n   =   n   >>   7;  
  buf[l++]   =b;  
  }  
  buf[l++]=   (byte)n;  
   
  byte[]   retBys   =   new   byte[l];  
  for(int   i=0;i<l;++i)  
  {  
  retBys[i]   =   (byte)(buf[l-i-1]|0x80);  
  }  
  retBys[l-1]   &=   0x7F;  
  return   retBys;  
   
  }  
  //   从文件中读取字节  
  private   byte[]   ReadFromFile(string   FileName)  
  {  
  byte[]   bf   =   new   byte[0];  
  FileStream   fs   =   null;  
  try  
  {  
  fs=   new   FileStream(FileName,FileMode.Open,FileAccess.ReadWrite,FileShare.None);     //   没有设定Buffsize  
  }  
  catch(Exception   e)  
  {  
  Console.WriteLine(e.ToString());  
  }  
  if(   fs!=null)  
  {  
  bf   =   new   byte[fs.Length];  
  fs.Read(bf,0,(int)fs.Length);  
  fs.Close();  
  }  
  return   bf;  
  }  
  //   得到文件名(不包含文件夹部分)  
  private   string   getContentId(string   FileName)  
  {  
  int   at   =FileName.LastIndexOf("\\");  
  if(   at   <0)  
  return   FileName;  
  else  
  return   FileName.Substring(at+1);  
  }  
  //   增加字节  
  private   byte[]   AppendOct(byte[]   bys,byte[]   byDest)  
  {  
  byte[]   bysNew   =new   byte[byDest.Length   +bys.Length];  
  try  
  {  
  Array.Copy(byDest,bysNew,byDest.Length);  
  Array.Copy(bys,0,bysNew,byDest.Length,bys.Length);  
  }  
  catch(Exception   e)  
  {  
  Console.WriteLine(e);  
  }  
  return   bysNew;  
  }  
  //   增加字符串  
  private   byte[]   AppendOct(string   sz,byte[]   byDest)  
  {  
  return   AppendOct(Encoding.Default.GetBytes(sz),byDest);  
  }  
  }  
  Top

2 楼deerball()回复于 2006-11-28 15:39:49 得分 0

那该怎么通过gprs   modem和mmsc建立http连接呢?Top

3 楼oldnew(冬日暖阳)回复于 2006-11-28 18:15:46 得分 0

楼上的,把gprs   modem当做一个普通的拨号modem,   然后在windows网络连接里面建立一个拨号连接,号码为*99#,*99***1#任选一个,用户名,密码为空,   然后拨号.     这样你连上网了,有了和mmsc通讯的物理连接,,,,然后就可以用以上代码发送mms了.  
   
  Top

4 楼oldnew(冬日暖阳)回复于 2006-11-28 18:16:24 得分 0

就这么简单.Top

5 楼matq2008(叶子.net)回复于 2006-11-29 13:46:02 得分 0

非常不错,呵呵Top

6 楼oo(为了名副其实,努力学习oo技术ing)回复于 2006-11-29 15:52:01 得分 0

markTop

7 楼deerball()回复于 2006-11-29 16:56:36 得分 0

有人试验成功了吗?  
   
  我在本地测试,当执行到“WebResponse   wRes=   wReq.GetResponse();”时发生异常,  
  说是“基础连接已经关闭:   接收时发生意外错误。”  
   
  请问出现这个问题的原因是什么呢?  
   
  另外,是不是应该先对modem进行上下文的设置啊?  
  比如:  
  AT+CGDCONT=1,”IP”,”CMWAP”  
  AT+CGATT=1  
  AT+CGACT=1,1  
  ……Top

8 楼oldnew(冬日暖阳)回复于 2006-11-29 22:53:56 得分 0

基础连接已经关闭:   接收时发生意外错误  
   
  网络不通啊,兄弟,你telnet   10.0.0.172   80试试?别告诉我你用ADSL或宽带来测试这个?Top

9 楼oldnew(冬日暖阳)回复于 2006-11-29 23:03:39 得分 0

AT+CGDCONT=1,”IP”,”CMWAP”  
   
  有些modem已经内置了指定cmwap的指令,所以可要可不要,如果在拨号时出现   734   错误,(734   PPP   链接控制协议被终止)   ,那就需要在modem的属性   \高级   界面中,在"额外的初始化命令"框中填入     AT+CGDCONT=1,”IP”,”CMWAP”,   不出现734,就没有必要填了  
   
  至于AT+CGATT=1..就不用考虑了Top

10 楼oldnew(冬日暖阳)回复于 2006-11-29 23:06:28 得分 0

拨号常用错误:   777   SIM卡的GPRS服务没有了,100%卡里没钱了  
                              734   上面已经讲了解决方法了    
                              692   没插卡或卡接触不好,反正没找到你的卡.  
   
  Top

11 楼deerball()回复于 2006-11-30 13:25:39 得分 0

使用的是gprs   modem进行的拨号,其中放有一张动感地带的sim卡  
   
  该过程没有问题,成功建立连接,并且可使用ie上网,打开网页  
   
  只是运行上面的程序时,执行到“WebResponse   wRes=   wReq.GetResponse();”时发生异常,  
  输出异常为“基础连接已经关闭:   接收时发生意外错误。”Top

12 楼deerball()回复于 2006-11-30 13:27:08 得分 0

注:进行上面试验时已拔掉网线,确认是通过modem进行的网络连接  
   
  另,用gprs上网时,传输层和网络层都是使用的什么协议呢?Top

13 楼oldnew(冬日暖阳)回复于 2006-11-30 13:59:46 得分 0

可使用ie上网,打开网页  
   
  如果使用cmwap拨号上网,ie是无法上网的.    
   
  很简单,telnet   10.0.0.172   80试试,因为无论发彩信,还是上wap网站,连接到的ip都是10.0.0.172:80Top

14 楼DraculaW(成爲牛人,然後離開)回复于 2006-12-08 16:00:04 得分 0

收藏一下     看起來像http協議有點Top

15 楼wenstory()回复于 2006-12-11 17:15:28 得分 0

markTop

16 楼corono()回复于 2007-01-08 14:17:08 得分 0

 
  我把他编到     windows   mobile   5.0   当执行到“WebResponse   wRes=   wReq.GetResponse();”时发生异常。  
   
  我的   smartphone   是可以发彩信的。  
   
  请问   oldnew   知道这是怎么回事吗?Top

17 楼zlyperson(rookie)回复于 2007-01-31 16:09:59 得分 0

非常优秀的实战文章!Top

18 楼mmxcpu(嫁给cpu)回复于 2007-02-08 18:03:57 得分 0

做个记号学习Top

19 楼qiri07(俺家金毛de地位比俺高)回复于 2007-03-05 15:24:03 得分 0

学习!Top

20 楼zlyperson(rookie)回复于 2007-03-07 18:33:37 得分 0

有没有接收的例子呢?Top

21 楼womanlee(小蜜蜂)回复于 2007-03-09 11:58:21 得分 0

楼主   我发了几天之后突然不能发送彩信了   每次都提示基础连接已关闭,但是telnet   代理   又是通的   请问怎么回事啊??Top

22 楼van911()回复于 2007-03-25 20:29:49 得分 0

oldnew(冬日暖阳)  
  _____  
   
   
  向你致敬~~Top

23 楼van911()回复于 2007-03-25 20:55:32 得分 0

oldnew(冬日暖阳)  
   
  请问这方面有没有什么好一点的教程或文挡之类的?  
   
  多谢~~Top

24 楼l1w1w1(阿伟)回复于 2007-03-31 21:19:38 得分 0

留个地址,^_^Top

25 楼van911()回复于 2007-04-02 20:47:23 得分 0

van911@126.com       3Q~~~Top

26 楼abigfish(大鱼儿)回复于 2007-04-04 11:54:28 得分 0

本对对C#没研究,  
  public   MMSender()  
  {  
  //  
  //   TODO:   在此处添加构造函数逻辑  
  //  
  }  
  试问这里是不是少了什么东西?Top

27 楼chiyongmin()回复于 2007-04-10 21:08:42 得分 0

modem 拨号错误提示777 用的是tc35I模块,卡已经开通GPRS服务了 百思不得其解,大家指教一下啊Top

28 楼noahroom111()回复于 2007-04-18 11:20:59 得分 0

您好:  
  诺亚短信群发器(短信猫)(全国最低价)=750元/台  
  诺亚短信群发软件(支持40通道)=950元    
  诺亚短信开发接口(无时间和使用次数的限制)=800元  
  我公司现面向全国诚征短信产品代理商,全线代理我公司产品,代理我公司产品具有投资少,见效快,收益高等特点!有意者请速与我公司联系:010-866255140,谢谢!  
  我公司郑重承诺:诺亚短信开发接口与诺亚短信设备(短信猫)无任何绑定限制(无时间和使用次数的限制):即第一次买入后,以后无需再次购买此开发接口,请广大用户在购买时注意咨询,如有疑问,欢迎来电咨询!诺亚短信设备(短信猫)为全国最低价!    
  我公司还供应以下软件产品(短信群发/群发短信/短信群发软件/短信开发接口/短信开发包/短信群发软件/短信卡/短信猫/小灵通短信猫/短信群发器/短信群发机/多串口卡/串口服务器):  
  诺亚?短信开发接口        诺亚?短信群发?办公版  
  诺亚?短信防伪?系统   诺亚?短信群发?广告版    
  诺亚?短信查询?系统   诺亚?短信群发?网络版  
  诺亚?短信家校通?版   诺亚?短信群发?物流版  
  诺亚?短信群发卡(短信卡)诺亚?网站?防恶点软件(有效阻击恶点行为)(1200元/年,标配容量:10万条)  
  诺亚?短信群发?集团版(群发短信资费:8分/条)  
  注:全部产品售后服务为:3年包换!  
  我公司可为广大用户办理货到付款业务!  
  如需了解更多优惠信息,请与我们联系:  
  联系人:王先生  
  地   址:北京市海淀区远大路20号鹏安世纪大厦A座12层  
  邮   编:100089      
  电   话:010-86625514    
  传   真:010-51980693  
  网   址:www.nuoyasoft.cn  
  Top

29 楼myxmouse(小老鼠(我的星怎么是黑的?★★★★★))回复于 2007-04-20 15:29:27 得分 0

太好     研究研究   先Top

相关问题

关键词

得分解答快速导航

  • 帖主:oldnew

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
CSDN网站24小时值班电话:13552009689
Copyright © 2000-2009, CSDN.NET, All Rights Reserved
GongshangLogo