GMLC & Le 接口操作指南
OmniLCS 包含一个网关移动位置中心(GMLC)功能,向外部 LCS 客户端暴露 Le 接口。这允许公共安全应答点(PSAP)、车队管理系统、合法拦截平台和其他外部方通过 3GPP TS 29.172 中定义的基于 Diameter 的 Le 参考点请求订阅者位置。
GMLC 支持 即时 和 延迟 位置请求。延迟请求包括 周期性位置(定期报告位置)和 触发位置(当订阅者进入、离开或停留在某个地理区域时报告位置)。

架构
请求流程
即时位置请求
外部 LCS 客户端通过 Diameter 发送提供位置请求(PLR)。OmniLCS 授权客户端,运行定位引擎,并在提供位置应答(PLA)中返回结果。
周期性位置请求
当 PLR 包含设置了周期位的 Deferred-Location-Type 和分组 AVP 的 Periodic-LDR-Information 时,OmniLCS 创建一个周期会话,在指定的时间间隔内运行位置修正,并通过位置报告请求(LRR)交付每个结果。
触发(地理围栏)位置请求
当 PLR 包含区域事件信息时,OmniLCS 创建一个触发会话,轮询 UE 位置,并在满足触发条件时触发。
配置
GMLC 配置
config :omnilcs, :gmlc,
# 启用/禁用 GMLC Le 接口
enabled: true,
# 允许来自未授权列表中的客户端的请求
allow_unknown_clients: false,
# 授权的外部 LCS 客户端
authorized_clients: [
%{
name: "psap-01",
type: :emergency_services,
allowed_methods: [:cell, :ecid, :gnss, :otdoa],
rate_limit: 100,
description: "主要 PSAP"
},
%{
name: "fleet-mgmt",
type: :value_added_services,
allowed_methods: [:cell, :ecid],
rate_limit: 50,
description: "车队管理系统"
}
],
# 允许延迟(周期性/触发)位置请求
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,
# 将所有位置修正记录到 InfluxDB
influx_logging: true
GMLC 参数
| 参数 | 类型 | 必需 | 默认 | 描述 |
|---|---|---|---|---|
enabled | 布尔值 | 否 | false | 启用 GMLC Le 接口处理程序。当禁用时,所有 PLR 被视为标准 SLg 请求。 |
allow_unknown_clients | 布尔值 | 否 | false | 接受未列在 authorized_clients 中的客户端的请求。在集成测试期间设置为 true 以允许模式。 |
authorized_clients | 列表 | 否 | [] | 授权的外部 LCS 客户端配置列表。请参见下面的 客户端参数。 |
allow_deferred | 布尔值 | 否 | true | 接受延迟(周期性和触发)位置请求。当 false 时,仅处理即时请求。 |
max_periodic_sessions | 整数 | 否 | 100 | 最大并发周期性位置会话数。当超过时返回 Diameter 3004(TOO_BUSY)。 |
max_triggered_sessions | 整数 | 否 | 50 | 最大并发触发位置会话数。 |
default_periodic_poll_interval_ms | 整数 | 否 | 60000 | 当 PLR 中未指定时,周期性位置修正之间的默认间隔。 |
default_triggered_poll_interval_ms | 整数 | 否 | 30000 | 当在 Area-Event-Info AVP 中未指定时,触发会话的默认轮询间隔。 |
influx_logging | 布尔值 | 否 | true | 将 GMLC 会话中的所有位置修正写入 InfluxDB。 |
客户端参数
每个 authorized_clients 中的条目:
| 参数 | 类型 | 必需 | 默认 | 描述 |
|---|---|---|---|---|
name | 字符串 | 是 | -- | 客户端身份。与 PLR 中的 LCS-EPS-Client-Name 或 LCS-Requestor-ID-String AVP 匹配。 |
type | 原子 | 否 | :any | 预期的 LCS-Client-Type: :emergency_services, :value_added_services, :plmn_operator_services, :lawful_intercept_services, 或 :any。 |
allowed_methods | 列表 | 否 | [:cell, :ecid, :gnss, :otdoa] | 此客户端可以请求的位置方法。 |
rate_limit | 整数 | 否 | 0 | 每分钟的最大请求数。0 表示无限制。 |
description | 字符串 | 否 | "" | 控制面板的可读描述。 |
LCS 客户端类型
| 值 | 类型 | 描述 |
|---|---|---|
| 0 | 紧急服务 | PSAP,E-CSCF 紧急呼叫路由 |
| 1 | 增值服务 | 车队管理、资产跟踪、基于位置的服务 |
| 2 | PLMN 运营商服务 | 运营商内部服务(O&M,网络优化) |
| 3 | 合法拦截服务 | 执法位置请求 |
延迟位置类型
周期性位置
周期性位置会话在固定的时间间隔内执行可配置数量的位置修正。每个修正是:
- 由 E-SMLC 引擎使用请求的位置方法执行
- 作为带有会话元数据的
location_fix测量写入 InfluxDB - 通过标准位置记录器(CSV + ETS)记录
- 通过 Diameter LRR 交付给发起的 LCS 客户端
当报告计数耗尽时,会话终止。
使用的 Diameter AVP:
| AVP | 代码 | 描述 |
|---|---|---|
Deferred-Location-Type | 1480 | 设置第 4 位表示周期性 LDR |
Periodic-LDR-Information | 2025 | 包含报告参数的分组 AVP |
Reporting-Amount | 2026 | 要执行的位置修正数量 |
Reporting-Interval | 2027 | 修正之间的间隔(秒) |
触发(地理围栏)位置
触发位置会话轮询 UE 位置,并将其与一个或多个地理区域进行评估��当满足触发条件时,报告位置。
事件类型:
| 事件 | Deferred-Location-Type 位 | 触发条件 |
|---|---|---|
| 进入 | 位 1 | UE 从区域外过渡到区域内 |
| 离开 | 位 2 | UE 从区域内过渡到区域外 |
| 在内 | 位 3 | UE 在每次轮询时都在区域内 |
支持的区域定义:
- 圆形 -- 中心点(纬度,经度)和半径(米)
- 多边形 -- 定义封闭多边形的顶点列表
地理围栏评估器重用 CAP 警报多边形解析器中的射线投射算法进行多边形包含检查,并使用哈弗辛距离进行圆形区域检查。
InfluxDB 位置记录
所有 GMLC 会话修正都使用 location_fix 测量写入 InfluxDB:
标签:
| 标签 | 描述 |
|---|---|
imsi | 订阅者 IMSI |
method | 使用的位置方法(cell, ecid, gnss, otdoa) |
source | 引擎结果中的位置来源 |
session_type | periodic, triggered, 或 immediate |
client_name | 请求的 LCS 客户端的名称 |
字段:
| 字段 | 类型 | 描述 |
|---|---|---|
latitude | 浮点数 | WGS84 纬度(度) |
longitude | 浮点数 | WGS84 经度(度) |
altitude | 浮点数 | 海拔(米,若可用) |
uncertainty | 浮点数 | 位置不确定��(米) |
confidence | 整数 | 置信水平(0-100) |
duration_ms | 整数 | 执行修正所需的时间 |
示例 InfluxQL 查询:
-- 订阅者的最新修正
SELECT * FROM location_fix WHERE imsi = '001010000000001' ORDER BY time DESC LIMIT 10
-- 最近一小时的周期性会话跟踪
SELECT latitude, longitude FROM location_fix
WHERE session_type = 'periodic' AND imsi = '001010000000001' AND time > now() - 1h
-- 按方法的修正成功率
SELECT COUNT(*) FROM location_fix WHERE time > now() - 24h GROUP BY method
-- 地理围栏触发事件
SELECT * FROM location_fix WHERE session_type = 'triggered' AND time > now() - 24h
REST API
延迟位置 API 可在 https://<host>:8443/api/deferred_location 访问。
列出活动会话
GET /api/deferred_location
响应:
{
"status": "ok",
"count": 2,
"data": [
{
"session_id": "a1b2c3d4-...",
"type": "periodic",
"imsi": "001010000000001",
"method": "cell",
"client_name": "rest-api",
"status": "active",
"interval_ms": 60000,
"remaining_reports": 7,
"total_reports": 10,
"started_at": "2026-04-09T10:00:00Z",
"last_fix_at": "2026-04-09T10:03:00Z"
}
]
}
创建周期性会话
POST /api/deferred_location
Content-Type: application/json
{
"type": "periodic",
"imsi": "001010000000001",
"method": "cell",
"interval_seconds": 60,
"count": 10
}
创建触发会话
POST /api/deferred_location
Content-Type: application/json
{
"type": "triggered",
"imsi": "001010000000001",
"method": "cell",
"event_type": "entering",
"poll_interval_seconds": 30,
"max_reports": 0,
"areas": [
{
"type": "circle",
"center": {"lat": -33.8688, "lon": 151.2093},
"radius_meters": 500
}
]
}
取消会话
DELETE /api/deferred_location/:session_id
指标
Le 接口请求
指标: omnilcs_gmlc_le_request_total
类型: 计数器
描述: 来自外部 LCS 客户端的总 Le 接口请求
标签:
client_type-- LCS 客户端类型(emergency_services, value_added_services 等)result-- 请求结果:received,success,error,unauthorized
指标: omnilcs_gmlc_le_request_duration
类型: 直方图
描述: Le 请求处理时间(毫秒)
标签:
client_type-- LCS 客户端类型
位置报告请求
指标: omnilcs_gmlc_lrr_total
类型: 计数器
描述: 发送给外部客户端的总位置报告请求
标签:
session_type--periodic或triggeredresult--sent或error
会话跟踪
指标: omnilcs_gmlc_session_periodic_active
类型: 测量
描述: 活动周期性位置会话的数量
指标: omnilcs_gmlc_session_triggered_active
类型: 测量
描述: 活动触发/地理围栏位置会话的数量
指标: omnilcs_gmlc_session_total
类型: 计数器
描述: 创建的总延迟会话
标签:
type--periodic或triggered
地理围栏事件
指标: omnilcs_gmlc_geofence_trigger_total
类型: 计数器
描述: 触发的总地理围栏事件
标签:
event_type--entering,leaving或being_inside
InfluxDB 写入
指标: omnilcs_gmlc_influx_write_total
类型: 计数器
描述: 来自 GMLC 会话的总 InfluxDB 位置修正写入
标签:
result--success或error
示例 Prometheus 查询:
# Le 请求速率
rate(omnilcs_gmlc_le_request_total[5m])
# 按类型的延迟会话创建速率
rate(omnilcs_gmlc_session_total[5m])
# 地理围栏触发速率
rate(omnilcs_gmlc_geofence_trigger_total[5m])
# LRR 交付错误比例
sum(rate(omnilcs_gmlc_lrr_total{result="error"}[5m]))
/ sum(rate(omnilcs_gmlc_lrr_total[5m]))
故障排除
Le 请求返回 5012 (UNABLE_TO_COMPLY)
症状: 外部 LCS 客户端对所有 PLR 接收到结果代码 5012。
可能原因:
- 配置中未启用 GMLC (
enabled: false) - 客户端不在
authorized_clients中且allow_unknown_clients为false - E-SMLC 引擎无法连接到任何 MME(检查 SL 连接状态)
解决方案:
- 验证
config :omnilcs, :gmlc, enabled: true是否已设置 - 检查客户端名称是否与 PLR 中的
LCS-EPS-Client-NameAVP 匹配 - 验证 SL 连接是否在仪表板或 SL 页面上建立
周期会话未启动
症状: 带有周期性延迟类型的 PLR 返回 3004 (TOO_BUSY)。
可能原因:
- 达到
max_periodic_sessions限制 - 会话监督员未运行
解决方案:
- 检查 GMLC 控制面板页面上的活动会话计数
- 如有需要,增加
max_periodic_sessions - 验证
OmniLcs.Gmlc.SessionSupervisor是否在应用页面中运行
位置修正未出现在 InfluxDB 中
症状: 周期/触发会话正在运行,但 InfluxDB 中没有数据。
可能原因:
influx_logging设置为false- InfluxDB 连接中断
- 数据库不存在
解决方案:
- 验证 GMLC 配置中的
influx_logging: true - 检查 InfluxDB 连接(���元同步状态是一个良好的代理)
- 直接查询 InfluxDB:
SHOW MEASUREMENTS应包括location_fix
地理围栏未触发
症状: 触发会话处于活动状态但从未触发。
可能原因:
- 区域定义对于定位方法的精度过小
- 错误的事件类型(例如,当订阅者已经在外部时使用
:leaving) - 定位方法返回
nil坐标
解决方案:
- 检查定位方法的精度 -- 小区 ID 具有公里级的不确定性,可能对于小地理围栏过于粗糙
- 对于较小区域,使用更精确的方法(
:ecid或:gnss) - 验证区域坐标是否正确(纬度/经度顺序)