.Net/C# 实现 中国移动 CMPP v3.0 ISMG SP 收发短信的 SP 客户端 (第2版) (CMPP SP Client)
/*
.Net/C# 实现 中国移动 CMPP v3.0 ISMG <-> SP 收发短信的 SP 客户端 (第2版)(CMPP SP Client)
增加了 CMPP Client 类
本程序严格按
《中国移动通信企业标准》之《中国移动通信互联网短信网关接口协议(China Mobile Point to Point)》(版本号: 3.0.0)
即: CMPP v3.0.0
http://www.spzone.net/protocol/CMPPV3.0.rar
文档,实现了下面消息的定义及其相关协议级交互:
8.4 业务提供商 (SP) 与互联网短信网关 (ISMG) 间的消息定义 8
8.4.1 SP 请求连接到 ISMG(CMPP_CONNECT) 操作 8
8.4.1.1 CMPP_CONNECT 消息定义 (SP -> ISMG) 8
8.4.1.2 CMPP_CONNECT_RESP消息定义 (ISMG -> SP) 9
8.4.2 SP 或 ISMG 请求拆除连接 (CMPP_TERMINATE)操作 9
8.4.2.1 CMPP_TERMINATE 消息定义 (SP -> ISMG 或 ISMG -> SP) 9
8.4.2.2 CMPP_TERMINATE_RESP 消息定义 (SP -> ISMG 或 ISMG -> SP) 10
8.4.3 SP 向 ISMG提交短信 (CMPP_SUBMIT) 操作 10
8.4.3.1 CMPP_SUBMIT 消息定义 (SP -> ISMG) 10
8.4.3.2 CMPP_SUBMIT_RESP 消息定义 (ISMG -> SP) 11
8.4.5 ISMG 向 SP 送交短信 (CMPP_DELIVER) 操作 13
8.4.5.1 CMPP_DELIVER 消息定义 (ISMG -> SP) 13
8.4.5.2 CMPP_DELIVER_RESP 消息定义 (SP -> ISMG) 16
8.4.7 链路检测 (CMPP_ACTIVE_TEST) 操作 17
8.4.7.1 CMPP_ACTIVE_TEST定义 (SP -> ISMG 或 ISMG <- SP) 17
8.4.7.2 CMPP_ACTIVE_TEST_RESP定义 (SP -> ISMG 或 ISMG <- SP) 17
可采用《中国移动通信 CMPP v3.0 短消息网关模拟器 v1.10》进行测试:
下载于: 《北京风起水流软件工作室》
http://www.zealware.com/download/cmpp3smg.rar
本程序以熟悉理解 CMPP 3.0 协议为主要目的,只将 "消息定义" 对象化,其相关协议级交互并未作更深层次的 OO!
也暂无任何错误处理程序!
消息定义的所有字段名称及其数据类型均与上述之 CMPP v3.0.0 文档完全一致!
其间参阅过 shanhe@CSDN or yexiong@cnBlogs 大作(在此鸣谢):
http://blog.csdn.net/shanhe/archive/2004/07/19/45383.aspx
http://cnblogs.com/yexiong/articles/115330.aspx
但其中有些消息定义字节错位,因此不能正常交互?!且对象化层次较高,不利于理解协议本身!
遂自己动手,丰衣足食,实现部分主要协议(SP 收发短信):
playyuer㊣Microshaoft.com Invent.
*/
namespace Microshaoft
{
using System;
using System.Net.Sockets;
public class Util
{
//private static object _SyncLockObject = new object();
public static string Get_MMDDHHMMSS_String(DateTime dt)
{
return DateTime.Now.ToString("MMddhhmmss");
}
public static string Get_YYYYMMDD_String(DateTime dt)
{
return DateTime.Now.ToString("yyyyMMdd");
}
internal static void WriteToStream(byte[] bytes, NetworkStream Stream)
{
if (Stream.CanWrite)
{
//lock (_SyncLockObject)
{
Stream.Write(bytes, 0, bytes.Length);
}
}
}
internal static byte[] ReadFromStream(int Length, NetworkStream Stream)
{
byte[] bytes = null;
if (Stream.CanRead)
{
if (Stream.DataAvailable)
{
bytes = new byte[Length];
int r = 0;
int l = 0;
//lock (_SyncLockObject)
{
while (l < Length)
{
r = Stream.Read(bytes, l, Length - l);
l += r;
}
}
}
}
return bytes;
}
}
}
//CMPP 消息定义
namespace Microshaoft.CMPP.Messages
{
using System;
using System.Text;
using System.Security.Cryptography;
public enum CMPP_Command_Id : uint
{
CMPP_CONNECT = 0x00000001 //请求连接
, CMPP_CONNECT_RESP = 0x80000001 //请求连接应答
, CMPP_TERMINATE = 0x00000002 //终止连接
, CMPP_TERMINATE_RESP = 0x80000002 //终止连接应答
, CMPP_SUBMIT = 0x00000004 //提交短信
, CMPP_SUBMIT_RESP = 0x80000004 //提交短信应答
, CMPP_DELIVER = 0x00000005 //短信下发
, CMPP_DELIVER_RESP = 0x80000005 //下发短信应答
, CMPP_QUERY = 0x00000006 //发送短信状态查询
, CMPP_QUERY_RESP = 0x80000006 //发送短信状态查询应答
, CMPP_CANCEL = 0x00000007 //删除短信
, CMPP_CANCEL_RESP = 0x80000007 //删除短信应答
, CMPP_ACTIVE_TEST = 0x00000008 //激活测试
, CMPP_ACTIVE_TEST_RESP = 0x80000008 //激活测试应答
, CMPP_FWD = 0x00000009 //消息前转
, CMPP_FWD_RESP = 0x80000009 //消息前转应答
, CMPP_MT_ROUTE = 0x00000010 //MT路由请求
, CMPP_MT_ROUTE_RESP = 0x80000010 //MT路由请求应答
, CMPP_MO_ROUTE = 0x00000011 //MO路由请求
, CMPP_MO_ROUTE_RESP = 0x80000011 //MO路由请求应答
, CMPP_GET_MT_ROUTE = 0x00000012 //获取MT路由请求
, CMPP_GET_MT_ROUTE_RESP = 0x80000012 //获取MT路由请求应答
, CMPP_MT_ROUTE_UPDATE = 0x00000013 //MT路由更新
, CMPP_MT_ROUTE_UPDATE_RESP = 0x80000013 //MT路由更新应答
, CMPP_MO_ROUTE_UPDATE = 0x00000014 //MO路由更新
, CMPP_MO_ROUTE_UPDATE_RESP = 0x80000014 //MO路由更新应答
, CMPP_PUSH_MT_ROUTE_UPDATE = 0x00000015 //MT路由更新
, CMPP_PUSH_MT_ROUTE_UPDATE_RESP = 0x80000015 //MT路由更新应答
, CMPP_PUSH_MO_ROUTE_UPDATE = 0x00000016 //MO路由更新
, CMPP_PUSH_MO_ROUTE_UPDATE_RESP = 0x80000016 //MO路由更新应答
, CMPP_GET_MO_ROUTE = 0x00000017 //获取MO路由请求
, CMPP_GET_MO_ROUTE_RESP = 0x80000017 //获取MO路由请求应答
}
public class MessageHeader //消息头
{
public const int Length = 4 + 4 + 4;
public CMPP_Command_Id Command_Id
{
get
{
return this._Command_Id;
}
}
public uint Sequence_Id
{
get
{
return this._Sequence_Id;
}
}
public uint Total_Length
{
get
{
return this._Total_Length;
}
}
private uint _Total_Length; // 4 Unsigned Integer 消息总长度(含消息头及消息体)
private CMPP_Command_Id _Command_Id; // 4 Unsigned Integer 命令或响应类型
private uint _Sequence_Id; // 4 Unsig
- 1
- 2
- 3
- 4
- 5
前往页