Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit GrandstreamAPI;
- interface
- uses
- Windows, Classes, SysUtils,
- IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
- IdAllAuthentications ;
- type
- TGrandstreamAPI = class;
- TGsRequestBase = class;
- TGsAudioVideo = class;
- TGsDevice = class;
- TGsStatus = class;
- TGrandstreamAPI = class(TComponent)
- private
- FAddress: String;
- FPort: Integer;
- FPass: String;
- FUser: String;
- FWeb: TIdHTTP;
- FAudioVideo: TGsAudioVideo;
- FDevice: TGsDevice;
- FStatus: TGsStatus;
- function GetURL: String;
- procedure SetAddress(const Value: String);
- procedure SetPort(const Value: Integer);
- procedure SetPass(const Value: String);
- procedure SetUser(const Value: String);
- public
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- property URL: String read GetURL;
- property AudioVideo: TGsAudioVideo read FAudioVideo;
- property Device: TGsDevice read FDevice;
- property Status: TGsStatus read FStatus;
- published
- property Address: String read FAddress write SetAddress;
- property Port: Integer read FPort write SetPort;
- property User: String read FUser write SetUser;
- property Pass: String read FPass write SetPass;
- end;
- TGsRequestResult = (grOkay,grBadRequest,grUnauthorized,grNotFound,
- grServiceUnavailable);
- TGsRequestBase = class(TObject)
- private
- FOwner: TGrandstreamAPI;
- FStream: TStringStream;
- FList: TStringList;
- public
- constructor Create(AOwner: TGrandstreamAPI); virtual;
- destructor Destroy; override;
- function Owner: TGrandstreamAPI;
- function Get(const Cmd: String): TGsRequestResult;
- function Stream: TStringStream;
- function Items: TStringList;
- end;
- { Audio/Video }
- TGsChannel = (gcPrimary,gcSecondary);
- TGsVideoCodec = (gvcH264,gvcMJPEG);
- TGsResolution = record
- Width: Integer;
- Height: Integer;
- end;
- TGsBrType = (gvbVBR,gvbCBR);
- TGsAudioCodec = (gacPCMU,gacPCMA,gacG726,gacDisabled,gacAAC);
- TGsAudioChipType = (gctAIC33,gctAIC3104,gctNone);
- TGsNtscPalType = (gptPAL,gtpNTSC);
- TGsPowerFreq = (gpfIndoor50,gpfIndoor60,gpfOutdoor);
- TGsChannelInfo = record
- Encoder: TGsVideoCodec;
- Resolution: TGsResolution;
- Bitrate: Integer;
- BrType: TGsBrType;
- Framerate: Integer;
- IFrame: Integer;
- ImageQuality: Integer;
- AudioEncoder: TGsAudioCodec;
- AudioBitrate: Integer;
- end;
- PGsStreamInfo = ^TGsStreamInfo;
- TGsStreamInfo = record
- HasSecondary: Boolean;
- Channel: Integer;
- Primary: TGsChannelInfo;
- Secondary: TGsChannelInfo;
- MicrophoneVolume: Integer;
- SpeakerVolume: Integer;
- AudioLineIn: Boolean;
- AudioLineOut: Boolean;
- AudioChipType: TGsAudioChipType;
- NtscPalType: TGsNtscPalType;
- PowerFreq: TGsPowerFreq
- end;
- TGsAudioVideo = class(TGsRequestBase)
- private
- FChannels: Array of PGsStreamInfo;
- function GetChannel(Index: Integer): PGsStreamInfo;
- procedure ClearChannels;
- public
- constructor Create(AOwner: TGrandstreamAPI); override;
- destructor Destroy; override;
- function Get: TGsRequestResult;
- function Count: Integer;
- property Channels[Index: Integer]: PGsStreamInfo read GetChannel; default;
- end;
- { System Settings }
- TGsAlarmType = (gatNormalOpen,gatNormalClose);
- TGsAlarmStatus = (gasOpen,gasClose);
- TGsAlarmOutputTime = (gao0,gao5,gao15,gao30,gao60,gao180,gao300,gao600,gao900,gao1800);
- TGsGpioPinMultiplex = (gpmNone,gpmControl,gpmAlarmIO);
- PGsDeviceInfo = ^TGsDeviceInfo;
- TGsDeviceInfo = record
- Channel: Integer;
- AlarmInType: TGsAlarmType;
- AlarmOutType: TGsAlarmType;
- AlarmInStatus: TGsAlarmStatus;
- AlarmOutStatus: TGsAlarmStatus;
- AlarmOutputTime: TGsAlarmOutputTime;
- GpioPinMultiplex: TGsGpioPinMultiplex;
- end;
- TGsDevice = class(TGsRequestBase)
- private
- FChannels: Array of PGsDeviceInfo;
- FDeviceName: String;
- function GetChannel(Index: Integer): PGsDeviceInfo;
- procedure ClearChannels;
- procedure SetDeviceName(const Value: String);
- public
- constructor Create(AOwner: TGrandstreamAPI); override;
- destructor Destroy; override;
- function Get: TGsRequestResult;
- function Count: Integer;
- property Channels[Index: Integer]: PGsDeviceInfo read GetChannel; default;
- property DeviceName: String read FDeviceName write SetDeviceName;
- end;
- { System Info }
- TGsDDNSState = (gdsDisable,gdsProcessing,gdsSuccess,gdsAcctPassErr,
- gdsServerBlocking,gdsStunServerErr,gdsDBFailed);
- TGsWiFiState = (gwsDisconnected,gwsConnected);
- TGsLedStatus = (glsUnsupported,glsOn,glsOff);
- TGsPPPoEStatus = (gpsDisconnected,gpsConnected);
- TGsStatus = class(TGsRequestBase)
- private
- FProductMode: String;
- FDDNSState: TGsDDNSState;
- FPartNumber: String;
- FCoreVersion: String;
- FBootLoaderVersion: String;
- FFirmwareVersion: String;
- FBaseVersion: String;
- FHardwareVersion: String;
- FCameraType: String;
- FSystemRun: String;
- FPPPoEStatus: TGsPPPoEStatus;
- FLedStatus: TGsLedStatus;
- FWiFiState: TGsWiFiState;
- FPPPoEIP: String;
- FMac: String;
- FDefaultGateway: String;
- FSubnetMask: String;
- FIPAddress: String;
- public
- constructor Create(AOwner: TGrandstreamAPI); override;
- destructor Destroy; override;
- function Get: TGsRequestResult;
- function DDNSStateStr: String;
- function WiFiStateStr: String;
- function LedStatusStr: String;
- function PPPoEStatusStr: String;
- property ProductMode: String read FProductMode;
- property HardwareVersion: String read FHardwareVersion;
- property PartNumber: String read FPartNumber;
- property BootLoaderVersion: String read FBootLoaderVersion;
- property CoreVersion: String read FCoreVersion;
- property BaseVersion: String read FBaseVersion;
- property FirmwareVersion: String read FFirmwareVersion;
- property CameraType: String read FCameraType;
- property DDNSState: TGsDDNSState read FDDNSState;
- property WiFiState: TGsWiFiState read FWiFiState;
- property SystemRun: String read FSystemRun;
- property Mac: String read FMac;
- property LedStatus: TGsLedStatus read FLedStatus;
- property PPPoEIP: String read FPPPoEIP;
- property PPPoEStatus: TGsPPPoEStatus read FPPPoEStatus;
- property IPAddress: String read FIPAddress;
- property SubnetMask: String read FSubnetMask;
- property DefaultGateway: String read FDefaultGateway;
- end;
- implementation
- const
- CAMERA_URL = 'http://%s:%s@%s:%d/';
- // http://user:pass@address:port/
- function EncodeUrl(source: string): string;
- var i:integer;
- begin
- result := '';
- for i := 1 to length(source) do
- if not (source[i] in ['A'..'Z','a'..'z','0','1'..'9','-','_','~','.']) then result := result + '%'+inttohex(ord(source[i]),2) else result := result + source[i];
- end;
- function IntToResult(const R: Integer): TGsRequestResult;
- begin
- case R of
- 200: Result:= grOkay;
- 400: Result:= grBadRequest;
- 401: Result:= grUnauthorized;
- 404: Result:= grNotFound;
- 503: Result:= grServiceUnavailable;
- end;
- end;
- function ResultToInt(const R: TGsRequestResult): Integer;
- begin
- case R of
- grOkay: Result:= 200;
- grBadRequest: Result:= 400;
- grUnauthorized: Result:= 401;
- grNotFound: Result:= 404;
- grServiceUnavailable: Result:= 503;
- end;
- end;
- function StrToRes(const R: String): TGsResolution;
- begin
- end;
- function ResToStr(const R: TGsResolution): String;
- begin
- end;
- { TGrandstreamAPI }
- constructor TGrandstreamAPI.Create(AOwner: TComponent);
- begin
- inherited;
- FWeb:= TIdHTTP.Create(nil);
- FWeb.ProtocolVersion:= pv1_0;
- FWeb.Request.Username:= FUser;
- FWeb.Request.Password:= FPass;
- FAudioVideo:= TGsAudioVideo.Create(Self);
- FDevice:= TGsDevice.Create(Self);
- FStatus:= TGsStatus.Create(Self);
- end;
- destructor TGrandstreamAPI.Destroy;
- begin
- FStatus.Free;
- FDevice.Free;
- FAudioVideo.Free;
- FWeb.Free;
- inherited;
- end;
- function TGrandstreamAPI.GetURL: String;
- begin
- Result:= Format(CAMERA_URL,
- [EncodeUrl(FUser),EncodeUrl(FPass),FAddress,FPort]);
- end;
- procedure TGrandstreamAPI.SetAddress(const Value: String);
- begin
- FAddress := Value;
- end;
- procedure TGrandstreamAPI.SetPass(const Value: String);
- begin
- FPass := Value;
- end;
- procedure TGrandstreamAPI.SetPort(const Value: Integer);
- begin
- FPort := Value;
- end;
- procedure TGrandstreamAPI.SetUser(const Value: String);
- begin
- FUser := Value;
- end;
- { TGsRequestBase }
- constructor TGsRequestBase.Create(AOwner: TGrandstreamAPI);
- begin
- FOwner:= AOwner;
- FStream:= TStringStream.Create;
- FList:= TStringList.Create;
- end;
- destructor TGsRequestBase.Destroy;
- begin
- FList.Free;
- FStream.Free;
- inherited;
- end;
- function TGsRequestBase.Get(const Cmd: String): TGsRequestResult;
- var
- U: String;
- begin
- U:= FOwner.URL+'/goform/'+Cmd+'?cmd=get';
- FOwner.FWeb.Request.UserAgent:= 'JD Grandstream API';
- FOwner.FWeb.Request.Username:= FOwner.FUser;
- FOwner.FWeb.Request.Password:= FOwner.FPass;
- FOwner.FWeb.Get(U);
- FOwner.FWeb.Get(U, FStream);
- Result:= grOkay;
- FStream.Position:= 0;
- FList.Text:= FStream.DataString;
- end;
- function TGsRequestBase.Items: TStringList;
- begin
- Result:= FList;
- end;
- function TGsRequestBase.Owner: TGrandstreamAPI;
- begin
- Result:= FOwner;
- end;
- function TGsRequestBase.Stream: TStringStream;
- begin
- Result:= FStream;
- end;
- { TGsAudioVideo }
- constructor TGsAudioVideo.Create(AOwner: TGrandstreamAPI);
- begin
- inherited;
- SetLength(FChannels, 0);
- end;
- destructor TGsAudioVideo.Destroy;
- begin
- ClearChannels;
- inherited;
- end;
- function TGsAudioVideo.Count: Integer;
- begin
- Result:= Length(FChannels);
- end;
- procedure TGsAudioVideo.ClearChannels;
- var
- X: Integer;
- begin
- for X := 0 to Length(FChannels) - 1 do
- Dispose(PGsStreamInfo(FChannels[X]));
- SetLength(FChannels, 0);
- end;
- function TGsAudioVideo.GetChannel(Index: Integer): PGsStreamInfo;
- begin
- Result:= FChannels[Index];
- end;
- function TGsAudioVideo.Get: TGsRequestResult;
- var
- I: PGsStreamInfo;
- N: String;
- X: Integer;
- function Chk(const V: String): Boolean;
- begin
- Result:= Pos(V+'=', N) = 1;
- end;
- function VStr: String;
- var
- P: Integer;
- begin
- P:= Pos('=', N);
- Result:= Copy(N, P+1, Length(N));
- end;
- function VInt: Integer;
- begin
- Result:= StrToIntDef(VStr, 0);
- end;
- begin
- ClearChannels;
- try
- Result:= inherited Get('audio_video');;
- X:= -1;
- while Items.Count > 0 do begin
- N:= Items[0];
- Items.Delete(0);
- if Chk('channel') then begin
- Inc(X);
- SetLength(FChannels, Length(FChannels)+1);
- I:= New(PGsStreamInfo);
- FChannels[X]:= I;
- I.Channel:= X;
- I.HasSecondary:= False;
- end else
- if Chk('video.primary.encoder') then begin
- case VInt of
- 96: I.Primary.Encoder:= gvcH264;
- 26: I.Primary.Encoder:= gvcMJPEG;
- end;
- end else
- if Chk('video.primary.resolution') then begin
- I.Primary.Resolution:= StrToRes(VStr);
- end else
- if Chk('video.primary.bitrate') then begin
- I.Primary.Bitrate:= VInt;
- end else
- if Chk('video.primary.brtype') then begin
- case VInt of
- 0: I.Primary.BrType:= gvbVBR;
- 1: I.Primary.BrType:= gvbCBR;
- end;
- end else
- if Chk('video.primary.framerate') then begin
- I.Primary.Framerate:= VInt;
- end else
- if Chk('video.primary.iframe') then begin
- I.Primary.IFrame:= VInt;
- end else
- if Chk('video.primary.imagequality') then begin
- I.Primary.ImageQuality:= VInt;
- end else
- if Chk('audio.primary.encoder') then begin
- case VInt of
- 0: I.Primary.AudioEncoder:= gacPCMU;
- 1: I.Primary.AudioEncoder:= gacPCMA;
- 2: I.Primary.AudioEncoder:= gacG726;
- 3: I.Primary.AudioEncoder:= gacDisabled;
- 4: I.Primary.AudioEncoder:= gacAAC;
- end;
- end else
- if Chk('audio.primary.bitrate') then begin
- I.Primary.AudioBitrate:= VInt;
- end else
- if Chk('video.secondary.encoder') then begin
- I.HasSecondary:= True;
- case VInt of
- 96: I.Secondary.Encoder:= gvcH264;
- 26: I.Secondary.Encoder:= gvcMJPEG;
- end;
- end else
- if Chk('video.secondary.resolution') then begin
- I.Secondary.Resolution:= StrToRes(VStr);
- end else
- if Chk('video.secondary.bitrate') then begin
- I.Secondary.Bitrate:= VInt;
- end else
- if Chk('video.secondary.brtype') then begin
- case VInt of
- 0: I.Secondary.BrType:= gvbVBR;
- 1: I.Secondary.BrType:= gvbCBR;
- end;
- end else
- if Chk('video.secondary.framerate') then begin
- I.Secondary.Framerate:= VInt;
- end else
- if Chk('video.secondary.iframe') then begin
- I.Secondary.IFrame:= VInt;
- end else
- if Chk('video.secondary.imagequality') then begin
- I.Secondary.ImageQuality:= VInt;
- end else
- if Chk('audio.secondary.encoder') then begin
- case VInt of
- 0: I.Secondary.AudioEncoder:= gacPCMU;
- 1: I.Secondary.AudioEncoder:= gacPCMA;
- 2: I.Secondary.AudioEncoder:= gacG726;
- 3: I.Secondary.AudioEncoder:= gacDisabled;
- 4: I.Secondary.AudioEncoder:= gacAAC;
- end;
- end else
- if Chk('audio.secondary.bitrate') then begin
- I.Secondary.AudioBitrate:= VInt;
- end else
- if Chk('audio.microphone.volume') then begin
- I.MicrophoneVolume:= VInt;
- end else
- if Chk('audio.speaker.volume') then begin
- I.SpeakerVolume:= VInt;
- end else
- if Chk('audio.linein') then begin
- case VInt of
- 0: I.AudioLineIn:= False;
- 1: I.AudioLineIn:= True;
- end;
- end else
- if Chk('audio.lineout') then begin
- case VInt of
- 0: I.AudioLineOut:= False;
- 1: I.AudioLineOut:= True;
- end;
- end else
- if Chk('audio.chip.type') then begin
- case VInt of
- 0: I.AudioChipType:= gctAIC33;
- 1: I.AudioChipType:= gctAIC3104;
- $FF: I.AudioChipType:= gctNone;
- end;
- end else
- if Chk('ntscpal.type') then begin
- case VInt of
- 50: I.PowerFreq:= gpfIndoor50;
- 60: I.PowerFreq:= gpfIndoor60;
- 61: I.PowerFreq:= gpfOutdoor;
- end;
- end else begin
- //Unrecognized property
- end;
- end;
- except
- on e: exception do begin
- end;
- end;
- end;
- { TGsDevice }
- constructor TGsDevice.Create(AOwner: TGrandstreamAPI);
- begin
- inherited;
- SetLength(FChannels, 0);
- end;
- destructor TGsDevice.Destroy;
- begin
- ClearChannels;
- inherited;
- end;
- procedure TGsDevice.ClearChannels;
- var
- X: Integer;
- begin
- for X := 0 to Length(FChannels) - 1 do
- Dispose(PGsStreamInfo(FChannels[X]));
- SetLength(FChannels, 0);
- end;
- function TGsDevice.Count: Integer;
- begin
- Result:= Length(FChannels);
- end;
- function TGsDevice.GetChannel(Index: Integer): PGsDeviceInfo;
- begin
- Result:= FChannels[Index];
- end;
- procedure TGsDevice.SetDeviceName(const Value: String);
- begin
- FDeviceName := Value;
- end;
- function TGsDevice.Get: TGsRequestResult;
- var
- I: PGsDeviceInfo;
- N: String;
- X: Integer;
- function Chk(const V: String): Boolean;
- begin
- Result:= Pos(V+'=', N) = 1;
- end;
- function VStr: String;
- var
- P: Integer;
- begin
- P:= Pos('=', N);
- Result:= Copy(N, P+1, Length(N));
- end;
- function VInt: Integer;
- begin
- Result:= StrToIntDef(VStr, 0);
- end;
- begin
- ClearChannels;
- try
- Result:= inherited Get('device');
- X:= -1;
- while Items.Count > 0 do begin
- N:= Items[0];
- Items.Delete(0);
- if Chk('devicename') then begin
- FDeviceName:= VStr;
- end else
- if Chk('channel') then begin
- Inc(X);
- SetLength(FChannels, Length(FChannels)+1);
- I:= New(PGsDeviceInfo);
- FChannels[X]:= I;
- I.Channel:= X;
- I.GpioPinMultiplex:= gpmNone;
- end else
- if Chk('alarmin.type') then begin
- case VInt of
- 0: I.AlarmInType:= gatNormalOpen;
- 1: I.AlarmInType:= gatNormalClose;
- end;
- end else
- if Chk('alarmout.type') then begin
- case VInt of
- 0: I.AlarmOutType:= gatNormalOpen;
- 1: I.AlarmOutType:= gatNormalClose;
- end;
- end else
- if Chk('alarmin.status') then begin
- case VInt of
- 0: I.AlarmInStatus:= gasOpen;
- 1: I.AlarmInStatus:= gasClose;
- end;
- end else
- if Chk('alarmout.status') then begin
- case VInt of
- 0: I.AlarmOutStatus:= gasOpen;
- 1: I.AlarmOutStatus:= gasClose;
- end;
- end else
- if Chk('alarm_output_time') then begin
- case VInt of
- 0: I.AlarmOutputTime:= gao0;
- 5: I.AlarmOutputTime:= gao5;
- 15: I.AlarmOutputTime:= gao15;
- 30: I.AlarmOutputTime:= gao30;
- 60: I.AlarmOutputTime:= gao60;
- 180: I.AlarmOutputTime:= gao180;
- 300: I.AlarmOutputTime:= gao300;
- 600: I.AlarmOutputTime:= gao600;
- 900: I.AlarmOutputTime:= gao900;
- 1800: I.AlarmOutputTime:= gao1800;
- end;
- end else
- if Chk('gpio_pin_multiplex') then begin
- case VInt of
- 0: I.GpioPinMultiplex:= gpmControl;
- 1: I.GpioPinMultiplex:= gpmAlarmIO;
- end;
- end else begin
- end;
- end;
- except
- on e: exception do begin
- end;
- end;
- end;
- { TGsStatus }
- constructor TGsStatus.Create(AOwner: TGrandstreamAPI);
- begin
- inherited;
- end;
- function TGsStatus.DDNSStateStr: String;
- begin
- end;
- destructor TGsStatus.Destroy;
- begin
- inherited;
- end;
- function TGsStatus.Get: TGsRequestResult;
- var
- N: String;
- T: String;
- function Chk(const V: String): Boolean;
- begin
- Result:= Pos(V+'=', N) = 1;
- end;
- function VStr: String;
- var
- P: Integer;
- begin
- P:= Pos('=', N);
- Result:= Copy(N, P+1, Length(N));
- end;
- function VInt: Integer;
- begin
- Result:= StrToIntDef(VStr, 0);
- end;
- begin
- try
- Result:= inherited Get('systeminfo');
- while Items.Count > 0 do begin
- N:= Items[0];
- Items.Delete(0);
- if Chk('productmode') then begin
- FProductMode:= VStr;
- end else
- if Chk('hardwareversion') then begin
- FHardwareVersion:= VStr;
- end else
- if Chk('partnumber') then begin
- FPartNumber:= VStr;
- end else
- if Chk('bootloaderversion') then begin
- FBootloaderVersion:= VStr;
- end else
- if Chk('coreversion') then begin
- FCoreVersion:= VStr;
- end else
- if Chk('baseversion') then begin
- FBaseVersion:= VStr;
- end else
- if Chk('firmwareversion') then begin
- FFirmwareVersion:= VStr;
- end else
- if Chk('cameratype') then begin
- T:= Trim(Items[0]);
- Items.Delete(0);
- T:= T + ' ' + Trim(Items[0]);
- Items.Delete(0);
- FCameraType:= T;
- end else
- if Chk('ddnsstate') then begin
- case VInt of
- 0: FDDNSState:= gdsDisable;
- 1: FDDNSState:= gdsProcessing;
- 2: FDDNSState:= gdsSuccess;
- 3: FDDNSState:= gdsAcctPassErr;
- 4: FDDNSState:= gdsServerBlocking;
- 5: FDDNSState:= gdsStunServerErr;
- 6: FDDNSState:= gdsDBFailed;
- end;
- end else
- if Chk('wifistate') then begin
- case VInt of
- 0: ;
- 1: ;
- end;
- end else
- if Chk('systemrun') then begin
- FSystemRun:= VStr;
- end else
- if Chk('mac') then begin
- FMac:= VStr;
- end else
- if Chk('ledstatus') then begin
- case VInt of
- 0: ;
- 1: ;
- end;
- end else
- if Chk('pppoe.ip') then begin
- FPPPoEIP:= VStr;
- end else
- if Chk('pppoe.status') then begin
- case VInt of
- 0: ;
- 1: ;
- end;
- end else
- if Chk('ipaddress') then begin
- FIPAddress:= VStr;
- end else
- if Chk('subnetmask') then begin
- FSubnetMask:= VStr;
- end else
- if Chk('defaultgateway') then begin
- FDefaultGateway:= VStr;
- end else begin
- end;
- end;
- except
- on e: exception do begin
- end;
- end;
- end;
- function TGsStatus.LedStatusStr: String;
- begin
- end;
- function TGsStatus.PPPoEStatusStr: String;
- begin
- end;
- function TGsStatus.WiFiStateStr: String;
- begin
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment