谁有做过SMGP的短消息接口API,用两个线程分别处理收、发 (300分)

  • 主题发起人 主题发起人 wwolf
  • 开始时间 开始时间
W

wwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
SMGP是电信的短信网关协议,谁有做过和电信网关收发短信的接口?
我手上有SMGP的协议,但没有接口,需要自已动手做:(

300分求助
 
偶做过SMGP的消息解析,跟踪,和SMPP比较相近。SMGP协议目前好像
还是处于保密状态,华为等厂商要参与SMGP应用的开发,必须和
电信局签订保密协议。做这类的开发人员太少了。
 
协议中有提到数据包,SMGP数据包分为包头和包体两部份。
两个部份的结构都有明确说明。可是,如果在程序中建立包?
在用SOCK发送的时候,又该如何做呢?
 
delphi里面用record结构声明,c++用struct。
发包就是写入缓冲区,然后send出去
 
可以用DELPHI给个小例子吗?
 
function IPSend(pBuf : pointer;
nSize : longint) : longint;
//封装在一个dll中的socket 发送函数.关键在于调用这个函数发送消息包
//以下是结构声明
type
DATA_MSG = record
Head: tagPureMTHead;
Data: array[0..MAX_MSG_DATA_LEN-1] of Byte;
end;

tagPureMTHead = record
nLen: DWORD;
nCmdID: DWORD;
nSenderID: DWORD;
nRecverID: DWORD;
nSequenceID: DWORD;
nStatus: DWORD;
end;

//一个线程中的函数
procedure TTCPSend.
Execute;
var
Buf : DATA_MSG;
MTBuf: MT_DATA_MSG;
SmsBuf: SMS_DATA_MSG;
DataLen : longint;
ErrorID : DWORD;
ReceiverID: DWORD;
sSendDirection: string;
begin
{ Place thread code here }
ThreadExitEvent.ResetEvent;
while (not self.Terminated)do
begin
//降低CPU占用率
//ThreadIsExitEvent.WaitFor(1);
//发送数据
DataLen := sizeof(DATA_MSG);
//没有数据
if not (MsgBufMng.WaitFor(m_SendID, 2000) = wrSignaled) then
Continue;
while MsgBufMng.GetMsgFromID(@Buf, DataLen, m_SendID)do
begin
DataLen := DATA_MSG((@Buf)^).HEAD.nLen;
//试添加
nCommandID := DATA_MSG((@Buf)^).HEAD.nCmdID;
nSequenceID := DATA_MSG((@Buf)^).HEAD.nSequenceID;
ReceiverID := DATA_MSG((@Buf)^).HEAD.nRecverID;
if loginType = ltMtServer then
begin
if ReceiverID = SENDER_ID_FROM_MT_SERVER then

//这里发送数据
ErrorID := IPSend(@Buf, DataLen) //发送数据
else
begin
DataLen := DataLen + sizeOf(tagPureSmsHead);
CopyMemory(@(MTBuf.MTHead), @(Buf.Head), SizeOf(Buf.Head));
MTBuf.MTHead.nLen := DataLen;

MTBuf.SmsHead.nLen := DataLen;
MTBuf.SmsHead.nCmdID := Buf.Head.nCmdID;
MTBuf.SmsHead.nStatus := Buf.Head.nStatus;
MTBuf.SmsHead.nSequenceID := Buf.Head.nSequenceID;
CopyMemory(@(MTBuf.Data), @(Buf.Data), SizeOf(Buf.Data));
ErrorID := IPSend(@MTBuf, DataLen);
//发送数据
end
{$else
}
ErrorID := IPSend(@Buf, DataLen);
//发送数据
{$endif}
end
else
if LoginType = ltSms then
begin
DataLen := DataLen - SizeOf(tagPureMTHead) + SizeOf(tagPureSmsHead);
SmsBuf.Head.nLen := DataLen;
SmsBuf.Head.nCmdID := Buf.Head.nCmdID;
SmsBuf.Head.nStatus := Buf.Head.nStatus;
SmsBuf.Head.nSequenceID := Buf.Head.nSequenceID;
CopyMemory(@(SmsBuf.Data), @(Buf.Data), SizeOf(Buf.Data));
ErrorID := IPSend(@SmsBuf, DataLen);
end;
//Synchronize(ShowSendState);
//发送失败,Socket断连,退出线程
if ErrorID <> 0 then
begin
ConnectError.SetEvent;
Break;
end
else
begin
if (nCommandID = CMD_MT_SHAKE_HAND) and not FTraceShakeHandSwitch then
else
begin
case LoginType of
ltMtServer:
begin
...
end;

ltSms:
begin
...
end;
end;
end;
end;
DataLen := sizeof(DATA_MSG);
//重要!恢复初始长度之用.
end;
//while 发送数据
end;
//while
ThreadExitEvent.SetEvent;
end;
 
to jimmyl:
我现在用DELPHI7,我想用INDY的Tidtcpclient来实现,不知道是否可以。
可以用QQ或是MSN和您交流一下吗?
 
只要遵循tcp协议的组件都可以用。上班用不了QQ,MSN。
 
可以给一段在阻塞模式下,用idtcpclient读数据的多线程编程的例子吗?
 
热情关注。
 
各位帮忙UP一下啦
 
搞定了。虽然没有直接得到帮助。不过得到了一些引导性的帮助。。谢谢
 
我是新手,正在学习这方面的东西,现在已有协议和端口,下一步我该如何做呢?
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部