From d6291d025431356e5f788e1a6a06593af94bc040 Mon Sep 17 00:00:00 2001 From: MengMengCode <227010654+MengMengCode@users.noreply.github.com> Date: Thu, 20 Aug 2026 03:35:10 +0800 Subject: [PATCH] feat: add device API management layer and SMS runtime for VoWiFi integration --- internal/server/device_api.go | 31 ++++++++++++++++++++++++++++++ internal/vowifi/ims/sms_runtime.go | 6 ++---- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/internal/server/device_api.go b/internal/server/device_api.go index 3b9410f..2bfe65d 100644 --- a/internal/server/device_api.go +++ b/internal/server/device_api.go @@ -1183,6 +1183,37 @@ func (s *Server) handleUSSD(w http.ResponseWriter, r *http.Request, config store } ctx, cancel := actionRequestContext(r.Context(), request.TimeoutMs) defer cancel() + + cmd := strings.TrimSpace(request.Command) + if cmd == "*#06#" || cmd == "*#06" { + imei := config.ModemIMEI + if imei == "" { + if runtime, runtimeErr := s.store.DeviceRuntime(ctx, id); runtimeErr == nil { + imei = runtime.IMEI + } + } + if imei != "" { + writeUSSDResult(w, device.USSDResult{ + Text: fmt.Sprintf("IMEI: %s", imei), + Status: "final", + }) + return true + } + } + if cmd == "*#0000#" || cmd == "*#0000" { + firmware := "" + if runtime, runtimeErr := s.store.DeviceRuntime(ctx, id); runtimeErr == nil { + firmware = runtime.Firmware + } + if firmware != "" { + writeUSSDResult(w, device.USSDResult{ + Text: fmt.Sprintf("Software Version: %s", firmware), + Status: "final", + }) + return true + } + } + // VoWiFi-first: when VoWiFi owns the radio the cellular CUSD path has no // network to talk to (CFUN=4 returns +CME ERROR: 30). Route over IMS/USSI // when the IMS session is registered, and fall back to cellular CUSD only diff --git a/internal/vowifi/ims/sms_runtime.go b/internal/vowifi/ims/sms_runtime.go index 3069f76..a5b223a 100644 --- a/internal/vowifi/ims/sms_runtime.go +++ b/internal/vowifi/ims/sms_runtime.go @@ -891,10 +891,8 @@ func (session *Session) parseUSSIReply(response *sipResponse) (string, *int) { } func (session *Session) ussiTarget() string { - if number, _, ok := vowifi.ExtractAssociatedMSISDN(session.evidence); ok { - if normalized := normalizeE164(number); normalized != "" { - return "tel:" + normalized - } + if domain := strings.TrimSpace(session.identity.domain); domain != "" { + return "sip:" + domain } return session.identity.public }