Support forum
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) 3
Currently Browsing this Page:
1 Guest(s)
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 HelmantelAdministrators: Henk Helmantel: 1550