RouterOS handleiding

Automatisering van WWAN- en GNSS-prioriteit

Overview

Mobiele verbinding en GNSS kunnen niet gelijktijdig werken (de WWAN- en GNSS Rx-ketens in de BG77-module delen bepaalde hardwareblokken, wat betekent dat de module gelijktijdige werking van WWAN en GNSS niet ondersteunt). Daarom is het commando at+qgpscfg="priority",(0-1) geïntroduceerd. Met behulp van dit commando kunt u handmatig de prioriteit voor de een of de ander wijzigen.

Het commando at+qgpscfg="priority",0 stelt de hoogste prioriteit voor GNSS in.

Het commando at+qgpscfg="priority",1 stelt de hoogste prioriteit voor LTE (WWAN) in.

In praktijksituaties is het niet erg handig om de prioriteit handmatig te wijzigen; daarom raden we aan om de hieronder getoonde methoden te gebruiken om de prioriteit automatisch te wijzigen.

Info Vanaf de firmwareversie 7.1rc3 is het mogelijk te controleren wanneer het apparaat voor het laatst NMEA-gegevens (GPS-gegevens) heeft ontvangen. Deze informatie kan worden gebruikt voor probleemoplossing. U kunt deze parameter in de CLI controleren met het commando "system gps monitor once". De parameter "data-age" laat zien wanneer het apparaat voor het laatst een NMEA-bericht heeft ontvangen.

Automatisch overschakelen naar GNSS wanneer er geen uitgaand verkeer wordt gedetecteerd

Automatisering kan worden bereikt met het ppp profile-script "on-down", de functie "idle-timeout" en de PPP-interface-instelling "dial on demand".

Bij implementatie zal de BG77-modem mobiele data gebruiken wanneer er internetverkeer aanwezig is (gedurende die tijd worden er geen GNSS-coordinaten ontvangen), en automatisch GPS-ontvangst inschakelen wanneer er geen internetverkeer wordt gedetecteerd.

De parameter Idle-timeout geeft aan na hoeveel tijd de verbinding wordt beëindigd als er geen activiteit is.

On-down - met dit scriptveld kunt u een script instellen dat wordt uitgevoerd telkens wanneer de PPP-interface uitvalt (ook na inactiviteit door idle-timeout). Het script zet de prioriteit van de modem op GNSS-ontvangst.

Dial-on-demand zorgt ervoor dat de PPP-interface alleen probeert de verbinding op te zetten wanneer er uitgaand verkeer aanwezig is (daarnaast stelt de modem automatisch de prioriteit van de WWAN/mobiele verbinding in). Zo wordt de verbinding na het optreden van idle-timeout niet automatisch opnieuw opgezet, tenzij er uitgaande pakketten worden gedetecteerd.

Door de drie functies te combineren kunt u het scenario bereiken waarbij:

  • Als u uitgaand verkeer hebt, komt de PPP-interface omhoog (vanwege "dial on demand") en wordt de prioriteit ingesteld op de mobiele verbinding. De AT-initialisatieopdracht voor de modem van de PPP-interface (die is geconfigureerd onder de instelling modem-init="AT+QGPSCFG="priority",1" van de PPP-interface) voor WWAN-prioriteit wordt verzonden. Gedurende deze tijd worden er geen GPS-coördinaten ontvangen.
  • Als er geen verkeer wordt gedetecteerd na het inactiviteitsvenster van "idle-timeout", gaat de PPP-interface omlaag en zal deze door de instelling "dial on demand" geen verbinding tot stand brengen totdat er uitgaande pakketten worden gedetecteerd. Op dat moment wordt het "on-down" script uitgevoerd dat de WWAN-prioriteit omschakelt naar GNSS-prioriteit. Om dit te implementeren, voegt u eenvoudig een nieuw PPP-profiel toe:
/ppp profile add idle-timeout=30s name=BG77 on-down="/interface ppp-client at-chat [find where modem-init=\"AT+QGPSCFG=\\\"priority\\\",1\"] input=\"AT+QGPSCFG=\\\"priority\\\",0\""

Het bovenstaande voorbeeld maakt een nieuw profiel aan met de naam "BG77", stelt idle-timeout in op 30 seconden, en schakelt het on-down script in dat het GNSS-prioriteit AT-commando verstuurt.

Zorg er daarna voor dat u dit nieuw aangemaakte profiel toepast op de PPP-interface:

/interface ppp-client set profile=BG77 0

En bevestig dat het is toegepast (profile=BG77):

/interface ppp-client print
Flags: X - disabled; R - running 
0 R name="ppp-out1" max-mtu=1500 max-mru=1500 mrru=disabled port=modem data-channel=2 info-channel=2 
apn="internet" pin="" user="" password="" profile=BG77 phone="" dial-command="ATDT" 
modem-init="AT+QGPSCFG="priority",1" null-modem=no dial-on-demand=yes add-default-route=yes 
default-route-distance=1 use-peer-dns=yes keepalive-timeout=30 allow=pap,chap,mschap1,mschap2 

Overschakelen naar GNSS met behulp van scripts en de scheduler

Het onderstaande script moet met een scheduler worden geconfigureerd. De scheduler zorgt ervoor dat het script elke x uren/minuten wordt gestart (wanneer u het maar nodig hebt).

:global lat
:global lon
:global spd
:global alt
/interface ppp-client set ppp-out1 disabled=yes
log info ("disabling WWAN to get GPS coordinates")
/interface ppp-client at-chat ppp-out1 input="AT+QGPSCFG=\"priority\",0"
log info ("enabling priority for GPS")
###the time in the delay below is the time that the device will wait for to get the coordinate fix
delay 32000ms
log info ("reading GPS coordinates")
/system gps monitor once do={
:set $lat $("latitude")
:set $lon $("longitude")
:set $spd $("speed")
:set $alt $("altitude")
}
:set $spd [:pick $spd 0 [find $spd " km"]]
:set $alt [:pick $alt 0 [find $alt "m"]]
if ($lat != "none") do={\
log info ("enabling priority back to WWAN")
/interface ppp-client at-chat ppp-out1 input="AT+QGPSCFG=\"priority\",1"
log info ("enabling WWAN")
/interface ppp-client set ppp-out1 disabled=no
delay 1000ms
###if dial on demand is enabled
###/ping 1.1.1.1 count=1
#the delay below waits for 5 seconds for the ppp connection to get established - this time can differ based on the signal strength
delay 5000ms
log info ("posting coordinates via fetch")
/tool fetch http-method=post output=user http-header-field="content-type:application/json" http-data="[\
{\
                \"payload\":{\
                             \"lat\":$lat,\
                              \"lng\":$lon,\
                               \"speed\":$spd,\
                                \"altitude\":$alt\
                                    }\
    }\
]" url="https://change-this-URL-accordingly"}\
else={
log info ("could not read GPS coordinates...enabling back WWAN")
/interface ppp-client at-chat ppp-out1 input="AT+QGPSCFG=\"priority\",1"
/interface ppp-client set ppp-out1 disabled=no
delay 1000ms
###if dial on demand is enabled
###/ping 1.1.1.1 count=1
}

Als "dial on demand" is ingeschakeld, verwijder dan het commentaar (verwijder "###") van de pingregels "/ping 1.1.1.1 count=1" in het script, want zonder uitgaand verkeer zal de ppp-interface geen verbinding tot stand brengen.

Wat dit script gaat doen, is de ppp-interface uitschakelen, het GNSS-prioriteitscommando sturen en 32 seconden wachten totdat het apparaat de coordinaten heeft (dat is de tijd/periode die wordt aanbevolen voor de Quectel-modem om een coordinatenfix te krijgen). U kunt deze tijd aanpassen op basis van uw voorkeur en signaalsterkte. Elk afzonderlijk geval kan uniek zijn. Als na een vertraging van 32 seconden de coordinaten succesvol zijn ontvangen (als latitude niet gelijk is aan "none" maar aan een andere waarde), stuurt het script een WWAN-prioriteitscommando, schakelt het de ppp-interface weer in en gebruikt het "/tool fetch" om de coordinaten naar de ingestelde HTTP-server te posten. Als de coordinaten na een vertraging van 32 seconden niet zijn ontvangen (als latitude "none" is), stuurt het script een WWAN-prioriteitscommando en schakelt het de ppp-interface weer in zonder resultaten te posten.

Vergeet niet het gedeelte "/tool fetch" van het script aan te passen aan de configuratie/vereisten van uw HTTP-server.

Je kunt ook MQTT gebruiken in plaats van een HTTP-post. Om dat te doen, wijzig je het "/tool fetch"-gedeelte van de configuratie van:

/tool fetch http-method=post output=user http-header-field="content-type:application/json" http-data="[\
{\
                \"payload\":{\
                             \"lat\":$lat,\
                              \"lng\":$lon,\
                               \"speed\":$spd,\
                                \"altitude\":$alt\
                                    }\
    }\
]" url="https://change-this-URL-accordingly"}\

Naar MQTT:

/iot mqtt publish broker="AWS" topic="my/test/topic" message="{\
                                 \"lat\":$lat,\
                                  \"lng\":$lon,\
                                   \"speed\":$spd,\
                                    \"altitude\":$alt \                                
  }"}\

Pas de broker, het topic en het bericht naar wens aan. Meer informatie over het configureren van MQTT vindt u via de link.

Als de MQTT-server/broker bijvoorbeeld AWS is, ziet het geposte resultaat er zo uit:

Overschakelen naar GNSS wanneer er geen uitgaand verkeer wordt gedetecteerd, met behulp van scripts en de scheduler

Het 1e script wordt gebruikt om te controleren of er verkeer is en om op basis daarvan de prioriteit heen en weer te schakelen.

Het 2e script kan worden gebruikt om WWAN-prioriteit in te schakelen en om de GPS-coördinaten te publiceren naar de server van uw keuze. U kunt elk ondersteund protocol gebruiken, zoals HTTPS post (fetch) of MQTT, om de coördinaten te posten.

1e script

Het onderstaande script maakt automatisch een scheduler aan:

/system scheduler
add name="GPS/WWAN enabler" on-event=":delay 30s\r\
    \n\r\
    \n:local pppName ppp-out1\r\
    \n:local pppModemInitInit \"AT+QGPSCFG=\\\"priority\\\",1\"\r\
    \n:local gpsCmd \"AT+QGPSCFG=\\\"priority\\\",0\"\r\
    \n:local idleCount 5\r\
    \n\r\
    \n\r\
    \n:local pppStats\r\
    \n:local pppStatsPrev\r\
    \n:local pppStatsReset\r\
    \n:local idleCounter\r\
    \n\r\
    \n:while (true) do={\r\
    \n\r\
    \n:if ( \\\r\
    \n  [/interface ppp-client get \$pppName running] \\\r\
    \n  && [/system gps get enabled] \\\r\
    \n  && [/interface ppp-client get \$pppName dial-on-demand] \\\r\
    \n  && \$pppModemInitInit=[/interface ppp-client get \$pppName modem-init]\
    \_) \\\r\
    \n  do={\r\
    \n    :set pppStats [:toarray ([/interface print stats as-value where name\
    =ppp-out1]->0)] \r\
    \n    :if ( \\\r\
    \n      \$pppStats->\"rx-packet\"=\$pppStatsPrev->\"rx-packet\" \\\r\
    \n      && \$pppStats->\"tx-packet\"=\$pppStatsPrev->\"tx-packet\" ) \\\r\
    \n      do={\r\
    \n        :set idleCounter (\$idleCounter+1)\r\
    \n:put (\"debug: idle \".\$idleCounter)\r\
    \n        :if ( \\\r\
    \n          \$idleCounter>=\$idleCount \\\r\
    \n          && \$pppStats->\"rx-packet\"!=\$pppStatsReset->\"rx-packet\" \
    \\\r\
    \n          && \$pppStats->\"tx-packet\"!=\$pppStatsReset->\"tx-packet\" )\
    \_\\\r\
    \n          do={\r\
    \n            :set pppStatsReset \$pppStats\r\
    \n            :set idleCounter 0\r\
    \n            :log info (\$pppName.\" idling - reseting dial-on-demand, pr\
    ioritizing GPS\")\r\
    \n            /interface ppp-client set \$pppName disabled=yes\r\
    \n            :do { /interface ppp-client at-chat \$pppName input=\$gpsCmd\
    \_} \\\r\
    \n                on-error={\r\
    \n:put (\"debug: GPS at-chat error\")                \r\
    \n                  :set idleCounter 0\r\
    \n                  :set pppStatsReset ({})\r\
    \n                  }\r\
    \n            /interface ppp-client set \$pppName disabled=no\r\
    \n            }\r\
    \n          :delay 1s\r\
    \n        } \\\r\
    \n      else={\r\
    \n:put (\"debug: no idle\")      \r\
    \n        :set idleCounter 0\r\
    \n        :set pppStatsPrev \$pppStats\r\
    \n        :delay 1s \r\
    \n        }\r\
    \n    } \\\r\
    \n  else={\r\
    \n:put (\"debug: unsupported config\")\r\
    \n    :set idleCounter 0\r\
    \n    :set pppStatsReset ({})\r\
    \n    :delay 1s\r\
    \n    }\r\
    \n}" policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
    start-time=startup

Kopieer alle bovenstaande regels en plak ze in een nieuw script. Voer het script uit en u maakt daarmee een "scheduler" aan. U kunt de "scheduler" bekijken onder System>Scheduler>"GPS/WWAN enabler".

Het ruwe script ziet er zo uit:

:local pppName ppp-out1
:local pppModemInitInit "AT+QGPSCFG=\"priority\",1"
:local gpsCmd "AT+QGPSCFG=\"priority\",0"
:local idleCount 5
:local pppStats
:local pppStatsPrev
:local pppStatsReset
:local idleCounter
:while (true) do={
:if ( \
  [/interface ppp-client get $pppName running] \
  && [/system gps get enabled] \
  && [/interface ppp-client get $pppName dial-on-demand] \
  && $pppModemInitInit=[/interface ppp-client get $pppName modem-init] ) \
  do={
    :set pppStats [:toarray ([/interface print stats as-value where name=ppp-out1]->0)] 
    :if ( \
      $pppStats->"rx-packet"=$pppStatsPrev->"rx-packet" \
      && $pppStats->"tx-packet"=$pppStatsPrev->"tx-packet" ) \
      do={
        :set idleCounter ($idleCounter+1)
:put ("debug: idle ".$idleCounter)
        :if ( \
          $idleCounter>=$idleCount \
          && $pppStats->"rx-packet"!=$pppStatsReset->"rx-packet" \
          && $pppStats->"tx-packet"!=$pppStatsReset->"tx-packet" ) \
          do={
            :set pppStatsReset $pppStats
            :set idleCounter 0
            :log info ($pppName." idling - reseting dial-on-demand, prioritizing GPS")
            /interface ppp-client set $pppName disabled=yes
            :do { /interface ppp-client at-chat $pppName input=$gpsCmd } \
                on-error={
:put ("debug: GPS at-chat error")                
                  :set idleCounter 0
                  :set pppStatsReset ({})
                  }
            /interface ppp-client set $pppName disabled=no
            }
          :delay 1s
        } \
      else={
:put ("debug: no idle")      
        :set idleCounter 0
        :set pppStatsPrev $pppStats
        :delay 1s 
        }
    } \
  else={
:put ("debug: unsupported config")
    :set idleCounter 0
    :set pppStatsReset ({})
    :delay 1s
    }
}

Om het script te laten werken, moet aan enkele voorwaarden worden voldaan.

De eerste voorwaarde is dat zowel de ppp interface (Interfaces>Interface) als GPS (System>GPS) ingeschakeld moeten zijn en gelijktijdig moeten werken. Mogelijk moet u ppp uitschakelen voordat u GPS inschakelt, omdat ze beide dezelfde seriële poort gebruiken. Wanneer zowel GPS als ppp zijn ingeschakeld, zorg er dan voor dat aan de tweede voorwaarde is voldaan.

De tweede voorwaarde is dat het AT-commando "AT+QGPSCFG="priority",1" voor de ppp-interface is geconfigureerd in het veld "Modem Init":

Wat dit gaat doen, is een WWAN-prioriteitscommando sturen telkens wanneer een ppp-verbinding succesvol tot stand komt.

De derde voorwaarde tot slot is dat "dial on demand" is ingeschakeld voor de ppp-interface:

Dit is nodig omdat anders, wanneer "dial on demand" is uitgeschakeld, de ppp-interface automatisch het AT-commando met een WWAN-prioriteitsinstelling verstuurt (een poging om de verbinding tot stand te brengen) zodra de poort weer wordt ingeschakeld. Wanneer "dial on demand" is ingeschakeld, wordt na het opnieuw inschakelen van de interface geen ppp-verbinding tot stand gebracht en wordt het AT-commando voor WWAN-prioriteit pas verstuurd wanneer uitgaande pakketten worden gedetecteerd.

Wanneer aan alle 3 de voorwaarden is voldaan, gaat het script het volgende doen:

Het script gaat "counters" vergelijken om te bepalen of er verkeer aanwezig is of niet (op basis van Tx-pakketten en Rx-pakketten voor de ppp-interface). Als er geen verkeer is, loopt de "counter" op, en wanneer die de "idleCount" bereikt, wordt de ppp-interface uitgeschakeld, weer ingeschakeld en wordt het GNS-prioriteitscommando verstuurd. Als er in deze tijd nog steeds geen uitgaand verkeer aanwezig is, zouden de GPS-coördinaten bijgewerkt moeten worden (onder System>GPS). Zodra er verkeer wordt gedetecteerd, wordt de "counter" gereset en wordt het WWAN-prioriteitscommando verstuurd door de ppp-verbinding tot stand te brengen.

Zodra aan alle 3 de voorwaarden is voldaan en de scheduler klaar is, start u het apparaat opnieuw op zodat het script in werking treedt.

2e script

Het tweede script wordt gebruikt om GPS-coördinaten te verzamelen en deze verder naar de server te sturen.

:global lat
:global lon
:global spd
:global alt
/system gps monitor once do={
:set $lat $("latitude")
:set $lon $("longitude")
:set $spd $("speed")
:set $alt $("altitude")
}
:set $spd [:pick $spd 0 [find $spd " km"]]
:set $alt [:pick $alt 0 [find $alt "m"]]
:if ($lat != "none") do={
/ping 1.1.1.1 count=1
:delay 3000ms;
/tool fetch http-method=post output=user http-header-field="content-type:application/json" http-data="[\
{\
                \"payload\":{\
                             \"lat\":$lat,\
                              \"lng\":$lon,\
                               \"speed\":$spd,\
                                \"altitude\":$alt\
                                    }\
    }\
]" url="https://change-this-URL"}\
else={log info ("could not read GPS coordinates")}

Het script gaat GPS-coördinaten "lezen", en als de breedtegraad met succes "gelezen" kon worden (als de breedtegraad niet gelijk is aan "none" maar aan een andere waarde), pingt het eenmaal naar "1.1.1.1" (om uitgaand verkeer te genereren), wacht het 3 seconden totdat de ppp-verbinding tot stand is gekomen en start het "/tool fetch" (HTTP post). Als de breedtegraad daarentegen niet bepaald kon worden (toen het script werd gestart), gebeurt er niets (u ziet een logbericht dat het apparaat de GPS-coördinaten niet kon lezen).

Je kunt de "delay"-regel in het script wijzigen naar de werkelijke tijd die je apparaat nodig heeft om met succes een ppp-verbinding (CAT-M/NB-IoT) met de ISP tot stand te brengen.

Je kunt een scheduler instellen om het script uit te voeren wanneer je maar wilt.

Het gedeelte "/tool fetch" van het script moet worden geconfigureerd in overeenstemming met uw serverinstellingen.

Je kunt ook MQTT gebruiken in plaats van een HTTP-post. Als je dat wilt doen, wijzig dan het "/tool fetch"-gedeelte, van:

/tool fetch http-method=post output=user http-header-field="content-type:application/json" http-data="[\
{\
                \"payload\":{\
                             \"lat\":$lat,\
                              \"lng\":$lon,\
                               \"speed\":$spd,\
                                \"altitude\":$alt\
                                    }\
    }\
]" url="https://change-this-URL-accordingly"}\

Aan:

/iot mqtt publish broker="AWS" topic="my/test/topic" message="{\
                                 \"lat\":$lat,\
                                  \"lng\":$lon,\
                                   \"speed\":$spd,\
                                    \"altitude\":$alt \                                  
  }"}\

Vergeet niet de broker, het topic en het bericht naar wens aan te passen. Meer informatie over het configureren van MQTT vindt u via de link.

Als de MQTT-server bijvoorbeeld AWS is, ziet het resultaat er zo uit:

Bron

Bijgewerkt op 2026-08-22.