Hogyan küldjünk több 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é. A 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 HTTP 200 OK választ küld a kérésedre. (1. ábra)

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

Kotlin kód több SMS mobilra küldéséhez

Az alábbi Kotlin SMS kódminta bemutatja, hogyan küldhetsz több 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ármely projektjében használhatja és módosíthatja.

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

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\nKi kell tölteni minden mezőt!", 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())
            }
        }

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

    <TextView
        android:id="@+id/textToAddress"
        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.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="Ü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" />

    <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="Küldés"
        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="Hozzáadás"
        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="Napló:"
        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>
	

A Kotlin SMS példa használata:

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

Töltse le a SendMultipleSms.kt fájlt

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

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

A SendMultipleSms.kt.zip fájl egy példaprojektet tartalmaz, amelyben megtalálható az Ozeki.Libs.Rest könyvtár. Ezzel a könyvtárral küldhetsz, törölhetsz, megjelö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 több SMS küldéséhez Kotlinnal
2. ábra - SendMultipleSms.kt könyvtárstruktúra

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

Több SMS küldése Kotlinból:

  1. Telepítse az Ozeki SMS Gateway-t
  2. Kapcsolja össze az Ozeki SMS Gateway-t a mobilhálózattal
  3. Küldjön egy teszt SMS-t az Ozeki grafikus felületéről
  4. Hozzon létre egy HTTP SMS API felhasználót
  5. Android Studio
  6. Töltse le a fenti példaprojektet
  7. Hozza létre az SMS-t egy új Message objektum létrehozásával
  8. Hozzon létre egy API-t az üzenetek küldéséhez
  9. Használja a Send metódust az üzenetek küldéséhez
  10. Olvassa el a válaszüzenetet a konzolon
  11. Ellenőrizze a naplókat az SMS gateway-ben

Az 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, hogy összekapcsolod az Ozeki SMS Gateway-t a mobilhálózattal. létrehozol 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

Több SMS küldéséhez Kotlinból a Kotlin kódodnak HTTP kérést kell küldenie az SMS gateway felé. 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 több SMS küldéséhez Kotlinból

A Kotlin SMS kliens hitelesítéséhez a felhasználónevet és a jelszót 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óddal végezheted el ezt a kódolást:

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 fejlécben tartalmaznia a HTTP kérésnek. 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. A 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: 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":	"Hello world 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":	"Hello world 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":	"Hello world 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
		}
	]
}
	

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 állapotkódot, ami jelzi, hogy az SMS beküldési kérés sikeres volt-e vagy sem. Emellett visszaad egy JSON kódolt struktúrát is, 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 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"
	    }
	  ]
	}
}
	

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

Ez a videó bemutatja, hogyan töltheted le és használhatod a SendMultipleSms.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 dolgot, amivel több SMS-t tudsz küldeni Kotlin használatával.

2. videó - Hogyan küldjünk több SMS üzenetet 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 gateway-t, 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 több SMS üzenet küldéséhez
3. ábra - SendMultipleSms.kt projekt az Android Studioban

Hogyan néz ki az alkalmazás használata virtuális telefonon

Amint a 4. ábrán látható, egyszerre több SMS üzenetet is küldhetsz az alkalmazással. Az üzenetek elküldése után a naplóban láthatod az üzenet szövegét. Itt további információkat kaphatsz az elküldött üzenetekről. Értesít arról, hogy az összes elküldött üzenetből hányat sikerült sikeresen elküldeni és hány sikertelen volt. (4. ábra)

példa Kotlin alkalmazás több SMS küldéséhez

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

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

Az Ozeki.Libs.Rest könyvtár ingyenesen letölthető, haszná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ást csak az Ozeki.Libs.Rest könyvtárral, 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 elhelyezned
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 adjuk hozzá az Ozeki.Libs.Rest könyvtárat a saját alkalmazáshoz (Videó útmutató)

Függőségek

Fontos megemlíteni, hogy az Ozeki.Libs.Rest könyvtárnak van néhány függősége. Ahhoz, hogy használni tudd, ezeket a függőségeket be kell írnod a Gradle Scripts-be.

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'
	

More information