支持smil文件的MMS PDU打包方式

  1. 支持smil文件的MMS PDU打包方式. 收藏   
  2. 新一篇: GSM MODEM发PUSH/MMS 的具体实现. | 旧一篇: 做了一个java5.0/6.0的反编译工具.随意试用吧.   
  3.  mms如果不支持smil那就不能叫真正的MMS,mixed的格式对于多个附件的MMS来说不仅没有"排版"功能,   
  4.    
  5. 而且即使用你想一个文件一个文件"拆单了看",也不得不看一次手工播放一次,就象要手动"翻页".所以不支持   
  6.    
  7. smil干脆就别玩MMS了.   
  8.    
  9. 但基于related格式的支持smil的PDU打包方式怎么也搜索不到,很多厂商和技术人员都故作神秘,不就是一   
  10.    
  11. 堆规范的实现吗?只好下了几个文档来研究,经过反复调试,其中用nowSMS的mmscomp打包出来的格式竟然   
  12.    
  13. 是错误的,最后多次抓包比较,总算成功了.在『别人原来的mixed方式』的基础上修改成related方式的.有需要的   
  14.    
  15. 就自己用去吧.(注意基础类是别人原来提供的,我只是提供了related方式的打包逻辑)   
  16.    
  17. 工程文件在:http://dl2.csdn.net/down4/20070706/06201955542.rar    
  18.    
  19.     
  20.    
  21. using System;   
  22. using System.Net;   
  23. using System.IO;   
  24. using System.Diagnostics;   
  25. using System.Threading;   
  26. using System.Collections;   
  27. using System.Text;   
  28. /// <SUMMARY>    
  29. /// Lib 的摘要说明    
  30. /// </SUMMARY>    
  31.    
  32.    
  33. namespace MMSLib   
  34. {   
  35.    
  36.     public class MMessage   
  37.     {   
  38.         string subject = "测试";   
  39.         int deliverTime = 0;   //   多少秒以后开始投递    
  40.         ArrayList inlineFiles = new ArrayList();       //   文件列表      
  41.         ArrayList destinations = new ArrayList();      //   目标号码      
  42.    
  43.         static long serialNumber = 19700311L;                  //   流水号    
  44.         FileInfo smilFile;   
  45.    
  46.    
  47.    
  48.         public void SetSubject(string subject)   
  49.         {   
  50.             this.subject = subject;   
  51.         }   
  52.         public void SetDeliverTime(int deliverTime)   
  53.         {   
  54.             this.deliverTime = deliverTime;   
  55.         }   
  56.         //        
  57.         public void AddTo(string dest)   
  58.         {   
  59.             destinations.Add(dest);   
  60.         }   
  61.    
  62.         public void AddFile(string file)   
  63.         {   
  64.    
  65.             if (file.ToLower().EndsWith(".smil"))   
  66.             {   
  67.                 if (this.smilFile != null)   
  68.                     throw new Exception("The smil file has existed!");   
  69.                 this.smilFile = new FileInfo(file);   
  70.             }   
  71.             inlineFiles.Add(file);   
  72.         }   
  73.    
  74.         public void ClearTo()   
  75.         {   
  76.             destinations.Clear();   
  77.         }   
  78.    
  79.         //   得到二进制编码字节      
  80.         public byte[] MakeMMSContent()   
  81.         {   
  82.    
  83.             if (this.smilFile == null) throw new Exception("The smil file not found!");   
  84.    
  85.             byte[] MMSContent = new byte[0];   
  86.     
  87.             //X-Mms-Message-Type      
  88.             MMSContent = appendContent(new byte[] { 0x8C, 0x80 }, MMSContent);   
  89.    
  90.                
  91.             //X-Mms-Transaction-ID      
  92.             MMSContent = appendContent(new byte[] { 0x98 }, MMSContent);   
  93.             MMSContent = appendContent(serialNumber.ToString(), MMSContent);   
  94.             serialNumber++;      
  95.    
  96.             MMSContent = appendContent(new byte[] { 0x0 }, MMSContent);   
  97.    
  98.             //X-Mms-MMS-Version      
  99.             MMSContent = appendContent(new byte[] { 0x8D, 0x90 }, MMSContent);   
  100.    
  101.             //Date      
  102.             MMSContent = appendContent(new byte[] { 0x85 }, MMSContent);   
  103.             TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0);   
  104.             int sec = (int)ts.TotalSeconds;   
  105.             byte[] bySec = BitConverter.GetBytes(sec);   
  106.             MMSContent = appendContent(new byte[] { (byte)bySec.Length }, MMSContent);   
  107.             Array.Reverse(bySec);   
  108.             MMSContent = appendContent(bySec, MMSContent);   
  109.    
  110.             if (deliverTime > 0)   
  111.             {   
  112.                 MMSContent = appendContent(new byte[] { 0x87 }, MMSContent);   
  113.                 byte[] bfTime = BitConverter.GetBytes(deliverTime);        
  114.                 Array.Reverse(bfTime);   
  115.                 byte[] bfTimeLen = new byte[3];   
  116.                 bfTimeLen[0] = (byte)(bfTime.Length + 2);   
  117.                 bfTimeLen[1] = 0x81;     //   相对时间格式      
  118.                 bfTimeLen[2] = (byte)bfTime.Length;   
  119.                 MMSContent = appendContent(bfTimeLen, MMSContent);   
  120.                 MMSContent = appendContent(bfTime, MMSContent);   
  121.             }   
  122.    
  123.    
  124.             //From,Len = 0x01,一个以0x81为标记的占位符,发送时自动插入发送号码.    
  125.             MMSContent = appendContent(new byte[] { 0x89, 0x01, 0x81 }, MMSContent);   
  126.    
  127.             //To      
  128.             for (int i = 0; i < destinations.Count; i++)   
  129.             {   
  130.                 MMSContent = appendContent(new byte[] { 0x97 }, MMSContent);   
  131.                 MMSContent = appendContent("+86" + (string)destinations[i] + "/TYPE=PLMN", MMSContent);   
  132.                 //MMSContent = appendContent(new byte[] { 0x20, 0x20, 0x0 }, MMSContent);    
  133.                 MMSContent = appendContent(new byte[] { 0x0 }, MMSContent);   
  134.             }   
  135.    
  136.             //subject      
  137.             if (subject.Length > 0)     //   使用Utf8编码      
  138.             {   
  139.                 MMSContent = appendContent(new byte[] { 0x96 }, MMSContent);   
  140.                 byte[] byLen = new byte[1];   
  141.                 byLen[0] = (byte)(Encoding.UTF8.GetByteCount(subject) + 2);   
  142.                 MMSContent = appendContent(byLen, MMSContent);   
  143.                 MMSContent = appendContent(new byte[] { 0xEA }, MMSContent);   
  144.                 MMSContent = appendContent(Encoding.UTF8.GetBytes(subject), MMSContent);   
  145.                 MMSContent = appendContent(new byte[] { 0x0 }, MMSContent);   
  146.             }   
  147.    
  148.    
  149.             MMSContent = appendContent(new byte[] { 0x84 }, MMSContent);   
  150.             int ctLen = 2   // 0xB3 ,0x89    
  151.                 +  "application/smil".Length   
  152.                 + 3         //0x00 0x8A 0x3c    
  153.                 + smilFile.Name.Length   
  154.                 + 2;         //0x3c,0x00    
  155.    
  156.             byte[] cl = uintToBytes(ctLen);   
  157.    
  158.             if(cl[0] >= 0x1F)   
  159.                 MMSContent = appendContent(new byte[] { 0x1F }, MMSContent);   
  160.             MMSContent = appendContent(cl, MMSContent);   
  161.             MMSContent = appendContent(new byte[] { 0xB3}, MMSContent);   
  162.                 //0xB3   Content-Type:application/vnd.wap.multipart.related    
  163.                
  164.             MMSContent = appendContent(new byte[] { 0x89 }, MMSContent);   
  165.             MMSContent = appendContent(Encoding.ASCII.GetBytes("application/smil"), MMSContent);   
  166.             MMSContent = appendContent(new byte[] { 0x0 }, MMSContent);   
  167.    
  168.             MMSContent = appendContent(new byte[] { 0x8A ,0x3C}, MMSContent);//0x8A:Start,0x3C:<    
  169.             MMSContent = appendContent(Encoding.ASCII.GetBytes( smilFile.Name ), MMSContent);   
  170.             MMSContent = appendContent(new byte[] { 0x3E ,0x0 }, MMSContent); //0x3E:>    
  171.    
  172.    
  173.    
  174.    
  175.    
  176.             byte[] byFileCount = new byte[1];   
  177.             byFileCount[0] = (byte)inlineFiles.Count;   
  178.             MMSContent = appendContent(byFileCount, MMSContent);   
  179.    
  180.             int chLen = "application/smil".Length    
  181.             + 4     //0x00 0xc0 0x22 0x3c: cid,",<    
  182.             + smilFile.Name.Length   
  183.             + 3     // 0x3E,0x00,0x8E    
  184.             + smilFile.Name.Length   
  185.             + 1;     // 0x00    
  186.                
  187.             for (int j = 0; j < inlineFiles.Count; j++)   
  188.             {   
  189.                 MMSContent = appendContent(GetFileContent(inlineFiles[j].ToString()), MMSContent);   
  190.             }   
  191.             return MMSContent;   
  192.         }   
  193.    
  194.    
  195.         //   打包文件    
  196.         private byte[] GetFileContent(string FileName)   
  197.         {   
  198.    
  199.             byte[] byHeaders = new byte[0];       //   ContentType和Headers组合      
  200.             byte[] byData = readFile(FileName);   
  201.    
  202.             string FileID = getContentId(FileName);   
  203.             if (FileName.EndsWith(".txt"))   
  204.             {   
  205.                 byHeaders = new byte[1];   
  206.                 byHeaders[0] = (byte)(Encoding.ASCII.GetByteCount(FileID) + 5);   
  207.                 byHeaders = appendContent(new byte[] { 0x83, 0x85 }, byHeaders);       //   Utf-8      
  208.                 byHeaders = appendContent(Encoding.ASCII.GetBytes(FileID), byHeaders);   
  209.                 byHeaders = appendContent(new byte[] { 0x00 }, byHeaders);   
  210.                 byHeaders = appendContent(new byte[] { 0x81, 0xEA }, byHeaders);   
  211.    
  212.             }   
  213.             else if (FileName.EndsWith(".gif"))   
  214.             {   
  215.                 byHeaders = new byte[] { 0x9D };   
  216.             }   
  217.             else if (FileName.EndsWith(".mid") || FileName.EndsWith(".midi"))   
  218.             {   
  219.                 byHeaders = Encoding.ASCII.GetBytes("audio/midi");   
  220.                 byHeaders = appendContent(new byte[] { 0x00 }, byHeaders);        
  221.             }   
  222.             else if (FileName.EndsWith(".smil"))   
  223.             {   
  224.                 byHeaders = Encoding.ASCII.GetBytes("application/smil");   
  225.                 byHeaders = appendContent(new byte[] { 0x00 }, byHeaders);        
  226.             }   
  227.    
  228.             //加入Content-ID     
  229.             byHeaders = appendContent(new byte[] { 0xC0, 0x22, 0x3C }, byHeaders);   
  230.             byHeaders = appendContent(Encoding.ASCII.GetBytes(FileID), byHeaders);   
  231.             byHeaders = appendContent(new byte[] { 0x3E, 0x00 }, byHeaders);   
  232.                
  233.             //加入Content-Location      
  234.             byHeaders = appendContent(new byte[] { 0x8E }, byHeaders);   
  235.             byHeaders = appendContent(Encoding.ASCII.GetBytes(FileID), byHeaders);   
  236.             byHeaders = appendContent(new byte[] { 0x00 }, byHeaders);   
  237.    
  238.             byte[] byHeaderLen = uintToBytes(byHeaders.Length);   
  239.             byte[] byDataLen = uintToBytes(byData.Length);   
  240.    
  241.             byte[] byMmc = new byte[byHeaderLen.Length + byDataLen.Length + byHeaders.Length + byData.Length];   
  242.             Array.Copy(byHeaderLen, byMmc, byHeaderLen.Length);   
  243.             Array.Copy(byDataLen, 0, byMmc, byHeaderLen.Length, byDataLen.Length);   
  244.             Array.Copy(byHeaders, 0, byMmc, byHeaderLen.Length + byDataLen.Length, byHeaders.Length);   
  245.             Array.Copy(byData, 0, byMmc, byHeaderLen.Length + byDataLen.Length + byHeaders.Length, byData.Length);   
  246.    
  247.             return byMmc;   
  248.         }   
  249.    
  250.         private byte[] uintToBytes(int n)   
  251.         {   
  252.             byte[] buf = new byte[8];   
  253.             int l = 0;   
  254.             while (n >= 128)   
  255.             {   
  256.                 byte b = (byte)(n & 0x7F);   
  257.                 n = n >> 7;   
  258.                 buf[l++] = b;   
  259.             }   
  260.             buf[l++] = (byte)n;   
  261.    
  262.             byte[] retBys = new byte[l];   
  263.             for (int i = 0; i < l; ++i)   
  264.             {   
  265.                 retBys[i] = (byte)(buf[l - i - 1] | 0x80);   
  266.             }   
  267.             retBys[l - 1] &= 0x7F;   
  268.             return retBys;   
  269.    
  270.         }   
  271.            
  272.         //   读取文件      
  273.         private byte[] readFile(string FileName)   
  274.         {   
  275.             if (FileName.EndsWith(".txt")) {   
  276.    
  277.                 StreamReader sr = null;   
  278.                 try{   
  279.                     sr = new StreamReader(FileName, Encoding.Default);   
  280.                     string text = sr.ReadToEnd();   
  281.                     byte[] bf = Encoding.UTF8.GetBytes(text);   
  282.                     return bf;   
  283.                 }   
  284.                 catch {   
  285.                     return new byte[0];   
  286.                 }   
  287.                 finally {   
  288.                     if (sr != null) sr.Close();   
  289.                 }   
  290.             }   
  291.             FileStream fs = null;   
  292.             try   
  293.             {   
  294.                 fs = new FileStream(FileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None);     //   没有设定Buffsize      
  295.                 byte[] bf = new byte[fs.Length];   
  296.                 fs.Read(bf, 0, (int)fs.Length);   
  297.                 return bf;   
  298.             }   
  299.             catch{   
  300.                 return new byte[0];   
  301.             }   
  302.             finally{   
  303.                 if(fs != null) fs.Close();   
  304.             }   
  305.         }   
  306.            
  307.         private string getContentId(string FileName)   
  308.         {   
  309.             int at = FileName.LastIndexOf("/");   
  310.             if (at < 0)   
  311.                 at = FileName.LastIndexOf("/");   
  312.             return FileName.Substring(at + 1);   
  313.         }   
  314.      
  315.         private byte[] appendContent(byte[] srcBys, byte[] destBys)   
  316.         {   
  317.             Array.Resize(ref destBys, srcBys.Length + destBys.Length);   
  318.             Array.Copy(srcBys,0,destBys,destBys.Length - srcBys.Length,srcBys.Length);   
  319.             return destBys;   
  320.         }   
  321.    
  322.         private byte[] appendContent(string sz, byte[] byDest)   
  323.         {   
  324.             return appendContent(Encoding.Default.GetBytes(sz), byDest);   
  325.         }   
  326.     }   
  327.    
  328.     ///   <SUMMARY>      
  329.     ///   MMSender   的摘要说明。      
  330.     ///        
  331.     ///   </SUMMARY>      
  332.     public class MMSender   
  333.     {   
  334.         //   设置参数      
  335.         string sMmscUrl = "http://mmsc.monternet.com";   
  336.         string sProxyUrl = "10.0.0.172:80";   
  337.    
  338.         public MMSender()   
  339.         {   
  340.             //      
  341.             //   TODO:   在此处添加构造函数逻辑      
  342.             //      
  343.         }   
  344.         public void SetMMSC(string szUrl)   
  345.         {   
  346.             sMmscUrl = szUrl;   
  347.         }   
  348.         public void SetProxy(string szUrl)   
  349.         {   
  350.             sProxyUrl = szUrl;   
  351.         }   
  352.    
  353.    
  354.         /*   发送MMS的过程    
  355.         1>   创建消息发送接口    
  356.             MMSender   ms   =   new   MMSender();    
  357.         2>   设置参数属性    
  358.             默认属性已经是中国移动参数,因此如果是中国移动用户,以下两个操作可以不需要    
  359.             ms.SetMMSC("http://mmsc.monternet.com");    
  360.             ms.SetProxy("10.0.0.172:80");    
  361.         3>   创建消息    
  362.             MMessage   mm=   new   MMessage();    
  363.         4>   设置消息内容    
  364.             mm.SetSubject("标题");             //   设置标题    
  365.             mm.AddTo("13810034500");         //   添加接收号码,调用一次添加一个接收号码    
  366.             mm.AddFile("FileName");           //   添加发送文件,包含文件路径,调用一次添加一个发送文件    
  367.         5>   发送消息    
  368.               string   szReult   =ms.Send(mm);    
  369.            
  370.         6>   继续发送其他号码    
  371.             mm.ClearTo();    
  372.             mm.AddTo("13812345678");    
  373.             ms.Send(mm);              
  374.         */   
  375.    
  376.    
  377.         /*   避免协议冲突的设置    
  378.         <CONFIGURATION>    
  379.         <SYSTEM.NET>    
  380.         <SETTINGS>    
  381.         <HTTPWEBREQUEST useUnsafeHeaderParsing="true" />    
  382.         </SETTINGS>    
  383.         </SYSTEM.NET>    
  384.         </CONFIGURATION>    
  385.                 */   
  386.    
  387.    
  388.    
  389.    
  390.         public string Send(MMessage mm)   
  391.         {   
  392.             try   
  393.             {   
  394.                 byte[] byMM = mm.MakeMMSContent();   
  395.                 if (byMM.Length > 50 * 1024)   
  396.                     return "The package is too large!";   
  397.                 //   验证参数有效性      
  398.                 //FileStream fs = new FileStream("d:/aaa.mms", FileMode.Create);    
  399.                 //fs.Write(byMM, 0, byMM.Length);    
  400.                 //fs.Close();    
  401.                 //return "OK";    
  402.                 WebRequest wReq = WebRequest.Create(sMmscUrl);   
  403.                 HttpWebRequest hReq = (HttpWebRequest)wReq;   
  404.                 wReq.Headers.Clear();   
  405.                 if (sProxyUrl.Length > 0)   
  406.                     wReq.Proxy = new WebProxy(sProxyUrl);   
  407.    
  408.                 wReq.ContentType = "application/vnd.wap.mms-message";   
  409.                 hReq.Accept = "application/vnd.wap.mms-message,text/plain,*/*";   
  410.                 wReq.Method = "POST";   
  411.                 hReq.KeepAlive = false;   
  412.                 hReq.UserAgent = "Nokia6681/2.0   (4.00.15)   SymbianOS/8.0   Series60/2.6   Profile/MIDP-2.0   Configuration/CLDC-1.1";   
  413.                 //   Write   Post   Dat      
  414.                    
  415.                 hReq.ContentLength = byMM.Length;   
  416.                 Stream sReq = wReq.GetRequestStream();   
  417.                 sReq.Write(byMM, 0, byMM.Length);   
  418.                 sReq.Close();   
  419.                 WebResponse wRes = wReq.GetResponse();   
  420.                 HttpWebResponse hRes = (HttpWebResponse)wRes;   
  421.                 if (hRes.StatusCode == HttpStatusCode.OK)   
  422.                 {   
  423.                     Stream sRes = wRes.GetResponseStream();   
  424.                     StreamReader sr = new StreamReader(sRes);   
  425.                     string szResult = sr.ReadToEnd();     //   发送结果      
  426.                     sr.Close();   
  427.                     return szResult;   
  428.                 }   
  429.             }   
  430.             catch (Exception e)   
  431.             {   
  432.                 throw new Exception(e.Message);   
  433.             }   
  434.             return string.Empty;   
  435.         }   
  436.     }   
  437. }   
  438.    
  439.    
  440.     
  441.    
  442.     
  443.    
  444. 发表于 @ 2007年06月29日 15:00:00|评论(38)|编辑   
  445.     
  446. Flex基本语法   
  447. 命名规范、标量属性等     
  448. 31 个Flex APIs,类库,组件等   
  449. 都是英文的,比较考验英语水平 评论   
  450. #hellobaobao 发表于2007-07-18 12:03:03  IP: 218.5.2.*    
  451. 你好非常感谢你提供了这篇文章。我有两个问题:   
  452. /* 避免协议冲突的设置    
  453. <CONFIGURATION>    
  454. <SYSTEM.NET>    
  455. <SETTINGS>    
  456. <HTTPWEBREQUEST useUnsafeHeaderParsing="true" />    
  457. </SETTINGS>    
  458. </SYSTEM.NET>    
  459. </CONFIGURATION>    
  460. */   
  461. 1:我在调试的时候编译器提示我协议冲突,请问我该怎么设置。上面你提供的注释在winform 下要怎么设置。   
  462. 2:   
  463. mm.AddFile("d://mmstest//1.smil");   
  464. mm.AddFile("d://mmstest//1.jpg");   
  465. mm.AddFile("d://mmspackage//1.txt");   
  466. mm.AddFile("d://mmspackage//1.gif");   
  467. mm.AddFile("d://mmspackage//1.mid");   
  468. 这里的smil文件需要事先写好吗如下所示:   
  469. < smil>   
  470. < head>   
  471. < /head>   
  472. < body>   
  473. < Image src="1.jpg" />   
  474. ...   
  475. < /body>   
  476. < /smil>   
  477. 还是只要提供一个1.smil空的文件,具体的内容由程序自己写入。   
  478. 我是一个新手,再次感谢!#axman 发表于2007-07-18 14:16:10  IP: 210.82.61.*   
  479. 对于应用程序应该和应用程序同名的config,如aaa.exe的config应该是aaa.exe.config,web应用中请在web.config中设置.也可以直接编程访问,具体请参看.NET的相关内容.   
  480.    
  481. 对于smil文件当然要你自己先编排好啊.否则怎么知道你要如何布局呢?你可以使用一些可视化的编辑器编辑好后提供进来.#hellobaobao 发表于2007-07-18 20:05:39  IP: 116.217.46.*   
  482. 你好谢谢你的回答,关于第二问题我明白了。第一个问题我还是不太明白。我在工程里加入这个config 文件,但是我的程序要在那里读取这个设置呢!不然我想单单添加这config文件对于程序来说没有什么意义。   
  483. 我下面还有两个问题:   
  484. 1:你提供的段代码其中有一个打包的模块:你提供了gif、txt、mid、smil格式的打包方法。我想问下jpg格式的打包是如何实现。或者你告诉我你的打包方法是遵守什么协议、规则。   
  485. 2:你这个demo提供的是“支持smil文件的mms pdu 打包方式”,我如果只是单纯的想把一个mms文件通过GPRS Modern   
  486. 我该如何操作。   
  487. 谢谢!新手问题比较多!呵呵   
  488. 顺便问下为什么我发表评论老是提示校验码错误!我确定我正确输入了#scrow 发表于2007-07-19 14:46:05  IP: 60.25.4.*   
  489. 以前我也是,现在去掉验证码了,可以直接输入了^V^#hellobaobao 发表于2007-07-19 14:48:06  IP: 218.5.2.*   
  490. 你好我上面提的问题能帮我解释下吗?我今天一个早上都在等你的回复!谢谢#axman 发表于2007-07-19 14:52:23  IP: 210.82.61.*   
  491. 1.jpg打包把9D改成9E,png是A0.   
  492. 2.单独的MMS你只要把byte[] byMM = mm.MakeMMSContent();改成读文件到byte[]中就行了,这个也好问啊.   
  493. 3.那不是我的事,问论坛的开发者#hellobaobao 发表于2007-07-19 15:17:32  IP: 218.5.2.*   
  494. 多谢axman的回答!我是初学者没有经验多多指教#hellobaobao 发表于2007-07-20 10:43:34  IP: 218.5.2.*   
  495. axman你好如果我要支持更多格式的资源文件的打包,我该怎么做他有没有一个标准或者规则,就像你教我的jpg是0X9E、png是0XA0.谢谢#axman 发表于2007-07-20 10:48:52  IP: 210.82.61.*   
  496. 当然有文档,不过很难找到,目前我不能给你,只能你需要什么格式我告诉你如何打包.#hellobaobao 发表于2007-07-20 12:37:26  IP: 218.5.2.*   
  497. 还有一个就是bmp格式,其他暂时不需要。谢谢!#axman 发表于2007-07-20 13:23:18  IP: 210.82.61.*   
  498. bmp应该是不支持的,手机应该是wbmp,PUD代码是A1.如果要打bmp,只能象下面的mid和smil那样指定ContentType.#hellobaobao 发表于2007-07-20 14:09:23  IP: 218.5.2.*   
  499. 行谢谢!#hellobaobao 发表于2007-07-22 13:46:36  IP: 116.217.58.*   
  500. axman我想问你一个彩信的标题最多支持多少个汉字。#hellobaobao 发表于2007-07-23 11:42:02  IP: 218.5.2.*   
  501. 这个问题我已经解决了,我把txt文件保存为utf-8编码就行了#hellobaobao 发表于2007-07-23 14:49:58  IP: 218.5.2.*   
  502. 我突然发现我的评论少了好多条记录#herosky 发表于2007-07-24 15:44:01  IP: 116.24.89.*   
  503. 好人,我亲死你了,正是我想找的#hellobaobao 发表于2007-08-01 15:34:40  IP: 218.5.2.*   
  504. to axman   
  505. 我想问下我把数据库里的Image字段的数据取出来,发送后手机 提示不可识别的媒体格式,我该怎么做。下面是我的修改后的代码:   
  506. SqlConnection con = new SqlConnection(GPRSXml.ConStr);   
  507. string ImageID = ImgID;   
  508. string sqlstr = "SELECT FileData FROM CarPhoto where id=" + ImageID;   
  509. SqlCommand Com = new SqlCommand(sqlstr, con);   
  510. con.Open();   
  511. SqlDataReader dr = Com.ExecuteReader();   
  512. if (dr.Read())   
  513. {   
  514. byte[] bImgData = (byte[])dr["FileData"];   
  515. string imgfilename = "img.jpg";   
  516. byMms = AppendOct(GetMmsPicContent(imgfilename, bImgData), byMms);   
  517. }   
  518.    
  519. con.Close();   
  520. return byMms;   
  521.    
  522.    
  523. private byte[] GetMmsPicContent(string FileName, byte[] FileData)   
  524. {   
  525. // 每一个Multipart Entry由5个部分组成    
  526. /* HeadersLen  
  527. * DataLen  
  528. * ContentType  
  529. * Headers  
  530. * Data  
  531. * */   
  532. byte[] byHeaders = new byte[0]; // ContentType和Headers组合    
  533. byte[] byData = FileData;   
  534. string FileID = FileName;   
  535. //说明是JPG格式    
  536. byHeaders = new byte[] { 0x9E };   
  537. // 加入Content-ID和Content-Location    
  538. byHeaders = AppendOct(new byte[] { 0xC0, 0x22, 0x3C }, byHeaders);   
  539. byHeaders = AppendOct(Encoding.ASCII.GetBy#hellobaobao 发表于2007-08-01 15:38:03  IP: 218.5.2.*   
  540. 接上   
  541. byHeaders = AppendOct(Encoding.ASCII.GetBytes(FileID), byHeaders);   
  542. byHeaders = AppendOct(new byte[] { 0x3E, 0x00 }, byHeaders);   
  543. //加入Content-Location    
  544. byHeaders = AppendOct(new byte[] { 0x8E }, byHeaders);   
  545. byHeaders = AppendOct(Encoding.ASCII.GetBytes(FileID), byHeaders);   
  546. byHeaders = AppendOct(new byte[] { 0x00 }, byHeaders);   
  547.    
  548. byte[] byHeaderLen = encodeUintvar(byHeaders.Length);   
  549. byte[] byDataLen = encodeUintvar(byData.Length);   
  550.    
  551. byte[] byMmc = new byte[byHeaderLen.Length + byDataLen.Length + byHeaders.Length + byData.Length];   
  552. Array.Copy(byHeaderLen, byMmc, byHeaderLen.Length);   
  553. Array.Copy(byDataLen, 0, byMmc, byHeaderLen.Length, byDataLen.Length);   
  554. Array.Copy(byHeaders, 0, byMmc, byHeaderLen.Length + byDataLen.Length, byHeaders.Length);   
  555. Array.Copy(byData, 0, byMmc, byHeaderLen.Length + byDataLen.Length + byHeaders.Length, byData.Length);   
  556.    
  557. return byMmc;#axman 发表于2007-08-01 15:49:25  IP: 210.82.61.*   
  558. 这还不简单,你把byte[] bImgData写到文件中,命名为aaa.jpg,然后看是否能打开,如果打开能打开那就一定能发送.#hellobaobao 发表于2007-08-01 15:51:49  IP: 218.5.2.*   
  559. 图片可以正确的显示在网页上,但是就是无法发送。#axman 发表于2007-08-01 16:01:33  IP: 210.82.61.*   
  560. 那就是文件不是JPG的,却被命名为JPG,在PC上你把gif命令为jpg它也能正确地显示,在手机上就不行了.要不你把文件传到哪我下来看看#hellobaobao 发表于2007-08-01 16:23:07  IP: 218.5.2.*   
  561. 当我把数据库的image字段数据写到本地文件中aaa.jpg,然后再从文件夹中把aaa.jpg发送出去就可以了。   
  562. if (dr.Read())   
  563. {   
  564. byte[] bImgData = (byte[])dr["FileData"];   
  565. FileStream fs = new FileStream("e://aaa.jpg", FileMode.Create, FileAccess.ReadWrite);    
  566. fs.Write(bImgData, 0, bImgData.Length);   
  567. fs.Close();   
  568. byMms = AppendOct(GetMmsContent("e://aaa.jpg"), byMms);   
  569. }   
  570. 感觉来回转换效率实在是低,暂时只能这么凑合。#axman 发表于2007-08-01 18:08:28  IP: 210.82.61.*   
  571. 那就奇怪了,你应该写到文件的再读回头,然后把每个byte值打印出来和直接从数据库中读取的byte[]中的每个byte比较,肯定不一样.   
  572. #hellobaobao 发表于2007-08-01 23:07:54  IP: 116.217.66.*    
  573. to axman   
  574. 你讲的有道理明天我试下看看。谢谢#hellobaobao 发表于2007-08-01 23:25:14  IP: 116.217.66.*   
  575. “那就是文件不是JPG的,却被命名为JPG,在PC上你把gif命令为jpg它也能正确地显示,在手机上就不行了.要不你把文件传到哪我下来看看”   
  576. 这个问题我也不好回答,因为我只是直接从数据库里读出相应编号的图片字段里的信息,这个图片字段数据是由别人填充进去的。他告诉我说是jpg格式的。#hellobaobao 发表于2007-08-02 09:59:33  IP: 218.5.2.*   
  577. to axman    
  578. 我截取部分的数据给你看   
  579. 这是程序读取本地jpg文件生成的部分编码:   
  580. [0x00000000] 0xff byte   
  581. [0x00000001] 0xd8 byte   
  582. [0x00000002] 0xff byte   
  583. [0x00000003] 0xdb byte   
  584. [0x00000004] 0x00 byte   
  585. [0x00000005] 0x84 byte   
  586. [0x00000006] 0x00 byte   
  587. [0x00000007] 0x10 byte   
  588. [0x00000008] 0x0b byte   
  589. [0x00000009] 0x0c byte   
  590. 这是数据库里保存的数据中的部分。   
  591. 0xFFD8FFDB008400100B0C   
  592. 确实不一样   
  593.    
  594. #karalf 发表于2007-10-24 12:21:01  IP: 221.137.240.*    
  595. to axman   
  596. 可以请教几个问题吗   
  597. 为什么我发mms时,只要信息大小1.4k,就会发生“基础连接已经关闭,接收时发生意外”或“基础连接已经关闭,连接被意外中断”的错误。#axman 发表于2007-10-24 13:31:51  IP: 61.135.207.*   
  598. 这应该和你的卡的GPRS连结的质量有关吧.另外看看手机的连结设置中是否有超时设置.#karalf 发表于2007-10-25 16:00:28  IP: 221.137.240.*   
  599. to axman   
  600. 多谢赐教。真没想到你能这么快就回应我了。   
  601. 我没有用手机,而是直接用sim300模组发的。之前可以发送10k以内的信息,重装了一下系统就只能发1.4k以内的信息了。真是郁闷啊,您说会不会是操作系统有问题呢?还是GRPS没有设置好?#axman 发表于2007-10-25 16:10:03  IP: 61.135.207.*   
  602. 如果是重装了系统,看看通讯协议是否正常,比如生成一个MMS文件,然后用java写个发送程序发出去看看.   
  603.    
  604. 因为.NET平台和中国移动的UNIX平台通讯非常有可能产生协议冲突,比如换行符不同,是否允许高节字等.另外写个程序通过GPRS通道去下一个梦网上的大的内容比如3GP文件看看是否可以.#karalf 发表于2007-10-25 16:19:19  IP: 221.137.240.*   
  605. 好的,谢谢指教。但是“写个程序通过GPRS通道去下一个梦网上的大的内容比如3GP文件”具体要怎么做呢?我是不是很烦,我是菜鸟啦,请多包涵。#karalf 发表于2007-10-26 09:25:03  IP: 221.137.246.*   
  606. to axman   
  607. 再请教个问题,用java写mms程序,对jdk的版本有限制吗,1.6版本可以用吗?#runnercn 发表于2007-11-20 11:16:22  IP: 211.137.96.*   
  608. 好东西啊,但是我发过去,手机打不开收到的文件,博主可以指教一下吗 ?#xiongzhaowei 发表于2007-12-30 18:51:28  IP: 116.24.166.*   
  609. 的确是好东西呀,楼主问下这样发出来的程序如何接收?比如在两个手机之间发送文件,就可以通过彩信来发送呀。#axman 发表于2007-12-31 10:51:33  IP: 123.115.12.*   
  610. 标准的MMS,收到打不开和如何接收,那是你的手机是否支持MMS和是否开通GPRS的问题.别人都能访问google页在.你的浏览器打不开或访问不到肯定是你的通讯链路或浏览器本身有问题.#xiongzhaowei 发表于2008-01-09 12:02:15  IP: 121.34.149.*   
  611. 我是说如何用程序绕过系统自己接收彩信,然后把彩信的内容拆开并执行相应的操作,如果我们把短信看成是命令的话,彩信就是一个带“附件”的命令,我们可以从smil文件的名字上判断命令的类型,TXT文件内容判断命令参数,其它的作为资源,比如我做一个软件,通过彩信自动更新,收彩信是免费的,因此我只要在有限的范围内群发一条彩信就可以了。问题是如何让程序主动的去接收而不是等待系统送上门由用户自己更新。#weiquanqiang 发表于2008-07-16 11:11:59  IP: 58.223.172.*   
  612. 请问楼主我用GPRS模块拨号上去以后可以浏览网页,但我在用程序发送彩信时候总是提示“无法连接到到远程服务器”,这是什么原因呀????#axman 发表于2008-07-17 09:02:42  IP: 61.135.207.*   
  613. GPRS模块拨号上去以后可以浏览网页,说明你用cmnet拔上去的,而MMS应该用cmwap拔号.  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值