2026年4月23日 星期四

eSIM 標準演進

Gemini Q&A

1. M2M (SGP.02):Pushed profile download via service provider platfrom direct to the device.
2. CONSUMER (SGP.22):Pull profile, could be activated with QR code or pre-provisioned on a device.
3. IoT (SGP.32):Allows users to order a profile from any operator, connecting to the relevant SM-DP.
三者有何不同?
這三種 GSMA 標準代表了 eSIM 技術的演進過程,主要區別在於 「誰發起下載」 以及 「架構的控制權」。
簡單來說,M2M 是為了自動化管理,Consumer 是為了用戶便利,而最新的 IoT (SGP.32) 則是結合了兩者的優點,解決了過去物聯網設備切換電信商太過困難的問題。
以下是針對這三者的詳細比較:

M2M (SGP.02):被動推送模式 (Push)
這是最早期的工業標準,主要設計給不需要人為介入的設備(如:智慧電表、車聯網)
核心邏輯: 設備是被動的。由後台管理平台 (SM-SR) 發送指令給設備,強制其下載或切換 Profile

優點: 適合管理成千上萬台沒有螢幕、分佈在全球的工業設備

缺點: 架構僵化。設備在出廠時就必須綁定特定的 SM-SR 平台。如果企業想換電信商,流程非常複雜,通常需要電信商之間進行後台對接

Consumer (SGP.22):主動拉取模式 (Pull)
這是我們目前手機(iPhone, Android)上最常見的標準。

核心邏輯: 以「人」為中心。用戶透過掃描 QR Code 或點擊設定,主動向電信商伺服器 (SM-DP+) 請求下載 Profile

優點: 靈活性極高,使用者可以隨時更換電信商

缺點: 需要人為操作。對於沒有螢幕、沒有 UI 的物聯網設備來說,掃 QR Code 是不可能的,因此不適合大規模物聯網部署

IoT (SGP.32):新型物聯網標準 (Best of Both Worlds)
這是 GSMA 為了克服前兩者的痛點而推出的最新標準,又被稱為 "eSIM for IoT"。

核心邏輯: 延用 Consumer 的 SM-DP+ 架構(簡單易接),但引入了 eIM (eSIM IoT Manager) 角色

運作方式: 管理者透過 eIM 下達指令,設備會像手機一樣「主動」去拉取 Profile,但這個過程是自動化的,不需要人去掃碼

進步之處: 取消了 SM-SR: 不再需要複雜的電信商後台對接

低功耗支持: 針對省電需求高的 IoT 設備優化了通訊協議


特性 M2M (SGP.02) Consumer (SGP.22) IoT (SGP.32)
互動模式 Push (後台推送到設備) Pull (用戶主動拉取) Managed Pull (由 eIM 指令驅動)
目標對象 無人值守設備 (電表、車子) 個人消費裝置 (手機、平板) 各類物聯網設備 (輕量化、大規模)
主要元件 SM-DP, SM-SR SM-DP+, LPA SM-DP+, eIM, IPA
切換彈性 低 (綁定特定管理平台) 極高 (掃碼即換) 高 (無需後台對接即可切換)
人機介面 不需要 絕對需要 (螢幕/相機) 不需要


總結
SGP.02 是為了管控,但太笨重。
SGP.22 是為了體驗,但無法自動化。
SGP.32 是為了規模化,它讓物聯網設備能像手機一樣輕鬆切換電信商,卻不需要人類去操作。


ref:eSIM 流程圖

2026年4月22日 星期三

Remove all the COM/Modem ports on Win10

Open Powershell

Remove all the COM ports
PS C:\Users\ubuntu> Get-PnpDevice | Where-Object { $_.Class -eq "Ports" -and $_.Present -eq $false } | ForEach-Object { pnputil /remove-device $_.InstanceId }
Microsoft PnP 公用程式

正在移除裝置:          FTDIBUS\VID_0403+PID_6011+09001550C\0000
已順利移除裝置。


a.   Get-PnpDevice: 獲取所有裝置列表。
b.   $_.Class -eq "Ports": 篩選出屬於「連接埠 (COM 和 LPT)」的裝置。
c.   $_.Present -eq $false: 篩選出「目前不在線上(隱藏)」的裝置。
d.   pnputil /remove-device: 強制移除這些裝置

Remove all the Modem ports
PS C:\Users\ubuntu> Get-PnpDevice | Where-Object { $_.Class -eq "Modem" -and $_.Present -eq $false } | ForEach-Object { pnputil /remove-device $_.InstanceId }
Microsoft PnP 公用程式

正在移除裝置:          USB\VID_1BC7&PID_1031&MI_02\6&170AB803&1&0002
已順利移除裝置。2

2026年4月8日 星期三

Telit LE910Q1 ECM Mode

LE910Q1
ECM Mode, VID: 7021
$ lsusb
Bus 003 Device 009: ID 1bc7:7021 Telit Wireless Solutions TelitCinterion Compo

Get IPv6 only via AT command
at+cgdcont=1,"IPv6",""
OK


at+cgpaddr=1
+CGPADDR: 1,"32.1.180.0.226.169.68.63.134.237.190.6.38.2.50.16"


AT#SGACT=1,1
OK

AT#PING="2001:4860:4860::8888"
#PING: 01,32.1.72.96.72.96.0.0.0.0.0.0.0.0.136.136,1,116
#PING: 02,32.1.72.96.72.96.0.0.0.0.0.0.0.0.136.136,0,116
#PING: 03,32.1.72.96.72.96.0.0.0.0.0.0.0.0.136.136,0,116
#PING: 04,32.1.72.96.72.96.0.0.0.0.0.0.0.0.136.136,0,116
OK

Set RA config
強制觸發: 有時候需要手動開啟內核對 RA (Router Advertisement) 的接收:
accept_ra: 決定是否接收來自基地台(電信商)的路由器公告訊息(Router Advertisement)。
autoconf: 決定是否根據收到的 RA 訊息,自動產生 IPv6 位址(SLAAC 流程)。

$ sudo sysctl -w net.ipv6.conf.wwan0.accept_ra=2 
    0:關閉。不接受 Router Advertisement (RA)。
    1:預設。如果該網卡沒有開啟轉發 (forwarding=0),則接受 RA。
    2:強制開啟。即使該網卡開啟了轉發 (forwarding=1),依然接受 RA。

$ sudo sysctl -w net.ipv6.conf.wwan0.autoconf=1

$ cat /proc/sys/net/ipv6/conf/wwan0/accept_ra

$ cat /proc/sys/net/ipv6/conf/wwan0/auto

$ reboot

Enable the wireless card


$ sudo ifconfig wwx2026123aa up

$ ifconfig wwx2026123aa

wwx2026123aa: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 2001:b400:e2a9:ffff:ffff:ffff:ffff:cc88  prefixlen 64  scopeid 0x0<global>
        inet6 2001:b400:e2a9:ffff:ffff:ffff:ffff:96aa  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::2289:84ff:fe6a:96aa  prefixlen 64  scopeid 0x20<link>
        ether 11:11:11:11:11:11  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

應該能直接得到IPv6 address
模組透過ECM Mode計算後,分配兩組IP(無狀態自動配置(SLAAC))


ECM 模式與 IP 分配邏輯
在 CDC-ECM 模式下,模組會模擬成一張標準的乙太網路卡。當介面 up 之後,流程如下:
1. RS/RA 封包交換: 主機發送 Router Solicitation (RS),模組(或電信端網路)回覆 Router Advertisement (RA)。
2. Prefix 下發: RA 封包會提供一個 /64 的網路前綴(Prefix),例如你畫面中的 2001:b400:e2a9:443f::/64。
3. SLAAC 計算:
主機根據這個 Prefix,結合自身的 MAC 位址或隨機數,自動計算出 Global 廣域位址。
由於 Linux 核心通常預設開啟了 IPv6 Privacy Extensions (RFC 4941),所以會同時產生一組「固定」與一組「臨時」的位址,這就是你看到「兩組全球 IP」的原因。

類型 位址範例 說明
Global (隱私位址) 2001:b400:...:cc88 臨時性位址 (Temporary Address)。為了保護隱私,系統會隨機產生一組位址用於對外連線,避免追蹤。
Global (固定位址) 2001:b400:...:96aa 公共位址 (Public Address)。由 Prefix + 介面識別碼組成,通常較固定,可用於被動接收連線。
Link-Local fe80::...:96aa 區域連結位址。僅用於本地端(模組與主機之間)的通訊,不跨越路由器。



Set the IPv6 route
$ ip -6 route
::1 dev lo proto kernel metric 256 pref medium
2001:1111:2222:3333::/64 dev wwx2026123aa proto kernel metric 256 pref medium
fe80::/64 dev wwx2089846a96aa proto kernel metric 256 pref medium
default via fe80::aaaa:bbbb:cccc:e685 dev wwx2089846a96aa proto ra metric 1024 expires 65525sec hoplimit 255 pref high

$ sudo ip -6 rule add from 2001:1111:2222:3333::/64 lookup 100

$ sudo ip -6 route replace default via fe80::aaaa:bbbb:cccc:e685 dev wwx2026123aa table 100

$ sudo ip -6 route add default via fe80::aaaa:bbbb:cccc:e685 dev wwx2026123aa metric 100



$ ip -6 route
::1 dev lo proto kernel metric 256 pref medium
2001:1111:2222:3333::/64 dev wwx2089846a96aa proto kernel metric 256 pref medium
fe80::/64 dev wwx2089846a96aa proto kernel metric 256 pref medium
default via fe80::aaaa:bbbb:cccc:e685 dev wwx2089846a96aa metric 100 pref medium
default via fe80::aaaa:bbbb:cccc:e685 dev wwx2089846a96aa proto ra metric 1024 expires 65507sec hoplimit 255 pref high


$ ping6 -I wwx2089846a96aa 2001:4860:4860::8888
PING 2001:4860:4860::8888(2001:4860:4860::8888) from 2001:b400:e255:a973:8836:4d92:92bd:f430 wwx2089846a96aa: 56 data bytes
64 bytes from 2001:4860:4860::8888: icmp_seq=1 ttl=115 time=43.1 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=2 ttl=115 time=64.6 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=3 ttl=115 time=37.9 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=4 ttl=115 time=37.1 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=5 ttl=115 time=55.8 ms
^C
--- 2001:4860:4860::8888 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 37.056/47.690/64.591/10.783 ms


$ ifconfig wwx2026123aa

wwx2026123aa: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 2001:b400:e2a9:aaaa:bbbb:cccc:dddd:cc88  prefixlen 64  scopeid 0x0<global>
        inet6 2001:b400:e2a9:ffff:ffff:ffff:ffff:96aa  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::2289:84ff:fe6a:96aa  prefixlen 64  scopeid 0x20<link>
        ether 11:11:11:11:11:11  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


$ ping6 -I 2001:b400:e2a9:aaaa:bbbb:cccc:dddd:cc88 2001:4860:4860::8888
PING 2001:4860:4860::8888(2001:4860:4860::8888) from 2001:b400:e255:1111:2222:3333:4444:5555 : 56 data bytes
64 bytes from 2001:4860:4860::8888: icmp_seq=1 ttl=114 time=153 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=2 ttl=115 time=52.4 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=3 ttl=115 time=51.1 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=4 ttl=115 time=52.5 ms
^C
--- 2001:4860:4860::8888 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 51.108/77.171/152.633/43.571 ms


Set DNS
$sudo resolvectl dns wwx2026123aa 2001:4860:4860::8888 2001:4860:4860::8844

#Tell the system this interface is the "default" for all DNS queries
$ sudo resolvectl domain wwx2026123aa "~."

$ resolvectl status wwx2026123aa
Link 5 (wwx2026123aa)
    Current Scopes: DNS
         Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 2001:4860:4860::8844
       DNS Servers: 2001:4860:4860::8888 2001:4860:4860::8844
        DNS Domain: ~.


$ ping6 google.com
PING google.com(lctsaa-ac-in-x0e.1e100.net (2404:6800:4012:9::200e)) 56 data bytes
64 bytes from lctsaa-ac-in-x0e.1e100.net (2404:6800:4012:9::200e): icmp_seq=1 ttl=116 time=41.8 ms
64 bytes from lctsaa-ac-in-x0e.1e100.net (2404:6800:4012:9::200e): icmp_seq=2 ttl=116 time=41.3 ms
64 bytes from lctsaa-ac-in-x0e.1e100.net (2404:6800:4012:9::200e): icmp_seq=3 ttl=116 time=28.7 ms
64 bytes from lctsaa-ac-in-x0e.1e100.net (2404:6800:4012:9::200e): icmp_seq=4 ttl=116 time=21.6 ms
64 bytes from lctsaa-ac-in-x0e.1e100.net (2404:6800:4012:9::200e): icmp_seq=5 ttl=116 time=36.9 ms
64 bytes from lctsaa-ac-in-x0e.1e100.net (2404:6800:4012:9::200e): icmp_seq=6 ttl=116 time=44.2 ms
64 bytes from lctsaa-ac-in-x0e.1e100.net (2404:6800:4012:9::200e): icmp_seq=7 ttl=116 time=15.0 ms
^C
--- google.com ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6009ms
rtt min/avg/max/mdev = 14.987/32.779/44.184/10.431 ms

About Kenel config for IPv6

CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y # CONFIG_IPV6_OPTIMISTIC_DAD is not set CONFIG_INET6_AH=m CONFIG_INET6_ESP=m CONFIG_INET6_ESP_OFFLOAD=m CONFIG_INET6_ESPINTCP=y CONFIG_INET6_IPCOMP=m CONFIG_IPV6_MIP6=m CONFIG_IPV6_ILA=m CONFIG_INET6_XFRM_TUNNEL=m CONFIG_INET6_TUNNEL=m CONFIG_IPV6_VTI=m CONFIG_IPV6_SIT=m CONFIG_IPV6_SIT_6RD=y CONFIG_IPV6_NDISC_NODETYPE=y CONFIG_IPV6_TUNNEL=m CONFIG_IPV6_GRE=m CONFIG_IPV6_FOU=m CONFIG_IPV6_FOU_TUNNEL=m CONFIG_IPV6_MULTIPLE_TABLES=y CONFIG_IPV6_SUBTREES=y CONFIG_IPV6_MROUTE=y CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y CONFIG_IPV6_PIMSM_V2=y CONFIG_IPV6_SEG6_LWTUNNEL=y CONFIG_IPV6_SEG6_HMAC=y CONFIG_IPV6_SEG6_BPF=y # CONFIG_IPV6_RPL_LWTUNNEL is not set


ref: Gemini
/*nice*/