📄 remotecfg.pas
字号:
unit remotecfg;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, SUIButton, jpeg, Menus,
Mask, DataCenterXControl_TLB;
const
CMD_REMOTECFG=$10;
CMD_WORKMODE=$30;
CMD_APN=$31;
CMD_APNUSERNAME=$32;
CMD_APNPWD=$33;
CMD_BAUDRATE=$34;
CMD_DNSIP=$35;
CMD_RESET=$69;
CMD_CENTER1DN=$36;
CMD_CENTER2DN=$37;
CMD_CENTER3DN=$38;
CMD_CENTER1IP=$39;
CMD_CENTER2IP=$3A;
CMD_CENTER3IP=$3B;
CMD_SOCKETTYPE=$3C;
CMD_BEATTIME=$3D;
CMD_DTUID=$3E;
CMD_DTUPHNO=$3F;
CMD_LOGINPWD=$40;
CMD_KEYCHR=$41;
CMD_KEYTIME=$42;
CMD_LOCALPORT=$43;
CMD_CENTERPORT=$44;
CMD_SETDEFAULT=$4E;
CMD_GETPARAM=$4F;
//--------super param
CMD_ATMONTIME=$50;
CMD_ATLOSSMAXCOUNT=$51;
CMD_ATMAXWAIT=$52;
CMD_GSMLOSSMAXCOUNT=$53;
CMD_GPRSMONTIME=$54;
CMD_GPRSLOSSMAXCOUNT=$55;
CMD_GPRSMAXWAIT=$56;
CMD_CENTERLOSSMAXCOUNT=$57;
CMD_BEATMAXWAIT=$58;
CMD_LOGINMAXWAIT=$59;
CMD_LOGINFAILMAXCOUNT=$5A;
CMD_TCPWINSIZE=$5B;
CMD_TCPOVT_RESENDBEGINTIME=$5C;
CMD_TCPOVT_RESENDCOUNT=$5D;
CMD_DNSMAXWAIT=$5E;
CMD_DNSFAILMAXCOUNT=$5F;
{
CMD_MODULELOSETIME=$52;
CMD_GSMLOSETIME=$53;
CMD_GPRSLOSETIME=$54;
}
//---------dtu up-------------
CMD_REPLYCONFIG=$A0;
CMD_REPLYSTATUS=$A1;
CMD_REPLYDATA=$A2;
CMD_OK=$F0;
CMD_ERROR=$F1;
//-------------------------------
//---------control mode cmds-----
CMD_CTRL_CREATESOCKET=$60;
CMD_CTRL_CONNECT=$61;
CMD_CTRL_SENDDATA=$62;
CMD_CTRL_READDATA=$63;
CMD_CTRL_DISCONNECT=$64;
CMD_CTRL_CLOSESOCKET=$65;
CMD_CTRL_GETSTATUS=$66;
CMD_CTRL_SETSTATUS=$67;
//-------------------------------
CMD_ENTERTRANSMODE=$6A;
CMD_ENTERATMODE=$6B;
//--------------------------------
FRAME_HEAD1=$AA;
FRAME_HEAD2=$55;
type
TfrmRemoteCfg = class;
TDTUCOM=class(tobject)
public
dtuid:string;
dataocx:tdatacenterx;
remotetype:integer;
procedure sendstring(s:string);
function readstring(var s:string):boolean;
//procedure OnData(sender:tobject; const Received: DWORD );
end;
TLineGet=class(TObject)
private
Buf:string;
public
procedure Init;
procedure ProcChar(C:Char);
procedure SendLine;
end;
TfrmRemoteCfg = class(TForm)
Timer1: TTimer;
StatusBar1: TStatusBar;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
MODEM1: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
MODEM2: TMenuItem;
panel3: TPanel;
Memo1: TMemo;
MaskEdit3: TMaskEdit;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
Panel1: TPanel;
GLabel: TLabel;
GComboBox: TComboBox;
suiButton2: TsuiButton;
GEdit: TEdit;
Panel2: TPanel;
ListView1: TListView;
GroupBox1: TGroupBox;
lbDTUInfo: TLabel;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure suiButton1Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure ListView1Change(Sender: TObject; Item: TListItem;
Change: TItemChange);
procedure FormActivate(Sender: TObject);
procedure suiButton2Click(Sender: TObject);
procedure ListView1DblClick(Sender: TObject);
procedure GComboBoxKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure GComboBoxKeyPress(Sender: TObject; var Key: Char);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure GEditKeyPress(Sender: TObject; var Key: Char);
procedure N6Click(Sender: TObject);
procedure ComboBox1KeyPress(Sender: TObject; var Key: Char);
procedure ComboBox2KeyPress(Sender: TObject; var Key: Char);
procedure ComboBox3KeyPress(Sender: TObject; var Key: Char);
procedure Memo1KeyPress(Sender: TObject; var Key: Char);
procedure MaskEdit3KeyPress(Sender: TObject; var Key: Char);
procedure Edit3KeyPress(Sender: TObject; var Key: Char);
procedure Edit4KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
xmodem1:tdtucom;
end;
var
G_SuperFlag:boolean;
G_SndCnt:integer;
G_RecvCnt:integer;
G_WorkMode:byte;
// G_KEYCHR:byte;
G_KEYCHR:string;
G_TMData:string; //透明模式数据缓冲区
LineGet:tlineget;
GEditMask:string;
frmRemoteCfg: TfrmRemoteCfg;
function TextToHexStr(s:string):string;
implementation
uses main;
{$R *.dfm}
function HexToStr(i:integer):string;
var tmp:string;
begin
tmp:='0123456789ABCDEF ';
result:=tmp[(i div 16)+1]+tmp[(i mod 16)+1];
end;
function TextToHexStr(s:string):string;
var i:integer;
ss:string;
begin
ss:='';
for i:=1 to length(s) do
begin
ss:=ss+hextostr(ord(s[i]))+' ';
end;
result:=ss;
end;
function strtohex(s:string):integer;
var tmp:string;
i,j,a,b:integer;
begin
if s='' then
begin
result:=0;
exit;
end;
a:=0;
tmp:='0123456789ABCDEF ';
for j:=1 to length(s) do
begin
if s[j]=' ' then s[j]:='0';
i:=1;
while i<=16 do
begin
if tmp[i]=s[j] then
begin
b:=i-1;
break;
end;
i:=i+1;
end;
a:=a*16+b;
end;
result:=a;
end;
function BuildDataPacket(Cmd:BYTE;Data:STRING):string;
var LEN:INTEGER;
ACC:WORD;
S,tip:STRING;
i:integer;
begin
{ //len本身变成2字节。
LEN:=LENGTH(DATA)+3;
s:=chr(FRAME_HEAD1)+chr(FRAME_HEAD2)+CHR(LEN div 256)+CHR(LEN mod 256)+CHR(CMD)+DATA;
ACC:=0;
FOR I:=3 TO LENGTH(S) DO
BEGIN
ACC:=ACC+ord(S[I]);
END;
S:=S+chr(ACC div 256)+chr(ACC mod 256);
tip:='';
for i:=1 to length(s) do
begin
tip:=tip+hextostr(ord(s[i]))+' ';
end;
frmremotecfg.memo1.lines.add('下行:'+tip);
RESULT:=S;
}
s:=chr(cmd)+data;
tip:='';
for i:=1 to length(s) do
begin
tip:=tip+hextostr(ord(s[i]))+' ';
end;
frmremotecfg.memo1.lines.add('下行:'+tip);
RESULT:=S;
end;
function WaitComData(wtime:integer):string;
var i:integer;
ss,s,tip:string;
begin
s:='';ss:='';
frmremotecfg.timer1.Enabled:=false; //禁止时钟读取串口数据
for i:=1 to (wtime div 100) do
begin
if frmremotecfg.XModem1.ReadString(s) then
begin
if s<>'' then break;
end;
sleep(100);
application.processmessages;
end;
ss:=s;
for i:=1 to (wtime div 100) do
begin
sleep(100);
if frmremotecfg.XModem1.ReadString(s) then
begin
ss:=ss+s;
end
else break;
application.processmessages;
end;
s:=ss;
//显示
if s<>'' then
begin
tip:='';
for i:=1 to length(s) do
begin
tip:=tip+hextostr(ord(s[i]))+' ';
end;
frmremotecfg.memo1.lines.add('上行:'+tip);
end;
frmremotecfg.timer1.Enabled:=true; //允许时钟读取串口数据
result:=s;
end;
function waitreply:integer;
var s:string;
i,r:integer;
head,data:string;
cmd:byte;
acc:word;
begin
s:=waitcomdata(4000*8);
if s='' then
begin
result:=-2;
exit;
end;
{
if ((s[1]<>chr(FRAME_HEAD1)) or (s[2]<>chr(FRAME_HEAD2))) then
begin
result:=-3;//非法的返回
exit;
end;
ACC:=0;
for I:=3 to LENGTH(S)-2 do
BEGIN
ACC:=ACC+ord(S[I]);
END;
if acc<>ord(s[6])*256+ord(s[7]) then
begin
result:=-4; //校验错误
exit;
end;
if length(s)=7 then
begin
if s[5]=chr(CMD_OK) then r:=0; //ok
if s[5]=chr(CMD_ERROR) then r:=-1; //error
end
else r:=-2; //timeout
}
if length(s)=1 then
begin
if s[1]=chr(CMD_OK) then r:=0; //ok
if s[1]=chr(CMD_ERROR) then r:=-1; //error
end
else r:=-2; //timeout
result:=r;
end;
function wait_status:integer;
var s:string;
i,r:integer;
head,data:string;
cmd:byte;
acc:word;
begin
s:=waitcomdata(4000*8);
if s='' then
begin
result:=-2;
exit;
end;
{
if ((s[1]<>chr(FRAME_HEAD1)) or (s[2]<>chr(FRAME_HEAD2))) then
begin
result:=-3;//非法的返回
exit;
end;
if s[5]<>chr(CMD_REPLYSTATUS) then
begin
frmremotecfg.StatusBar1.Panels[3].Text:='[状态读取失败,返回数据包命令字非法!]';
frmremotecfg.memo1.Lines.add(frmremotecfg.StatusBar1.Panels[3].Text);
exit;
end;
ACC:=0;
for I:=3 to LENGTH(S)-2 do
BEGIN
ACC:=ACC+ord(S[I]);
END;
if acc<>ord(s[7])*256+ord(s[8]) then
begin
result:=-4; //校验错误
exit;
end;
if length(s)=8 then
begin
r:=ord(s[6]);
end
else r:=-2; //timeout
}
if length(s)=2 then
begin
r:=ord(s[2]);
end
else r:=-2;
result:=r;
end;
//-透明模式-comunication funcitons-------------------
procedure SendText(s:string);
begin
frmremotecfg.xmodem1.SendString(s);
end;
//-------------------------------------------
//-控制模式
function CreateSocket(Protocol:integer;LPORT:integer;RPORT:integer;RIP:string):integer;
begin
frmremotecfg.xmodem1.SendString(BuildDataPacket(CMD_CTRL_CREATESOCKET,
chr(protocol)+
chr(LPort div 256)+chr(LPort mod 256)+
chr(RPort div 256)+chr(RPort mod 256)+RIP
));
result:=waitreply;
end;
function Connect(socket:integer):integer;
begin
frmremotecfg.xmodem1.SendString(BuildDataPacket(CMD_CTRL_CONNECT,chr(socket div 256)+chr(socket mod 256)));
result:=waitreply;
end;
function SendData(socket:integer;Data:string):integer;
var r:integer;
begin
frmremotecfg.xmodem1.SendString(BuildDataPacket(CMD_CTRL_SENDDATA,chr(socket div 256)+chr(socket mod 256)+data));
r:=waitreply;
if r=0 then frmremotecfg.StatusBar1.Panels[3].Text:='[数据发送成功]';
if r=-1 then frmremotecfg.StatusBar1.Panels[3].Text:='[数据发送失败]';
if r=-2 then frmremotecfg.StatusBar1.Panels[3].Text:='[数据发送失败,设备无响应!]';
if r=-3 then frmremotecfg.StatusBar1.Panels[3].Text:='[数据发送失败,非法的返回串!]';
if r=-4 then frmremotecfg.StatusBar1.Panels[3].Text:='[数据发送失败,返回帧校验错误!]';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -