Dual SIM Application
本页面介绍如何为双 SIM LTE 设备在 MikroTik RouterOS 中配置和自动化 SIM 卡切换,包括初始设置步骤、漫游状态检查,以及基于 LTE 连接状态在家庭/漫游网络之间切换的示例脚本。
双 SIM 应用
概述
第一个脚本示例展示在 LtAP mini 设备检测到移动漫游时如何在 SIM 插槽之间切换。这对于移动车辆应用非常有用,例如汽车、公共汽车或火车可能行驶到国外,应该使用两张 SIM 卡(一张用于家庭网络,另一张用于漫游网络)。由于 RouterOS 在 LTE monitor 中具有漫游状态(仅在漫游时显示),我们可以在 RouterOS 脚本中使用它来相应地更改 SIM 卡。
第二个脚本示例展示在当前所选 SIM 卡上的移动连接丢失时如何在 SIM 卡之间切换。
注意: 请记住,这些只是如何利用双 SIM 插槽的示例。对于真实的生产环境,应进行适当的测试,因此请尝试优化它们并根据您的需求添加新功能。
初始设置
首先,确保您已为每张 SIM 卡正确设置了 LTE 网络参数(由移动网络运营商提供)。您可以使用默认的 APN 配置文件或创建两个独立的配置文件,请点击此链接 - LTE/5G#Quicksetupexample。本示例使用默认的 APN 配置文件。
之后,使用以下命令启用数据漫游以连接到其它国家的数据提供商。这使我们能够跟踪漫游状态。
/interface/lte/set [find name=lte1] allow-roaming=yes
然后,选择哪些 SIM 插槽将用于家庭网络和漫游网络。在本示例中,我们使用插槽 "down" 作为家庭网络,插槽 "up" 作为漫游网络。某些设备型号(如 SXT)的 SIM 插槽命名为 "a" 和 "b" 而不是 "up" 和 "down"。使用以下命令在活动插槽之间切换。
RouterOS v6 版本中的命令
/system/routerboard/modem/set sim-slot=down
RouterOS v7 版本中的命令
/interface/lte/settings/set sim-slot=down
更改 SIM 插槽后,LTE 调制解调器将重新启动。完全初始化它可能需要一些时间(取决于调制解调器和主板,大约 30 秒),因此请务必测试您的调制解调器。
漫游脚本示例
现在创建一个将通过 scheduler 运行的脚本。此脚本将执行几个关键步骤:
- 检查 LTE 接口是否已初始化(显示在
/interface/lte中),否则尝试电源重置。 - 检查是否已建立 LTE 连接(接口处于 "running" 状态),否则创建日志条目并直接等待下一个 scheduler。
- 读取当前使用的 LTE 插槽,并根据漫游状态决定是否更改 SIM 插槽。
让我们将此脚本称为 "roamingScript",其源码如下:
{
# Setup and read current values, "up" SIM slot will be used for roaming, "down" for home network
:global simSlot [/interface/lte/settings/get sim-slot]
:global timeoutLTE 60
:global timeoutConnect 60
# Wait for LTE to initialize for maximum "timeoutLTE" seconds
:local i 0
:local isLTEinit false
:while ($i<$timeoutLTE) do={
:foreach n in=[/interface/lte/find] do={:set $isLTEinit true}
:if ($isLTEinit=true) do={
:set $i $timeoutLTE
}
:set $i ($i+1)
:delay 1s
}
# Check if LTE is initialized, or try power-reset the modem
:if ($isLTEinit=true) do={
# Wait for LTE interface to connect to mobile network for maximum "timeoutConnect" seconds
:local isConnected false
:set $i 0
:while ($i<$timeoutConnect) do={
:if ([/interface/lte/get [find name="lte1"] running]=true) do={
:set $isConnected true
:set $i $timeoutConnect
}
:set $i ($i+1)
:delay 1s
}
# Check if LTE is connected
if ($isConnected=true) do={
:local Info [/interface/lte/monitor lte1 once as-value]
:local isRoaming ($Info->"roaming")
# Check which SIM slot is used
:if ($simSlot="down") do={
# If "down" (home) slot, check roaming status
:if ($isRoaming=true) do={
:log info message="Roaming detected, switching to SIM UP (Roaming)"
/interface/lte/settings/set sim-slot=up
}
} else={
# Else "up" (roaming) slot, check roaming status
:if (!$isRoaming=true) do={
:log info message="Not roaming, switching to SIM DOWN (Home)"
/interface/lte/settings/set sim-slot=down
}
}
} else={
:log info message="LTE interface did not connect to network, wait for next scheduler"
}
} else={
:log info message="LTE modem did not appear, trying power-reset"
/system/routerboard/usb/power-reset duration=5s
}
}
故障转移脚本示例
现在创建一个将通过 scheduler 运行的脚本。此脚本将执行几个关键步骤:
- 检查 LTE 接口是否已初始化(显示在
/interface/lte中),否则尝试电源重置。 - 检查是否已建立 LTE 连接(接口处于 "running" 状态),否则创建日志条目并直接等待下一个 scheduler。
- 读取当前使用的 LTE 插槽,并根据接口状态决定是否更改 SIM 插槽。
注意: 请记住,只有在当前 SIM 插槽无法连接到网络时才会更改 SIM 插槽。如果您需要切换回主 SIM 卡,则需要安排另一个在特定时间执行该操作的动作。在不切换回另一张 SIM 卡的情况下,无法知道它是否在服务中。
让我们将此脚本称为 "failoverScript",其源码如下:
{
# Setup and read current values
:global simSlot [/interface/lte/settings/get sim-slot]
:global timeoutLTE 60
:global timeoutConnect 60
# Wait for LTE to initialize for maximum "timeoutLTE" seconds
:local i 0
:local isLTEinit false
:while ($i<$timeoutLTE) do={
:foreach n in=[/interface/lte/find] do={:set $isLTEinit true}
:if ($isLTEinit=true) do={
:set $i $timeoutLTE
}
:set $i ($i+1)
:delay 1s
}
# Check if LTE is initialized, or try power-reset the modem
:if ($isLTEinit=true) do={
# Wait for LTE interface to connect to mobile network for maximum "timeoutConnect" seconds
:local isConnected false
:set $i 0
:while ($i<$timeoutConnect) do={
:if ([/interface/lte/get [find name="lte1"] running]=true) do={
:set $isConnected true
:set $i $timeoutConnect
}
:set $i ($i+1)
:delay 1s
}
# Check if LTE is connected
if ($isConnected=false) do={
# Check which SIM slot is used
:if ($simSlot="down") do={
# If "down" slot, switch to up
:log info message="LTE down, switching slot to UP"
/interface/lte/settings/set sim-slot=up
}
:if ($simSlot="up") do={
# If "up" slot, switch to down
:log info message="LTE down, switching slot to DOWN"
/interface/lte/settings/set sim-slot=down
}
} else={
# Else "running"
:if ($isConnected=true) do={
:log info message="LTE UP"
} else={
:log info message="LTE interface did not connect to network, wait for next scheduler"
}
}
} else={
:log info message="LTE modem did not appear, trying power-reset"
/system/routerboard/usb/power-reset duration=5s
}
}
设置 scheduler
最后,创建将运行先前创建的脚本的 scheduler。选择合适的 scheduler 间隔,以免两个或多个事件相互重叠。对于上面的示例,3 分钟就足够了。
/system/scheduler/add interval=3m on-event=roamingScript name=Roaming
/system/scheduler/add interval=3m on-event=failoverScript name=Failover
请记住,"家庭" SIM 卡会消耗一些漫游数据,因为 SIM 插槽的切换不会立即发生。