Support forum
October 16, 2025
8:24 pm
8:24 pm
Simon
Guest
Guests
Hi
Just to say thank you very much for posting this. With some tiny edits I was able to add it to the c# bit of a scripted gateway and it worked out of the box.
Its turned what was looking like a waste of money and a shed load of time into a working robust solution
Thanks
August 14, 2025
11:08 am
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) 8
Currently Browsing this Page:
1 Guest(s)
1 Guest(s)
Top Posters:
Member Stats:
Guest Posters: 694
Members: 0
Moderators: 0
Admins: 1
Forum Stats:
Groups: 2
Forums: 3
Topics: 1183
Posts: 4038
Newest Members:
, Henk HelmantelAdministrators: Henk Helmantel: 1553
Add Reply
Add Topic
Quote