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 插槽的切换不会立即发生。