كيفية جدولة رسالة 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 لإرسال رسالة نصية مجدولة إلى الهاتف المحمول

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

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

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="إرسال"
        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="إلى العنوان:"
        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="الرسالة:"
        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="وقت الإرسال:"
        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="مرحبًا بالعالم!"
        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="السجلات:"
        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>
	

كيفية استخدام مثال Kotlin للرسائل النصية:

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

تنزيل SendScheduledSms.kt

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

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

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

مشروع مثال لإرسال رسائل SMS مجدولة باستخدام Kotlin
الشكل 2 - دليل SendScheduledSms.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. فحص السجلات في بوابة SMS

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

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

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

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

لإرسال رسالة SMS مجدولة من Kotlin، سيتعين على Kotlin إصدار طلب HTTP إلى بوابة SMS. يظهر رابط API أدناه. لاحظ أنه يجب استبدال عنوان IP (127.0.0.1) بعنوان IP الخاص ببوابة SMS. إذا كان 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: 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":	"مرحبًا بالعالم!",
			"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 المستلمة بواسطة مثال 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 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"
	    }
	  ]
	}
}
	

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

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

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

كيفية التحقق من أن الرسالة القصيرة قد تم قبولها من قبل مستخدم HTTP

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

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

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

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

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

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

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

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

إذا قررت إنشاء تطبيقك بنفسك فقط باستخدام مكتبة 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 - كيفية السماح بالوصول إلى الإنترنت لتطبيقك (فيديو تعليمي)

ملخص

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

تابع قراءة البرامج التعليمية مثل هذه على صفحة Ozekي. هناك المزيد من المعلومات حول استخدام Kotlin للتعامل مع رسائل SMS، تعلم بعد ذلك كيفية استلام رسالة SMS في Kotlin.

قم بتنزيل بوابة Ozeki للرسائل القصيرة الآن واستخدم ما تعلمته!

More information