诗剑书生的专栏

我在灌江口上住,花开花落,不知流年度.雁过空遗秋色暮,抚琴细听梧桐雨. 轻舞残虹漫展书,云卷云舒,思愫万千缕.安得婵娟与共处,长作识字耕田夫.                   诗剑书生 于灌江口.听潮居

用户操作
[即时聊天] [发私信] [加为好友]
诗剑书生ID:axman
108737次访问,排名817好友0人,关注者16
一个男人. 一个写程序男人. 一个写程序并从程序中寻找快乐的男人. 一个写程序并从程序中寻找快乐又把快乐传递给大家的男人.
一个书生. 一个寂寞的书生. 一个寂寞的梅香竹影下敲声写韵的书生. 一个寂寞的梅香竹影下敲声写韵晨钟暮鼓中逸气扬剑的书生.
那个男人是位书生。没有人知道他的姓名,居无定所,行无定踪,亦耕亦读,或渔或樵。
axman的文章
原创 87 篇
翻译 0 篇
转载 0 篇
评论 161 篇
axman的公告
最近评论
ZangXT:醍醐灌顶
matay:能不能把这个打包mms的工程源代码共享一下?万分感谢!
mataym@gmail.com
axman:不用说明什么,一切都如我预料的那样.
在整个奥运开幕式期间,我一边看电视,一边访问
http://www.cctvolympics.com/main.php?type=vod这个地址,其间访问一百多次,没有一次成功.大多数时候是前端缓存的squid在报refuse(111).有时以过几分钟的等待,能出来页面,但Flash缓冲的进度条到了99%就一直停止在那儿.
……
myvicc:写得不错,等写下文
chinagavin:我是先读三位正向输出,然后再读三位反向输出来最终达到想要的结果。
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 支持smil文件的MMS PDU打包方式.收藏

    新一篇: GSM MODEM发PUSH/MMS 的具体实现. | 旧一篇: 做了一个java5.0/6.0的反编译工具.随意试用吧.

     mms如果不支持smil那就不能叫真正的MMS,mixed的格式对于多个附件的MMS来说不仅没有"排版"功能,

    而且即使用你想一个文件一个文件"拆单了看",也不得不看一次手工播放一次,就象要手动"翻页".所以不支持

    smil干脆就别玩MMS了.

    但基于related格式的支持smil的PDU打包方式怎么也搜索不到,很多厂商和技术人员都故作神秘,不就是一

    堆规范的实现吗?只好下了几个文档来研究,经过反复调试,其中用nowSMS的mmscomp打包出来的格式竟然

    是错误的,最后多次抓包比较,总算成功了.在『别人原来的mixed方式』的基础上修改成related方式的.有需要的

    就自己用去吧.(注意基础类是别人原来提供的,我只是提供了related方式的打包逻辑)

    工程文件在:http://dl2.csdn.net/down4/20070706/06201955542.rar

     

    using System;
    using System.Net;
    using System.IO;
    using System.Diagnostics;
    using System.Threading;
    using System.Collections;
    using System.Text;
    /// <summary>
    /// Lib 的摘要说明
    /// </summary>


    namespace MMSLib
    {

        
    public class MMessage
        {
            
    string subject = "测试";
            
    int deliverTime = 0;   //   多少秒以后开始投递
            ArrayList inlineFiles = new ArrayList();       //   文件列表  
            ArrayList destinations = new ArrayList();      //   目标号码  

            
    static long serialNumber = 19700311L;                  //   流水号
            FileInfo smilFile;



            
    public void SetSubject(string subject)
            {
                
    this.subject = subject;
            }
            
    public void SetDeliverTime(int deliverTime)
            {
                
    this.deliverTime = deliverTime;
            }
            
    //    
            public void AddTo(string dest)
            {
                destinations.Add(dest);
            }

            
    public void AddFile(string file)
            {

                
    if (file.ToLower().EndsWith(".smil"))
                {
                    
    if (this.smilFile != null)
                        
    throw new Exception("The smil file has existed!");
                    
    this.smilFile = new FileInfo(file);
                }
                inlineFiles.Add(file);
            }

            
    public void ClearTo()
            {
                destinations.Clear();
            }

            
    //   得到二进制编码字节  
            public byte[] MakeMMSContent()
            {

                
    if (this.smilFile == nullthrow new Exception("The smil file not found!");

                
    byte[] MMSContent = new byte[0];
     
                
    //X-Mms-Message-Type  
                MMSContent = appendContent(new byte[] { 0x8C0x80 }, MMSContent);

                
                
    //X-Mms-Transaction-ID  
                MMSContent = appendContent(new byte[] { 0x98 }, MMSContent);
                MMSContent 
    = appendContent(serialNumber.ToString(), MMSContent);
                serialNumber
    ++;   

                MMSContent 
    = appendContent(new byte[] { 0x0 }, MMSContent);

                
    //X-Mms-MMS-Version  
                MMSContent = appendContent(new byte[] { 0x8D0x90 }, MMSContent);

                
    //Date  
                MMSContent = appendContent(new byte[] { 0x85 }, MMSContent);
                TimeSpan ts 
    = DateTime.Now - new DateTime(197011000);
                
    int sec = (int)ts.TotalSeconds;
                
    byte[] bySec = BitConverter.GetBytes(sec);
                MMSContent 
    = appendContent(new byte[] { (byte)bySec.Length }, MMSContent);
                Array.Reverse(bySec);
                MMSContent 
    = appendContent(bySec, MMSContent);

                
    if (deliverTime > 0)
                {
                    MMSContent 
    = appendContent(new byte[] { 0x87 }, MMSContent);
                    
    byte[] bfTime = BitConverter.GetBytes(deliverTime);     
                    Array.Reverse(bfTime);
                    
    byte[] bfTimeLen = new byte[3];
                    bfTimeLen[
    0= (byte)(bfTime.Length + 2);
                    bfTimeLen[
    1= 0x81;     //   相对时间格式  
                    bfTimeLen[2= (byte)bfTime.Length;
                    MMSContent 
    = appendContent(bfTimeLen, MMSContent);
                    MMSContent 
    = appendContent(bfTime, MMSContent);
                }


                
    //From,Len = 0x01,一个以0x81为标记的占位符,发送时自动插入发送号码.
                MMSContent = appendContent(new byte[] { 0x890x010x81 }, MMSContent);

                
    //To  
                for (int i = 0; i < destinations.Count; i++)
                {
                    MMSContent 
    = appendContent(new byte[] { 0x97 }, MMSContent);
                    MMSContent 
    = appendContent("+86" + (string)destinations[i] + "/TYPE=PLMN", MMSContent);
                    
    //MMSContent = appendContent(new byte[] { 0x20, 0x20, 0x0 }, MMSContent);
                    MMSContent = appendContent(new byte[] { 0x0 }, MMSContent);
                }

                
    //subject  
                if (subject.Length > 0)     //   使用Utf8编码  
                {
                    MMSContent 
    = appendContent(new byte[] { 0x96 }, MMSContent);
                    
    byte[] byLen = new byte[1];
                    byLen[
    0= (byte)(Encoding.UTF8.GetByteCount(subject) + 2);
                    MMSContent 
    = appendContent(byLen, MMSContent);
                    MMSContent 
    = appendContent(new byte[] { 0xEA }, MMSContent);
                    MMSContent 
    = appendContent(Encoding.UTF8.GetBytes(subject), MMSContent);
                    MMSContent 
    = appendContent(new byte[] { 0x0 }, MMSContent);
                }


                MMSContent 
    = appendContent(new byte[] { 0x84 }, MMSContent);
                
    int ctLen = 2   // 0xB3 ,0x89
                    +  "application/smil".Length
                    
    + 3         //0x00 0x8A 0x3c
                    + smilFile.Name.Length
                    
    + 2;         //0x3c,0x00

                
    byte[] cl = uintToBytes(ctLen);

                
    if(cl[0>= 0x1F)
                    MMSContent 
    = appendContent(new byte[] { 0x1F }, MMSContent);
                MMSContent 
    = appendContent(cl, MMSContent);
                MMSContent 
    = appendContent(new byte[] { 0xB3}, MMSContent);
                    
    //0xB3   Content-Type:application/vnd.wap.multipart.related
                
                MMSContent 
    = appendContent(new byte[] { 0x89 }, MMSContent);
                MMSContent 
    = appendContent(Encoding.ASCII.GetBytes("application/smil"), MMSContent);
                MMSContent 
    = appendContent(new byte[] { 0x0 }, MMSContent);

                MMSContent 
    = appendContent(new byte[] { 0x8A ,0x3C}, MMSContent);//0x8A:Start,0x3C:<
                MMSContent = appendContent(Encoding.ASCII.GetBytes( smilFile.Name ), MMSContent);
                MMSContent 
    = appendContent(new byte[] { 0x3E ,0x0 }, MMSContent); //0x3E:>





                
    byte[] byFileCount = new byte[1];
                byFileCount[
    0= (byte)inlineFiles.Count;
                MMSContent 
    = appendContent(byFileCount, MMSContent);

                
    int chLen = "application/smil".Length 
                
    + 4     //0x00 0xc0 0x22 0x3c: cid,",<
                + smilFile.Name.Length
                
    + 3     // 0x3E,0x00,0x8E
                + smilFile.Name.Length
                
    + 1;     // 0x00
                
                
    for (int j = 0; j < inlineFiles.Count; j++)
                {
                    MMSContent 
    = appendContent(GetFileContent(inlineFiles[j].ToString()), MMSContent);
                }
                
    return MMSContent;
            }


            
    //   打包文件
            private byte[] GetFileContent(string FileName)
            {

                
    byte[] byHeaders = new byte[0];       //   ContentType和Headers组合  
                byte[] byData = readFile(FileName);

                
    string FileID = getContentId(FileName);
                
    if (FileName.EndsWith(".txt"))
                {
                    byHeaders 
    = new byte[1];
                    byHeaders[
    0= (byte)(Encoding.ASCII.GetByteCount(FileID) + 5);
                    byHeaders 
    = appendContent(new byte[] { 0x830x85 }, byHeaders);       //   Utf-8  
                    byHeaders = appendContent(Encoding.ASCII.GetBytes(FileID), byHeaders);
                    byHeaders 
    = appendContent(new byte[] { 0x00 }, byHeaders);
                    byHeaders 
    = appendContent(new byte[] { 0x810xEA }, 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 
    = appendContent(new byte[] { 0x00 }, byHeaders);     
                }
                
    else if (FileName.EndsWith(".smil"))
                {
                    byHeaders 
    = Encoding.ASCII.GetBytes("application/smil");
                    byHeaders 
    = appendContent(new byte[] { 0x00 }, byHeaders);     
                }

                
    //加入Content-ID 
                byHeaders = appendContent(new byte[] { 0xC00x220x3C }, byHeaders);
                byHeaders 
    = appendContent(Encoding.ASCII.GetBytes(FileID), byHeaders);
                byHeaders 
    = appendContent(new byte[] { 0x3E0x00 }, byHeaders);
                
                
    //加入Content-Location  
                byHeaders = appendContent(new byte[] { 0x8E }, byHeaders);
                byHeaders 
    = appendContent(Encoding.ASCII.GetBytes(FileID), byHeaders);
                byHeaders 
    = appendContent(new byte[] { 0x00 }, byHeaders);

                
    byte[] byHeaderLen = uintToBytes(byHeaders.Length);
                
    byte[] byDataLen = uintToBytes(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[] uintToBytes(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[] readFile(string FileName)
            {
                
    if (FileName.EndsWith(".txt")) {

                    StreamReader sr 
    = null;
                    
    try{
                        sr 
    = new StreamReader(FileName, Encoding.Default);
                        
    string text = sr.ReadToEnd();
                        
    byte[] bf = Encoding.UTF8.GetBytes(text);
                        
    return bf;
                    }
                    
    catch {
                        
    return new byte[0];
                    }
                    
    finally {
                        
    if (sr != null) sr.Close();
                    }
                }
                FileStream fs 
    = null;
                
    try
                {
                    fs 
    = new FileStream(FileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None);     //   没有设定Buffsize  
                    byte[] bf = new byte[fs.Length];
                    fs.Read(bf, 
    0, (int)fs.Length);
                    
    return bf;
                }
                
    catch{
                    
    return new byte[0];
                }
                
    finally{
                    
    if(fs != null) fs.Close();
                }
            }
            
            
    private string getContentId(string FileName)
            {
                
    int at = FileName.LastIndexOf("\");
                
    if (at < 0)
                    at 
    = FileName.LastIndexOf("/");
                
    return FileName.Substring(at + 1);
            }
      
            
    private byte[] appendContent(byte[] srcBys, byte[] destBys)
            {
                Array.Resize(
    ref destBys, srcBys.Length + destBys.Length);
                Array.Copy(srcBys,
    0,destBys,destBys.Length - srcBys.Length,srcBys.Length);
                
    return destBys;
            }

            
    private byte[] appendContent(string sz, byte[] byDest)
            {
                
    return appendContent(Encoding.Default.GetBytes(sz), byDest);
            }
        }

        
    ///   <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("13810034500");         //   添加接收号码,调用一次添加一个接收号码  
                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
                {
                    
    byte[] byMM = mm.MakeMMSContent();
                    
    if (byMM.Length > 50 * 1024)
                        
    return "The package is too large!";
                    
    //   验证参数有效性  
                    
    //FileStream fs = new FileStream("d:/aaa.mms", FileMode.Create);
                    
    //fs.Write(byMM, 0, byMM.Length);
                    
    //fs.Close();
                    
    //return "OK";
                    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  
                    
                    hReq.ContentLength 
    = byMM.Length;
                    Stream sReq 
    = wReq.GetRequestStream();
                    sReq.Write(byMM, 
    0, byMM.Length);
                    sReq.Close();
                    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();     //   发送结果  
                        sr.Close();
                        
    return szResult;
                    }
                }
                
    catch (Exception e)
                {
                    
    throw new Exception(e.Message);
                }
                
    return string.Empty;
            }
        }
    }

     

     

    发表于 @ 2007年06月29日 15:00:00|评论(loading...)|编辑

    新一篇: GSM MODEM发PUSH/MMS 的具体实现. | 旧一篇: 做了一个java5.0/6.0的反编译工具.随意试用吧.

    评论

    #hellobaobao 发表于2007-07-18 12:03:03  IP: 218.5.2.*
    你好非常感谢你提供了这篇文章。我有两个问题:
    /* 避免协议冲突的设置
    <configuration>
    <system.net>
    <settings>
    <httpWebRequest useUnsafeHeaderParsing="true"/>
    </settings>
    </system.net>
    </configuration>
    */
    1:我在调试的时候编译器提示我协议冲突,请问我该怎么设置。上面你提供的注释在winform 下要怎么设置。
    2:
    mm.AddFile("d:\\mmstest\\1.smil");
    mm.AddFile("d:\\mmstest\\1.jpg");
    mm.AddFile("d:\\mmspackage\\1.txt");
    mm.AddFile("d:\\mmspackage\\1.gif");
    mm.AddFile("d:\\mmspackage\\1.mid");
    这里的smil文件需要事先写好吗如下所示:
    < smil>
    < head>
    < /head>
    < body>
    < Image src="1.jpg" />
    ...
    < /body>
    < /smil>
    还是只要提供一个1.smil空的文件,具体的内容由程序自己写入。
    我是一个新手,再次感谢!
    #axman 发表于2007-07-18 14:16:10  IP: 210.82.61.*
    对于应用程序应该和应用程序同名的config,如aaa.exe的config应该是aaa.exe.config,web应用中请在web.config中设置.也可以直接编程访问,具体请参看.NET的相关内容.

    对于smil文件当然要你自己先编排好啊.否则怎么知道你要如何布局呢?你可以使用一些可视化的编辑器编辑好后提供进来.
    #hellobaobao 发表于2007-07-18 20:05:39  IP: 116.217.46.*
    你好谢谢你的回答,关于第二问题我明白了。第一个问题我还是不太明白。我在工程里加入这个config 文件,但是我的程序要在那里读取这个设置呢!不然我想单单添加这config文件对于程序来说没有什么意义。
    我下面还有两个问题:
    1:你提供的段代码其中有一个打包的模块:你提供了gif、txt、mid、smil格式的打包方法。我想问下jpg格式的打包是如何实现。或者你告诉我你的打包方法是遵守什么协议、规则。
    2:你这个demo提供的是“支持smil文件的mms pdu 打包方式”,我如果只是单纯的想把一个mms文件通过GPRS Modern
    我该如何操作。
    谢谢!新手问题比较多!呵呵
    顺便问下为什么我发表评论老是提示校验码错误!我确定我正确输入了
    #scrow 发表于2007-07-19 14:46:05  IP: 60.25.4.*
    以前我也是,现在去掉验证码了,可以直接输入了^V^
    #hellobaobao 发表于2007-07-19 14:48:06  IP: 218.5.2.*
    你好我上面提的问题能帮我解释下吗?我今天一个早上都在等你的回复!谢谢
    #axman 发表于2007-07-19 14:52:23  IP: 210.82.61.*
    1.jpg打包把9D改成9E,png是A0.
    2.单独的MMS你只要把byte[] byMM = mm.MakeMMSContent();改成读文件到byte[]中就行了,这个也好问啊.
    3.那不是我的事,问论坛的开发者
    #hellobaobao 发表于2007-07-19 15:17:32  IP: 218.5.2.*
    多谢axman的回答!我是初学者没有经验多多指教
    #hellobaobao 发表于2007-07-20 10:43:34  IP: 218.5.2.*
    axman你好如果我要支持更多格式的资源文件的打包,我该怎么做他有没有一个标准或者规则,就像你教我的jpg是0X9E、png是0XA0.谢谢
    #axman 发表于2007-07-20 10:48:52  IP: 210.82.61.*
    当然有文档,不过很难找到,目前我不能给你,只能你需要什么格式我告诉你如何打包.
    #hellobaobao 发表于2007-07-20 12:37:26  IP: 218.5.2.*
    还有一个就是bmp格式,其他暂时不需要。谢谢!
    #axman 发表于2007-07-20 13:23:18  IP: 210.82.61.*
    bmp应该是不支持的,手机应该是wbmp,PUD代码是A1.如果要打bmp,只能象下面的mid和smil那样指定ContentType.
    #hellobaobao 发表于2007-07-20 14:09:23  IP: 218.5.2.*
    行谢谢!
    #hellobaobao 发表于2007-07-22 13:46:36  IP: 116.217.58.*
    axman我想问你一个彩信的标题最多支持多少个汉字。
    #hellobaobao 发表于2007-07-23 11:42:02  IP: 218.5.2.*
    这个问题我已经解决了,我把txt文件保存为utf-8编码就行了
    #hellobaobao 发表于2007-07-23 14:49:58  IP: 218.5.2.*
    我突然发现我的评论少了好多条记录
    #herosky 发表于2007-07-24 15:44:01  IP: 116.24.89.*
    好人,我亲死你了,正是我想找的
    #hellobaobao 发表于2007-08-01 15:34:40  IP: 218.5.2.*
    to axman
    我想问下我把数据库里的Image字段的数据取出来,发送后手机 提示不可识别的媒体格式,我该怎么做。下面是我的修改后的代码:
    SqlConnection con = new SqlConnection(GPRSXml.ConStr);
    string ImageID = ImgID;
    string sqlstr = "SELECT FileData FROM CarPhoto where id=" + ImageID;
    SqlCommand Com = new SqlCommand(sqlstr, con);
    con.Open();
    SqlDataReader dr = Com.ExecuteReader();
    if (dr.Read())
    {
    byte[] bImgData = (byte[])dr["FileData"];
    string imgfilename = "img.jpg";
    byMms = AppendOct(GetMmsPicContent(imgfilename, bImgData), byMms);
    }

    con.Close();
    return byMms;


    private byte[] GetMmsPicContent(string FileName, byte[] FileData)
    {
    // 每一个Multipart Entry由5个部分组成
    /* HeadersLen
    * DataLen
    * ContentType
    * Headers
    * Data
    * */
    byte[] byHeaders = new byte[0]; // ContentType和Headers组合
    byte[] byData = FileData;
    string FileID = FileName;
    //说明是JPG格式
    byHeaders = new byte[] { 0x9E };
    // 加入Content-ID和Content-Location
    byHeaders = AppendOct(new byte[] { 0xC0, 0x22, 0x3C }, byHeaders);
    byHeaders = AppendOct(Encoding.ASCII.GetBy
    #hellobaobao 发表于2007-08-01 15:38:03  IP: 218.5.2.*
    接上
    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;
    #axman 发表于2007-08-01 15:49:25  IP: 210.82.61.*
    这还不简单,你把byte[] bImgData写到文件中,命名为aaa.jpg,然后看是否能打开,如果打开能打开那就一定能发送.
    #hellobaobao 发表于2007-08-01 15:51:49  IP: 218.5.2.*
    图片可以正确的显示在网页上,但是就是无法发送。
    #axman 发表于2007-08-01 16:01:33  IP: 210.82.61.*
    那就是文件不是JPG的,却被命名为JPG,在PC上你把gif命令为jpg它也能正确地显示,在手机上就不行了.要不你把文件传到哪我下来看看
    #hellobaobao 发表于2007-08-01 16:23:07  IP: 218.5.2.*
    当我把数据库的image字段数据写到本地文件中aaa.jpg,然后再从文件夹中把aaa.jpg发送出去就可以了。
    if (dr.Read())
    {
    byte[] bImgData = (byte[])dr["FileData"];
    FileStream fs = new FileStream("e:\\aaa.jpg", FileMode.Create, FileAccess.ReadWrite);
    fs.Write(bImgData, 0, bImgData.Length);
    fs.Close();
    byMms = AppendOct(GetMmsContent("e:\\aaa.jpg"), byMms);
    }
    感觉来回转换效率实在是低,暂时只能这么凑合。
    #axman 发表于2007-08-01 18:08:28  IP: 210.82.61.*
    那就奇怪了,你应该写到文件的再读回头,然后把每个byte值打印出来和直接从数据库中读取的byte[]中的每个byte比较,肯定不一样.
    #hellobaobao 发表于2007-08-01 23:07:54  IP: 116.217.66.*
    to axman
    你讲的有道理明天我试下看看。谢谢
    #hellobaobao 发表于2007-08-01 23:25:14  IP: 116.217.66.*
    “那就是文件不是JPG的,却被命名为JPG,在PC上你把gif命令为jpg它也能正确地显示,在手机上就不行了.要不你把文件传到哪我下来看看”
    这个问题我也不好回答,因为我只是直接从数据库里读出相应编号的图片字段里的信息,这个图片字段数据是由别人填充进去的。他告诉我说是jpg格式的。
    #hellobaobao 发表于2007-08-02 09:59:33  IP: 218.5.2.*
    to axman
    我截取部分的数据给你看
    这是程序读取本地jpg文件生成的部分编码:
    [0x00000000] 0xff byte
    [0x00000001] 0xd8 byte
    [0x00000002] 0xff byte
    [0x00000003] 0xdb byte
    [0x00000004] 0x00 byte
    [0x00000005] 0x84 byte
    [0x00000006] 0x00 byte
    [0x00000007] 0x10 byte
    [0x00000008] 0x0b byte
    [0x00000009] 0x0c byte
    这是数据库里保存的数据中的部分。
    0xFFD8FFDB008400100B0C
    确实不一样

    #karalf 发表于2007-10-24 12:21:01  IP: 221.137.240.*
    to axman
    可以请教几个问题吗
    为什么我发mms时,只要信息大小1.4k,就会发生“基础连接已经关闭,接收时发生意外”或“基础连接已经关闭,连接被意外中断”的错误。
    #axman 发表于2007-10-24 13:31:51  IP: 61.135.207.*
    这应该和你的卡的GPRS连结的质量有关吧.另外看看手机的连结设置中是否有超时设置.
    #karalf 发表于2007-10-25 16:00:28  IP: 221.137.240.*
    to axman
    多谢赐教。真没想到你能这么快就回应我了。
    我没有用手机,而是直接用sim300模组发的。之前可以发送10k以内的信息,重装了一下系统就只能发1.4k以内的信息了。真是郁闷啊,您说会不会是操作系统有问题呢?还是GRPS没有设置好?
    #axman 发表于2007-10-25 16:10:03  IP: 61.135.207.*
    如果是重装了系统,看看通讯协议是否正常,比如生成一个MMS文件,然后用java写个发送程序发出去看看.

    因为.NET平台和中国移动的UNIX平台通讯非常有可能产生协议冲突,比如换行符不同,是否允许高节字等.另外写个程序通过GPRS通道去下一个梦网上的大的内容比如3GP文件看看是否可以.
    #karalf 发表于2007-10-25 16:19:19  IP: 221.137.240.*
    好的,谢谢指教。但是“写个程序通过GPRS通道去下一个梦网上的大的内容比如3GP文件”具体要怎么做呢?我是不是很烦,我是菜鸟啦,请多包涵。
    #karalf 发表于2007-10-26 09:25:03  IP: 221.137.246.*
    to axman
    再请教个问题,用java写mms程序,对jdk的版本有限制吗,1.6版本可以用吗?
    #runnercn 发表于2007-11-20 11:16:22  IP: 211.137.96.*
    好东西啊,但是我发过去,手机打不开收到的文件,博主可以指教一下吗 ?
    #xiongzhaowei 发表于2007-12-30 18:51:28  IP: 116.24.166.*
    的确是好东西呀,楼主问下这样发出来的程序如何接收?比如在两个手机之间发送文件,就可以通过彩信来发送呀。
    #axman 发表于2007-12-31 10:51:33  IP: 123.115.12.*
    标准的MMS,收到打不开和如何接收,那是你的手机是否支持MMS和是否开通GPRS的问题.别人都能访问google页在.你的浏览器打不开或访问不到肯定是你的通讯链路或浏览器本身有问题.
    #xiongzhaowei 发表于2008-01-09 12:02:15  IP: 121.34.149.*
    我是说如何用程序绕过系统自己接收彩信,然后把彩信的内容拆开并执行相应的操作,如果我们把短信看成是命令的话,彩信就是一个带“附件”的命令,我们可以从smil文件的名字上判断命令的类型,TXT文件内容判断命令参数,其它的作为资源,比如我做一个软件,通过彩信自动更新,收彩信是