Wie man SMS von Kotlin aus sendet

Der einfachste Weg, SMS von Kotlin aus zu senden, ist die Verwendung der integrierten HTTP/Rest-SMS-API von Ozeki SMS Gateway. 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 SMS von Kotlin aus sendet
Abbildung 1 - Wie man SMS von Kotlin aus sendet

Das folgende Kotlin-SMS-Codebeispiel zeigt, wie Sie SMS mit der HTTP-REST-SMS-API des Ozeki SMS Gateway unter Verwendung der Kotlin-Bibliothek Ozeki.Libs.Rest 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 - So laden Sie das SendSms.kt.zip-Beispiel herunter (Video-Tutorial)

MainActivity.kt
package send.sms

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

class MainActivity : AppCompatActivity() {
    @RequiresApi(Build.VERSION_CODES.O)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val btnSendRequest:android.widget.Button = findViewById(R.id.btnSendRequest)
        val inputToAddress:android.widget.EditText = findViewById(R.id.inputToAddress)
        val inputMessage:android.widget.EditText = findViewById(R.id.inputMessage)
        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() != "") {
                GlobalScope.launch(Dispatchers.IO) {
                    val msg = Message()
                    msg.ToAddress = inputToAddress.text.toString()
                    msg.Text = inputMessage.text.toString()
                    inputToAddress.text.clear()
                    inputMessage.text.clear()
                    val response = api.Send(msg)
                    logBox.text = String.format("%s\n%s", logBox.text, response.toString())
                }
            }
        }
    }
}
	
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="send.sms.MainActivity">

    <Button
        android:id="@+id/btnSendRequest"
        android:layout_width="320dp"
        android:layout_height="50dp"
        android:layout_marginBottom="24dp"
        android:text="Senden"
        android:backgroundTint="#FF3F3F"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.505"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/logBox"
        app:layout_constraintVertical_bias="0.776" />

    <EditText
        android:id="@+id/inputMessage"
        android:layout_width="320dp"
        android:layout_height="150dp"
        android:layout_marginTop="32dp"
        android:ems="10"
        android:gravity="start|top"
        android:hint="Hallo Welt!"
        android:inputType="textMultiLine"
        android:textColorHint="#BFBFBF"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.494"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <TextView
        android:id="@+id/textView"
        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/textView2"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:text="An Adresse:"
        android:textSize="20sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.505"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/inputToAddress"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:ems="10"
        android:hint="+36201111111"
        android:inputType="textPersonName"
        android:textColorHint="#BFBFBF"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.505"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView2" />

    <TextView
        android:id="@+id/logBox"
        android:layout_width="320dp"
        android:layout_height="160dp"
        android:layout_marginTop="36dp"
        android:scrollbars="vertical"
        android:text="Protokoll:"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.505"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/inputMessage" />

</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 SMS an das SMS-Gateway zu senden. Das SMS-Gateway leitet Ihre Nachricht dann entweder über eine drahtlose Verbindung oder über das Internet an das Mobilfunknetz weiter.

Download SendSms.kt

Der in diesem Artikel erklärte Quellcode kann kostenlos heruntergeladen, genutzt und modifiziert werden.
Download: SendSms.kt.zip (148Kb)

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

Die SendSms.kt.zip-Datei enthält das 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 von SMS mit Node JS
Abbildung 2 - SendSms.kt-Verzeichnis

Wie man SMS von Kotlin aus sendet (Schnelle Schritte)

Um SMS von Kotlin aus zu senden:

  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, um Ihre Nachricht zu senden
  9. Verwenden Sie die Send-Methode, um Ihre 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 von Kotlin aus 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 besteht der nächste Schritt darin, Ozeki SMS Gateway mit dem Mobilfunknetz zu verbinden. Sie können Erstellung 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 von Kotlin aus

Um SMS von Kotlin aus zu senden, muss Ihre Kotlin-Anwendung 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 von SMS von Kotlin aus

Um den Kotlin-SMS-Client zu authentifizieren, müssen Sie den Benutzernamen und das Passwort in einer base64-kodierten Zeichenfolge in einer HTTP-Anfrage an den Server 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 Zeichenfolge: aHR0cF91c2VyOnF3ZTEyMw==. Zum Senden

HTTP-Anfrageheader zum Senden von SMS von Kotlin aus

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 von Kotlin aus

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 Datenzeichenfolge. Sie enthält die Empfängernummer und den Text der Nachrichten.

POST /api?action=sendmsg HTTP/1.1
Connection: Keep-Alive
Content-Length: 323
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":	"b686acf6-7420-4a3d-b444-779dcffc652b",
			"to_address":	"+36201111111",
			"text":	"Hallo Welt!",
			"create_date":	"2021-06-17T09:48:30",
			"valid_until":	"2021-06-24T09:48:30",
			"time_to_send":	"-999999999-01-01T00:00",
			"submit_report_requested":	true,
			"delivery_report_requested":	true,
			"view_report_requested":	true
		}
	]
}
	

HTTP-Antwort, die vom Kotlin-SMS-Beispiel empfangen wurde

Sobald das SMS-Gateway diese Anfrage erhält, generiert es eine HTTP-Antwort. 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: Wed, 16 Jun 2021 09:06:03 GMT
Server: 10/10.3.120
Transfer-Encoding: chunked

