To solve the optimization problem described, we first need to translate the natural language description into a symbolic representation. This involves defining variables for each type of unit (air defense batteries, signal platoons, medical platoons), formulating the objective function using these variables, and then listing all constraints in terms of these variables.

Let's denote:
- \(x_0\) as the number of air defense batteries,
- \(x_1\) as the number of signal platoons,
- \(x_2\) as the number of medical platoons.

The objective function aims to maximize \(2x_0 + 6x_1 + 5x_2\).

Constraints are as follows:
1. Fuel demand from air defense batteries and signal platoons: \(15x_0 + 17x_1 \geq 35\)
2. Total offensive capability rating from air defense batteries and signal platoons: \(x_0 + 12x_1 \leq 196\)
3. Total offensive capability rating from air defense batteries and medical platoons: \(x_0 + 3x_2 \leq 283\)
4. Total offensive capability rating from all units: \(x_0 + 12x_1 + 3x_2 \leq 247\)
5. Fuel demand from signal platoons and medical platoons: \(17x_1 + 5x_2 \leq 140\)
6. Total fuel demand from all units: \(15x_0 + 17x_1 + 5x_2 \leq 96\)
7. Integrity constraints:
   - \(x_0, x_1, x_2\) are non-negative integers.

Given the symbolic representation and constraints, we can now formulate this problem in Gurobi Python code:

```python
from gurobipy import *

# Create a new model
m = Model("Optimization_Problem")

# Define variables
x0 = m.addVar(vtype=GRB.INTEGER, name="air_defense_batteries")
x1 = m.addVar(vtype=GRB.INTEGER, name="signal_platoons")
x2 = m.addVar(vtype=GRB.INTEGER, name="medical_platoons")

# Objective function
m.setObjective(2*x0 + 6*x1 + 5*x2, GRB.MAXIMIZE)

# Constraints
m.addConstr(15*x0 + 17*x1 >= 35, "fuel_demand_min")
m.addConstr(x0 + 12*x1 <= 196, "offensive_capability_air_signal")
m.addConstr(x0 + 3*x2 <= 283, "offensive_capability_air_medical")
m.addConstr(x0 + 12*x1 + 3*x2 <= 247, "total_offensive_capability_max")
m.addConstr(17*x1 + 5*x2 <= 140, "fuel_demand_signal_medical")
m.addConstr(15*x0 + 17*x1 + 5*x2 <= 96, "total_fuel_demand")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Air Defense Batteries: {x0.x}")
    print(f"Signal Platoons: {x1.x}")
    print(f"Medical Platoons: {x2.x}")
    print(f"Objective Function Value: {m.objVal}")
else:
    print("No optimal solution found.")
```

This code solves the optimization problem by maximizing the objective function subject to all given constraints. Note that Gurobi may return an infeasible or unbounded status if the model is not properly defined or if no feasible solutions exist, respectively.

Here's a summary of the symbolic representation as requested:
```json
{
    'sym_variables': [('x0', 'air defense batteries'), ('x1', 'signal platoons'), ('x2', 'medical platoons')],
    'objective_function': '2*x0 + 6*x1 + 5*x2',
    'constraints': [
        '15*x0 + 17*x1 >= 35',
        'x0 + 12*x1 <= 196',
        'x0 + 3*x2 <= 283',
        'x0 + 12*x1 + 3*x2 <= 247',
        '17*x1 + 5*x2 <= 140',
        '15*x0 + 17*x1 + 5*x2 <= 96'
    ]
}
```