Wie man mehrere SMS von Kotlin aus sendet
Der einfachste Weg, SMS von Kotlin aus zu senden, 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 Nachricht im JSON-Format enthalten. Das SMS-Gateway sendet diese SMS an das Empfängertelefon und gibt eine HTTP-200-OK-Antwort auf Ihre Anfrage zurück. (Abbildung 1)
Das folgende Kotlin-SMS-Codebeispiel zeigt, wie Sie mehrere 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.
MainActivity.kt
package send.multiple.sms import Ozeki.Libs.Rest.Configuration import Ozeki.Libs.Rest.Message import Ozeki.Libs.Rest.MessageApi import android.os.Bundle import android.text.method.ScrollingMovementMethod import android.widget.ArrayAdapter import androidx.appcompat.app.AppCompatActivity 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 btnAddMessage:android.widget.Button = findViewById(R.id.btnAddMessage) val btnSendRequest:android.widget.Button = findViewById(R.id.btnSendRequest) val listOfMessages:android.widget.ListView = findViewById(R.id.listView) 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) val messages : ArrayList<Message> = arrayListOf() val messages_label : ArrayList<String> = arrayListOf() val arrayAdapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, messages_label) listOfMessages.adapter = arrayAdapter btnAddMessage.setOnClickListener { if (inputToAddress.text.toString() != "" && inputMessage.text.toString() != "" ) { val msg = Message() msg.ToAddress = inputToAddress.text.toString() msg.Text = inputMessage.text.toString() inputToAddress.text.clear() inputMessage.text.clear() messages_label.add(msg.toString()) arrayAdapter.notifyDataSetChanged() messages.add(msg) } else { logBox.text = String.format("%s\nSie müssen alle Felder ausfüllen!", logBox.text) } } btnSendRequest.setOnClickListener { messages_label.clear() arrayAdapter.notifyDataSetChanged() GlobalScope.launch(Dispatchers.IO) { val response = api.Send(messages) messages.clear() logBox.text = String.format("%s\n%s", logBox.text, response.toString()) } } } }
<?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"> <TextView android:id="@+id/textToAddress" 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.498" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/textMsg" 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" /> <EditText android:id="@+id/inputToAddress" android:layout_width="320dp" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:ems="10" 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="80dp" android:layout_marginTop="20dp" android:ems="10" android:gravity="start|top" android:inputType="textMultiLine" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.494" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textMsg" /> <Button android:id="@+id/btnSendRequest" android:layout_width="320dp" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="Senden" android:backgroundTint="#FF3F3F" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/listView" /> <Button android:id="@+id/btnAddMessage" android:layout_width="320dp" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:backgroundTint="#FF3F3F" android:text="Hinzufügen" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.505" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/inputMessage" /> <ListView android:id="@+id/listView" android:layout_width="320dp" android:layout_height="120dp" android:layout_marginTop="20dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.494" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/btnAddMessage" /> <TextView android:id="@+id/logBox" android:layout_width="320dp" android:layout_height="80dp" android:layout_marginTop="20dp" android:nestedScrollingEnabled="false" android:scrollbars="vertical" android:text="Protokolle:" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.494" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/btnSendRequest" /> </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-Nachrichten 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.
SendMultipleSms.kt herunterladen
Der in diesem Artikel erklärte Quellcode kann kostenlos heruntergeladen, verwendet und modifiziert werden.
Download: SendMultipleSms.kt.zip (150Kb)
Was befindet sich in der SendMultipleSms.kt.zip-Datei?
Die SendMultipleSms.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)
Wie Sie mehrere SMS von Kotlin aus senden (Schnelle Schritte)
Um mehrere SMS von Kotlin aus zu senden:
- Installieren Sie Ozeki SMS Gateway
- Verbinden Sie Ozeki SMS Gateway mit dem Mobilfunknetz
- Senden Sie eine Test-SMS über die Ozeki GUI
- Erstellen Sie einen HTTP-SMS-API-Benutzer
- Android Studio
- Laden Sie das oben genannte Beispielprojekt herunter
- Erstellen Sie die SMS, indem Sie ein neues Message-Objekt erstellen
- Erstellen Sie eine API zum Senden Ihrer Nachrichten
- Verwenden Sie die Send-Methode, um Ihre Nachrichten zu senden
- Lesen Sie die Antwortnachricht auf der Konsole
- Ü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 einen HTTP-SMS-API-Benutzer zu erstellen. 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 mehrere SMS von Kotlin aus zu senden, muss Ihr Kotlin 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 mehrerer SMS von Kotlin aus
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 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- 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 Datenzeichenkette. Sie enthält die Empfängernummer und den Text der Nachricht.
POST /api?action=sendmsg HTTP/1.1 Connection: Keep-Alive Content-Length: 944 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": "50fae4db-be52-4a79-905b-d51d1c83351b", "to_address": "+36201111111", "text": "Hallo Welt 3", "create_date": "2021-06-17T13:59:40", "valid_until": "2021-06-24T13:59:40", "time_to_send": "-999999999-01-01T00:00", "submit_report_requested": true, "delivery_report_requested": true, "view_report_requested": true }, { "message_id": "6be6e16f-783e-4a88-ba7c-5f37553ee430", "to_address": "+36202222222", "text": "Hallo Welt 2", "create_date": "2021-06-17T13:59:58", "valid_until": "2021-06-24T13:59:58", "time_to_send": "-999999999-01-01T00:00", "submit_report_requested": true, "delivery_report_requested": true, "view_report_requested": true }, { "message_id": "128495ae-7175-4219-bed5-5da3161e7c1a", "to_address": "+36203333333", "text": "Hallo Welt 1", "create_date": "2021-06-17T14:00:15", "valid_until": "2021-06-24T14:00:15", "time_to_send": "-999999999-01-01T00:00", "submit_report_requested": true, "delivery_report_requested": true, "view_report_requested": true } ] }
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 13:48:15 GMT Server: 10/10.3.120 Transfer-Encoding: chunked { "http_code": 200, "response_code": "SUCCESS", "response_msg": "Messages queued for delivery.", "data": { "total_count": 3, "success_count": 3, "failed_count": 0, "messages": [ { "message_id": "50fae4db-be52-4a79-905b-d51d1c83351b", "from_station": "%", "to_address": "+36201111111", "to_station": "%", "text": "Hello world 3", "create_date": "2021-06-17 13:59:40", "valid_until": "2021-06-24 13:59:40", "time_to_send": "2021-06-17 13:59:40", "submit_report_requested": true, "delivery_report_requested": true, "view_report_requested": false, "tags": [ { "name": "Type", "value": "SMS:TEXT" } ], "status": "SUCCESS" }, { "message_id": "6be6e16f-783e-4a88-ba7c-5f37553ee430", "from_station": "%", "to_address": "+36202222222", "to_station": "%", "text": "Hello world 2", "create_date": "2021-06-17 13:59:58", "valid_until": "2021-06-24 13:59:58", "time_to_send": "2021-06-17 13:59:58", "submit_report_requested": true, "delivery_report_requested": true, "view_report_requested": false, "tags": [ { "name": "Type", "value": "SMS:TEXT" } ], "status": "SUCCESS" }, { "message_id": "128495ae-7175-4219-bed5-5da3161e7c1a", "from_station": "%", "to_address": "+36203333333", "to_station": "%", "text": "Hello world 1", "create_date": "2021-06-17 14:00:15", "valid_until": "2021-06-24 14:00:15", "time_to_send": "2021-06-17 14:00:15", "submit_report_requested": true, "delivery_report_requested": true, "view_report_requested": false, "tags": [ { "name": "Type", "value": "SMS:TEXT" } ], "status": "SUCCESS" } ] } }
Wie man mehrere SMS von Kotlin aus mit der SMS-API und dem obigen Beispielprojekt sendet (Video-Tutorial)
Dieses Video zeigt Ihnen, wie Sie das SendMultipleSms.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 zum Senden mehrerer SMS mit Kotlin benötigen, enthält.
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 überprüfen, 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)
Wie die Verwendung der App auf einem virtuellen Telefon aussieht
Wie Sie in Abbildung 4 sehen können, können Sie mit der App mehrere SMS-Nachrichten gleichzeitig senden. Nachdem Sie die Nachrichten gesendet haben, können Sie ein Protokoll nach dem Text der Nachricht sehen. Dort erhalten Sie weitere Informationen über die gesendeten Nachrichten. Es wird Ihnen mitteilen, wie viele der gesendeten Nachrichten erfolgreich gesendet wurden und wie viele fehlgeschlagen sind. (Abbildung 4)
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
zu erstellen, müssen Sie einige Dinge in Ihrer Basis-Anwendung ändern.
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.
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 einfügen.
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'
Abhängigkeiten hinzufügen (Video-Tutorial)
Im folgenden Video lernen Sie, wie Sie die zuvor erwähnten Abhängigkeiten zu Ihrem Projekt hinzufügen. Es beginnt mit dem Kopieren des Codes und führt Sie bis zu den funktionierenden Abhängigkeiten. Das Video ist nur 53 Sekunden lang, zeigt aber alle notwendigen Schritte, um den Prozess abzuschließen. Sie können diesem Tutorial mühelos folgen.
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" />
android:usesCleartextTraffic="true"
Internetverbindung zum Projekt hinzufügen (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. Das Video beginnt mit dem Kopieren des Codes und führt Sie zu einer funktionierenden Internetverbindung. Dieses Video ist sehr einfach zu folgen, zeigt aber alle notwendigen Schritte detailliert.
Zusammenfassend
Dieser Artikel hilft Ihnen, eine HTTP-SMS-API im Ozeki SMS Gateway einzurichten und den gegebenen Kotlin-Code zum Senden mehrerer SMS-Nachrichten zu verwenden. Diese Lösung ist perfekt, wenn Sie eine wichtige Nachricht schnell an mehrere Kunden weiterleiten müssen. Es ist vorteilhaft, diese Lösung in Ihrer Kotlin-App zu verwenden, um ein leistungsstarkes Informationsverteilungssystem zu haben.
Weitere Informationen zu diesem Thema finden Sie auf der Ozeki-Webseite. Lesen Sie weiter mit dem Artikel Wie Sie eine SMS in Kotlin planen.
Laden Sie jetzt das Ozeki SMS Gateway herunter und beginnen Sie mit der Entwicklung Ihres Geschäfts!
More information
- Kotlin SMS mit HTTP-REST-API senden (Codebeispiel)
- Kotlin mehrere SMS mit HTTP-REST-API senden (Codebeispiel)
- Kotlin SMS mit HTTP-REST-API planen (Codebeispiel)
- Kotlin SMS mit HTTP-REST-API empfangen (Codebeispiel)
- Kotlin SMS mit HTTP-REST-API löschen (Codebeispiel)
- Github: Kotlin SMS API