Hogyan ütemezzen SMS-t Kotlinban

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

hogyan ütemezzen sms-t kotlinban
1. ábra - Hogyan ütemezzen SMS-t Kotlinban

Kotlin kód ütemezett SMS küldéséhez mobilra

Az alábbi Kotlin SMS kód minta bemutatja, hogyan küldhetsz ütemezett SMS-t az Ozeki SMS Gateway http rest sms api-jával, az Ozeki.Libs.Rest könyvtár használatával. Ez a könyvtár ingyenesen elérhető számodra, és bármely projektben felhasználhatod és módosíthatod.

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

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="Küldés"
        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="Címzett:"
        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="Ü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/textWhen"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="Küldés ideje:"
        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="Hello world!"
        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="Napló:"
        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>
	

Hogyan használd a Kotlin SMS példát:

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

Töltse le a SendScheduledSms.kt fájlt

A cikkben ismertetett forráskód letölthető, felhasználható és módosítható ingyenesen.
Letöltés: SendScheduledSms.kt.zip (149Kb)

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

A SendScheduledSms.kt.zip fájl tartalmaz egy 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 ütemezett sms küldéséhez kotlinban
2. ábra - SendScheduledSms.kt könyvtár

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

Ütemezett SMS küldéséhez Kotlinból:

  1. Telepítsd az Ozeki SMS Gateway-t
  2. Kapcsold az Ozeki SMS Gateway-t a mobilhálózathoz
  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 ütemezett üzeneted küldéséhez
  9. Használd a Send metódust az ütemezett üzeneted küldéséhez
  10. Olvasd el a válaszüzenetet a konzolon
  11. Ellenőrizd a naplókat az SMS gateway-ben

Telepítsd az Ozeki SMS Gateway-t és hozz létre egy HTTP API felhasználót

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 Android Studio-ban. A telepítés után a következő lépés az, hogy kapcsold az Ozeki SMS Gateway-t a mobilhálózathoz. hozz létre egy HTTP SMS API felhasználót. 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.

A környezet beállítása után futtathatod a Kotlin kódodat.

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

Ütemezett SMS küldéséhez Kotlinból a Kotlin kódodnak egy HTTP kérést kell küldenie az SMS gateway-nek. Az API URL az alábbiakban látható. Fontos, hogy az IP cím (127.0.0.1) legyen lecserélve az SMS gateway IP címére. 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 a számítógépnek az IP címét kell megadni.

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

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

A Kotlin SMS kliens hitelesítéséhez a felhasználónevet és jelszót kell küldened egy base64 kódolt stringként 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, akkor a következő base64 kódolt stringet kapod: aHR0cF91c2VyOnF3ZTEyMw==. A küldéshez

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 a HTTP kérés fejlécének. Figyelj arra, hogy tartalmazunk egy content type és egy Authorization fejlécet.

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 arra, hogy ez a kérés tartalmaz egy HTTP fejléc részt és egy http törzs részt. A HTTP törzs egy JSON kódolt adat string. 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: 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":	"Hello world!",
			"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 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. A HTTP válasz tartalmaz egy státusz kódot, ami jelzi, hogy az SMS beküldési kérés sikeres volt-e vagy sem. 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: Thu, 17 Jun 2021 14:56:26 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": "e68f8e11-dce2-48e2-a2c5-1d2efa98272a",
	      "from_station": "%",
	      "to_address": "+36201111111",
	      "to_station": "%",
	      "text": "Hello world!",
	      "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": "Type",
	          "value": "SMS:TEXT"
	        }
	      ],
	      "status": "SUCCESS"
	    }
	  ]
	}
}
	

Hogyan küldj ütemezett SMS-t Kotlinból az SMS API és a fenti példaprojekt használatával (Videó útmutató)

Ez a videó bemutatja, hogyan töltheted le és használhatod a SendScheduledSms.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 mindent, amire szükséged van az ütemezett SMS küldéséhez Kotlinban.

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

Hogyan ellenőrizd, hogy az SMS-t elfogadta-e a HTTP felhasználó

Az SMS beküldése után érdemes ellenőrizni az SMS gateway-t, hogy lássad, mit kapott. A naplót az Ozeki SMS Gateway kezelőfelületén keresztül ellenőrizheted, ahol megnyithatod a HTTP felhasználó részleteit. A fenti videó végén láthatod, hogyan ellenőrizheted, hogy a http_user megkapta-e a kérést.

kotlin projekt ütemezett sms üzenetek küldéséhez
3. ábra - SendScheduledSms.kt projekt Android Studio-ban

Hogyan néz ki az alkalmazás használata telefonon (Videó útmutató)

A 4. ábrán láthatod az alkalmazás felhasználói felületét telefonon. Amint láthatod a képkockákon, az ütemezett SMS küldés nagyon egyszerű ezzel az alkalmazással. Az üzenet elküldése után a küldési folyamat naplója látható lesz a 'Küldés ideje' szövegdoboz alatt. Itt minden információt megtalálsz az elküldött üzenetről.

példa kotlin alkalmazás ütemezett sms küldéséhez

4. ábra - SendScheduledSms példaalkalmazás az üzenetek küldése előtt és után

Hogyan adjad hozzá az Ozeki.Libs.Rest könyvtárat a saját projektedhez

Az Ozeki.Libs.Rest könyvtár letölthető, felhasználható és módosítható ingyenesen.
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árral, akkor néhány dolgot módosítanod kell az alap alkalmazásodban. Az Ozeki.Libs.Rest könyvtár használatához be kell helyezned a java mappába a fő könyvtárban
A következő videóban megmutatom, hogyan töltheted le és adhatod hozzá az Ozeki.Libs.Rest könyvtárat a saját projektedhez.

3. videó - Hogyan add hozzá az Ozeki.Libs.Rest könyvtárat a saját alkalmazásodhoz (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 a projekthez (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 sikeresen hozzáadott függőségekig. A videó mindössze 53 másodperc hosszú, de tartalmazza az összes szükséges lépést a folyamat befejezéséhez. Könnyedén követheted ezt az útmutatót.

4. videó - Hogyan add 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 internetkapcsolatot az alkalmazásod számára.
A következő videóban megmutatom, hogyan engedélyezheted 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

Internetkapcsolat engedély

More information