Référence de Configuration OmniLCS
Toute la configuration est définie dans config/config.exs. Ce document couvre chaque section et paramètre de configuration.
Panneau de Contrôle (UI LiveView)
Le Panneau de Contrôle fournit l'interface de gestion basée sur le web servie sur HTTPS sur le port 443.
config :control_panel,
parent_application: :omnilcs,
parent_application_version: "1.0.0",
parent_application_readable_name: "OmniLCS",
home_page: ControlPanelWeb.ApplicationLive,
use_builtin_pages: [...],
use_additional_pages: [...],
page_order: ["/dashboard", "/location", "/cells", "/diameter",
"/cbc", "/cbc4g", "/application", "/configuration", "/log"],
licensee_name: "Omnitouch"
| Paramètre | Type | Description |
|---|---|---|
parent_application | atom | Nom de l'application OTP |
parent_application_version | string | Version affichée dans l'UI |
parent_application_readable_name | string | Nom du produit lisible par l'homme |
home_page | module | Module de la page d'accueil par défaut |
use_builtin_pages | list | Pages intégrées (Application, Configuration, Journal) |
use_additional_pages | list | Pages OmniLCS personnalisées (Tableau de bord, Localisation, Cellules, Diamètre, CBC 2G, CBC 3G, CBC 4G, Alertes CAP) |
page_order | list | Ordre des onglets dans la barre de navigation |
licensee_name | string | Nom du licencié affiché dans le pied de page |
Point de terminaison du Panneau de Contrôle
config :control_panel, ControlPanelWeb.Endpoint,
server: true,
https: [
port: 443,
keyfile: "priv/cert/omnitouch.pem",
certfile: "priv/cert/omnitouch.crt"
],
secret_key_base: "...",
check_origin: false,
pubsub_server: ControlPanel.PubSub,
live_view: [signing_salt: "LcsLvSlt"]
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
server | boolean | true | Activer le serveur HTTP |
https.port | integer | 443 | Port d'écoute HTTPS |
https.keyfile | string | "priv/cert/omnitouch.pem" | Chemin vers la clé privée TLS |
https.certfile | string | "priv/cert/omnitouch.crt" | Chemin vers le certificat TLS |
secret_key_base | string | -- | Clé de chiffrement de session Phoenix (générer avec mix phx.gen.secret) |
check_origin | boolean | false | Vérifier les origines WebSocket |
pubsub_server | atom | ControlPanel.PubSub | Serveur PubSub pour les mises à jour LiveView |
live_view.signing_salt | string | "LcsLvSlt" | Sel de signature du token LiveView |
API REST
L'API REST est servie sur HTTPS sur le port 8443 via le framework api_ex.
config :api_ex,
api: %{
port: 8443,
listen_ip: "0.0.0.0",
product_name: "OmniLCS",
title: "API - OmniLCS",
hostname: "localhost",
enable_tls: true,
tls_cert_path: "priv/cert/omnitouch.crt",
tls_key_path: "priv/cert/omnitouch.pem",
routes: [...]
}
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
port | integer | 8443 | Port d'écoute de l'API |
listen_ip | string | "0.0.0.0" | Adresse de liaison de l'API |
product_name | string | "OmniLCS" | Nom du produit dans la spécification OpenAPI |
title | string | "API - OmniLCS" | Titre de l'API dans Swagger UI |
hostname | string | "localhost" | Nom d'hôte pour les URL de spécification OpenAPI |
enable_tls | boolean | true | Activer HTTPS |
tls_cert_path | string | "priv/cert/omnitouch.crt" | Chemin vers le certificat TLS |
tls_key_path | string | "priv/cert/omnitouch.pem" | Chemin vers la clé privée TLS |
routes | list | -- | Liste des définitions de routes (chemin, module, actions) |
Routes API enregistrées
| Chemin | Contrôleur | Actions |
|---|---|---|
/status | OmniLcs.Api.StatusController | index |
/location | OmniLcs.Api.LocationController | index, create, show |
/cells | OmniLcs.Api.CellController | index, create, show, update, delete |
/cap | OmniLcs.Api.CapController | index, create, show, update |
Paramètres E-SMLC
Configuration générale de l'E-SMLC.
config :omnilcs,
esmlc_name: "OmniLCS",
cell_database_path: "priv/cells.json"
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
esmlc_name | string | "OmniLCS" | Nom de l'instance E-SMLC (utilisé dans l'API de statut) |
cell_database_path | string | "priv/cells.json" | Chemin vers le fichier JSON de la base de données des cellules pour importation |
CBSP (Diffusion de Cellule 2G)
Configuration pour l'écouteur TCP CBSP. Les BSCs se connectent à la CBC sur ce port.
config :omnilcs, :cbsp,
listen_ip: "0.0.0.0",
listen_port: 48049
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
listen_ip | string | "0.0.0.0" | Adresse IP pour l'écouteur TCP CBSP |
listen_port | integer | 48049 | Port TCP pour les connexions CBSP (port enregistré IANA pour CBSP) |
SABP (Diffusion de Cellule 3G)
Configuration pour l'écouteur TCP SABP. Les RNCs se connectent à la CBC sur ce port via l'interface Iu-BC selon 3GPP TS 25.419.
config :omnilcs, :sabp,
listen_ip: "0.0.0.0",
listen_port: 25419
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
listen_ip | string | "0.0.0.0" | Adresse IP pour l'écouteur TCP SABP |
listen_port | integer | 25419 | Port TCP pour les connexions SABP des RNCs |
SBC-AP (Diffusion de Cellule 4G)
Configuration pour les connexions SCTP SBC-AP. Selon 3GPP TS 29.168, la CBC initie des associations SCTP à chaque pair MME.
config :omnilcs, :sbcap,
local_ip: "10.5.198.200",
mme_peers: [
%{host: "mme01", ip: "10.179.2.100", port: 29168},
%{host: "mme02", ip: "10.179.2.101", port: 29168}
]
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
local_ip | string | "0.0.0.0" | Adresse IP locale pour lier le socket SCTP |
mme_peers | list | [] | Liste des configurations des pairs MME |
Configuration des Pairs MME
Chaque entrée dans mme_peers est une carte avec les champs suivants :
| Champ | Type | Requis | Par défaut | Description |
|---|---|---|---|---|
host | string | Non | valeur de ip | Nom d'hôte MME lisible par l'homme (pour les journaux et l'UI) |
ip | string | Oui | -- | Adresse IP MME |
port | integer | Non | 29168 | Port SCTP SBC-AP MME (enregistré IANA) |
Le transport SBC-AP utilise l'identifiant de protocole de charge utile SCTP (PPID) 24. En cas d'échec de connexion, il réessaie avec un retour exponentiel commençant à 5 secondes jusqu'à un maximum de 60 secondes.
InfluxDB
Les données de position des cellules sont synchronisées périodiquement à partir d'une instance InfluxDB.
config :omnilcs, OmniLcs.InfluxDb,
database: "nokia-monitor",
host: "172.19.3.68",
port: 8086,
auth: [method: :basic, username: "monitor", password: "..."],
http_opts: [recv_timeout: 30_000],
pool: [max_overflow: 10, size: 5]
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
database | string | -- | Nom de la base de données InfluxDB |
host | string | -- | Nom d'hôte ou IP du serveur InfluxDB |
port | integer | 8086 | Port HTTP de l'API InfluxDB |
auth.method | atom | :basic | Méthode d'authentification |
auth.username | string | -- | Nom d'utilisateur InfluxDB |
auth.password | string | -- | Mot de passe InfluxDB |
http_opts.recv_timeout | integer | 30000 | Délai d'attente de réception HTTP en millisecondes |
pool.size | integer | 5 | Taille du pool de connexions |
pool.max_overflow | integer | 10 | Nombre maximum de connexions de débordement du pool |
La synchronisation des cellules s'exécute automatiquement toutes les 5 minutes avec un délai initial de 10 secondes après le démarrage. Elle peut également être déclenchée manuellement via l'API REST ou le Panneau de Contrôle.
Interface SLs (LCS-AP sur SCTP)
L'interface SLs connecte l'E-SMLC au MME en utilisant LCS-AP sur SCTP selon 3GPP TS 29.171. OmniLCS initie des associations SCTP à chaque pair MME configuré sur le port 9082 avec PPID 29.
config :omnilcs, :sls,
local_ip: "10.5.198.200",
mme_peers: [
%{host: "mme01", ip: "10.179.1.15", port: 9082}
]
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
local_ip | string | "0.0.0.0" | Adresse IP locale pour lier le socket SCTP |
mme_peers | list | [] | Liste des configurations des pairs MME |
Configuration des Pairs MME (SLs)
Chaque entrée dans mme_peers est une carte avec les champs suivants :
| Champ | Type | Requis | Par défaut | Description |
|---|---|---|---|---|
host | string | Non | valeur de ip | Nom d'hôte MME lisible par l'homme (pour les journaux et l'UI) |
ip | string | Oui | -- | Adresse IP MME |
port | integer | Non | 9082 | Port SCTP LCS-AP MME (enregistré IANA pour LCS-AP) |
Le transport SLs utilise l'identifiant de protocole de charge utile SCTP (PPID) 29. En cas d'échec de connexion, il réessaie avec un retour exponentiel commençant à 5 secondes jusqu'à un maximum de 60 secondes.
Paramètres de réglage SCTP :
| Paramètre | Valeur | Description |
|---|---|---|
| Intervalle de heartbeat | 10 secondes | Heartbeat de l'adresse du pair |
| Max retransmissions de chemin | 7 | Avant de déclarer un échec de chemin |
| RTO max | 30 secondes | Délai d'attente de retransmission maximum |
| RTO min | 1 seconde | Délai d'attente de retransmission minimum |
| Délai SACK | 200 ms | Délai d'accusé de réception sélectif |
Diameter (Interfaces SLg et Autres)
La configuration Diameter contrôle l'interface SLg entre OmniLCS (agissant en tant que GMLC) et le MME, routée via un DRA. Ceci est séparé de l'interface SLs qui utilise LCS-AP natif sur SCTP.
config :diameter_ex,
diameter: %{
service_name: :omnitouch_esmlc,
listen_ip: "10.5.198.200",
listen_port: 3868,
host: "amanaki",
realm: "epc.mnc380.mcc313.3gppnetwork.org",
product_name: "OmniLCS",
request_timeout: 5000,
peer_selection_algorithm: :random,
allow_undefined_peers_to_connect: true,
log_unauthorized_peer_connection_attempts: true,
control_module: OmniLcs.Control.Diameter,
vendor_id: 10415,
supported_vendor_ids: [5535, 10415],
applications: [...],
peers: [...]
}
Paramètres de Service
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
service_name | atom | :omnitouch_esmlc | Identifiant de service Diameter |
listen_ip | string | -- | Adresse IP locale pour le transport Diameter |
listen_port | integer | 3868 | Port d'écoute Diameter (enregistré IANA) |
host | string | -- | Origin-Host Diameter (sans suffixe de domaine) |
realm | string | -- | Origin-Realm Diameter |
product_name | string | "OmniLCS" | Valeur AVP Product-Name Diameter |
request_timeout | integer | 5000 | Délai d'attente de la demande en millisecondes |
peer_selection_algorithm | atom | :random | Comment sélectionner parmi plusieurs pairs |
allow_undefined_peers_to_connect | boolean | true | Accepter les connexions des pairs non configurés |
log_unauthorized_peer_connection_attempts | boolean | true | Journaliser les tentatives de connexion non autorisées |
control_module | module | OmniLcs.Control.Diameter | Module gérant le routage des demandes Diameter |
processor_module | module | DiameterEx.Processor | Module traitant les messages Diameter |
vendor_id | integer | 10415 | Identifiant du fournisseur 3GPP |
supported_vendor_ids | list | [5535, 10415] | Valeurs d'identifiant de fournisseur prises en charge |
Applications Diameter
applications: [
%{
application_name: :slg,
application_dictionary: :diameter_gen_3gpp_slg,
vendor_specific_application_ids: [
%{vendor_id: 10415, auth_application_id: 16_777_264, acct_application_id: nil}
]
}
]
| Champ | Type | Description |
|---|---|---|
application_name | atom | Identifiant de l'application (:slg pour l'interface GMLC-à-MME) |
application_dictionary | atom | Module de dictionnaire Diameter Erlang |
vendor_specific_application_ids | list | Valeurs AVP Vendor-Specific-Application-Id |
L'application SLg utilise l'ID d'application 16777264 avec l'identifiant de fournisseur 3GPP 10415. Notez que l'interface E-SMLC-à-MME (SLs) utilise LCS-AP natif sur SCTP, pas Diameter.
Pairs Diameter
peers: [
%{
host: "omni-nick2-dra01.epc.mnc380.mcc313.3gppnetwork.org",
realm: "epc.mnc380.mcc313.3gppnetwork.org",
ip: "10.179.2.233",
port: 3868,
tls: false,
transport: :diameter_sctp,
initiate_connection: true
}
]
| Champ | Type | Par défaut | Description |
|---|---|---|---|
host | string | -- | Identité d'hôte Diameter du pair (FQDN) |
realm | string | -- | Domaine Diameter du pair |
ip | string | -- | Adresse IP du pair |
port | integer | 3868 | Port Diameter du pair |
tls | boolean | false | Activer TLS pour la connexion au pair |
transport | atom | :diameter_sctp | Protocole de transport (:diameter_sctp ou :diameter_tcp) |
initiate_connection | boolean | true | Indique si OmniLCS initie la connexion à ce pair |
GMLC / Interface Le
Configuration pour le Centre de Localisation Mobile Gateway et l'interface Le vers des clients LCS externes. Voir le Guide des Opérations GMLC & Interface Le pour tous les détails sur les flux de demandes, les sessions différées et la journalisation InfluxDB.
config :omnilcs, :gmlc,
enabled: true,
allow_unknown_clients: false,
authorized_clients: [
%{
name: "psap-01",
type: :emergency_services,
allowed_methods: [:cell, :ecid, :gnss, :otdoa],
rate_limit: 100,
description: "PSAP principal"
}
],
allow_deferred: true,
max_periodic_sessions: 100,
max_triggered_sessions: 50,
default_periodic_poll_interval_ms: 60_000,
default_triggered_poll_interval_ms: 30_000,
influx_logging: true
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
enabled | boolean | false | Activer le gestionnaire d'interface Le GMLC |
allow_unknown_clients | boolean | false | Accepter les demandes des clients non listés |
authorized_clients | list | [] | Définitions des clients LCS autorisés (voir guide GMLC) |
allow_deferred | boolean | true | Accepter les demandes de localisation périodiques et déclenchées |
max_periodic_sessions | integer | 100 | Nombre maximum de sessions périodiques simultanées |
max_triggered_sessions | integer | 50 | Nombre maximum de sessions déclenchées simultanées |
default_periodic_poll_interval_ms | integer | 60000 | Intervalle de correction périodique par défaut (ms) |
default_triggered_poll_interval_ms | integer | 30000 | Intervalle de sondage de géorepérage par défaut (ms) |
influx_logging | boolean | true | Écrire toutes les corrections de localisation GMLC dans InfluxDB |
Alertes CAP
Configuration pour l'ingestion et la diffusion des alertes CAP (Common Alerting Protocol). Voir le Guide des Opérations d'Alerte CAP pour tous les détails sur le cycle de vie des alertes, la résolution des polygones et le flux de validation des opérateurs.
config :omnilcs, :cap,
require_approval: true,
plmn: %{mcc: "001", mnc: "01"},
coverage_aware: false,
feeds: []
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
require_approval | boolean | true | Lorsque true, les alertes sont mises en file d'attente pour approbation par l'opérateur. Lorsque false, les alertes sont diffusées automatiquement. |
plmn | map | %{mcc: "001", mnc: "01"} | Identité PLMN (MCC/MNC) pour les messages de diffusion |
coverage_aware | boolean | false | Utiliser le rayon de couverture des cellules pour l'intersection des polygones (vs uniquement le point central) |
feeds | list | [] | URL des flux CAP Atom à interroger |
Configuration des Flux
feeds: [
%{url: "https://alerts.weather.gov/cap/us.php?x=1", poll_interval_seconds: 60}
]
| Champ | Type | Requis | Par défaut | Description |
|---|---|---|---|---|
url | string | Oui | -- | URL du flux CAP Atom |
poll_interval_seconds | integer | Non | 60 | Secondes entre les sondages |
Logger
config :logger,
backends: [:console, ControlPanel.Logger]
| Paramètre | Type | Description |
|---|---|---|
backends | list | Backends du logger. :console écrit sur stdout ; ControlPanel.Logger alimente la page de journal dans l'UI web. |
Exemple de Configuration Complète
import Config
config :control_panel,
parent_application: :omnilcs,
parent_application_version: "1.0.0",
parent_application_readable_name: "OmniLCS",
home_page: ControlPanelWeb.ApplicationLive,
use_builtin_pages: [
{ControlPanelWeb.ApplicationLive, "/application", "Ressources"},
{ControlPanelWeb.ConfigurationLive, "/configuration", "Configuration"},
{ControlPanelWeb.LogLive, "/log", "Journal"}
],
use_additional_pages: [
{OmniLcs.Web.DashboardLive, "/dashboard", "Tableau de bord"},
{OmniLcs.Web.LocationLive, "/location", "Localisation"},
{OmniLcs.Web.CellDatabaseLive, "/cells", "Cellules"},
{OmniLcs.Web.DiameterLive, "/diameter", "Diamètre"},
{OmniLcs.Web.CbcLive, "/cbc", "CBC 2G"},
{OmniLcs.Web.Cbc3gLive, "/cbc3g", "CBC 3G"},
{OmniLcs.Web.Cbc4gLive, "/cbc4g", "CBC 4G"},
{OmniLcs.Web.CapAlertsLive, "/cap", "Alertes CAP"}
],
page_order: [
"/dashboard", "/location", "/cells", "/diameter",
"/cbc", "/cbc3g", "/cbc4g", "/cap", "/application", "/configuration", "/log"
],
licensee_name: "Omnitouch"
# API REST
config :api_ex,
api: %{
port: 8443,
listen_ip: "0.0.0.0",
product_name: "OmniLCS",
title: "API - OmniLCS",
hostname: "localhost",
enable_tls: true,
tls_cert_path: "priv/cert/omnitouch.crt",
tls_key_path: "priv/cert/omnitouch.pem",
routes: [
%{path: "/status", module: OmniLcs.Api.StatusController, actions: [:index]},
%{path: "/location", module: OmniLcs.Api.LocationController, actions: [:index, :create, :show]},
%{path: "/cells", module: OmniLcs.Api.CellController, actions: [:index, :create, :show, :update, :delete]},
%{path: "/cap", module: OmniLcs.Api.CapController, actions: [:index, :create, :show, :update]}
]
}
# Point de terminaison HTTPS du Panneau de Contrôle
config :control_panel, ControlPanelWeb.Endpoint,
server: true,
url: [host: "0.0.0.0", path: "/"],
https: [port: 443, keyfile: "priv/cert/omnitouch.pem", certfile: "priv/cert/omnitouch.crt"],
adapter: Bandit.PhoenixAdapter,
secret_key_base: "REPLACE_WITH_64_BYTE_RANDOM_SECRET",
check_origin: false,
pubsub_server: ControlPanel.PubSub,
live_view: [signing_salt: "LcsLvSlt"]
# Logger
config :logger,
backends: [:console, ControlPanel.Logger]
# Paramètres généraux E-SMLC
config :omnilcs,
esmlc_name: "OmniLCS",
cell_database_path: "priv/cells.json"
# CBSP (Diffusion de Cellule 2G) - Les BSCs se connectent à ce port
config :omnilcs, :cbsp,
listen_ip: "0.0.0.0",
listen_port: 48049
# SABP (Diffusion de Cellule 3G) - Les RNCs se connectent à ce port
config :omnilcs, :sabp,
listen_ip: "0.0.0.0",
listen_port: 25419
# SLs (LCS-AP sur SCTP) - L'E-SMLC se connecte à ces MMEs pour le positionnement
config :omnilcs, :sls,
local_ip: "10.5.198.200",
mme_peers: [
%{host: "mme01", ip: "10.179.1.15", port: 9082}
]
# SBC-AP (Diffusion de Cellule 4G) - OmniLCS se connecte à ces MMEs
config :omnilcs, :sbcap,
local_ip: "10.5.198.200",
mme_peers: [
%{host: "mme01", ip: "10.179.2.100", port: 29168},
%{host: "mme02", ip: "10.179.2.101", port: 29168}
]
# Ingération et diffusion des alertes CAP
config :omnilcs, :cap,
require_approval: true,
plmn: %{mcc: "001", mnc: "01"},
coverage_aware: false,
feeds: []
# InfluxDB pour la synchronisation de position des cellules
config :omnilcs, OmniLcs.InfluxDb,
database: "nokia-monitor",
host: "172.19.3.68",
port: 8086,
auth: [method: :basic, username: "monitor", password: "REPLACE_WITH_PASSWORD"],
http_opts: [recv_timeout: 30_000],
pool: [max_overflow: 10, size: 5]
# Diameter (interface SLg vers DRA/MME - rôle GMLC, pas E-SMLC SLs)
config :diameter_ex,
diameter: %{
service_name: :omnitouch_esmlc,
listen_ip: "10.5.198.200",
listen_port: 3868,
host: "amanaki",
realm: "epc.mnc380.mcc313.3gppnetwork.org",
product_name: "OmniLCS",
request_timeout: 5000,
peer_selection_algorithm: :random,
allow_undefined_peers_to_connect: true,
log_unauthorized_peer_connection_attempts: true,
control_module: OmniLcs.Control.Diameter,
processor_module: DiameterEx.Processor,
auth_application_ids: [],
acct_application_ids: [],
vendor_id: 10415,
supported_vendor_ids: [5535, 10415],
applications: [
%{
application_name: :slg,
application_dictionary: :diameter_gen_3gpp_slg,
vendor_specific_application_ids: [
%{vendor_id: 10415, auth_application_id: 16_777_264, acct_application_id: nil}
]
}
],
peers: [
%{
host: "dra01.epc.mnc380.mcc313.3gppnetwork.org",
realm: "epc.mnc380.mcc313.3gppnetwork.org",
ip: "10.179.2.233",
port: 3868,
tls: false,
transport: :diameter_sctp,
initiate_connection: true
}
]
}