Complete guide to installing, configuring, and using IASER
Make sure you have DCS World 2.7+ installed and Windows 10/11 (64-bit)
Download the latest release from our GitHub repository:
# Clone the repository
git clone https://github.com/dark0venom/IASER.git
cd IASER
# Or download the pre-built release
# https://github.com/dark0venom/IASER/releases
Run the automated build script:
# Run the build script
.\build.ps1
# Or build manually with CMake
mkdir build
cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release
Copy the export script to your DCS Scripts folder:
# Copy export script
copy "lua_scripts\Export.lua" "%USERPROFILE%\Saved Games\DCS\Scripts\Export.lua"
Start the IASER engine:
# Run IASER
.\build\Release\iaser.exe
Launch DCS World and start any mission. IASER will automatically connect and display telemetry data.
| Component | Minimum | Recommended |
|---|---|---|
| Operating System | Windows 10 (64-bit) | Windows 11 (64-bit) |
| Memory | 4 GB RAM | 8 GB RAM |
| Storage | 50 MB | 100 MB |
| DCS World | 2.7.0 | Latest OpenBeta |
| Network | Localhost | Localhost |
If building from source:
IASER can be configured through command-line arguments or a configuration file.
# Basic usage
iaser.exe [options]
# Available options:
--telemetry-port PORT # UDP port for telemetry (default: 45100)
--command-port PORT # TCP port for commands (default: 45101)
--dcs-host HOST # DCS host address (default: 127.0.0.1)
--update-rate RATE # Update frequency in Hz (default: 30)
--log-level LEVEL # Logging level: debug, info, warn, error
--config FILE # Load configuration from file
Create a config.json file:
{
"network": {
"telemetry_port": 45100,
"command_port": 45101,
"dcs_host": "127.0.0.1"
},
"engine": {
"update_rate_hz": 30.0,
"max_units": 1000,
"enable_logging": true
},
"ai": {
"tactical_update_rate": 10.0,
"strategic_update_interval": 60.0,
"enable_advanced_behaviors": true
}
}
The export script must be properly installed for IASER to receive telemetry data from DCS.
%USERPROFILE%\Saved Games\DCS\Scripts\
Export.lua file already exists, backup it firstcopy "IASER\lua_scripts\Export.lua" "%USERPROFILE%\Saved Games\DCS\Scripts\Export.lua"
If you have existing export scripts, you can chain them:
-- At the top of your existing Export.lua
dofile(lfs.writedir().."Scripts\\IASER\\iaser_export.lua")
-- Your existing export code continues below...
Ensure Windows Firewall allows DCS to communicate on the configured ports:
Launch IASER before starting DCS World:
# Start with default settings
iaser.exe
# Start with custom configuration
iaser.exe --config my_config.json
# Start with specific ports
iaser.exe --telemetry-port 45200 --command-port 45201
IASER provides real-time status information:
IASER - Intelligent Air & Surface External Runtime
Version 1.0.0 - Phase 1: Core Infrastructure
Configuration:
Telemetry Port: 45100
Command Port: 45101
DCS Host: 127.0.0.1
Update Rate: 30.0 Hz
IASER engine started successfully
Waiting for DCS World connection...
UDP receiver started on port 45100
Connected to DCS at 127.0.0.1:45101
Statistics:
Frames Received: 1250
Commands Sent: 15
Parse Errors: 0
Active Aircraft: 2
Last Update Time: 485.234s
--update-rate 20IASER provides both C++ APIs for engine integration and network protocols for external tools.
// Basic engine usage
#include "iaser/engine.hpp"
iaser::EngineConfig config;
config.telemetry_port = 45100;
config.command_port = 45101;
iaser::Engine engine(config);
engine.start();
// Get aircraft information
auto aircraft = engine.getAllAircraft();
for (const auto& ac : aircraft) {
std::cout << "Aircraft: " << ac.getTypeName()
<< " at " << ac.getPosition().x << ", "
<< ac.getPosition().y << std::endl;
}
// Send commands
engine.sendTextMessage("Hello from IASER!");
engine.sendWaypoint(1, iaser::Vector3(123456, 567890, 8000));
engine.stop();
Telemetry format (UDP):
SEQ:123;TIME:456.789;COUNT:2;
AC1:ID=1,TYPE=F-16C,X=123.45,Y=678.90,Z=8000.0,HDG=1.57,FUEL=0.75;
AC2:ID=2,TYPE=F-18C,X=124.45,Y=679.90,Z=8100.0,HDG=1.60,FUEL=0.80;
Command format (TCP):
TEXT:Hello DCS World!
WAYPOINT:1,123456,567890,8000
SPAWN:F-16C,123000,567000,5000
#include "iaser/engine.hpp"
#include
#include
#include
int main() {
iaser::EngineConfig config;
iaser::Engine engine(config);
if (!engine.start()) {
std::cerr << "Failed to start engine\n";
return 1;
}
std::cout << "Monitoring DCS World...\n";
while (true) {
auto stats = engine.getStatistics();
std::cout << "Active Aircraft: " << stats.active_aircraft
<< ", Frames: " << stats.frames_received << "\n";
std::this_thread::sleep_for(std::chrono::seconds(5));
}
return 0;
}
// Basic threat response
auto aircraft_list = engine.getAllAircraft();
for (const auto& aircraft : aircraft_list) {
// Check fuel level
if (aircraft.getFuelLevel() < 0.2) {
engine.sendTextMessage("Aircraft " +
std::to_string(aircraft.getId()) +
" low on fuel - RTB recommended");
}
// Simple proximity alert
for (const auto& other : aircraft_list) {
if (other.getId() != aircraft.getId()) {
double distance = aircraft.getDistanceTo(other);
if (distance < 1000.0) { // 1km
engine.sendTextMessage("Proximity alert!");
}
}
}
}
You can modify the Lua export script to send additional data:
-- Add custom data fields
local function exportCustomData()
local customData = {
weather = LoGetWeatherAtPoint(pos),
time_of_day = LoGetMissionOptions().start_time,
mission_name = LoGetMissionDescription()
}
return customData
end
IASER can work alongside other DCS tools: