Hogyan küldjünk SMS-t Kotlinból

A legegyszerűbb módja az SMS küldésének Kotlinból az Ozeki SMS Gateway beépített HTTP/Rest SMS API-jának használata. Amikor ezt az API-t használod, SMS üzeneteket küldhetsz HTTP POST kérések kiadásával az SMS gateway felé. Az HTTP POST kérés egy JSON formátumban formázott üzenetet fog tartalmazni. Az SMS gateway továbbítja ezt az SMS-t a címzett telefonszámára, és egy HTTP 200 OK választ küld vissza a kérésedre. (1. ábra)

hogyan küldjünk sms-t kotlinból
1. ábra - Hogyan küldjünk SMS-t Kotlinból

Kotlin kód SMS küldésére mobilra

Az alábbi Kotlin SMS kódminta bemutatja, hogyan küldhetsz SMS-t az Ozeki SMS Gateway http rest SMS API-jával, a Kotlin Ozeki.Libs.Rest könyvtár segítségével. Ez a könyvtár ingyenesen elérhető, és bármilyen projektben felhasználhatod és módosíthatod.

1. videó - Hogyan töltsd le a SendSms.kt.zip példát (Videó útmutató)

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="Küldés"
        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="Hello world!"
        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="Üzenet:"
        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="Címzett:"
        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="Napló:"
        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>
	

A Kotlin SMS példa használata:

A Message osztály segítségével létrehozhatod az SMS-t, és a MessageApi osztállyal elküldheted az SMS-t az SMS gatewaynek. Az SMS gateway továbbítja az üzenetedet a mobilhálózatnak vezeték nélküli kapcsolaton vagy az interneten keresztül.

SendSms.kt letöltése

Az ebben a cikkben ismertetett forráskód ingyenesen letölthető, felhasználható és módosítható.
Letöltés: SendSms.kt.zip (148Kb)

Mi található a SendSms.kt.zip fájlban?

A SendSms.kt.zip fájl tartalmazza a példaprojektet, amelyben megtalálható az Ozeki.Libs.Rest könyvtár. Ezzel a könyvtárral küldhetsz, törölhetsz, jelölhetsz és fogadhatsz SMS üzeneteket egy MessageApi létrehozásával és a Send(), Delete(), Mark(), és Receive() metódusok használatával. (2. ábra)

példaprojekt sms küldésére node js használatával
2. ábra - SendSms.kt könyvtárstruktúra

Hogyan küldjünk SMS-t Kotlinból (Gyors lépések)

SMS küldése Kotlinból:

  1. Telepítsd az Ozeki SMS Gateway-t
  2. Kapcsold össze az Ozeki SMS Gateway-t a mobilhálózattal
  3. Küldj egy teszt SMS-t az Ozeki GUI-ból
  4. Hozz létre egy HTTP SMS API felhasználót
  5. Android Studio
  6. Töltsd le a fenti példaprojektet
  7. Hozd létre az SMS-t egy új Message objektum létrehozásával
  8. Hozz létre egy API-t az üzeneted küldéséhez
  9. Használd a Send metódust az üzeneted küldéséhez
  10. Olvasd el a válaszüzenetet a konzolon
  11. Ellenőrizd a naplókat az SMS gatewayben

Ozeki SMS Gateway telepítése és HTTP API felhasználó létrehozása

Ahhoz, hogy SMS-t tudj küldeni Kotlinból, először telepítened kell az Ozeki SMS Gateway-t. Az SMS gateway telepíthető ugyanarra a számítógépre, ahol a Kotlin kódodat fejleszted az Android Studioban. A telepítés után a következő lépés az Ozeki SMS Gateway mobilhálózathoz való csatlakoztatása. Küldhetsz egy teszt SMS-t az Ozeki GUI-ból annak ellenőrzésére, hogy a mobilhálózati kapcsolatod működik. A környezet előkészítésének utolsó lépése egy HTTP SMS API felhasználói fiók létrehozása. Hozz létre egy felhasználót "http_user" felhasználónévvel és "qwe123" jelszóval, hogy a példa módosítás nélkül működjön.

Miután a környezet be van állítva, futtathatod a Kotlin kódodat.

HTTP API URL SMS küldéséhez Kotlinból

Ahhoz, hogy SMS-t küldj Kotlinból, a Kotlin alkalmazásodnak HTTP kérést kell küldenie az SMS gatewaynek. Az API URL az alábbiakban látható. Fontos, hogy az IP cím (127.0.0.1) helyére az SMS gateway IP címét írd. Ha az Ozeki SMS Gateway ugyanarra a számítógépre van telepítve, ahol a JavaScript SMS alkalmazás fut, ez lehet 127.0.0.1. Ha másik számítógépre van telepítve, akkor annak az IP címét kell megadni.

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

HTTP hitelesítés SMS küldéséhez Kotlinból

A Kotlin SMS kliens hitelesítéséhez a felhasználónevet és a jelszót egy base64 kódolt sztringként kell elküldeni a szervernek egy HTTP kérésben. A használt formátum: base64(felhasználónév+":"+jelszó). Kotlinban a következő kódot használhatod a kódoláshoz:

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

Például, ha a 'http_user' felhasználónevet és a 'qwe123' jelszót kódolod, a következő base64 kódolt sztringet kapod: aHR0cF91c2VyOnF3ZTEyMw==.

HTTP kérés fejléc SMS küldéséhez Kotlinból

Az SMS üzenetek küldéséhez a következő sorokat kell tartalmaznia az HTTP kérés fejlécének. Figyelj arra, hogy a tartalomtípus és egy Authorization fejléc is szerepel.

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

HTTP kérés SMS küldéséhez Kotlinból

Az SMS beküldéséhez a Kotlin alkalmazásod egy olyan HTTP kérést fog küldeni, mint az alábbi. Figyelj fel, hogy ez a kérés tartalmaz egy HTTP fejléc részt és egy HTTP törzs részt. Az HTTP törzs egy JSON kódolt adatsztring. Tartalmazza a címzett számát és az üzenet szövegét.

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":	"Hello world!",
			"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 válasz, amit a Kotlin SMS példa kap

Amint az SMS gateway megkapja ezt a kérést, generál egy HTTP választ. Az HTTP válasz tartalmaz egy státuszkódot, ami jelzi, hogy az SMS beküldési kérés sikeres volt-e vagy sem. Ezen kívül egy JSON kódolt struktúrát is visszaad, ami hasznos részleteket nyújt az üzenet beküldéséről.

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"
	    }
	  ]
	}
}
	

Hogyan küldjünk SMS-t Kotlinból az SMS API és a fenti példaprojekt segítségével (Videó útmutató)

Ez a videó bemutatja, hogyan töltsd le és használd a SendSms.kt projektet. Miután megnyitottad a példaprojektet, észreveheted, hogy van egy Ozeki.Libs.Rest nevű csomag. Ez a csomag tartalmazza a MessageApi-t és minden szükséges eszközt az SMS küldéséhez Kotlinban.

2. videó - Hogyan küldjünk SMS-t a fenti Kotlin kóddal (Videó útmutató)

Hogyan ellenőrizzük, hogy az SMS-t elfogadta-e az HTTP felhasználó

Az SMS beküldése után érdemes ellenőrizni az SMS gatewayt, hogy lássuk, mit kapott. A naplót az Ozeki SMS Gateway kezelőfelületén az HTTP felhasználó részleteinek megnyitásával ellenőrizheted. A fenti videó végén láthatod, hogyan ellenőrizheted, hogy a kérést megkapta-e a http_user. (3. ábra)

kotlin projekt sms üzenet küldésére
3. ábra - SendSms.kt projekt az Android Studioban

Hogyan néz ki az alkalmazás használata

A 4. ábrán láthatod, hogyan néz ki az alkalmazás, miután elküldtél egy üzenetet vele. Amint láthatod, a korábban küldött üzenetek naplóként tárolódnak a 'Üzenet' szövegdoboz alatt. Láthatod az üzenet összes információját, például a feladót, a szöveget és a küldési eljárás eredményét.

példa kotlin alkalmazás sms küldésére
4. ábra - SendSms példaalkalmazás az üzenet küldése előtt és után

Hogyan ellenőrizzük, hogy az SMS-t elküldte-e a mobilhálózat

Az eljárás ellenőrzésének utolsó lépése a mobilhálózati kapcsolat naplóinak megtekintése. Lehet, hogy be kell kapcsolnod a naplózást a kapcsolat beállításaiban, mielőtt elküldöd az üzenetet, hogy láthasd a naplókat. Ha a naplózás be van kapcsolva, látni fogod a telefonszámot és az üzenet szövegét, amit küldtél.

3. videó - Hogyan teszteljük, hogy az SMPP kliens megkapta-e a kérésünket (Videó útmutató)

Hogyan adjuk hozzá az Ozeki.Libs.Rest könyvtárat a saját projekthez

Az Ozeki.Libs.Rest könyvtár ingyenesen letölthető, felhasználható és módosítható.
Letöltés: Ozeki.Libs.Rest.kt.zip (7.66Kb)

Ha úgy döntesz, hogy saját magad hozod létre az alkalmazásodat csak az Ozeki.Libs.Rest könyvtár segítségével, néhány dolgot módosítanod kell az alap alkalmazásban. Az Ozeki.Libs.Rest könyvtár használatához a fő könyvtár java mappájába kell helyezned
A következő videóban megmutatom, hogyan töltsd le és add hozzá az Ozeki.Libs.Rest könyvtárat a saját projektedhez.

4. videó - Hogyan adjuk hozzá az Ozeki.Libs.Rest könyvtárat a saját alkalmazásunkhoz (Videó útmutató)

Függőségek

Fontos megemlíteni, hogy az Ozeki.Libs.Rest könyvtárnak vannak függőségei. A használatához ezeket a függőségeket hozzá kell adnod a Gradle Scripts-hez.

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'
	

1. kód - A felvenni kívánt függőségek listája.

Függőségek hozzáadása (videó útmutató)

A következő videóban megtanulhatod, hogyan add hozzá a korábban említett függőségeket. A kód másolásával kezdődik, és végigvezet a függőségek sikeres hozzáadásáig. A videó mindössze 53 másodperc hosszú, de tartalmazza az összes szükséges lépést a folyamat elvégzéséhez. Könnyedén követheted ezt az útmutatót.

5. videó - Hogyan adjuk hozzá a szükséges függőségeket (Videó útmutató)

Internet hozzáférés

Ahhoz, hogy az alkalmazásod képes legyen HTTP kérést küldeni, engedélyezned kell az internethez való csatlakozást.
A következő videóban megmutatom, hogyan engedélyezd az internet hozzáférést a Kotlin alkalmazásod számára.

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

2. kód - Az internet hozzáférés engedélyezése a Kotlin alkalmazásod számára.

android:usesCleartextTraffic="true"
	

3. kód - A HTTP kérések küldésének engedélyezése

Hogyan engedélyezzük az internetkapcsolatot az alkalmazásunk számára (Videó útmutató)

Mindkét sort hozzá kell adnod az AndroidManifest.xml fájlhoz.
A következő videóban megmutatom, hová kell elhelyezned a fenti kódokat. A videó a kód másolásával kezdődik, és végigvezet az internetkapcsolat sikeres hozzáadásáig. Ez a videó részletes és könnyen követhető.

6. videó - H

More information