⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mms.cpp

📁 详细介绍MMS发送过程中的文件转换
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        {
            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|评论(38)|编辑
 
Flex基本语法
命名规范、标量属性等  
31 个Flex APIs,类库,组件等
都是英文的,比较考验英语水平 评论
#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文件内容判断命令参数,其它的作为资源,比如我做一个软件,通过彩信自动更新,收彩信是免费的,因此我只要在有限的范围内群发一条彩信就可以了。问题是如何让程序主动的去接收而不是等待系统送上门由用户自己更新。#weiquanqiang 发表于2008-07-16 11:11:59  IP: 58.223.172.*
请问楼主我用GPRS模块拨号上去以后可以浏览网页,但我在用程序发送彩信时候总是提示“无法连接到到远程服务器”,这是什么原因呀????#axman 发表于2008-07-17 09:02:42  IP: 61.135.207.*
GPRS模块拨号上去以后可以浏览网页,说明你用cmnet拔上去的,而MMS应该用cmwap拔号.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -