Skicka SMS med Teltonika – Användning¶
I detta kapitel beskrivs hur pluginet används i Ethiris för att skicka SMS.
Skapa ett skriptbibliotek för att konfigurera anslutningen till routern¶
Det är rekommenderat att skapa ett separat skriptbibliotek för att lägga konfigurationsskriptet i, på så vis säkerställs att skriptet inte krockar med eller påverkar andra skriptfunktioner i huvudskriptet. Eventuell felsökning och uppgradering underlättas också.
-
Skapa ett nytt skriptbibliotek i Ethiris Admin genom att högerklicka på Skriptbibliotek -> Ny -> Skriptbibliotek.

-
Ett nytt skriptbibliotek skapas då med namnet Nytt skriptbibliotek. Ange ett lämpligt namn för skriptbiblioteket genom att dubbelklicka på skriptbibliotek-noden och mata in det nya namnet. I detta exempel används scSMS.
-
Klistra in följande skript:
// Stänger av certifikatvalideringen, kan plockas bort om ett giltigt certifikat importeras KentimaSmsClient.KentimaSmsClient.RestClient.SetIgnoreCertificateErrors(true); // Anger anslutningsuppgifter för routern: url, användarnamn och lösenord. KentimaSmsClient.KentimaSmsClient.SmsClient.Configure(_url_, _användarnamn_, _lösenord_); // Testar att anslutningen till routern faktiskt fungerar med de angivna uppgifterna. var testConnectionStatus = KentimaSmsClient.KentimaSmsClient.SmsClient.TestConnection(); if(!testConnectionStatus) { // Anslutningen misslyckades - skriv ut felmeddelandet. Debug.Print(KentimaSmsClient.KentimaSmsClient.SmsClient.GetLastError()); } else { // Anslutningen lyckades. Debug.Print("Koppling till Teltonika Router fungerar!"); }Varför krävs SetIgnoreCertificateErrors?
Teltonika-routerns webbaserade API använder som standard ett självsignerat certifikat som är utfärdat för ett värdnamn baserat på routerns MAC-adress (t.ex.
Teltonika001122334455) – inte för den lokala IP-adress (t.ex.192.168.1.1) som pluginet ansluter till. Certifikatet är därför varken betrott av serverdatorn eller giltigt för adressen som anropas, vilket gör att .NET:s inbyggda certifikatvalidering annars skulle avvisa anslutningen.SetIgnoreCertificateErrors(true)stänger av denna validering så att anslutningen ändå tillåts. Nackdelen är att skyddet mot man-in-the-middle-attacker försvinner, men eftersom anslutningen sker mot routern över ett lokalt nätverk anses risken normalt vara acceptabel.Vill man slippa stänga av valideringen helt går det istället att skapa ett certifikat som är giltigt för routerns IP-adress, se Certifikat giltigt för routerns IP-adress under Avancerat.
-
Uppdatera
.Configure()och mata in korrekt information för routern. Exempelvis:Argument Värde url https://192.168.1.1användarnamn smslösenord lösenordet som sattes i föregående steg Använd https, inte http
Anslut alltid till routern via
https://istället förhttp://, så att inloggningsuppgifter och kommunikation inte kan läsas av utomstående på nätverket. Nyare versioner av RutOS inaktiverar dessutom http som standard och tvingar fram https, så en anslutning via http kan sluta fungera helt efter en firmware-uppdatering.Configure() är säkert att köra varje cykel
Till skillnad från
SendSms()/SendSmsWait()(se varningen längre ner) gör ett upprepatConfigure()-anrop med oförändrade uppgifter ingenting – funktionen är säker att ha ovillkorad i ett skript som körs cykliskt. Ändras url, användarnamn, lösenord eller modem-id byggs anslutningen om, och eventuella meddelanden som just då ligger kvar i den gamla kön övergivs. -
Klicka på knappen Visa Debug-fönster överst i skriptfönstret för att öppna Output-panelen längst ned i Ethiris Admin. Spara sedan konfigurationen så att skriptet körs. Om allt har gått rätt till visas
Koppling till Teltonika Router fungerar!i Output-panelen.
Val av modem vid flera SIM-kort¶
Configure() finns i två varianter: en som tar tre argument (url, användarnamn, lösenord) och en som tar fyra (samma tre, plus id). Exemplet ovan använder tre-argumentsvarianten.
Med tre argument frågar pluginet routern vilket modem som ska användas för att skicka SMS:
- En router med ett SIM-kort har bara ett modem att välja mellan. Routern svarar automatiskt med dess ID, och pluginet använder det utan att någon ytterligare konfiguration behövs.
- En router med två SIM-kort (t.ex. RUTX-serien) har två möjliga modem, och pluginet kan då inte avgöra automatiskt vilket som ska användas.
GetLastError()skriver i det läget ut ett felmeddelande som listar namnen på de två modemen.
I det senare fallet behöver Configure() istället anropas med fyra argument, där det fjärde är ID:t för det modem som ska användas för utskicket: Configure(_url_, _användarnamn_, _lösenord_, _id_).
Modem-id:t kan även tas fram direkt på routern, via SSH eller CLI-fönstret i webbgränssnittet, med kommandot ubus call mctl list.
Skicka ett SMS med routern¶
När kommunikationen med routern fungerar går det att skicka SMS. Det finns två funktioner för detta, SendSms() och SendSmsWait(), som skiljer sig åt i hur de hanterar utskicket:
| Funktion | Beteende |
|---|---|
SendSms() |
Asynkron. Utskicket läggs till i en kö och skickas när modemet hinner med det, utan att skriptet stannar upp och väntar. Nackdelen är att funktionen inte returnerar något true/false som visar om utskicket faktiskt lyckades. |
SendSmsWait() |
Synkron. Skriptet väntar tills utskicket är genomfört och funktionen returnerar true eller false beroende på om det lyckades. |
Båda funktionerna tar samma två argument, båda strängar: telefonnummer och den text som ska skickas, t.ex. SendSms(_telefonnummer_, _text_).
Format på telefonnumret
Telefonnumret behöver inte anges i internationellt format – ett vanligt lokalt nummer fungerar också. Internationellt format (t.ex. +46701234567, med landskod och +) rekommenderas ändå, för att undvika oklarheter kring vilket land numret hör till.
Text längre än 160 tecken delas upp i flera SMS (standard GSM-segmentering), vilket är värt att ha i åtanke eftersom det kan påverka kostnaden per utskick beroende på operatörens prissättning.
Misslyckas ett köat utskick (SendSms()) görs det om ytterligare tre gånger, med 15 sekunders mellanrum, innan det kasseras.
Lägg inte SendSms direkt i huvudskriptet
Ethiris huvudskript körs som standard var 150:e millisekund. Ligger anropet till SendSms()/SendSmsWait() direkt i huvudskriptet körs det alltså om och om igen, vilket leder till ett väldigt stort antal SMS-utskick. Anropet måste istället kopplas till en händelse, t.ex. onEvent() eller onDataChange(), så att ett SMS bara skickas när den händelsen faktiskt inträffar.
Varför fungerar det i scSMS men inte i huvudskriptet?
Ett skriptbibliotek som scSMS körs bara en gång – vid uppstart av Ethiris Server, eller när konfigurationen sparas – till skillnad från huvudskriptet, som utvärderas cykliskt var 150:e ms. Det är därför ett SendSms()-anrop kan ligga direkt i toppen av ett skriptbibliotek utan att skicka SMS om och om igen (se "Snabbtesta hela kedjan" nedan), men aldrig i huvudskriptet.
Välj SendSmsWait() om skriptet behöver veta om SMS:et faktiskt skickades, och SendSms() om det räcker att lägga utskicket i kö utan att invänta resultatet.
Snabbtesta hela kedjan¶
Om man vill kan man lägga till följande skriptrad direkt i scSMS (skriptbiblioteket som skapades tidigare):
Då skickas ett SMS varje gång konfigurationen sparas, vilket låter en snabbt verifiera att hela kedjan – anslutning, autentisering och utskick – fungerar från Ethiris.
Plocka bort raden efteråt
Ta bort raden igen när testet är genomfört. Ligger den kvar i scSMS kommer ett nytt SMS att skickas varje gång konfigurationen sparas.
Exempel på användning¶
Ett enskilt larm¶
Nedan skickas ett SMS när ett larm, MittLarm, går aktivt. En händelselyssnare kopplas till larmets onStateChange, och SMS skickas bara när larmets nya tillstånd (State) är 3 (aktivt) – precis det flankvillkor som varningen ovan syftar på, snarare än att kontrollera larmets tillstånd i varje cykel:
// Händelselyssnare på larmet
MittLarm.onStateChange = function(event)
{
// Larmet har gått aktivt
if (event.target.State == 3)
{
KentimaSmsClient.KentimaSmsClient.SmsClient.SendSms(_telefonnummer_, "Larmet: " + event.target.Name + " har gått aktivt!");
}
}
Alla larm i projektet¶
Samma mönster kan i stället kopplas till Alarms-samlingen för att lyssna på alla larm i projektet, istället för ett enskilt larm: