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>
18 KiB
GeViSet File Format Reverse Engineering Specification
Version: 1.0 Date: 2024-12-12 Status: In Progress
Overview
This specification documents the reverse engineering effort to fully parse, understand, and manipulate the GeViSoft .set configuration file format. The goal is to enable programmatic reading, editing, and writing of GeViServer configurations, particularly action mappings.
Background
What is a .set File?
- Source: Exported from GeViSet application or read via
GeViAPI_SetupClient_ReadSetup - Purpose: Complete GeViServer configuration (cameras, alarms, action mappings, users, etc.)
- Format: Proprietary binary format with "GeViSoft Parameters" header
- Size: Typically 200-300 KB for production configurations
- Use Case: Backup, migration, and programmatic configuration management
Current State
What Works:
- ✅ Read .set file from GeViServer via SetupClient API
- ✅ Extract 64 action mappings from binary data
- ✅ Write back byte-for-byte identical (round-trip verified)
- ✅ Password encryption with
GeViAPI_EncodeString
What's Missing:
- ❌ Full structure parsing (all sections, all items)
- ❌ Understanding of all data types and relationships
- ❌ Ability to add NEW action mappings
- ❌ JSON representation of complete structure
- ❌ Comprehensive Excel export/import
Requirements
Primary Request
"I want to do full reverse engineering - I need to parse the whole file and maybe to json format in the first phase and then we will revert this json or its parts to excel"
Key Requirements
-
Parse Entire File Structure
- All sections (Alarms, Clients, GeViIO, Cameras, ActionMappings, etc.)
- All configuration items (key-value pairs)
- All rules and triggers
- All metadata and relationships
-
JSON Serialization
- Complete structure in JSON format
- Human-readable and editable
- Preserves all data and relationships
- Round-trip safe (JSON → Binary → JSON)
-
Excel Export/Import
- Export action mappings to Excel
- User-friendly editing interface
- Add new mappings
- Delete existing mappings
- Import back to JSON
-
Safety & Validation
- Verify integrity before writing to server
- Backup original configuration
- Validate against schema
- Error handling and recovery
Architecture
Data Flow
┌─────────────────────────────────────────────────────────────┐
│ GeViServer │
│ ↓ │
│ SetupClient API (ReadSetup) │
└─────────────────────────────────────────────────────────────┘
↓
.set file (binary)
281,714 bytes
↓
┌─────────────────────────────────────────────────────────────┐
│ PHASE 1: Binary Parser │
│ - Parse header │
│ - Parse all sections │
│ - Parse all items │
│ - Parse all rules │
│ - Extract action mappings │
└─────────────────────────────────────────────────────────────┘
↓
JSON Structure
(full configuration representation)
↓
┌─────────────────────────────────────────────────────────────┐
│ PHASE 2: JSON Processing │
│ - Validate structure │
│ - Transform for editing │
│ - Extract sections │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ PHASE 3: Excel Export │
│ - Convert action mappings to Excel │
│ - User edits in Excel │
│ - Add/delete/modify mappings │
└─────────────────────────────────────────────────────────────┘
↓
Excel file
↓
┌─────────────────────────────────────────────────────────────┐
│ PHASE 4: Excel Import │
│ - Read Excel changes │
│ - Validate data │
│ - Update JSON structure │
└─────────────────────────────────────────────────────────────┘
↓
JSON Structure
(modified)
↓
┌─────────────────────────────────────────────────────────────┐
│ PHASE 5: Binary Writer │
│ - Rebuild .set file from JSON │
│ - Maintain binary format │
│ - Validate integrity │
└─────────────────────────────────────────────────────────────┘
↓
.set file (binary)
↓
SetupClient API (WriteSetup)
↓
GeViServer
Binary Format Analysis
File Structure
.set file
├── Header
│ ├── 0x00 (optional null byte)
│ └── Pascal String: "GeViSoft Parameters" (0x07 <len> <data>)
│
├── Sections (multiple)
│ ├── Section Name (Pascal String)
│ ├── Items (key-value pairs)
│ │ ├── Key (Pascal String)
│ │ └── Value (typed)
│ │ ├── 0x01 = Boolean
│ │ ├── 0x04 = Integer (4 bytes)
│ │ └── 0x07 = String (Pascal)
│ │
│ └── Rules Subsection
│ ├── "Rules" marker (0x05 0x52 0x75 0x6C 0x65 0x73)
│ ├── Count/Metadata
│ └── Action Rules (multiple)
│ ├── Trigger Properties
│ │ └── .PropertyName = Boolean
│ ├── Main Action String
│ │ └── 0x07 0x01 0x40 <len_2bytes> <action_data>
│ └── Action Variations
│ ├── GscAction (GeViScope)
│ ├── GNGAction (G-Net-Guard)
│ └── GCoreAction (GCore)
│
└── Footer (metadata/checksums?)
Data Types Discovered
| Marker | Type | Format | Example |
|---|---|---|---|
| 0x01 | Boolean | 0x01 | 0x01 0x01 = true |
| 0x04 | Integer | 0x04 <4-byte little-endian> | 0x04 0x0A 0x00 0x00 0x00 |
| 0x07 | String | 0x07 | 0x07 0x0B "Description" |
| 0x07 0x01 0x40 | Action | 0x07 0x01 0x40 <len_2bytes> | Action string format |
Action String Format
Pattern: 07 01 40 <len_2bytes_LE> <action_text>
Example:
07 01 40 1C 00 47 53 43 20 56 69 65 77 65 72 43 6F 6E 6E 65 63 74 4C 69 76 65...
│ │ │ │ │ └─ "GSC ViewerConnectLive V <- C"
│ │ │ └──┴─ Length: 0x001C (28 bytes)
│ │ └─ 0x40 (action marker)
│ └─ 0x01 (subtype)
└─ 0x07 (string type)
Sections Found
From file analysis, sections include:
- Alarms: Alarm configurations
- Clients: Client connections
- GeViIO: Digital I/O configurations
- Cameras: Camera settings
- Description: Various descriptive entries
- IpHost: Network configurations
- ActionMappings: Trigger → Action rules (our focus)
JSON Schema
Complete Structure
{
"$schema": "https://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"version": {
"type": "string",
"description": "Parser version"
},
"header": {
"type": "string",
"description": "File header (GeViSoft Parameters)"
},
"sections": {
"type": "array",
"items": {
"$ref": "#/definitions/Section"
}
}
},
"definitions": {
"Section": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"items": {
"type": "array",
"items": {
"$ref": "#/definitions/ConfigItem"
}
},
"rules": {
"type": "array",
"items": {
"$ref": "#/definitions/ActionRule"
}
}
}
},
"ConfigItem": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"value": {
"oneOf": [
{ "type": "boolean" },
{ "type": "integer" },
{ "type": "string" }
]
},
"type": {
"enum": ["boolean", "integer", "string"]
}
}
},
"ActionRule": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"triggers": {
"type": "object",
"additionalProperties": {
"type": "boolean"
}
},
"mainAction": {
"type": "string"
},
"variations": {
"type": "array",
"items": {
"$ref": "#/definitions/ActionVariation"
}
}
}
},
"ActionVariation": {
"type": "object",
"properties": {
"platform": {
"enum": ["GSC", "GNG", "GCore"]
},
"actionString": {
"type": "string"
},
"serverType": {
"type": "string"
},
"serverName": {
"type": "string"
}
}
}
}
}
Example JSON Output
{
"version": "1.0",
"header": "GeViSoft Parameters",
"sections": [
{
"name": "ActionMappings",
"items": [],
"rules": [
{
"id": 1,
"triggers": {
"InputContact": true,
"VideoInput": false
},
"mainAction": "AlternateContact(2, 1000, 500)",
"variations": [
{
"platform": "GSC",
"actionString": "GSC ViewerConnectLive V <- C_101027",
"serverType": "GeViScope",
"serverName": "GEVISCOPE"
},
{
"platform": "GNG",
"actionString": "GNG PanLeft_101027",
"serverType": "",
"serverName": ""
}
]
}
]
},
{
"name": "Alarms",
"items": [
{
"key": "AlarmCount",
"value": 5,
"type": "integer"
},
{
"key": "Enabled",
"value": true,
"type": "boolean"
}
],
"rules": []
}
]
}
Implementation Phases
Phase 1: Complete Binary Parser ✅
Goal: Parse entire .set file structure into memory
Components:
- ✅ Header parser
- 🚧 Section parser (all types)
- 🚧 Item parser (all data types)
- 🚧 Rules parser (complete structure)
- 🚧 Action variation parser
Status: Basic parser exists, needs enhancement for full structure
Phase 2: JSON Serialization 🚧
Goal: Convert parsed structure to JSON
Components:
- JSON serializer
- Schema validator
- Round-trip tester (Binary → JSON → Binary)
Deliverables:
SetFileToJsonconverter- JSON schema definition
- Validation tools
Phase 3: Excel Export 🚧
Goal: Export action mappings to Excel for editing
Components:
- Excel writer (EPPlus library)
- Action mapping table generator
- Template with formulas/validation
Excel Structure:
Sheet: ActionMappings
| Rule ID | Trigger Type | Trigger Param | Action 1 | Action 2 | Action 3 |
|---------|--------------|---------------|----------|----------|----------|
| 1 | InputContact | 3, false | Alternate| Viewer | |
| 2 | VideoInput | 4, true | CrossSwi | VCChange | |
Phase 4: Excel Import 🚧
Goal: Import edited Excel back to JSON
Components:
- Excel reader
- Validation engine
- Diff generator (show changes)
- JSON merger
Phase 5: Binary Writer 🚧
Goal: Rebuild .set file from JSON
Components:
- Binary writer
- Structure rebuilder
- Validation
- Backup mechanism
Critical: Must maintain binary compatibility!
Phase 6: Testing & Validation 🚧
Goal: Ensure safety and correctness
Test Cases:
- Round-trip (Binary → JSON → Binary) = identical
- Round-trip (Binary → JSON → Excel → JSON → Binary) = valid
- Add new mapping → write → server accepts
- Modify existing mapping → write → server accepts
- Delete mapping → write → server accepts
Current Progress
Completed ✅
- SetupClient API integration
- Password encryption
- Basic binary parsing (64 action mappings extracted)
- Safe round-trip (byte-for-byte identical)
- File structure analysis
- Data type discovery
In Progress 🚧
- Complete section parsing
- Full rule structure parsing
- JSON serialization
- Excel export
- Binary writer for modifications
Pending 📋
- Excel import
- Add new mapping functionality
- API endpoints
- Documentation
- Production deployment
Technical Challenges
Challenge 1: Unknown Metadata Bytes
Problem: Many byte sequences whose purpose is unknown
Solution:
- Document all patterns found
- Test modifications to understand behavior
- Preserve unknown bytes during round-trip
Challenge 2: Complex Nested Structure
Problem: Sections contain items and rules, rules contain variations
Solution:
- Recursive parsing
- Clear data model hierarchy
- Offset tracking for debugging
Challenge 3: Binary Format Changes
Problem: Format may vary between GeViSoft versions
Solution:
- Version detection
- Support multiple format versions
- Graceful degradation
Challenge 4: Action String Syntax
Problem: Action strings have complex syntax (parameters, types, etc.)
Solution:
- Pattern matching
- Action string parser
- Validation against known action types
Safety Considerations
Before Writing to Server
- ✅ Verify round-trip: Parse → Write → Compare = Identical
- ✅ Backup original: Always keep copy of working config
- ⚠️ Test in dev: Never test on production first
- ⚠️ Validate structure: Check against schema
- ⚠️ Incremental changes: Small changes, test frequently
Error Handling
- Validate before write
- Provide detailed error messages
- Support rollback
- Log all operations
Tools & Libraries
Development
- Language: C# / .NET 8.0
- Binary Parsing: Custom binary reader
- JSON: System.Text.Json
- Excel: EPPlus (for .xlsx)
- Testing: xUnit
- Logging: Serilog
Project Structure
GeViSetEditor/
├── GeViSetEditor.Core/
│ ├── Models/
│ │ ├── SetFileStructure.cs
│ │ ├── Section.cs
│ │ ├── ConfigItem.cs
│ │ ├── ActionRule.cs
│ │ └── ActionVariation.cs
│ ├── Parsers/
│ │ ├── SetFileBinaryParser.cs
│ │ ├── SectionParser.cs
│ │ └── RuleParser.cs
│ ├── Writers/
│ │ ├── SetFileBinaryWriter.cs
│ │ └── JsonWriter.cs
│ ├── Converters/
│ │ ├── JsonToExcel.cs
│ │ └── ExcelToJson.cs
│ └── Validators/
│ └── StructureValidator.cs
├── GeViSetEditor.CLI/
│ └── Commands/
│ ├── ParseCommand.cs
│ ├── ToJsonCommand.cs
│ ├── ToExcelCommand.cs
│ └── FromExcelCommand.cs
└── GeViSetEditor.Tests/
├── ParserTests.cs
├── RoundTripTests.cs
└── ValidationTests.cs
Next Steps
Immediate (This Session)
- ✅ Create specification document
- ✅ Update git repository
- 🚧 Implement complete binary parser
- 🚧 Implement JSON serialization
- 🚧 Test round-trip with JSON
Short Term (Next Session)
- Excel export implementation
- Excel import implementation
- Add new mapping functionality
- Comprehensive testing
Long Term
- Web UI for configuration management
- API endpoints
- Multi-version support
- Documentation and examples
References
- GeViSoft SDK Documentation
- SetupClient API Reference
- Existing .set file samples (TestMKS.set, setup_config_*.dat)
- Binary analysis notes
- Round-trip test results
Version History
| Version | Date | Changes |
|---|---|---|
| 1.0 | 2024-12-12 | Initial specification |
Status: Ready for full implementation Priority: High Complexity: High Timeline: 2-3 days estimated