كيفية إرسال رسائل SMS متعددة من Kotlin

أبسط طريقة لإرسال رسائل SMS من Kotlin هي استخدام واجهة برمجة تطبيقات HTTP/Rest المدمجة في بوابة Ozeki SMS. عند استخدام هذه الواجهة، ستقوم بإرسال رسائل SMS عن طريق إصدار طلب HTTP Post إلى بوابة SMS. سيحتوي طلب HTTP Post على رسالة مُنسقة بتنسيق json. ستقوم بوابة SMS بإرسال هذه الرسالة إلى هاتف المستلم، وسيتم إرجاع استجابة HTTP 200 OK إلى طلبك. (الشكل 1)

كيفية إرسال رسائل SMS متعددة من Kotlin
الشكل 1 - كيفية إرسال رسائل SMS متعددة من Kotlin

كود Kotlin لإرسال رسائل SMS متعددة إلى الهاتف المحمول

يعرض نموذج كود SMS بلغة Kotlin أدناه كيفية إرسال رسائل SMS متعددة باستخدام واجهة برمجة تطبيقات REST لرسائل SMS من بوابة Ozeki SMS Gateway باستخدام مكتبة Ozeki.Libs.Rest بلغة Kotlin. هذه المكتبة مقدمة لك مجانًا، ويمكنك استخدامها وتعديلها في أي من مشاريعك.

الفيديو 1 - كيفية تحميل ملف SendMultipleSms.kt.zip كمثال (شرح بالفيديو)

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\nيجب ملء جميع الحقول!", 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="العنوان المرسل إليه:"
        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="الرسالة:"
        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="إرسال"
        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="إضافة"
        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="السجلات:"
        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>
	

كيفية استخدام مثال SMS بلغة Kotlin:

يمكنك استخدام فئة Message لإنشاء رسائل SMS واستخدام فئة MessageApi لإرسال رسائل SMS إلى بوابة SMS. ستقوم بوابة SMS بإعادة توجيه رسالتك إلى شبكة الهاتف المحمول إما عبر اتصال لاسلكي أو عبر الإنترنت.

تنزيل SendMultipleSms.kt

يمكن تنزيل الكود المصدري الموضح في هذه المقالة واستخدامه وتعديله مجانًا.
تنزيل: SendMultipleSms.kt.zip (150 كيلوبايت)

ما الموجود في ملف SendMultipleSms.kt.zip؟

يحتوي ملف SendMultipleSms.kt.zip على مشروع مثال، والذي يتضمن مكتبة Ozeki.Libs.Rest. باستخدام هذه المكتبة يمكنك إرسال وحذف وتحديد واستقبال رسائل SMS عن طريق إنشاء MessageApi واستخدام طرق Send() و Delete() و Mark() و Receive(). (الشكل 2)

مشروع مثال لإرسال رسائل SMS متعددة باستخدام Kotlin
الشكل 2 - دليل SendMultipleSms.kt

كيفية إرسال رسائل SMS متعددة من Kotlin (خطوات سريعة)

لإرسال رسائل SMS متعددة من Kotlin:

  1. تثبيت Ozeki SMS Gateway
  2. ربط Ozeki SMS Gateway بشبكة الهاتف المحمول
  3. إرسال رسالة SMS اختبارية من واجهة Ozeki
  4. إنشاء مستخدم HTTP SMS API
  5. Android Studio
  6. تنزيل مشروع المثال أعلاه
  7. إنشاء الرسالة عن طريق إنشاء كائن Message جديد
  8. إنشاء API لإرسال رسائلك
  9. استخدام طريقة Send لإرسال رسائلك
  10. قراءة رسالة الاستجابة على وحدة التحكم
  11. فحص السجلات في بوابة الرسائل

تثبيت Ozeki SMS Gateway وإنشاء مستخدم HTTP API

لتتمكن من إرسال رسائل SMS من Kotlin، تحتاج أولاً إلى تثبيت Ozeki SMS Gateway. يمكن تثبيت بوابة الرسائل على نفس الكمبيوتر الذي تقوم فيه بتطوير كود Kotlin في Android Studio. بعد التثبيت، الخطوة التالية هي ربط Ozeki SMS Gateway بشبكة الهاتف المحمول. يمكنك إنشاء مستخدم HTTP SMS API. قم بإنشاء مستخدم باسم مستخدم "http_user" وكلمة مرور "qwe123" لجعل المثال يعمل دون تعديل.

بعد إعداد البيئة، يمكنك تشغيل كود Kotlin الخاص بك.

رابط HTTP API لإرسال رسائل SMS من Kotlin

لإرسال رسائل SMS متعددة من Kotlin، سيتعين على Kotlin إصدار طلب HTTP إلى بوابة الرسائل. يظهر رابط API أدناه. لاحظ أنه يجب استبدال عنوان IP (127.0.0.1) بعنوان IP الخاص ببوابة الرسائل. إذا تم تثبيت Ozeki SMS Gateway على نفس الكمبيوتر الذي يعمل عليه تطبيق JavaScript لإرسال الرسائل، يمكن أن يكون هذا 127.0.0.1. إذا تم تثبيته على كمبيوتر مختلف، فيجب أن يكون عنوان IP لذلك الكمبيوتر.

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

مصادقة HTTP لإرسال رسائل SMS متعددة من Kotlin

لمصادقة عميل SMS في Kotlin، تحتاج إلى إرسال اسم المستخدم وكلمة المرور في سلسلة مشفرة بـ base64 إلى الخادم في طلب HTTP. التنسيق المستخدم هو: base64(username+":"+password). في Kotlin يمكنك استخدام الكود التالي لإجراء هذا التشفير:

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

على سبيل المثال، إذا قمت بتشفير اسم المستخدم 'http_user' وكلمة المرور 'qwe123'، ستحصل على السلسلة المشفرة بـ base64 التالية: aHR0cF91c2VyOnF3ZTEyMw==. للإرسال

رأس طلب HTTP لإرسال رسائل SMS من Kotlin

لإرسال رسائل SMS، تحتاج إلى تضمين الأسطر التالية كرؤوس في طلب HTTP. لاحظ أننا ندرج نوع المحتوى ورأس المصادقة.

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

طلب HTTP لإرسال رسائل SMS من Kotlin

لإرسال الرسائل، سيقوم تطبيق Kotlin الخاص بك بإرسال طلب HTTP مشابه للطلب أدناه. لاحظ أن هذا الطلب يحتوي على جزء رأس HTTP وجزء جسم HTTP. جسم HTTP هو سلسلة بيانات مشفرة بـ JSON. يحتوي على رقم المستلم ونص الرسالة.

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 المستلمة بواسطة مثال Kotlin لرسائل SMS

بمجرد أن يستقبل بوابة الرسائل القصيرة هذا الطلب، ستقوم بإنشاء استجابة HTTP. ستحتوي استجابة HTTP على رمز حالة، للإشارة إلى ما إذا كان طلب إرسال الرسالة القصيرة ناجحًا أم لا. كما ستعود أيضًا بهيكل مشفر بتنسيق JSON لتزويدك بتفاصيل مفيدة حول إرسال الرسالة.

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

كيفية إرسال رسائل SMS متعددة من Kotlin باستخدام واجهة برمجة تطبيقات الرسائل القصيرة ومشروع المثال أعلاه (فيديو تعليمي)

يعرض هذا الفيديو كيفية تنزيل واستخدام مشروع SendMultipleSms.kt. بمجرد فتحك لمشروع المثال، قد تلاحظ وجود حزمة تسمى Ozeki.Libs.Rest. هذه الحزمة تحتوي على MessageApi وكل ما تحتاجه لإرسال رسائل SMS متعددة باستخدام Kotlin.

الفيديو 2 - كيفية إرسال رسائل SMS متعددة باستخدام كود Kotlin أعلاه (فيديو تعليمي)

كيفية التحقق من قبول HTTP user لرسالة SMS

بعد إرسال الرسالة القصيرة، من الجيد التحقق من بوابة الرسائل القصيرة الخاصة بك، لمعرفة ما تم استلامه. يمكنك التحقق من السجل عن طريق فتح تفاصيل HTTP user من وحدة تحكم إدارة بوابة Ozeki للرسائل القصيرة. في نهاية الفيديو أعلاه، يمكنك رؤية كيفية التحقق مما إذا كان الطلب قد تم استلامه بواسطة http_user. (الشكل 3)

مشروع Kotlin لإرسال رسائل SMS متعددة
الشكل 3 - مشروع SendMultipleSms.kt في Android Studio

كيف يبدو استخدام التطبيق على هاتف افتراضي

كما ترى في الشكل 4، يمكنك إرسال رسائل SMS متعددة في نفس الوقت باستخدام التطبيق. بعد إرسال الرسائل، يمكنك رؤية سجل بعد نص الرسالة. هناك، يمكنك الحصول على مزيد من المعلومات حول الرسائل المرسلة. سيخبرك بعدد الرسائل التي تم إرسالها بنجاح وعدد الرسائل التي فشلت. (الشكل 4)

تطبيق Kotlin مثال لإرسال رسائل SMS متعددة

الشكل 4 - تطبيق SendMultipleSms مثال قبل وبعد إرسال الرسائل

كيفية إضافة Ozeki.Libs.Rest إلى مشروعك الخاص

يمكن تنزيل واستخدام وتعديل مكتبة Ozeki.Libs.Rest مجانًا.
تنزيل: Ozeki.Libs.Rest.kt.zip (7.66 كيلوبايت)

إذا قررت إنشاء تطبيقك بنفسك فقط باستخدام مكتبة Ozeki.Libs.Rest، فهناك بعض الأشياء التي يجب تغييرها في تطبيقك الأساسي. لاستخدام مكتبة Ozeki.Libs.Rest، يجب وضعها في مجلد java في الدليل الرئيسي
في الفيديو التالي سأوضح لك كيفية تنزيل وإضافة مكتبة Ozeki.Libs.Rest إلى مشروعك الخاص.

الفيديو 3 - كيفية إضافة مكتبة Ozeki.Libs.Rest إلى تطبيقك الخاص (فيديو تعليمي)

التبعيات

من المهم ذكر أن مكتبة Ozeki.Libs.Rest لديها بعض التبعيات. لاستخدامها، يجب إضافة هذه التبعيات إلى Gradle Scripts.

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 - قائمة التبعيات التي تحتاج إلى تضمينها.

إضافة التبعيات (فيديو تعليمي)

في الفيديو التالي، ستتعلم كيفية إضافة التبعيات المذكورة سابقًا إلى مشروعك. سيبدأ بنسخ الكود وسيأخذك خطوة بخطوة حتى الحصول على تبعيات عاملة. يبلغ طول الفيديو 53 ثانية فقط، لكنه يحتوي على جميع الخطوات اللازمة لإكمال العملية. يمكنك متابعة هذا البرنامج التعليمي دون عناء

الفيديو 4 - كيفية إضافة التبعيات المطلوبة (فيديو تعليمي)

وصول الإنترنت

لتمكين تطبيقك من إرسال طلب HTTP، يجب أن تسمح لتطبيقك بالاتصال بالإنترنت.
في الفيديو التالي، سأريك كيفية تمكين الوصول إلى الإنترنت لتطبيق Kotlin الخاص بك.

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

الكود 2 - لتمكين الوصول إلى الإنترنت لتطبيق Kotlin الخاص بك.

android:usesCleartextTraffic="true"
	

الكود 3 - لتمكين إرسال طلبات HTTP

إضافة اتصال الإنترنت إلى المشروع (فيديو تعليمي)

تحتاج إلى إضافة هذين السطرين إلى ملف AndroidManifest.xml.
في الفيديو التالي، سأريك أين يجب وضع الأكواد أعلاه. تحتاج إلى إضافة هذين السطرين إلى ملف AndroidManifest.xml. سيبدأ الفيديو بنسخ الكود وسيأخذك إلى اتصال إنترنت عامل. هذا الفيديو سهل المتابعة ويحتوي على جميع الخطوات التي تحتاج إلى اتخاذها بطريقة مفصلة.

الفيديو 5 - كيفية السماح بالوصول إلى الإنترنت لتطبيقك (فيديو تعليمي)

للتلخيص

تساعدك هذه المقالة في إعداد واجهة برمجة تطبيقات SMS عبر HTTP في بوابة Ozeki SMS واستخدام كود Kotlin المقدم لإرسال رسائل SMS متعددة. هذا الحل مثالي إذا كنت بحاجة إلى إرسال رسالة مهمة إلى عدة عملاء في أسرع وقت ممكن. من المفيد استخدام هذا الحل في تطبيق Kotlin الخاص بك للحصول على نظام مشاركة معلومات عالي الأداء.

يمكن العثور على المزيد من المعلومات حول هذا الموضوع على موقع Ozeki الإلكتروني. تابع القراءة مع المقالة بعنوان كيفية جدولة SMS في Kotlin.

قم الآن بتنزيل بوابة Ozeki SMS وابدأ في تطوير عملك!

More information