Support forum

Advanced Search
Forum Scope


Match



Forum Options



Minimum search word length is 3 characters - maximum search word length is 84 characters
sp_TopicIcon
Script to send SMS via JSON REST API on Teltonika TRB140
sp_NewTopic Add Topic
August 14, 2025
11:08 am
Jan
Guest
Guests

I would like to just post script to sending SMS via REST API on Teltonika TRB140 as from newer version‘s firmware (>7.14) old method is removed and is possible use only REST API which is two-step process. Login, get token and send message with token. This isn’t possible to make via standard HTTP gateway. So I would like publish so someone else can use it.

Below is the created script:

// Diafaan SMS Server JSON example script for Teltonika TRB140 API
// Created with Perplexity AI, modified and verified by me

// AddReference System.dll

// AddReference Newtonsoft.Json.dll

//

using System;

using System.Collections;

using System.Collections.Generic;

using System.Net;

using System.Text;

using System.IO;

using Newtonsoft.Json;

using Newtonsoft.Json.Linq;

 

namespace DiafaanMessageServer

{

public class GatewayScript : IScript

{

    private IScriptHost host = null;

 

    // Nastavení adresy routeru

    private string baseUrl = http://ADDRES_TO_TRB; // CHANGE ME

    private string username = "USER";            // CHANGE ME

    private string password = "PASSWORD";    // CHANGE ME

 

    private string authToken = "";

 

    public void OnLoad(IScriptHost host)

    {

        this.host = host;

    }

 

    public void OnUnload()

    {

    }

 

    private void OnMessageToSend(string recordId, string toAddress, string fromAddress,

                                 string message, string messageType)

    {

        string jsonResponse = null;

        string messageId = "";

        StatusCode statusCode = StatusCode.SendError;

        string statusMessage = "Error: Unhandled error";

        string errorCode = "";

        string errorMessage = "";

        bool sendStatusRequest = false;

 

        // Login to get valid TOKEN; make everytime due short timeout to reuse

        if (!Login())

        {

                statusMessage = "Error: Login failed - fce";

                PostSendResult(recordId, "", statusCode, statusMessage, "", "", false);

                return;

        }

 

        // Create JSON request by TELTONIKA API - https://developers.teltonika-networks.com/reference/trb140/7.14/v1.6/messages#post-messages-actions-send

        JObject jsonOuter = new JObject();

                               JObject jsonData = new JObject();

 

                               jsonData.Add("number", toAddress);             // recipient's number

                               jsonData.Add("message", message);              // message

                               jsonData.Add("modem", "3-1");                // used modem, default should be 3-1 by

 

                               jsonOuter.Add("data", jsonData);

 

                               // Convert to sending text

                               string jsonRequestString = jsonOuter.ToString(Formatting.None);

 

        try

        {

            // Create HTTP request for SMS

            string smsUri = baseUrl + "/api/messages/actions/send";

            PostTraceLog("HTTP POST", TraceLog.Information);

            PostTraceLog(smsUri, TraceLog.Send);

 

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(smsUri);

            request.Method = "POST";

            request.Headers.Add("Authorization", "Bearer " + authToken);

            request.ContentType = "application/json";

            request.Accept = "application/json";

 

            // Send data

            byte[] data = Encoding.UTF8.GetBytes(jsonRequestString);

            request.ContentLength = data.Length;

            using (Stream writeStream = request.GetRequestStream())

            {

                PostTraceLog(jsonRequestString, TraceLog.Send);

                writeStream.Write(data, 0, data.Length);

            }

 

            // Receive response

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())

            {

                jsonResponse = new StreamReader(response.GetResponseStream()).ReadToEnd();

                PostTraceLog(jsonResponse, TraceLog.Receive);

            }

 

            // Process response and evaluate if SMS is successfuly sent.

            if (!string.IsNullOrEmpty(jsonResponse))

            {

                JObject doc = JObject.Parse(jsonResponse);

                bool success = false;

                try

                {

                    success = (bool)doc["success"];

                }

                catch {}

                if (success)

                {

                    statusCode = StatusCode.Sent;

                    statusMessage = "Success: Message accepted";

                    try { messageId = (string)doc["message_id"]; } catch {}

                }

                else

                {

                    try { errorMessage = (string)doc["error"]; } catch {}

                    if (string.IsNullOrEmpty(errorMessage))

                        statusMessage = "Unexpected or missing JSON response";

                    else

                        statusMessage = "Error: Message rejected";

                    PostEventLog(statusMessage, jsonResponse, EventLog.Error);

                    PostTraceLog(statusMessage, TraceLog.Receive);

                }

            }

        }

        catch (Exception e)

        {

            statusMessage = "Error: " + e.Message;

            PostEventLog(e.Message, e.ToString(), EventLog.Error);

            PostTraceLog(e.Message, TraceLog.Receive);

        }

 

        // Return result OK/Fail

        PostSendResult(recordId, messageId, statusCode, statusMessage,

                       errorCode, errorMessage, sendStatusRequest);

    }

 

    private bool Login()

    {

        string loginUri = baseUrl + "/api/login";

        JObject loginData = new JObject();

        loginData.Add("username", username);

        loginData.Add("password", password);

        string jsonLogin = loginData.ToString(Formatting.None);

 

        try

        {

            PostTraceLog("HTTP POST LOGIN", TraceLog.Information);

            PostTraceLog(loginUri, TraceLog.Send);

 

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(loginUri);

            request.Method = "POST";

            request.ContentType = "application/json";

            request.Accept = "application/json";

 

            byte[] data = Encoding.UTF8.GetBytes(jsonLogin);

            request.ContentLength = data.Length;

            using (Stream writeStream = request.GetRequestStream())

            {

                PostTraceLog(jsonLogin, TraceLog.Send);

                writeStream.Write(data, 0, data.Length);

            }

 

            string jsonResponse;

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())

            {

                jsonResponse = new StreamReader(response.GetResponseStream()).ReadToEnd();

                PostTraceLog(jsonResponse, TraceLog.Receive);

            }

 

            // Extract TOKEN from response

               JObject doc = JObject.Parse(jsonResponse);

 

                                               bool success = false;

                                               try { success = (bool)doc["success"]; } catch {}

 

                                               if (success && doc["data"] != null)

                                               {

                                                               string token = "";

                                                               try { token = (string)doc["data"]["token"]; } catch {}

 

                                                               if (!string.IsNullOrEmpty(token))

                                                               {

                                                                               authToken = token;

                                                                               return true;

                                                               }

                                               }

        }

        catch (Exception e)

        {

            PostEventLog("Login failed", e.Message, EventLog.Error);

        }

        return false;

    }

 

    private void OnStatusRequest(string messageId)

    {

        // TODO: get status - TELTONIKA doesn't offer this function

    }

 

#region Gateway Script helper functions

private enum StatusCode {Sent=200, Received=201, SendError=300}

private enum EventLog {Information=0, Warning=1, Error=2}

private enum TraceLog {Information=0, Send=1, Receive=2}

 

public void OnMessagePacket(Hashtable messagePacket)

{

    if (GetPacketString(messagePacket, "PacketName", "") == "MessageOut") {

        OnMessageToSend(GetPacketString(messagePacket, "RecordId", ""),

                        GetPacketString(messagePacket, "To", ""),

                        GetPacketString(messagePacket, "From", ""),

                        GetPacketString(messagePacket, "Message", ""),

                        GetPacketString(messagePacket, "MessageType", ""));

    }

    else if (GetPacketString(messagePacket, "PacketName", "") == "StatusRequest") {

        OnStatusRequest(GetPacketString(messagePacket, "MessageId", ""));

    }

}

 

private void PostSendResult(string recordId, string messageId, StatusCode status,

                            string statusText, string errorCode, string errorText, bool sendStatusRequest)

{

    Hashtable messagePacket = new Hashtable();

    messagePacket.Add("PacketName", "MessageOutResult");

    messagePacket.Add("RecordId", recordId);

    messagePacket.Add("MessageId", messageId);

    messagePacket.Add("StatusCode", ((int) status).ToString());

    messagePacket.Add("StatusText", statusText);

    messagePacket.Add("ErrorCode", errorCode);

    messagePacket.Add("ErrorText", errorText);

    messagePacket.Add("SendStatusRequest", sendStatusRequest ? "1" : "0");

    host.PostMessagePacket(messagePacket);

}

 

private void PostEventLog(string eventMessage, string eventDescription, EventLog eventType)

{

    Hashtable messagePacket = new Hashtable();

    messagePacket.Add("PacketName", "EventLog");

    messagePacket.Add("EventType", ((int) eventType).ToString());

    messagePacket.Add("EventMessage", eventMessage);

    messagePacket.Add("EventDescription", eventDescription);

    host.PostMessagePacket(messagePacket);

}

 

private void PostTraceLog(string traceLogMessage, TraceLog logType)

{

    Hashtable messagePacket = new Hashtable();

    messagePacket.Add("PacketName", "TraceLog");

    messagePacket.Add("TraceLogType", ((int) logType).ToString());

    messagePacket.Add("TraceLogMessage", traceLogMessage);

    host.PostMessagePacket(messagePacket);

}

 

private string GetPacketString(Hashtable hashtable, string key, string defaultValue)

{

    try {

        if (!hashtable.ContainsKey(key) || (hashtable[key] == null) ||

            (hashtable[key].GetType() != typeof(string)))

            return defaultValue;

        return (string) hashtable[key];

    }

    catch {}

    return defaultValue;

}

#endregion

}

}
Forum Timezone: Europe/Amsterdam
Most Users Ever Online: 529
Currently Online:
Guest(s) 3
Currently Browsing this Page:
1 Guest(s)
Top Posters:
Member Stats:
Guest Posters: 692
Members: 0
Moderators: 0
Admins: 1
Forum Stats:
Groups: 2
Forums: 3
Topics: 1180
Posts: 4031
Newest Members:
, Henk Helmantel
Administrators: Henk Helmantel: 1550