Wie man eine SMS in Kotlin plant

Der einfachste Weg, SMS von Kotlin aus zu versenden, ist die Verwendung der integrierten HTTP/Rest-SMS-API des Ozeki SMS Gateways. Wenn Sie diese API verwenden, senden Sie SMS-Nachrichten, indem Sie eine HTTP-Post-Anfrage an das SMS-Gateway stellen. Die HTTP-Post-Anfrage wird eine im JSON-Format formatierte Nachricht enthalten. Das SMS-Gateway wird diese SMS an das Empfängertelefon senden und eine HTTP-200-OK-Antwort auf Ihre Anfrage zurückgeben. (Abbildung 1)

wie man eine sms in kotlin plant
Abbildung 1 - Wie man eine SMS in Kotlin plant

Das folgende Kotlin-SMS-Codebeispiel zeigt, wie Sie eine geplante SMS mit der HTTP-REST-SMS-API des Ozeki SMS Gateway unter Verwendung der Kotlin Ozeki.Libs.Rest-Bibliothek senden können. Diese Bibliothek wird Ihnen kostenlos zur Verfügung gestellt, und Sie können sie in Ihren Projekten verwenden und modifizieren.

Video 1 - Wie man das SendScheduledSms.kt.zip Beispiel herunterlädt (Video-Tutorial)

MainActivity.kt
package send.scheduledsms

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import Ozeki.Libs.Rest.Configuration
import Ozeki.Libs.Rest.MessageApi
import Ozeki.Libs.Rest.Message
import android.text.method.ScrollingMovementMethod
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val inputToAddress:android.widget.EditText = findViewById(R.id.inputToAddress)
        val inputMessage:android.widget.EditText = findViewById(R.id.inputMessage)
        val date:android.widget.EditText = findViewById(R.id.inputTimeToSendDate)
        val time:android.widget.EditText = findViewById(R.id.inputTimeToSendTime)
        val btnSendRequest:android.widget.Button = findViewById(R.id.btnSendRequest)
        val logBox:android.widget.TextView = findViewById(R.id.logBox)
        logBox.movementMethod = ScrollingMovementMethod()


        val configuration = Configuration(
            username = "http_user",
            password = "qwe123",
            apiurl = "http://10.0.2.2:9509/api"
        )

        val api = MessageApi(configuration)

        btnSendRequest.setOnClickListener {
            if (inputToAddress.text.toString() != "" && inputMessage.text.toString() != ""
                && date.text.toString() != "" && time.text.toString() != "") {
                val datetime = String.format("%s %s", date.text.toString(), time.text.toString())
                val msg = Message()
                msg.ToAddress = inputToAddress.text.toString()
                msg.Text = inputMessage.text.toString()
                msg.TimeToSend = datetime
                GlobalScope.launch(Dispatchers.IO) {
                    val response = api.Send(msg)
                    logBox.text = String.format("%s\n%s", logBox.text, response.toString())
                }
                inputToAddress.text.clear()
                inputMessage.text.clear()
                date.text.clear()
                time.text.clear()
            }
        }

    }
}
	
main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btnSendRequest"
        android:layout_width="320dp"
        android:layout_height="50dp"
        android:layout_marginTop="36dp"
        android:text="Senden"
        android:backgroundTint="#FF3F3F"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.494"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/logBox" />

    <TextView
        android:id="@+id/textToAddress"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="36dp"
        android:text="An Adresse:"
        android:textSize="20sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textMessage"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="Nachricht:"
        android:textSize="20sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.505"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/inputToAddress" />

    <TextView
        android:id="@+id/textWhen"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="Sendezeitpunkt:"
        android:textSize="20sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.494"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/inputMessage" />

    <EditText
        android:id="@+id/inputToAddress"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:ems="10"
        android:hint="+36201111111"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.505"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textToAddress" />

    <EditText
        android:id="@+id/inputMessage"
        android:layout_width="320dp"
        android:layout_height="100dp"
        android:layout_marginTop="20dp"
        android:ems="10"
        android:gravity="start|top"
        android:hint="Hallo Welt!"
        android:inputType="textMultiLine"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.505"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textMessage" />

    <EditText
        android:id="@+id/inputTimeToSendTime"
        android:layout_width="120dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="44dp"
        android:ems="10"
        android:hint="15:30:00"
        android:inputType="time"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textWhen" />

    <TextView
        android:id="@+id/logBox"
        android:layout_width="320dp"
        android:layout_height="80dp"
        android:layout_marginTop="20dp"
        android:scrollbars="vertical"
        android:text="Protokolle:"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.505"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/inputTimeToSendTime" />

    <EditText
        android:id="@+id/inputTimeToSendDate"
        android:layout_width="180dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="24dp"
        android:ems="10"
        android:hint="2021-06-16"
        android:inputType="date"
        app:layout_constraintEnd_toStartOf="@+id/inputTimeToSendTime"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textWhen" />
</androidx.constraintlayout.widget.ConstraintLayout>
	

So verwenden Sie das Kotlin-SMS-Beispiel:

Sie können die Message-Klasse verwenden, um die SMS zu erstellen, und die MessageApi-Klasse, um die geplante SMS an das SMS-Gateway zu senden. Das SMS-Gateway leitet Ihre Nachricht entweder über eine drahtlose Verbindung oder über das Internet an das Mobilfunknetz weiter.

Download SendScheduledSms.kt

Der in diesem Artikel erklärte Quellcode kann kostenlos heruntergeladen, verwendet und modifiziert werden.
Download: SendScheduledSms.kt.zip (149Kb)

Was befindet sich in der SendScheduledSms.kt.zip-Datei?

Die SendScheduledSms.kt.zip-Datei enthält ein Beispielprojekt, das die Ozeki.Libs.Rest-Bibliothek beinhaltet. Mit dieser Bibliothek können Sie SMS-Nachrichten senden, löschen, markieren und empfangen, indem Sie eine MessageApi erstellen und die Methoden Send(), Delete(), Mark() und Receive() verwenden. (Abbildung 2)

Beispielprojekt zum Senden geplanter SMS mit Kotlin
Abbildung 2 - SendScheduledSms.kt-Verzeichnis

Wie sendet man eine geplante SMS mit Kotlin (Kurzanleitung)

So senden Sie eine geplante SMS mit Kotlin:

  1. Installieren Sie Ozeki SMS Gateway
  2. Verbinden Sie Ozeki SMS Gateway mit dem Mobilfunknetz
  3. Senden Sie eine Test-SMS über die Ozeki GUI
  4. Erstellen Sie einen HTTP-SMS-API-Benutzer
  5. Android Studio
  6. Laden Sie das oben genannte Beispielprojekt herunter
  7. Erstellen Sie die SMS, indem Sie ein neues Message-Objekt erstellen
  8. Erstellen Sie eine API zum Senden Ihrer geplanten Nachricht
  9. Verwenden Sie die Send-Methode, um Ihre geplante Nachricht zu senden
  10. Lesen Sie die Antwortnachricht in der Konsole
  11. Überprüfen Sie die Protokolle im SMS-Gateway

Installieren Sie Ozeki SMS Gateway und erstellen Sie einen HTTP-API-Benutzer

Um SMS mit Kotlin senden zu können, müssen Sie zunächst Ozeki SMS Gateway installieren. Das SMS-Gateway kann auf demselben Computer installiert werden, auf dem Sie Ihren Kotlin-Code in Android Studio entwickeln. Nach der Installation ist der nächste Schritt, Ozeki SMS Gateway mit dem Mobilfunknetz zu verbinden. Sie können eine Test-SMS über die Ozeki GUI senden, um zu überprüfen, ob Ihre Mobilfunknetzverbindung funktioniert. Der letzte Schritt zur Vorbereitung Ihrer Umgebung ist das Erstellen eines HTTP-SMS-API-Benutzerkontos. Erstellen Sie einen Benutzer mit dem Benutzernamen "http_user" und dem Passwort "qwe123", damit das Beispiel ohne Änderungen funktioniert.

Nachdem die Umgebung eingerichtet ist, können Sie Ihren Kotlin-Code ausführen.

HTTP-API-URL zum Senden von SMS mit Kotlin

Um eine geplante SMS mit Kotlin zu senden, muss Ihr Kotlin-Code eine HTTP-Anfrage an das SMS-Gateway senden. Die API-URL wird unten angezeigt. Beachten Sie, dass die IP-Adresse (127.0.0.1) durch die IP-Adresse Ihres SMS-Gateways ersetzt werden sollte. Wenn Ozeki SMS Gateway auf demselben Computer installiert ist, auf dem die JavaScript-SMS-Anwendung läuft, kann dies 127.0.0.1 sein. Wenn es auf einem anderen Computer installiert ist, sollte es die IP-Adresse dieses Computers sein.

http://127.0.0.1:9509/api?action=rest
	

HTTP-Authentifizierung zum Senden einer geplanten SMS mit Kotlin

Um den Kotlin-SMS-Client zu authentifizieren, müssen Sie den Benutzernamen und das Passwort in einer base64-kodierten Zeichenkette an den Server in einer HTTP-Anfrage senden. Das verwendete Format lautet: base64(Benutzername+":"+Passwort). In Kotlin können Sie den folgenden Code verwenden, um diese Kodierung durchzuführen:

var usernamePassword = "%s:%s".format(username, password)
return "Basic %s".format(Base64.getEncoder().encodeToString(usernamePassword.toByteArray()))
	

Wenn Sie beispielsweise den Benutzernamen 'http_user' und das Passwort 'qwe123' kodieren, erhalten Sie die folgende base64-kodierte Zeichenkette: aHR0cF91c2VyOnF3ZTEyMw==. Zum Senden

HTTP-Anfrageheader zum Senden von SMS mit Kotlin

Um die SMS-Nachrichten zu senden, müssen Sie die folgenden Zeilen als Header in die HTTP-Anfrage aufnehmen. Beachten Sie, dass wir einen Content-Type-Header und einen Authorization-Header einfügen.

Content-Type: application/json
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
	

HTTP-Anfrage zum Senden von SMS mit Kotlin

Um die SMS zu übermitteln, sendet Ihre Kotlin-Anwendung eine HTTP-Anfrage ähnlich der unten gezeigten. Beachten Sie, dass diese Anfrage einen HTTP-Header-Teil und einen HTTP-Body-Teil enthält. Der HTTP-Body ist eine JSON-kodierte Datenzeichenkette. Sie enthält die Empfängernummer und den Text der Nachricht.

POST /api?action=sendmsg HTTP/1.1
Connection: Keep-Alive
Content-Length: 320
Content-Type: application/json; charset=utf-8
Accept-Encoding: gzip
Authorization: Basic aHR0cF91c2VyOnF3ZTEyMw==
Host: 10.0.2.2:9509
User-Agent: okhttp/4.2.2

{
	"messages":	[
		{
			"message_id":	"e68f8e11-dce2-48e2-a2c5-1d2efa98272a",
			"to_address":	"+36201111111",
			"text":	"Hallo Welt!",
			"create_date":	"2021-06-17T15:04:03",
			"valid_until":	"2021-06-24T15:04:03",
			"time_to_send":	"2021-06-17 15:10:00",
			"submit_report_requested":	true,
			"delivery_report_requested":	true,
			"view_report_requested":	true
		}
	]
}
	
HTTP-Antwort empfangen vom Kotlin SMS-Beispiel

Sobald das SMS-Gateway diese Anfrage erhält, wird es eine HTTP-Antwort generieren. Die HTTP-Antwort enthält einen Statuscode, der anzeigt, ob die SMS-Sendeanfrage erfolgreich war oder nicht. Es wird auch eine JSON-kodierte Struktur zurückgegeben, die Ihnen nützliche Details über die Übermittlung der Nachricht liefert.

HTTP/1.1 200 OK
User-Agent: OZEKI 10.3.120 (www.myozeki.com)
Content-Type: application/json; charset=utf8
Last-Modified: Thu, 17 Jun 2021 14:56:26 GMT
Server: 10/10.3.120
Transfer-Encoding: chunked

{
	"http_code": 200,
	"response_code": "SUCCESS",
	"response_msg": "Nachrichten wurden zur Zustellung in die Warteschlange gestellt.",
	"data": {
	  "total_count": 1,
	  "success_count": 1,
	  "failed_count": 0,
	  "messages": [
	    {
	      "message_id": "e68f8e11-dce2-48e2-a2c5-1d2efa98272a",
	      "from_station": "%",
	      "to_address": "+36201111111",
	      "to_station": "%",
	      "text": "Hallo Welt!",
	      "create_date": "2021-06-17 15:04:03",
	      "valid_until": "2021-06-24 15:04:03",
	      "time_to_send": "2021-06-17 15:10:00",
	      "submit_report_requested": true,
	      "delivery_report_requested": true,
	      "view_report_requested": false,
	      "tags": [
	        {
	          "name": "Typ",
	          "value": "SMS:TEXT"
	        }
	      ],
	      "status": "SUCCESS"
	    }
	  ]
	}
}
	

Wie man eine geplante SMS von Kotlin aus mit der SMS-API und dem obigen Beispielprojekt sendet (Video-Tutorial)

Dieses Video zeigt Ihnen, wie Sie das SendScheduledSms.kt-Projekt herunterladen und verwenden. Sobald Sie das Beispielprojekt geöffnet haben, werden Sie vielleicht bemerken, dass es ein Paket namens Ozeki.Libs.Rest gibt. Dies ist das Paket, das die MessageApi und alles, was Sie benötigen, enthält, um eine geplante SMS mit Kotlin zu senden.

Video 2 - Wie man eine geplante SMS mit dem obigen Kotlin-Code sendet (Video-Tutorial)

Wie man überprüft, ob die SMS vom HTTP-Benutzer akzeptiert wurde

Nachdem die SMS übermittelt wurde, ist es eine gute Idee, Ihr SMS-Gateway zu überprüfen, um zu sehen, was es erhalten hat. Sie können das Protokoll einsehen, indem Sie die Details des HTTP-Benutzers aus der Ozeki SMS Gateway Management-Konsole öffnen. Am Ende des obigen Videos können Sie sehen, wie Sie überprüfen können, ob die Anfrage vom http_user empfangen wurde.

Kotlin-Projekt zum Senden geplanter SMS-Nachrichten
Abbildung 3 - SendScheduledSms.kt-Projekt in Android Studio

Wie die App auf einem Telefon aussieht (Video-Tutorial)

In Abbildung 4 können Sie die Benutzeroberfläche der App auf einem Telefon sehen. Wie Sie auf den Vorher-Nachher-Bildern sehen können, ist das geplante SMS-Senden mit dieser App sehr einfach. Nachdem die Nachricht gesendet wurde, wird das Protokoll des Sendevorgangs unter dem Textfeld "Zeit zum Senden" sichtbar. Hier erhalten Sie alle Informationen über die gesendete Nachricht.

Beispiel-Kotlin-Anwendung zum Senden geplanter SMS

Abbildung 4 - SendScheduledSms-Beispielanwendung vor und nach dem Versand der Nachrichten

Wie man Ozeki.Libs.Rest zu Ihrem eigenen Projekt hinzufügt

Die Ozeki.Libs.Rest-Bibliothek kann kostenlos heruntergeladen, verwendet und modifiziert werden.
Download: Ozeki.Libs.Rest.kt.zip (7.66Kb)

Wenn Sie sich entscheiden, Ihre Anwendung nur mit der Ozeki.Libs.Rest-Bibliothek selbst zu erstellen, gibt es einige Dinge, die Sie in Ihrer Basis-Anwendung ändern sollten. Um die Ozeki.Libs.Rest-Bibliothek zu verwenden, müssen Sie sie in den Java-Ordner des Hauptverzeichnisses legen
Im folgenden Video zeige ich Ihnen, wie Sie die Ozeki.Libs.Rest-Bibliothek herunterladen und zu Ihrem eigenen Projekt hinzufügen.

Video 3 - Wie Sie die Ozeki.Libs.Rest-Bibliothek zu Ihrer eigenen Anwendung hinzufügen (Video-Tutorial)

Abhängigkeiten

Es ist wichtig zu erwähnen, dass die Ozeki.Libs.Rest-Bibliothek einige Abhängigkeiten hat. Um sie zu verwenden, müssen Sie diese Abhängigkeiten in die Gradle Scripts aufnehmen.

implementation "com.squareup.okhttp3:okhttp:4.2.2"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0'
	

Code 1 - Die Liste der Abhängigkeiten, die Sie einbinden müssen.

Abhängigkeiten zum Projekt hinzufügen (Video-Tutorial) Im folgenden Video erfahren Sie, wie Sie die zuvor genannten Abhängigkeiten hinzufügen können. Es beginnt mit dem Kopieren des Codes und führt Sie bis zu den erfolgreich angehängten Abhängigkeiten. Das Video ist nur 53 Sekunden lang, enthält aber alle notwendigen Schritte, um den Prozess abzuschließen. Sie können diesem Tutorial ohne großen Aufwand folgen.

Video 4 - Wie Sie die benötigten Abhängigkeiten hinzufügen (Video-Tutorial)

Internetzugang

Damit Ihre Anwendung eine HTTP-Anfrage senden kann, müssen Sie ihr den Zugriff auf das Internet ermöglichen.
Im folgenden Video zeige ich Ihnen, wie Sie den Internetzugang für Ihre Kotlin-Anwendung freischalten.

<uses-permission android:name="android.permission.INTERNET" />
	

Code 2 - Um Internetzugang für Ihre Kotlin-Anwendung zu ermöglichen.

android:usesCleartextTraffic="true"
	

Code 3 - Um das Senden von HTTP-Anfragen zu ermöglichen

Internetverbindung für Ihr Projekt freischalten (Video-Tutorial)

Sie müssen beide dieser Zeilen zur AndroidManifest.xml-Datei hinzufügen.
Im folgenden Video zeige ich Ihnen, wo Sie die oben genannten Codes einfügen sollten. Sie müssen beide dieser Zeilen zur AndroidManifest.xml-Datei hinzufügen. Im folgenden Video zeige ich Ihnen, wo Sie die oben genannten Codes einfügen sollten. Das Video beginnt mit dem Kopieren und Einfügen des Codes und führt Sie bis zur erfolgreich eingerichteten Internetverbindung. Dieses Video ist detailliert und leicht zu verfolgen.

Video 5 - Wie Sie Internetzugang für Ihre Anwendung erlauben (Video-Tutorial)

Zusammenfassung

Diese Anleitung zeigt Ihnen die Schritte zum Planen von SMS in Kotlin mit der HTTP-Nutzung des Ozeki SMS Gateways. Das Planen von SMS, um Nachrichten zu versenden, wenn Ihre Kunden Zeit haben, sie zu lesen, hilft Ihnen, eine gute Beziehung zu ihnen aufrechtzuerhalten. Auf kleine Dinge wie den perfekten Zeitpunkt für das Teilen von Gedanken und Informationen zu achten, ist entscheidend, wenn Sie zeigen möchten, wie professionell Ihr Unternehmen ist.

Lesen Sie weiterhin Tutorials wie dieses auf der Ozeki-Webseite. Es gibt mehr Informationen zur Verwendung von Kotlin für den Umgang mit SMS-Nachrichten. Als nächstes lernen Sie Wie Sie eine SMS in Kotlin empfangen.

Laden Sie das Ozeki SMS Gateway jetzt herunter und setzen Sie das Gelernte um!

More information