This MVP release provides a complete full-stack solution for managing action mappings in Geutebruck's GeViScope and GeViSoft video surveillance systems. ## Features ### Flutter Web Application (Port 8081) - Modern, responsive UI for managing action mappings - Action picker dialog with full parameter configuration - Support for both GSC (GeViScope) and G-Core server actions - Consistent UI for input and output actions with edit/delete capabilities - Real-time action mapping creation, editing, and deletion - Server categorization (GSC: prefix for GeViScope, G-Core: prefix for G-Core servers) ### FastAPI REST Backend (Port 8000) - RESTful API for action mapping CRUD operations - Action template service with comprehensive action catalog (247 actions) - Server management (G-Core and GeViScope servers) - Configuration tree reading and writing - JWT authentication with role-based access control - PostgreSQL database integration ### C# SDK Bridge (gRPC, Port 50051) - Native integration with GeViSoft SDK (GeViProcAPINET_4_0.dll) - Action mapping creation with correct binary format - Support for GSC and G-Core action types - Proper Camera parameter inclusion in action strings (fixes CrossSwitch bug) - Action ID lookup table with server-specific action IDs - Configuration reading/writing via SetupClient ## Bug Fixes - **CrossSwitch Bug**: GSC and G-Core actions now correctly display camera/PTZ head parameters in GeViSet - Action strings now include Camera parameter: `@ PanLeft (Comment: "", Camera: 101028)` - Proper filter flags and VideoInput=0 for action mappings - Correct action ID assignment (4198 for GSC, 9294 for G-Core PanLeft) ## Technical Stack - **Frontend**: Flutter Web, Dart, Dio HTTP client - **Backend**: Python FastAPI, PostgreSQL, Redis - **SDK Bridge**: C# .NET 8.0, gRPC, GeViSoft SDK - **Authentication**: JWT tokens - **Configuration**: GeViSoft .set files (binary format) ## Credentials - GeViSoft/GeViScope: username=sysadmin, password=masterkey - Default admin: username=admin, password=admin123 ## Deployment All services run on localhost: - Flutter Web: http://localhost:8081 - FastAPI: http://localhost:8000 - SDK Bridge gRPC: localhost:50051 - GeViServer: localhost (default port) Generated with Claude Code (https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
350 lines
20 KiB
HTML
350 lines
20 KiB
HTML
<!DOCTYPE html>
|
|
<html xmlns:MadCap="http://www.madcapsoftware.com/Schemas/MadCap.xsd" lang="en" xml:lang="en" data-mc-search-type="Stem" data-mc-help-system-file-name="index.xml" data-mc-path-to-help-system="../../" data-mc-target-type="WebHelp2" data-mc-runtime-file-type="Topic" data-mc-preload-images="false" data-mc-in-preview-mode="false" data-mc-toc-path="GeViScope SDK|Action documentation">
|
|
<!-- saved from url=(0014)about:internet -->
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Remote export</title>
|
|
<link href="../Resources/TableStyles/TABLE.css" rel="stylesheet" />
|
|
<style>/*<![CDATA[*/BODY {
|
|
FONT-FAMILY: Arial, Helvetica, sans-serif; FONT-SIZE: 10pt
|
|
}
|
|
/*]]>*/</style>
|
|
<link href="../../Skins/Default/Stylesheets/TextEffects.css" rel="stylesheet" />
|
|
<link href="../../Skins/Default/Stylesheets/Topic.css" rel="stylesheet" />
|
|
<link href="../Resources/Stylesheets/Styles.css" rel="stylesheet" />
|
|
<script src="../../Resources/Scripts/jquery.min.js">
|
|
</script>
|
|
<script src="../../Resources/Scripts/plugins.min.js">
|
|
</script>
|
|
<script src="../../Resources/Scripts/require.min.js">
|
|
</script>
|
|
<script src="../../Resources/Scripts/require.config.js">
|
|
</script>
|
|
<script src="../../Resources/Scripts/MadCapAll.js">
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<div class="MCBreadcrumbsBox_0"><span class="MCBreadcrumbsPrefix">| </span><a class="MCBreadcrumbsLink" href="../Titel.htm">GeViScope SDK</a><span class="MCBreadcrumbsDivider"> > </span><a class="MCBreadcrumbsLink" href="../300_Action documentation.htm">Action documentation</a><span class="MCBreadcrumbsDivider"> > </span><span class="MCBreadcrumbs">Remote export</span>
|
|
</div>
|
|
<h1>Remote export</h1>
|
|
<p>The actions of the category "Remote Export" subserve to start and control
|
|
exports over the network. The actions are only at disposal if GSCRemEx service
|
|
runs on every device and a connection to a central GeViSoft server persists. The
|
|
GSCServer and GSCRemEx service have to run together on a local machine otherwise
|
|
exports are not possible. The GSCRemEx service has to be setup in advance by
|
|
GSCRemExEditor. The exports can be executed by a PILOT center device or other
|
|
software systems (SDK based, GEUTEBRUECK devices). The PILOT is a system
|
|
management console of GEUTEBRUECK which simplifies the handling of complex
|
|
security systems. The PILOT among others can be used to control GSCView.
|
|
Especially in view of the fact of exports the user can define start and end
|
|
points by the help of the PILOT through GSCRemEx ("SetExportMarker" action).
|
|
GSCView remembers the points in time and inserts them to the action
|
|
"StartRemoteExport". The action "StartRemoteExport" is initiated by GSCView
|
|
after the PILOT has send the action "InitializeRemoteExport" by indirection via
|
|
the GeViSoft server and GeViScope server to GSCView. GSCView sends the action
|
|
"StartRemoteExport" to the GSCRemEx service and triggers the appropriate export.
|
|
Exports that have been started through GSCRemEx service can be started or
|
|
aborted from other devices or software systems over the network. Exports that
|
|
have been started locally in GSCView cannot be controlled from other devices or
|
|
software systems. In the curse of an export process no new export can be
|
|
started. This export has to be restarted after the running export process has
|
|
been completed! The actions "SetExportMarker" and "InitializeRemoteExport" have
|
|
been developed especially for the PILOT. </p>
|
|
<h2>Cancel export</h2>
|
|
<p>Action name:<i>CancelExport(ExportID, AbortFlag)</i></p>
|
|
<p>Action category: command</p>
|
|
<p>Through this action the running export process with the specified export ID
|
|
is being aborted if GSCView remote-controls the GSCRemEx service. If the
|
|
GSCRemEx service is remote-controlled by an external application the external
|
|
application has to send the action to abort the running export process.</p>
|
|
<table border="1" style="mc-table-style: url('../Resources/TableStyles/TABLE.css');margin-left: 0;margin-right: auto;" class="TableStyle-Rows" cellspacing="0">
|
|
<col class="Column-Column1" style="width: 80px;" />
|
|
<col class="Column-Column1" style="width: 80px;" />
|
|
<col class="Column-Column1" style="width: 380px;" />
|
|
<thead>
|
|
<tr class="Head-Header1">
|
|
<th class="HeadE-Column1-Header1" colspan="2">Parameter</th>
|
|
<th class="HeadD-Column1-Header1">Function</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="Body-Body1">
|
|
<td class="BodyE-Column1-Body1">export GUID</td>
|
|
<td class="BodyE-Column1-Body1"><i>ExportID</i>
|
|
</td>
|
|
<td class="BodyD-Column1-Body1">ID of the export process that has to be aborted. <br />The export GUID
|
|
is being assigned on the action "StartRemoteExport". <br />e.g.:
|
|
01E68451-2406-484d-A9BC-5140762931E0 <br /></td>
|
|
</tr>
|
|
<tr class="Body-Body2">
|
|
<td class="BodyB-Column1-Body2">abort flag</td>
|
|
<td class="BodyB-Column1-Body2"><i>AbortFlag</i>
|
|
</td>
|
|
<td class="BodyA-Column1-Body2">reason for abort <br />0: user abort; abort of export through user
|
|
<br />1: low disc space; too little storage capacity <br />2: no user rights;
|
|
access based on restricted user rights not possible <br />3: error; internal
|
|
error <br /></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h2>Export finished</h2>
|
|
<p>Action name:<i>ExportFinished(ExportID, Success)</i></p>
|
|
<p>Action category: notification</p>
|
|
<p>The GSCRemEx service notifies through this action that the running process
|
|
was completed. </p>
|
|
<p>Possible status messages are: user abort, low disc space, no user rights,
|
|
error. </p>
|
|
<table border="1" style="mc-table-style: url('../Resources/TableStyles/TABLE.css');margin-left: 0;margin-right: auto;" class="TableStyle-Rows" cellspacing="0">
|
|
<col class="Column-Column1" style="width: 80px;" />
|
|
<col class="Column-Column1" style="width: 80px;" />
|
|
<col class="Column-Column1" style="width: 380px;" />
|
|
<thead>
|
|
<tr class="Head-Header1">
|
|
<th class="HeadE-Column1-Header1" colspan="2">Parameter</th>
|
|
<th class="HeadD-Column1-Header1">Function</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="Body-Body1">
|
|
<td class="BodyE-Column1-Body1">export GUID</td>
|
|
<td class="BodyE-Column1-Body1"><i>ExportID</i>
|
|
</td>
|
|
<td class="BodyD-Column1-Body1">ID of completed export process. The export GUID is being assigned on
|
|
the action "StartRemoteExport". <br />e.g.:
|
|
01E68451-2406-484d-A9BC-5140762931E0 <br /></td>
|
|
</tr>
|
|
<tr class="Body-Body2">
|
|
<td class="BodyB-Column1-Body2">success</td>
|
|
<td class="BodyB-Column1-Body2"><i>Success</i>
|
|
</td>
|
|
<td class="BodyA-Column1-Body2">reason for abort <br />0: user abort; abort of export through user
|
|
<br />1: low disc space; too little storage capacity <br />2: no user rights;
|
|
access based on restricted user rights not possible <br />3: error; internal
|
|
error <br /></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h2>Export progress</h2>
|
|
<p>Action name:<i>ExportProgress(ExportID, Progress)</i></p>
|
|
<p>Action category: notification</p>
|
|
<p>The GSCRemEx service notifies the current status of the running export
|
|
process in %.</p>
|
|
<table border="1" style="mc-table-style: url('../Resources/TableStyles/TABLE.css');margin-left: 0;margin-right: auto;" class="TableStyle-Rows" cellspacing="0">
|
|
<col class="Column-Column1" style="width: 80px;" />
|
|
<col class="Column-Column1" style="width: 80px;" />
|
|
<col class="Column-Column1" style="width: 380px;" />
|
|
<thead>
|
|
<tr class="Head-Header1">
|
|
<th class="HeadE-Column1-Header1" colspan="2">Parameter</th>
|
|
<th class="HeadD-Column1-Header1">Function</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="Body-Body1">
|
|
<td class="BodyE-Column1-Body1">export GUID</td>
|
|
<td class="BodyE-Column1-Body1"><i>ExportID</i>
|
|
</td>
|
|
<td class="BodyD-Column1-Body1">ID of running export. The export GUID is being assigned on the action
|
|
"StartRemoteExport". <br />e.g.: 01E68451-2406-484d-A9BC-5140762931E0
|
|
<br /></td>
|
|
</tr>
|
|
<tr class="Body-Body2">
|
|
<td class="BodyB-Column1-Body2">progress</td>
|
|
<td class="BodyB-Column1-Body2"><i>Progress</i>
|
|
</td>
|
|
<td class="BodyA-Column1-Body2">shows current status of the export process in %</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h2>Initialize remote export</h2>
|
|
<p>Action name:<i>InitializeRemoteExport(Viewer, Device)</i></p>
|
|
<p>Action category: command</p>
|
|
<p>This action is being used especially in the context of control units or
|
|
systems like for example the PILOT. </p>
|
|
<p>The PILOT center device notifies GSCView that a new export has to be
|
|
initiated. Thereupon GSCView creates the action "StartRemoteExport" with the
|
|
appropriate parameters. </p>
|
|
<table border="1" style="mc-table-style: url('../Resources/TableStyles/TABLE.css');margin-left: 0;margin-right: auto;" class="TableStyle-Rows" cellspacing="0">
|
|
<col class="Column-Column1" style="width: 80px;" />
|
|
<col class="Column-Column1" style="width: 79px;" />
|
|
<col class="Column-Column1" style="width: 380px;" />
|
|
<thead>
|
|
<tr class="Head-Header1">
|
|
<th class="HeadE-Column1-Header1" colspan="2">Parameter</th>
|
|
<th class="HeadD-Column1-Header1">Function</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="Body-Body1">
|
|
<td class="BodyE-Column1-Body1">viewer</td>
|
|
<td class="BodyE-Column1-Body1"><i>Viewer</i>
|
|
</td>
|
|
<td class="BodyD-Column1-Body1">global viewer number <br /></td>
|
|
</tr>
|
|
<tr class="Body-Body2">
|
|
<td class="BodyB-Column1-Body2">device GUID</td>
|
|
<td class="BodyB-Column1-Body2"><i>Device</i>
|
|
</td>
|
|
<td class="BodyA-Column1-Body2">ID of the PILOT center device (transmitted by the PILOT itself)
|
|
<br />e.g.: 01E68451-2406-484d-A9BC-5140762931E0 <br /></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h2>Set export marker</h2>
|
|
<p>Action name:<i>SetExportMarker(Viewer, Marker)</i></p>
|
|
<p>Action category: command</p>
|
|
<p>This action is being used especially in the context of control units or
|
|
systems like for example the PILOT. </p>
|
|
<p>It indicates GSCView that an export start and end point has to be set on the
|
|
current position of viewer X. </p>
|
|
<p>The so-called markers are being transferred automatically into the
|
|
"StartRemoteExport" action once the "InitializeRemoteExport" action has been
|
|
sent from the PILOT. The action "StartRemoteExport" transfers the start and end
|
|
points to the GSCRemEx service which conducts the appropriate export. </p>
|
|
<table border="1" style="mc-table-style: url('../Resources/TableStyles/TABLE.css');margin-left: 0;margin-right: auto;" class="TableStyle-Rows" cellspacing="0">
|
|
<col class="Column-Column1" style="width: 80px;" />
|
|
<col class="Column-Column1" style="width: 80px;" />
|
|
<col class="Column-Column1" style="width: 380px;" />
|
|
<thead>
|
|
<tr class="Head-Header1">
|
|
<th class="HeadE-Column1-Header1" colspan="2">Parameter</th>
|
|
<th class="HeadD-Column1-Header1">Function</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="Body-Body1">
|
|
<td class="BodyE-Column1-Body1">viewer</td>
|
|
<td class="BodyE-Column1-Body1"><i>Viewer</i>
|
|
</td>
|
|
<td class="BodyD-Column1-Body1">global viewer number <br /></td>
|
|
</tr>
|
|
<tr class="Body-Body2">
|
|
<td class="BodyB-Column1-Body2">marker</td>
|
|
<td class="BodyB-Column1-Body2"><i>Marker</i>
|
|
</td>
|
|
<td class="BodyA-Column1-Body2">tags and stores the start and end point of the data that has to be
|
|
exported <br />(selection begin=0, selection end=1) <br /></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h2>Start remote export</h2>
|
|
<p>Action name:<i>StartRemoteExport(ExportID, Device, BackupFormat, Channel,
|
|
SelectionBegin, SelectionEnd, JobID)</i></p>
|
|
<p>Action category: command</p>
|
|
<p>This action tells the GSCRemEx service to start a new export. </p>
|
|
<p>The action "StartRemoteExport" was created because the PILOT or another
|
|
external software system did send the action "InitializeRemoteExport" to GSCView
|
|
before. </p>
|
|
<table border="1" style="mc-table-style: url('../Resources/TableStyles/TABLE.css');margin-left: 0;margin-right: auto;" class="TableStyle-Rows" cellspacing="0">
|
|
<col class="Column-Column1" style="width: 80px;" />
|
|
<col class="Column-Column1" style="width: 90px;" />
|
|
<col class="Column-Column1" style="width: 371px;" />
|
|
<thead>
|
|
<tr class="Head-Header1">
|
|
<th class="HeadE-Column1-Header1" colspan="2">Parameter</th>
|
|
<th class="HeadD-Column1-Header1">Function</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="Body-Body1">
|
|
<td class="BodyE-Column1-Body1">export GUID</td>
|
|
<td class="BodyE-Column1-Body1"><i>ExportID</i>
|
|
</td>
|
|
<td class="BodyD-Column1-Body1">ID of running exports. The export GUID has to be determined separately
|
|
in advance because the action itself does not create a GUID.</td>
|
|
</tr>
|
|
<tr class="Body-Body2">
|
|
<td class="BodyE-Column1-Body2">device GUID</td>
|
|
<td class="BodyE-Column1-Body2"><i>Device</i>
|
|
</td>
|
|
<td class="BodyD-Column1-Body2">ID of PILOT center device. If no PILOT is being used the blank GUID
|
|
can be used instead. <br />e.g.: 01E68451-2406-484d-A9BC-5140762931E0
|
|
<br /></td>
|
|
</tr>
|
|
<tr class="Body-Body1">
|
|
<td class="BodyE-Column1-Body1">format</td>
|
|
<td class="BodyE-Column1-Body1"><i>BackupFormat</i>
|
|
</td>
|
|
<td class="BodyD-Column1-Body1">defines the format of the exported file <br />0=default (in this case it
|
|
equals 1=GBF) <br />1=GBF( GEUTEBRUECK backup file) <br />2=MPEG2 <br /></td>
|
|
</tr>
|
|
<tr class="Body-Body2">
|
|
<td class="BodyE-Column1-Body2">channel</td>
|
|
<td class="BodyE-Column1-Body2"><i>Channel</i>
|
|
</td>
|
|
<td class="BodyD-Column1-Body2">global channel number/camera number</td>
|
|
</tr>
|
|
<tr class="Body-Body1">
|
|
<td class="BodyE-Column1-Body1">start time</td>
|
|
<td class="BodyE-Column1-Body1"><i>SelectionBegin</i>
|
|
</td>
|
|
<td class="BodyD-Column1-Body1">holds the position of the marker for the start point ("selection
|
|
begin")</td>
|
|
</tr>
|
|
<tr class="Body-Body2">
|
|
<td class="BodyE-Column1-Body2">end time</td>
|
|
<td class="BodyE-Column1-Body2"><i>SelectionEnd</i>
|
|
</td>
|
|
<td class="BodyD-Column1-Body2">holds the position of the marker for the end point ("selection
|
|
end")</td>
|
|
</tr>
|
|
<tr class="Body-Body1">
|
|
<td class="BodyB-Column1-Body1">job ID</td>
|
|
<td class="BodyB-Column1-Body1"><i>JobID</i>
|
|
</td>
|
|
<td class="BodyA-Column1-Body1">Contains the login data (server name, user name, encoded password)
|
|
<br />Optional second user password. The login data is separated by |.
|
|
<br />e.g.: <server
|
|
name>|<user>|<PW>|<user2>|<PW2>
|
|
<br />localhost|admin|test| <br />If there is no second user (second user
|
|
password) nothing has to be <br />entered at this point. <br />Passwords in
|
|
this parameter are encoded. Therefor the function <br />DBIEncodeString() of
|
|
GscDBI-DLL (from GeViScope/re_porter SDK) is being used.
|
|
<br /></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h2>Start scene store</h2>
|
|
<p>Action name:<i>StartSceneStore(SceneStoreID, CutList, PreHistoryLength,
|
|
RecordingLength)</i></p>
|
|
<p>Action category: command</p>
|
|
<p>For internal use only!</p>
|
|
<table border="1" style="mc-table-style: url('../Resources/TableStyles/TABLE.css');margin-left: 0;margin-right: auto;" class="TableStyle-Rows" cellspacing="0">
|
|
<col class="Column-Column1" />
|
|
<col class="Column-Column1" />
|
|
<col class="Column-Column1" style="width: 315px;" />
|
|
<thead>
|
|
<tr class="Head-Header1">
|
|
<th class="HeadE-Column1-Header1" colspan="2">Parameter</th>
|
|
<th class="HeadD-Column1-Header1">Function</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="Body-Body1">
|
|
<td class="BodyE-Column1-Body1">scene store GUID</td>
|
|
<td class="BodyE-Column1-Body1"><i>SceneStoreID</i>
|
|
</td>
|
|
<td class="BodyD-Column1-Body1">Scene store GUID.</td>
|
|
</tr>
|
|
<tr class="Body-Body2">
|
|
<td class="BodyE-Column1-Body2">cut-list</td>
|
|
<td class="BodyE-Column1-Body2"><i>CutList</i>
|
|
</td>
|
|
<td class="BodyD-Column1-Body2">Cut-list.</td>
|
|
</tr>
|
|
<tr class="Body-Body1">
|
|
<td class="BodyE-Column1-Body1">pre-history length</td>
|
|
<td class="BodyE-Column1-Body1"><i>PreHistoryLength</i>
|
|
</td>
|
|
<td class="BodyD-Column1-Body1">Pre-history length.</td>
|
|
</tr>
|
|
<tr class="Body-Body2">
|
|
<td class="BodyB-Column1-Body2">recording length</td>
|
|
<td class="BodyB-Column1-Body2"><i>RecordingLength</i>
|
|
</td>
|
|
<td class="BodyA-Column1-Body2">Recording length.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</body>
|
|
</html> |