TLDR:使用hideck成功拉起VOXI esim卡wifi calling实现发短信保号

AI时代,越来越多的互联网服务注册要求手机号认证,众所周知一些网站不对国内服务,因此海外sim卡已经成为IT基础设施之一了。

之前购买了VOXI的esim搭配eUICC白卡修改默认apn后能够成功接收短信,但是由于无法拉起WifiCalling无法拨打电话或者发送短信,产生不了费用导致无法保号。充完5英镑后,想着180天还有很久便搁置下了。

最近在思考openwrt+sms-tools的替代方案,sms-tools删除短信时经常会有bug,以及没有API或者消息推送用来获取短信内容。正当准备让AI写一个USB LTE MODEM管理软件时,发现有VoHive这种现成的项目,不过江湖再见了,于是又找到了HiDeck和这篇文章,试了下果然成功了。

弯路

最初按照网上视频教程里的过程操作,让ios15的iphone7关闭飞行模式打开Wifi,并且获得了英国IP后,尝试打开无线局域网通话,能看到隧道有网络流量产生,但是一直没有获得WifiCall标志。

因为iphone不方便获取相关日志,没法知道失败的原因,有说法是要用英国家宽的IP,但手头的主机都是数据中心的IP。

事实证明并不需要家宽IP也可以拉起WifiCalling,卡策略-通话方式选择Wifi calling之后,会自动开启飞行模式,不一会就发现VoWifi已连接。

查看日志可以观察IMS注册过程

[2026-10-14 20:50:13]INFOdevice/vowifi_start_orchestrator.go:523[wwan0] 进入飞行模式以禁用原生 IMS 注册 {"trace_id": "62b64fa0c451c2ec", "backend": "qmi"}
[2026-10-14 20:50:20]INFOdevice/vowifi_start_orchestrator.go:185[wwan0] VoWiFi 使用 QMI 模式鉴权 {"trace_id": "0d2958224e0fa13d"}
[2026-10-14 20:50:20]INFOdevice/vowifi_start_orchestrator.go:203[wwan0] VoWiFi 启动前读取当前设备身份 {"trace_id": "0d2958224e0fa13d", "iccid": "xxxx", "imsi": "xxxx", "imei": "xxxx"}
[2026-10-14 20:50:20]INFOdevice/vowifi_start_profile.go:93[wwan0] VoWiFi 启动前获取 SMSC 成功 {"trace_id": "0d2958224e0fa13d"}
[2026-10-14 20:50:20]INFOdevice/vowifi_start_profile.go:50[wwan0] VoWiFi 启动画像将基于实时 IMSI 构建 {"trace_id": "0d2958224e0fa13d", "source": "live_imsi", "plmn_source": "sim_home", "native_mcc": "234", "native_mnc": "15", "iccid": "xxxx", "imsi": "xxxx", "mcc": "234", "mnc": "15", "imei": "xxxx"}
[2026-10-14 20:50:20]INFOdevice/vowifi_start_orchestrator.go:227[wwan0] VoWiFi 使用 APDU(AKA) 鉴权 {"trace_id": "0d2958224e0fa13d"}
[2026-10-14 20:50:20]INFOdevice/vowifi_start_orchestrator.go:290[wwan0] VoWiFi 启动画像已准备 {"trace_id": "0d2958224e0fa13d", "matched_plmn": "234/015", "preset_id": "vodafone_uk_23415", "device_model": "rmx3366", "ike_proposals": ["aes256-sha512-prfsha512-modp2048", "aes256-sha256-prfsha512-modp2048", "aes256-sha256-modp2048", "aes128-sha256-modp2048", "aes128-sha256-modp1024", "aes128-sha1-modp1024", "aes256-sha1-modp1024"], "esp_proposals": ["aes256-sha512", "aes256-sha256", "aes128-sha256", "aes256gcm16", "aes128gcm16", "aes128-sha1"], "reauth_seconds": 0, "epdg_source": "standard", "epdg": "epdg.epc.mnc015.mcc234.pub.3gppnetwork.org", "identity_source": "carrier_device_model", "requested_source": "", "actual_source": "", "aka_app_preference": "", "applied": false}
[2026-10-14 20:50:20]INFOdevice/vowifi_start_orchestrator.go:630[wwan0] VoWiFi 卡策略指定前置代理 {"trace_id": "0d2958224e0fa13d", "iccid": "xxxx", "upstream_proxy_id": "uk", "proxy_route": "card_override"}
[2026-10-14 20:50:20]INFOdevice/vowifi_start_orchestrator.go:320[wwan0] VoWiFi 启用中,停止网络功能 {"trace_id": "0d2958224e0fa13d"}
[2026-10-14 20:50:20]INFOqmi/manager.go:1682[wwan0] 断开数据连接
[2026-10-14 20:50:20]INFOdevice/vowifi_start_orchestrator.go:519[wwan0] 设备已处于飞行模式,跳过冗余的飞行模式切换 {"trace_id": "0d2958224e0fa13d", "backend": "qmi"}
[2026-10-14 20:50:33]INFOvowifihost/lifecycle_run.go:182[wwan0] VoWiFi SWu 隧道已建立,正在等待 IMS 注册 {"trace_id": "0d2958224e0fa13d", "cost_ms": 12897}
[2026-10-14 20:50:33]INFOlogging/logger.go:9[wwan0] IMS P-CSCF configuration from new tunnel {"inner_ip": "10.131.73.126", "assigned_pcscf_v4": ["10.127.192.83","10.127.67.198"], "assigned_pcscf_v6": null, "registrar": "10.127.192.83:5060;10.127.67.198:5060"}
[2026-10-14 20:50:33]INFOlogging/logger.go:9[wwan0] IMS P-CSCF candidates resolved {"source": "registrar", "previous_candidates": [], "candidates": ["10.127.192.83:5060", "10.127.67.198:5060"]}
[2026-10-14 20:50:33]INFOlogging/logger.go:9[wwan0] IMS P-CSCF candidate eligibility {"selected": "10.127.192.83:5060", "candidates": [{"registrar":"10.127.192.83:5060","retry_not_before":"0001-01-01T00:00:00Z","deprioritized_until":"0001-01-01T00:00:00Z","failures":0},{"registrar":"10.127.67.198:5060","retry_not_before":"0001-01-01T00:00:00Z","deprioritized_until":"0001-01-01T00:00:00Z","failures":0}]}
[2026-10-14 20:50:33]INFOlogging/logger.go:9[wwan0] IMS REGISTER attempt {"cseq": 2, "pcscf": "10.127.192.83:5060", "inner_ip": "10.131.73.126", "reg_id": "", "port_s_generation": 0, "port_s_connected": false, "port_s_last_inbound_at": "[0001-01-01 00:00:00]"}
[2026-10-14 20:50:33]INFOlogging/logger.go:9[wwan0] IMS REGISTER via ports {"transport": "udp", "via_port": 26940, "cfg_local_port": 26940, "port_c": 33202, "port_s": 27639, "via_eq_port_c": false, "via_eq_port_s": false, "udp_via_uses_port_s": true, "protected": false}
[2026-10-14 20:50:34]INFOlogging/logger.go:9[wwan0] IMS REGISTER response {"cseq": 2, "status": 401, "security_server": true, "digest_challenge": true}
[2026-10-14 20:50:34]INFOlogging/logger.go:9IMS 3GPP IPsec policy installed {"auth": "hmac-sha-1-96", "encryption": "aes-cbc", "local_client_port": 33202, "local_server_port": 27639, "remote_client_port": 50601, "remote_server_port": 50600}
[2026-10-14 20:50:34]INFOlogging/logger.go:9[wwan0] IMS security association identifiers {"local_ip": "10.131.73.126", "remote_ip": "10.127.192.83", "inbound_spi_c": 776663155, "inbound_spi_s": 1290562706, "outbound_spi_c": 1522746524, "outbound_spi_s": 1008475550}
[2026-10-14 20:50:34]INFOlogging/logger.go:9IMS secure signaling channel selected {"attempts": ["tcp:ok"]}
[2026-10-14 20:50:34]INFOlogging/logger.go:9IMS protected REGISTER TCP connected {"local_port": 33202, "remote_port": 50600}
[2026-10-14 20:50:34]INFOlogging/logger.go:9IMS secure signaling channel established {"network": "tcp", "local": "10.131.73.126:33202", "remote": "10.127.192.83:50600"}
[2026-10-14 20:50:34]INFOlogging/logger.go:9[wwan0] IMS protected UDP receiver listening {"pcscf": "10.127.192.83:5060", "local": "10.131.73.126:27639", "remote": "10.127.192.83:50601"}
[2026-10-14 20:50:34]INFOlogging/logger.go:9[wwan0] IMS REGISTER attempt {"cseq": 3, "pcscf": "10.127.192.83:5060", "inner_ip": "10.131.73.126", "reg_id": "", "port_s_generation": 0, "port_s_connected": false, "port_s_last_inbound_at": "[0001-01-01 00:00:00]"}
[2026-10-14 20:50:34]INFOlogging/logger.go:9[wwan0] IMS REGISTER via ports {"transport": "tcp", "via_port": 26940, "cfg_local_port": 26940, "port_c": 33202, "port_s": 27639, "via_eq_port_c": false, "via_eq_port_s": false, "udp_via_uses_port_s": false, "protected": true}
[2026-10-14 20:50:35]INFOlogging/logger.go:9[wwan0] IMS REGISTER response {"cseq": 3, "status": 200, "security_server": false, "digest_challenge": false}
[2026-10-14 20:50:35]INFOlogging/logger.go:9[wwan0] IMS REGISTER flow negotiation {"supported_outbound": false, "required_outbound": false, "via_keep": false, "path_present": true, "path_ob": true, "service_route_count": 1, "service_route_orig": false, "contact_reg_id": false}
[2026-10-14 20:50:35]INFOlogging/logger.go:9[wwan0] IMS REGISTER completing outbound flow
[2026-10-14 20:50:35]INFOlogging/logger.go:9[wwan0] IMS REGISTER attempt {"cseq": 4, "pcscf": "10.127.192.83:5060", "inner_ip": "10.131.73.126", "reg_id": "1", "port_s_generation": 0, "port_s_connected": false, "port_s_last_inbound_at": "[0001-01-01 00:00:00]"}
[2026-10-14 20:50:35]INFOlogging/logger.go:9[wwan0] IMS REGISTER via ports {"transport": "tcp", "via_port": 26940, "cfg_local_port": 26940, "port_c": 33202, "port_s": 27639, "via_eq_port_c": false, "via_eq_port_s": false, "udp_via_uses_port_s": false, "protected": true}
[2026-10-14 20:50:35]INFOlogging/logger.go:9[wwan0] IMS REGISTER response {"cseq": 4, "status": 503, "security_server": false, "digest_challenge": false}
[2026-10-14 20:50:35]WARNlogging/rate_limit.go:30[wwan0] IMS outbound binding refresh failed; keep current registration {"err": "imscore: registration failed during authenticated REGISTER with status 503 (Service Unavailable)"}
[2026-10-14 20:50:35]INFOlogging/logger.go:9[wwan0] IMS REGISTER succeeded {"registration_generation": 1, "pcscf": "10.127.192.83:5060", "inner_ip": "10.131.73.126", "reg_id": 0, "expires_seconds": 3590, "transport": "tcp", "protected_tcp": true, "sec_agree": true, "public_id": "***@ims.mnc015.mcc234.3gppnetwork.org"}
[2026-10-14 20:50:35]INFOlogging/logger.go:9[wwan0] IMS downlink path diagnostics {"event": "registered", "pcscf": "10.127.192.83:5060", "port_s_listener": "10.131.73.126:27639", "port_s_udp_listener": "10.131.73.126:27639", "network": {"available":true,"bridge":{"OutboundPackets":15,"InboundPackets":12,"OutboundErrors":0,"InboundErrors":0,"InboundReadPackets":12,"InboundReadErrors":0,"InboundTransformErrors":0,"OutboundTransformErrors":0,"OutboundWriteErrors":0},"context_done":false,"inner_endpoint":{"OutboundPackets":15,"InboundPackets":12,"SAMisses":0,"EncapsulationErrors":0,"DecapsulationErrors":0,"SendErrors":0,"LastOutboundLen":88,"LastInboundLen":488},"ipsec":{"local_ip":"10.131.73.126","remote_ip":"10.127.192.83","stats":{"OutboundPackets":11,"InboundPackets":10,"PassthroughPackets":0,"TransformErrors":0,"Replay":{"Accepted":10,"Duplicate":0,"TooOld":0}},"unknown_inbound_spi":0,"flow_c":{"local_port":33202,"remote_port":50600,"inbound_spi":776663155,"outbound_spi":1522746524,"inbound_decoded":{"packets":10,"udp":0,"syn":0,"syn_ack":1,"ack":9,"rst":0,"transform_errors":0,"replay_rejected":0,"selector_mismatches":0,"last_packet_at":"2026-10-14T20:50:35.520942155+08:00"},"outbound_protected":{"packets":11,"udp":0,"syn":1,"syn_ack":0,"ack":10,"rst":0,"transform_errors":0,"replay_rejected":0,"selector_mismatches":0,"last_packet_at":"2026-10-14T20:50:35.521032188+08:00"}},"flow_s":{"local_port":27639,"remote_port":50601,"inbound_spi":1290562706,"outbound_spi":1008475550,"inbound_decoded":{"packets":0,"udp":0,"syn":0,"syn_ack":0,"ack":0,"rst":0,"transform_errors":0,"replay_rejected":0,"selector_mismatches":0,"last_packet_at":"0001-01-01T00:00:00Z"},"outbound_protected":{"packets":0,"udp":0,"syn":0,"syn_ack":0,"ack":0,"rst":0,"transform_errors":0,"replay_rejected":0,"selector_mismatches":0,"last_packet_at":"0001-01-01T00:00:00Z"}}},"ipsec_generation":1,"ipsec_installed":true,"previous_ipsec":null}}
[2026-10-14 20:50:35]INFOlogging/logger.go:9[wwan0] IMS SUBSCRIBE(reg) skipped {"reason": "registration event subscription rejected with status 489; waiting for IMS identity deregistration"}
[2026-10-14 20:50:35]INFOlogging/logger.go:9[wwan0] IMS SUBSCRIBE(mwi) starting
[2026-10-14 20:50:36]INFOlogging/logger.go:9[wwan0] IPSec portS accepted server push connection {"remote": "10.127.192.83:50601", "local": "10.131.73.126:27639"}
[2026-10-14 20:50:36]INFOlogging/logger.go:9[wwan0] IMS port-s lifecycle {"event": "opened", "generation": 1, "pcscf": "10.127.192.83:5060", "inner_ip": "10.131.73.126", "remote": "10.127.192.83:50601", "local": "10.131.73.126:27639"}
[2026-10-14 20:50:36]INFOlogging/logger.go:9[wwan0] IMS SMS receiver ready {"reason": "IMS SMS receiver ready"}
[2026-10-14 20:50:36]WARNlogging/rate_limit.go:30[wwan0] IMS SUBSCRIBE(mwi) failed; keeping current registration {"err": "imscore: SUBSCRIBE message-summary was routed back to the local contact: SUBSCRIBE rejected with status 405 (Method Not Allowed)"}
[2026-10-14 20:50:38]INFOlogging/logger.go:9[wwan0] XCAP PDN established {"ipv4": true, "ipv6": false}
[2026-10-14 20:50:38]INFOvowifihost/runtime_readiness.go:49[wwan0] VoWiFi IMS 注册已就绪 {"trace_id": "0d2958224e0fa13d", "cost_ms": 18509}
[2026-10-14 20:50:38]INFOvowifihost/runtime_readiness.go:74[wwan0] VoWiFi 已启用、短信模式已切换为 VoWiFi {"trace_id": "0d2958224e0fa13d", "active_count": 1, "cost_ms": 18509}

保号

连上VoWifi后就可以发送短信来保号了,尝试了给+86手机号发短信成功扣费了,虽然实际没有收到短信。或许是运营商拦截了境外短信呢。

如果想要验证发送短信功能是否正常,可以免费发送短信INFO到85075,自动收到短信回复的话就是正常了。

一些猜测

iphone上默认apn是wap.vodafone.co.uk,这时候连国内运营商的漫游信号都收不到,修改成payg.talkmobile.co.uk之后就能成功驻网漫游接收短信了。但是Hideck上,使用自动apn,也能直接获得中国移动的漫游信号,查询apn发现当前使用的apn是3gnet和ims。

>AT+CGCONTRDP

+CGCONTRDP: 1,5,3gnet,10.22.153.209,,,
+CGCONTRDP: 2,6,ims,10.105.178.69,,,,10.127.192.83,10.127.67.198

或许在国内只要用3gnet默认的apn配置就可以了吧,iphone上获取了sim卡的vodafone apn配置反而不行。

另外通过wificalling注册完ims之后,之后通话方式改成蜂窝数据也能保持wifi calling连接。不过这时候发现是接入了中国移动的信号漫游的,听说英国运营商只允许短期旅行漫游使用,为了防止封号还是开启飞行模式使用wifi calling来收发短信吧。或许有用呢。