开放 mm1接口发送彩信(也就是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;
}
}
}
问题点数: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





