Files
Administrator 14893e62a5 feat: Geutebruck GeViScope/GeViSoft Action Mapping System - MVP
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>
2025-12-31 18:10:54 +01:00

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"> &gt; </span><a class="MCBreadcrumbsLink" href="../300_Action documentation.htm">Action documentation</a><span class="MCBreadcrumbsDivider"> &gt; </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.: &lt;server
name&gt;|&lt;user&gt;|&lt;PW&gt;|&lt;user2&gt;|&lt;PW2&gt;
<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>