{
	"http_code": 200,
	"response_code": "SUCCESS",
	"response_msg": "Messages queued for delivery.",
	"data": {
	  "total_count": 1,
	  "success_count": 1,
	  "failed_count": 0,
	  "messages": [
	    {
	      "message_id": "b686acf6-7420-4a3d-b444-779dcffc652b",
	      "from_station": "%",
	      "to_address": "+36201111111",
	      "to_station": "%",
	      "text": "Hello world!",
	      "create_date": "2021-06-17 09:48:30",
	      "valid_until": "2021-06-24 09:48:30",
	      "time_to_send": "2021-06-17 09:48:30",
	      "submit_report_requested": true,
	      "delivery_report_requested": true,
	      "view_report_requested": false,
	      "tags": [
	        {
	          "name": "Type",
	          "value": "SMS:TEXT"
	        }
	      ],
	      "status": "SUCCESS"
	    }
	  ]
	}
}
	

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

Dieses Video zeigt Ihnen, wie Sie das SendSms.kt-Projekt herunterladen und verwenden. Sobald Sie das Beispielprojekt geöffnet haben, werden Sie möglicherweise bemerken, dass es ein Paket namens Ozeki.Libs.Rest gibt. Dies ist das Paket, das die MessageApi und alles, was Sie zum Senden einer SMS mit Kotlin benötigen, enthält.

Video 2 - Wie Sie SMS mit dem obigen Kotlin-Code senden (Video-Tutorial)

Wie Sie überprüfen können, 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 empfangen 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. (Abbildung 3)

Kotlin-Projekt zum Senden von SMS-Nachrichten
Abbildung 3 - SendSms.kt-Projekt in Android Studio

Wie die Verwendung der App aussieht

In Abbildung 4 können Sie sehen, wie die App aussieht, nachdem Sie eine Nachricht damit gesendet haben. Wie Sie sehen, werden Ihre zuvor gesendeten Nachrichten als Protokoll unter dem 'Nachricht'-Textfeld gespeichert. Sie können alle Informationen über die Nachricht sehen, wie den Absender, den Text und das Ergebnis des Sendevorgangs.

Beispiel-Kotlin-Anwendung zum Senden von SMS
Abbildung 4 - SendSms-Beispielanwendung vor und nach dem Senden der Nachricht

Wie Sie überprüfen können, ob die SMS an das Mobilfunknetz gesendet wurde

Der letzte Schritt zur Überprüfung des Vorgangs besteht darin, die Protokolle der Mobilfunknetzverbindung zu überprüfen. Möglicherweise müssen Sie die Protokollierung in der Konfiguration der Verbindung aktivieren, bevor Sie die Nachricht senden, um die Protokolle zu sehen. Wenn die Protokollierung aktiviert ist, sehen Sie die Telefonnummer und den Text der Nachricht, die Sie gesendet haben.

Video 3 - Wie Sie testen können, ob der SMPP-Client unsere Anfrage erhalten hat (Video-Tutorial)

Wie Sie Ozeki.Libs.Rest zu Ihrem eigenen Projekt hinzufügen

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 einfügen
Im folgenden Video zeige ich Ihnen, wie Sie die Ozeki.Libs.Rest -Bibliothek herunterladen und zu Ihrem eigenen Projekt hinzufügen.

Video 4 - 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.

Die Abhängigkeiten hinzufügen (Video-Tutorial)

Im folgenden Video erfahren Sie, wie Sie die zuvor genannten Abhängigkeiten hinzufügen. Es beginnt mit dem Kopieren des Codes und führt Sie bis zu den erfolgreich hinzugefügten 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 mühelos folgen.

Video 5 - 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 aktivieren.

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

Code 2 - Um den Internetzugang für Ihre Kotlin-Anwendung zu aktivieren.

android:usesCleartextTraffic="true"
	

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

Wie Sie die Internetverbindung für Ihre App aktivieren (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. Das Video beginnt mit dem Kopieren des Codes und führt Sie bis zur erfolgreich hinzugefügten Internetverbindung. Dieses Video ist detailliert und leicht zu verfolgen.

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

Fazit

Der Zweck dieser Anleitung war es, Ihnen zu zeigen, wie Sie SMS-Nachrichten aus Kotlin mit der HTTP-SMS-API des Ozeki SMS Gateways senden können. Das hier erworbene Wissen ermöglicht es Ihnen, mit Ihren Kunden über einen einfachen Kotlin-Code in Kontakt zu bleiben. Internationales Messaging ist mit dem Ozeki SMS Gateway ebenfalls möglich, da es in jedem Land funktioniert und SMS über verschiedene Mobilfunkverbindungen senden und empfangen kann.

Stellen Sie sicher, dass Sie hier weiterlernen, besuchen Sie andere Tutorial-Seiten auf der Ozeki-Website für weitere Informationen. Sehen Sie sich weitere Anleitungen zur Verwendung von Kotlin an, beginnen Sie mit der Wie Sie mehrere SMS aus Kotlin senden.

Jetzt ist Ihr erster Schritt, das Ozeki SMS Gateway herunterzuladen und zu nutzen!

More information