📄 deliverunit.pas
字号:
end;
end;
function TDeliverForm.PackBadWord(Msg:String):String;
var
i :integer;
begin
for i:=0 to BadWordList.Count - 1 do
begin
Msg := StringReplace(Msg,BadWordList[i],'#',[rfReplaceAll]);
end;
Result := Msg;
end;
function TDeliverForm.ConnectToDB():boolean;
var
ini :TIniFile;
begin
try
ini := TIniFile.Create(self.GetIniConfigFile);
try
self.ADOConn.Close;
self.ADOConn.ConnectionString := ini.ReadString('Option','AdoConn','');
self.ADOConn.Open;
self.MainStatusBar.Panels.Items[0].Text := '数据库:已连接';
self.WriteInfo('数据库连接成功.');
//init DB StoredProc
Result := true;
except
self.MainStatusBar.Panels.Items[0].Text := '数据库:连接失败';
self.WriteInfo('数据库连接失败.');
Result := false;
end;
finally
FreeAndNil(Ini);
end;
end;
function TDeliverForm.GetIniConfigFile():String;
begin
Result := ExtractFilePath(Application.ExeName) + 'SGIP12.ini';
end;
procedure TDeliverForm.FormCreate(Sender: TObject);
begin
Application.Title := '杭州亚大通讯--联通发送通讯平台 V2.1 0119';
self.Caption := Application.Title;
self.LoadParameters;
F_Sequence_Number := 1;
BadWordList := TStringList.Create;
F_DeliverCount := 0 ;
F_ReportCount := 0 ;
end;
procedure TDeliverForm.Button_StartClick(Sender: TObject);
begin
if self.SGIPServerSocket.Active then
begin
self.CloseSocket;
end;
if self.ADOConn.Connected then self.ADOConn.Close;
self.InfoMemo.Clear;
if not self.ConnectToDB() then Abort;
if not self.OpenSocket() then Abort;
end;
procedure TDeliverForm.Button_ShutClick(Sender: TObject);
begin
if self.SGIPServerSocket.Active then
begin
self.CloseSocket;
self.MainStatusBar.Panels.Items[1].Text := '服务:未启动';
end;
self.ADOConn.Close;
end;
function TDeliverForm.ConvertMsgID(Msg_ID: PChar):string;
var
High4, Low4: Cardinal;
Month, Day, Hour, Minute, Second, GateWayID, SID: Word;
begin
CopyMemory(@High4, @Msg_ID[0], 4);
CopyMemory(@Low4, @Msg_ID[4], 4);
High4 := ntohl(High4);
Low4 := ntohl(Low4);
Month := (High4 shr 28) and $0F;
Day := (High4 shr 23) and $1F;
Hour := (High4 shr 18) and $1F;
Minute := (High4 shr 12) and $3F;
Second := (High4 shr 6) and $3F;
SID := Low4 and $FF;
GateWayID := (Low4 shr 16) and $FF + (((High4) and $3F) * 65536);
Result := Format('%.2d.%.2d.%.2d.%.2d.%.2d.%d.%d', [Month, Day, Hour, Minute,
Second, GateWayID, SID]);
end;
procedure TDeliverForm.SpeedButton3Click(Sender: TObject);
begin
WinExec(PChar('notepad.exe ' + self.GetIniConfigFile),SW_SHOW);
end;
procedure TDeliverForm.InfoMemoChange(Sender: TObject);
begin
if self.InfoMemo.Lines.Count > F_ClearInfoLineCount then
begin
self.InfoMemo.Clear;
end;
end;
procedure TDeliverForm.ADOConnAfterConnect(Sender: TObject);
begin
self.MainStatusBar.Panels.Items[0].Text := '数据库:已连接';
self.MainStatusBar.Update;
end;
procedure TDeliverForm.ADOConnAfterDisconnect(Sender: TObject);
begin
self.MainStatusBar.Panels.Items[0].Text := '数据库:已断开';
self.MainStatusBar.Update;
end;
procedure TDeliverForm.ADOConnBeforeConnect(Sender: TObject);
begin
self.MainStatusBar.Panels.Items[0].Text := '数据库:正在连接,请稍候...';
self.MainStatusBar.Update;
end;
procedure TDeliverForm.ADOConnBeforeDisconnect(Sender: TObject);
begin
self.MainStatusBar.Panels.Items[0].Text := '数据库:正在断开,请稍候...';
self.MainStatusBar.Update;
end;
procedure TDeliverForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
self.Button_Shut.Click;
end;
procedure TDeliverForm.ApplicationEvents_XException(Sender: TObject;
E: Exception);
begin
if E Is ESocketError then
begin
ApplicationEvents_X.CancelDispatch;
end;
end;
procedure TDeliverForm.SGIPServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode := -1;
end;
procedure TDeliverForm.SGIPServerSocketListen(Sender: TObject;
Socket: TCustomWinSocket);
begin
self.MainStatusBar.Panels.Items[1].Text := '接收服务已启动...';
end;
procedure TDeliverForm.SGIPServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
self.MainStatusBar.Panels.Items[2].Text := '网关:' + Socket.RemoteAddress + ' 已连接';
end;
procedure TDeliverForm.SGIPServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
self.MainStatusBar.Panels.Items[2].Text := '网关:' + Socket.RemoteAddress + ' 已断开';
end;
procedure TDeliverForm.SGIPServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
SGIPHead : TSGIPHead;
SGIPBind_Resp : TSGIPBind_Resp;
SGIPUnBind_Resp : TSGIPUnBind_Resp;
Deliver : TDeliver;
DeliverHeaderSection : TDeliverHeaderSection;
SGIPDeliver_Resp : TSGIPDeliver_Resp;
Report : TReport;
SGIPReport_Resp : TSGIPReport_Resp;
StrInfo :String;
begin
try
FillChar(SGIPHead,SizeOf(TSGIPHead),0);
if Socket.ReceiveBuf(SGIPHead,SizeOf(SGIPHead)) <> SizeOf(SGIPHead) then
begin
Exit;
end;
except
On E: Exception do
begin
self.WriteInfo(E.Message);
end;
end;
try
case WinSock.ntohl(SGIPHead.CommandId) of
SGIP12_Protocol.SGIP_BIND :
begin
FillChar(SGIPBind_Resp,SizeOf(SGIPBind_Resp),0);
SGIPBind_Resp.Head.MessageLength := WinSock.htonl(SizeOf(SGIPBind_Resp));
SGIPBind_Resp.Head.CommandId := WinSock.htonl(SGIP12_Protocol.SGIP_BIND_RESP);
SGIPBind_Resp.Head.SNumber1 := SGIPHead.SNumber1;
SGIPBind_Resp.Head.SNumber2 := SGIPHead.SNumber2;
SGIPBind_Resp.Head.SNumber3 := SGIPHead.SNumber3;
SGIPBind_Resp.Bind_Resp.Result := 0;
if Socket.SendBuf(SGIPBind_Resp,SizeOf(SGIPBind_Resp)) = SizeOf(SGIPBind_Resp) then
begin
//self.WriteInfo('网关' + Socket.RemoteAddress + '登陆本地短信接收服务成功。');
;
end else
begin
self.WriteInfo('网关' + Socket.RemoteAddress + '登陆本地短信接收服务失败。');
end;
Exit;
end;
SGIP12_Protocol.SGIP_UNBIND :
begin
FillChar(SGIPUnBind_Resp,SizeOf(SGIPUnBind_Resp),0);
SGIPUnBind_Resp.Head.MessageLength := WinSock.htonl(SizeOf(SGIPUnBind_Resp));
SGIPUnBind_Resp.Head.CommandId := WinSock.htonl(SGIP12_Protocol.SGIP_UNBIND_RESP);
SGIPUnBind_Resp.Head.SNumber1 := SGIPHead.SNumber1;
SGIPUnBind_Resp.Head.SNumber2 := SGIPHead.SNumber2;
SGIPUnBind_Resp.Head.SNumber3 := SGIPHead.SNumber3;
if Socket.SendBuf(SGIPUnBind_Resp,SizeOf(SGIPUnBind_Resp)) = SizeOf(SGIPUnBind_Resp) then
begin
self.WriteInfo('网关' + Socket.RemoteAddress + '退出本地短信接收服务成功。');
;
end else
begin
self.WriteInfo('网关' + Socket.RemoteAddress + '退出本地短信接收服务失败。');
end;
Exit;
end;
SGIP12_Protocol.SGIP_DELIVER :
begin
FillChar(Deliver,SizeOf(Deliver),0);
FillChar(SGIPDeliver_Resp,SizeOf(SGIPDeliver_Resp),0);
FillChar(DeliverHeaderSection,Sizeof(DeliverHeaderSection),0);
//Socket.ReceiveBuf(Deliver,WinSock.htonl(SGIPHead.MessageLength) - SizeOf(SGIPHead));
Socket.ReceiveBuf(DeliverHeaderSection,SizeOf(DeliverHeaderSection));
Socket.ReceiveBuf(Deliver.MessageContent,WinSock.ntohl(DeliverHeaderSection.MessageLength));
Socket.ReceiveBuf(Deliver.Reserver,SizeOf(Deliver.Reserver));
StrPCopy(Deliver.UserNumber,DeliverHeaderSection.UserNumber);
StrPCopy(Deliver.SPNumber,DeliverHeaderSection.SPNumber);
Deliver.TP_pid := DeliverHeaderSection.TP_pid;
Deliver.TP_udhi := DeliverHeaderSection.TP_udhi;
Deliver.MessageCoding := DeliverHeaderSection.MessageCoding;
Deliver.MessageLength := DeliverHeaderSection.MessageLength;
SGIPDeliver_Resp.Head.MessageLength := WinSock.htonl(SizeOf(SGIPDeliver_Resp));
SGIPDeliver_Resp.Head.CommandId := WinSock.htonl(SGIP12_Protocol.SGIP_DELIVER_RESP);
SGIPDeliver_Resp.Head.SNumber1 := SGIPHead.SNumber1;
SGIPDeliver_Resp.Head.SNumber2 := SGIPHead.SNumber2;
SGIPDeliver_Resp.Head.SNumber3 := SGIPHead.SNumber3;
SGIPDeliver_Resp.Deliver_Resp.Result := 0;
Socket.SendBuf(SGIPDeliver_Resp,SizeOf(SGIPDeliver_Resp));
// self.WriteInfo('手机:' + String(Deliver.UserNumber)+'回包');
ReceiveThreadUnit.DeliverThread.Create(false,Deliver,self.ADOConn.ConnectionString);
StrInfo := '手机:' + String(Deliver.UserNumber) + ' ';
StrInfo := StrInfo + 'SP号:' + String(Deliver.SPNumber) + ' ';
StrInfo := StrInfo + '短信长{' + IntToStr(WinSock.ntohl(Deliver.MessageLength)) + '}';
self.WriteInfo(StrInfo);
F_DeliverCount := F_DeliverCount + 1;
self.MainStatusBar.Panels.Items[3].Text := '接收短信数 ' + IntToStr(F_DeliverCount) + ' 条';
end;
SGIP12_Protocol.SGIP_REPORT :
begin
FillChar(Report,SizeOf(Report),0);
FillChar(SGIPReport_Resp,SizeOf(SGIPReport_Resp),0);
Socket.ReceiveBuf(Report,WinSock.htonl(SGIPHead.MessageLength) - SizeOf(SGIPHead));
SGIPReport_Resp.Head.MessageLength := WinSock.htonl(SizeOf(SGIPReport_Resp));
SGIPReport_Resp.Head.CommandId := WinSock.htonl(SGIP12_Protocol.SGIP_REPORT_RESP);
SGIPReport_Resp.Head.SNumber1 := SGIPHead.SNumber1;
SGIPReport_Resp.Head.SNumber2 := SGIPHead.SNumber2;
SGIPReport_Resp.Head.SNumber3 := SGIPHead.SNumber3;
SGIPReport_Resp.Report_Resp.Result := 0;
Socket.SendBuf(SGIPReport_Resp,SizeOf(SGIPReport_Resp));
ReceiveThreadUnit.ReportThread.Create(false,Report,self.ADOConn.ConnectionString);
StrInfo := '手机:' + String(Report.UserNumber) + ',';
StrInfo := StrInfo + '状态:' + IntToStr(Report.State) + ',';
StrInfo := StrInfo + '错误:' + IntToStr(Report.ErrorCode) +',';
StrInfo := StrInfo + IntToStr(WinSock.ntohl(Report.SequenceNumber1)) + ',';
StrInfo := StrInfo + IntToStr(WinSock.ntohl(Report.SequenceNumber2)) + ',';
StrInfo := StrInfo + IntToStr(WinSock.ntohl(Report.SequenceNumber3)) + ' ';
self.WriteInfo(StrInfo);
F_ReportCount := F_ReportCount + 1;
self.MainStatusBar.Panels.Items[4].Text := '接收状态报告 ' + IntToStr(F_ReportCount) + ' 条';
end;
end;
except
On E : Exception do
begin
self.WriteInfo(E.Message);
end;
end;
end;
procedure TDeliverForm.SpeedButton4Click(Sender: TObject);
begin
Application.MessageBox('杭州亚大通讯--联通发送通讯平台 V2.1 0119', PChar(Application.Title), MB_OK+MB_ICONASTERISK+MB_DEFBUTTON1+MB_APPLMODAL);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -