zoukankan      html  css  js  c++  java
  • GPRS modem发送彩信代码 c#版

    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;  
      }  
      }  
      } 

    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);  
      }  
      }  




  • 相关阅读:
    @FeignClient同一个name使用多个配置类报错,解决方案【转+改进】
    spring cloud 与spring boot 版本不匹配引发的问题总结
    无聊系列
    基于redis+lua实现的分布式限流
    elasticsearch 优化笔记
    redis+lua库存扣减和冲正
    es-dsl笔记
    wiki—-Confluence搭建
    Linux常用命令
    SQLSERVER|CDC 日志变更捕获机制
  • 原文地址:https://www.cnblogs.com/freemobile/p/824343.html
Copyright © 2011-2022 走看看