SIP یا پروتکل - در برنامه نویسی اندروید

کار با SIP یا پروتکل بحث بسیار مهمی در برنامه نویسی اندروید است که چگونه بتوانیم در اینترنت با استفاده از این قابلیت, تماس برقرار کنیم. در این مقاله تمام بحث های مهم این قابلیت مورد ارزش یابی و بررسی قرار گرفته است. در این مقاله بحث کاملی در رابطه با SIP و استفاده کامل از آن در اندروید آموزش داده میشود.

کلید کلاس های بنیادی :

  • SipManager
  • SipProfile
  • SipAudioCall

راه اندازی جلسه پروتکل (Session Initiation Protocol)

اندروید تمام APIهای مورد پشتیبانی برای شروع جلسه پروتکل(SIP) را ارائه میکند. بدین صورت اندروید به شما اجازه می دهد تا ویژگی های اینترنت تلفن مبتنی بر SIP را به برنامه یتان اضافه کنید. اندروید شامل, تمام منابع پروتکل SIP است. این سرویس یکپارچه سازی مدیریت تماس ها, به برنامه های کاربردی اجاز می دهد تا به راحتی صداها, تماسهای خروجی و ورودی را تنظیم کند, بدون نیاز به مدیریت جلسات, ارتباطات در سطح حمل و نقل, ضبط صدا یا پخش به صورت مستقیم.

نمونه مثال های از برنامه هایی که از این API (SIP) استفاده میکنند:

  • ویدئو کنفرانس
  • پیام های فوری

الزامات و محدودیت ها

در پایین الزاماتی برای توسعه برنامه های SIP آمده است :

  • شما باید دارای یک تلفن همراه واقعی (این نوع برنامه ها بر روی تلفن های شبیه ساز AVD کار نمی کنند) که دارای اندروید باالی 2.3 است, باشید.
  • SIP با استفاده از اتصال داده بی سیم اجرا میشود, بنابراین باید تلفن همراه شما به اتصال داده (اتصال داده تلفن همراه , اتصال داده از طریق WI-FI) وصل باشد.
  • هر شرکت کننده ای دربرنامه های ارتباطی جلسه باید دارای یک حساب SIP باشند.

کلاس ها و اینترفیس های SIP

در پایین خلاصه ای از کلاس ها و یک اینترفیس (SipRegistrationListener) که شامل, API SIP هستند, توضیح داده شده است:

کلاس و اینترفیس توضیحات
SipAudioCall هندل کردن تماس صوتی اینترنتی از SIP
SipAudioCall.Listener Listener برای رویدادهای مربوط به تماس SIP, مانند زمانی که یک تماس در حال دریافت یا برقراری است.
SipErrorCode تعریف کدهای خطای بازگشتی در طی اقدامات SIP
SipManager فراهم آوردن APIها برای فعالیت های SIP, مانند شروع اتصال SIP, و فراهم آوردن دسترسی به سرویس های SIP مرتبط.
SipProfile تعریف یک پروفایل, شامل یک حساب SIP, اطلاعات دامنه و سرور
SipProfile.Builder کلاس کمک کننده برای یک پروفایل SIP
SipSession نشان دهنده یک جلسه SIP همراه با یک Dialog در SIP است یا اتصال مستقل نیست و به همین دلیل بدون Dialog خواهد بود.
SipSession.Listener شنونده برای رخ دادهای مربوط به یک جلسه SIP, مانند زمانیکه یک جلسه در حال نام نویسی است و یا یک تماس در حال برقراری است.
SipSession.State تعریف خصوصیات جلسه SIP مانند ثبت نام , تماس های خروجی , تماس های دریافتی.
SipRegistrationListener یک رابط شنونده است برای برای رویداد های ثبت نام SIP.

ایجاد در AndroidManifest.xml

اگر شما در حال توسعه برنامه های هستید که از API یک SIP استفاده میکند, باید بدانید که این API فقط بر روی تمام دستگاه های اندروید با ورژن 2.3 و بالاتر کار میکند و همیشه در میان تمام دستگاه های اجرا کنند اندروید 2.3 و بالاتر, همه نمیتوانند از SIP استفاده کنند چون ممکن است این API را ارائه نداده باشد.

برای استفاده از SIP در برنامه , باید اجزا های زیر را در فایل AndroidManifest.xml وارد کنید:

  • Android.permission.USE_SIP
  • Android.permission.INTERNET

درصورت نیاز برای اطمینان بیشتر از این که برنامه شما بر روی چه تلفن های میتواند کار بکند و مورد استفاده قرار بگیرد یا بعبارت دیگر بر روی چه تلفن های پشتبانی میشود , باید اطلاعات زیر را در AndroidManifest.xml اضافه نمایید :

  • باید در قسمت minsdkversion عدد 9 یا بالاتر را قرار بدهید به خط کد زیر توجه کنید :
<uses-sdk android.minsdkversion=”9” />

برای فیلتر کردن برنامه خود از دستگاه هایی که از SIP پشتیبانی نمی کند باید اطلاعات زیر را به AndroidManifest.xml اضافه کنید :

<uses-feature android:name="android.hardware.sip.voip" />
  • با نوشتن خصوصیت بالا در برنامه یتان , شما تعیین میکنید که برنامه شما از API برای SIP استفاده میکند. این اعلان باید شامل صفت android:required باشد که نشان می دهد شما می خواهید چه چیز را در تلفن هایی که پشتیبانی SIP را ارائه نمی دهند را فیلتر کنید. دیگر اعلان های <uses-feature> ممکن است همیشه لازم باشد, بستگی به نوع اجرای و فعالیت برنامه دارد.

اگر برنامه شما برای دریافت تماس طراحی شده است , شما باید همیشه کلاس receiver (کلاس که از BroadCastReceiver برای انجام فعالیت ها ارث بری (extends )میکند) را در فایل AndroidManifest.xml بصورت زیر مشخص نمایید :

<receiver android:name=".IncomingCallReceiver" android:label="Call Receiver"/>

در پایین یک نمونه کد از یک فایل AndroidManifest.xml وجود دارد که از SIP استفاده میکند:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.sip">
...
<receiver android:name=".IncomingCallReceiver" android:label="Call
Receiver"/>
...
<uses-sdk android:minSdkVersion="9" />
<uses-permission android:name="android.permission.USE_SIP" />
<uses-permission android:name="android.permission.INTERNET" />
...
<uses-feature android:name="android.hardware.sip.voip" android:required="true"
/>
<uses-feature android:name="android.hardware.wifi" android:required="true" />
<uses-feature android:name="android.hardware.microphone" android:required="true"
/>
</manifest>

ایجاد یک SipManager

برای استفاده از API یک SIP در برنامه یتان , شما باید یک شی SipManager ایجاد بکنید , برای اطمینان بیشتر درباره بدرستی کار کردن با SipManager باید مراقب فعالیت های زیر باشید :

  • راه اندازی جلسه SIP
  • راه اندازی و دریافت تماس ها
  • ثبت نام و لغو ثبت نام در SIP فراهم آورده شده
  • تایید جلسه ی اتصال

برای معرفی یک SipManager جدید به برنامه باید به صورت زیر عمل نمایید :

public SipManager mSipManager = null;
...
if(mSipManager == null) {
mSipManager = SipManager.newInstance(this);
}

ثبت نام در SIPServer

بعضی از برنامه های استفاده کننده از SIP (یا پروتکل) شامل یک یا چند کاربر می باشند که هر کاربر دارای یک حساب می باشد. در هر برنامه ای که از SIP استفاده میکند, هر حساب SIP , بوسیله یک شئ SipProfile نمایش داده میشود.

SipProfile , یک پروفایل SIP تعریف می کند , که شامل یک حساب SIP, دامنه و اطلاعات سرور می باشد. پروفایل, همراه با حساب SIPی که در دستگاه اجرا کننده وجود دارد, پروفایل محلی (Local Profile)نامیده میشود. به پروفایلی که به جلسه (Session)متصل شده باشد, پروفایل همتا (Profile Peer) گفته میشود. زمانی که برنامه SIP شما بوسیله پروفایل محلی SipProfile, به سرور SIP وارد میشود, اطلاعاتی از دستگاه , مانند محل ارسال تماس ها برای آدرس SIP شما , ثبت میشود.

این بخش نشان می دهد که چگونه یک SipProfile را ایجاد و آن را بوسیله SIPServer ثبت نام کنید و پشته های از رخ داد های ثبت نام را نشان میدهد.

برای ایجاد یک شئ SipProfile باید بصورت زیر عمل کنید :

public SipProfile mSipProfile = null;
...
SipProfile.Builder builder = new SipProfile.Builder(username, domain);
builder.setPassword(password);
mSipProfile = builder.build();

دنبال کردن کدهای گزیده باز کردن پروفایل محلی (Local Profile)برای ایجاد تماس (ها) و/یا دریافت تماس (های) عمومی SIP .تماس گیرنده می تواند تماس های بعدی را از طریق mSipManager.makeAudioCall ایجاد کند.این انتخاب همیشه عمل (Action) android.SipDemo.CALL_INCOMING را تعیین میکنند, هر کدام میتوانند زمانی که دستگاه یک تماس دریافت کرد در intent filter مورد استفاده قرار بگیرند. این مرحله ثبت نام است :

Intent intent = new Intent();
intent.setAction("android.SipDemo.INCOMING_CALL");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent,
Intent.FILL_IN_DATA);
mSipManager.open(mSipProfile, pendingIntent, null);

سر آخر کد های تعیین کننده یک SipRegistrationListener در SipManager:

mSipManager.setRegistrationListener(mSipProfile.getUriString(), new
SipRegistrationListener() {
public void onRegistering(String localProfileUri) {
updateStatus("Registering with SIP Server...");
}
public void onRegistrationDone(String localProfileUri, long expiryTime) {
updateStatus("Ready");
}
public void onRegistrationFailed(String localProfileUri, int errorCode,
String errorMessage) {
updateStatus("Registration failed. Please check settings.");
}

زمانی که برنامه شما استفاده از پروفایل را انجام داد, باید آن را همراه با اشیاء مرتبط در حافظه بست و دستگاه را در سرور (Server) لغو ثبت نام کرد. برای مثال :

public void closeLocalProfile() {
if (mSipManager == null) {
return;
}
try {
if (mSipProfile != null) {
mSipManager.close(mSipProfile.getUriString());
}
} catch (Exception ee) {
Log.d("WalkieTalkieActivity/onDestroy", "Failed to close local profile.",
ee);
}
}

ایجاد یک تماس صوتی

برای ایجاد یک تماس صوتی , شما باید مراحل زیر را دنبال کنید :

  • یک SipProfile برای برقراری تماس (“مشخصات محلی”) و یک آدرس معتبر SIP برای دریافت تماس (“مشخصات همتا”)
  • یک شئ SipManager

برای ایجاد یک تماس صوتی, شما باید یک SipAudioCall.Listener تنظیم کنید. بسیاری از تعامل مشتری ها با پشته SIP , از طریق Listenerها اتفاق می افتد. در قطعه کد زیر شما می بینید که چگونه SipAudioCall.Listener , بعد از برقراری تماس تنظیم میشود :

SipAudioCall.Listener listener = new SipAudioCall.Listener() {
@Override
public void onCallEstablished(SipAudioCall call) {
call.startAudio();
call.setSpeakerMode(true);
call.toggleMute();
...
}
@Override
public void onCallEnded(SipAudioCall call) {
// Do something.
}
};

هنگامی که شما SipAudioCalll.Listener را تعیین کردید , میتوانید تماس را ایجاد (برقرار) بکنید. متد makeAudioCall از SipManager پارامتر های زیر را دارد :

  • یک مشخصات محلی SIP (تماس گیرنده)
  • یک مشخصات همتا SIP (برای کاربری که تماس گرفته است)
  • یک SipAudioCall.Listener برای شنیدن رخ داد های تماس از SipAudioCall استفاده میکند. البته این متغیر میتواند null باشد. اما همان طور که در بالا نشان داده شده است, Listener برای تنظیم یکباره همه چیز بعد از برقراری تماس , استفاده میشود.
  • مقدار فاصله زمانی , در ثانیه

برای مثال:

call = mSipManager.makeAudioCall(mSipProfile.getUriString(), sipAddress, listener, 30);

دریافت تماس ها

برای برقراری تماس, یک برنامه SIP باید شامل یک SubClass از BroadCastReceiver باشد که دارای توانایی برای پاسخ به یک Intent باشد و تماس های دریافتی را در صورت موجود, نشان بدهد. بدین ترتیب شما باید مراحل زیر را در برنامه یتان انجام بدهید :

  • در AndroidManifest.xml, اعلام یک <receiver>. در SipDemo, به این صورت :
<receiver android:name=".IncomingCallReceiver" android:label="CallReceiver"/>
  • Implement کردن هر کدام از زیر کلاس های (SubClass)BroadCastReceiver در خود کلاس receiver.
  • مقدار دهی اولیه مشخصات محلی(SipProfile) به وسیله یک Pending Intent که اکتیویتی receiver شما را زمانی که یک نفر به Local Profile شما زنگ می زند, خبردار کند.
  • تنظیم یک Intent Filter برای اتفاقات(action) نمایش تماس های ورودی. در SipDemo این عمل (action ) به این صورت است :  android.SipDemo.CALL_INCOMING

SIP

زیر کلاس BroadCastReceiver

برای دریافت تماس, برنامه SIP (یا پروتکل) شما باید دارای زیر کلاس BroadCastReceiver باشد.سیستم اندروید تماس های ورودی SIP را هندل (handle) می کند و زمانی که یک تماس دریافت شود , BroadCastReceiver یک intent به “InComingCall” (که توسط نرم افزار تعیین شده) ارسال می کند. در پایین کدهای نحوه ایجاد کلاس با BroadCastReceiver از SipDemo وجود دارد. برای مشاهده تمام مثال ها در این رابطه میتوانید به SDK خود مراجعه کنید و تمام مثال های موجود در این رابطه به SDK را مشاهده کنید.

/*** Listens for incoming SIP calls, intercepts and hands them off to
WalkieTalkieActivity.
*/
public class IncomingCallReceiver extends BroadcastReceiver {
/**
* Processes the incoming call, answers it, and hands it over to the
* WalkieTalkieActivity.
* @param context The context under which the receiver is running.
* @param intent The intent being received.
*/
@Override
public void onReceive(Context context, Intent intent) {
SipAudioCall incomingCall = null;
try {
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
@Override
public void onRinging(SipAudioCall call, SipProfile caller) {
try {
call.answerCall(30);
} catch (Exception e) {
e.printStackTrace();
}
}
};
WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;
incomingCall = wtActivity.mSipManager.takeAudioCall(intent, listener);
incomingCall.answerCall(30);
incomingCall.startAudio();
incomingCall.setSpeakerMode(true);
if(incomingCall.isMuted()) {
incomingCall.toggleMute();
}
wtActivity.call = incomingCall;
wtActivity.updateStatus(incomingCall);
} catch (Exception e) {
if (incomingCall != null) {
incomingCall.close();
}
}
}
}

تنظیم یک Intent Filter برای دریافت تماس

زمانی که SIP سرویس تماس جدید دریافت میکند, آن را به وسیله یک intent همراه با یک action که به صورت string است, که توسط برنامه ارائه شده است , ارسال میکند. در SipDemo این action که به صورت string است , به این صورت است :

android.SipDemo.INCOMING_CALL

این کدهای انتخابی از SipDemo , در پایین نشان می دهند که شئ SipProfile چگونه به وسیله یک Pending Intent که دارای یک عمل رشته (action string) مستقر در (android.SipDemo.CALL_INCOMING) است, ایجاد میشود. شی Pending Intent زمانی به BroadCast ارسال میشود که SipProfile یک تماس دریافت کند. به کد زیر توجه کنید :

public SipManager mSipManager = null;
public SipProfile mSipProfile = null;
...
Intent intent = new Intent();
intent.setAction("android.SipDemo.INCOMING_CALL");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent,
Intent.FILL_IN_DATA);
mSipManager.open(mSipProfile, pendingIntent, null);

BroadCast به وسیله IntentFilter از هرگونه عمل دریافتی ممکن در Reveiver (InComingCallReceiver) به غیر عمل اصلی (android.SipDemo.CALL_INCOMING) جدا میشود. شما میتوانید این intent filter را در فایل AndroidManifest.xml برنامه یتان مشخص کنید. یا این عمل را در کد های SipDemo در متد onCreate در Activity برنامه به این صورت قرار بدهید :

public class WalkieTalkieActivity extends Activity implements View.OnTouchListener
{
...
public IncomingCallReceiver callReceiver;
...
@Override
public void onCreate(Bundle savedInstanceState) {
IntentFilter filter = new IntentFilter();
filter.addAction("android.SipDemo.INCOMING_CALL");
callReceiver = new IncomingCallReceiver();
this.registerReceiver(callReceiver, filter);
...
}
...
}

تست برنامه های با SIP یا پروتکل

برای تست کردن یک برنامه SIP , شما باید مراحل زیر را دنبال کنید :

  • یک تلفن واقعی (بر روی تلفن های شبیه ساز AVD کار نمی کند) با اندروید 2.3 یا بالاتر. SIP با استفاده از اتصال داده بدون سیم کار میکند.
  • یک حساب SIP , تعداد زیادی از ارائه دهندگان SIP وجود دارد که حساب های SIP ارائه میدهند.
  • اگر شما یک تماس را انجام می دهید, این ارتباط باید دارای یک حساب معتبر SIP باشد.
تست یک برنامه با زمینه استفاده از SIP یا پروتکل :
  1. در دستگاهتان, به وای فای متصل شوید.
  2. تنظیم دستگاه تلفنتان برای تست, بعنوان یک توسعه دهنده
  3. برنامه را در تلفنتان اجرا کنید , به عنوان یک توسعه دهنده.
  4. برای مشاهده جزییات تغییرات میتوانید لاگ ها را در اندروید استودیو مشاهده کنید.
  5. مطمئن شدن از برنامه یتان که آیا به درستی اجرا میشود؟ , برای نمایش تمام رویداد های مرتبط با آن در اندروید استودیو, در قسمت Cat Log بصورت اتوماتیک در زمان اجرا , باید به صورت زیر عمل کنید :
    • گزینه Edit Configurations را از منوی Run انتخاب کنید.
    • تب Miscellaneous را در پنجره Debug/Run Configurations  انتخاب کنید.
    • در زیر log cat , گزینه Show logcat Automatically را انتخاب و Ok را بزنید.

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر نیاز است تا ابتدا وارد سایت شوید.

هیچ نظری ارسال نشده است.

قیمت آموزش
رایگان
نوع دسترسی
رایگان

این مقاله در حال حاضر تنها به روش رایگان در دسترس می باشد.

ناصر خالدی
مدرس دوره

ناصر خالدی

مهندس شبکه, امنیت, برنامه نویسی تلفن های هوشمند, طراح وب سایت و متخصص هوش مصنوعی

گفتگوی برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن

مقالات پیشنهادی

اندروید

اندروید یک سیستم عامل می باشد که توسط گوگل توسعه داده میشود, این سیستم عامل بر پایه نسخه ی اصلاح شده ی هسته ی لینوکس و دیگر نرم افزار های متن باز طراحی شده است و ...


۱۰۵۴
۰
۲۹ آبان ۱۳۹۹

وردپرس

وردپرس یک سیستم مدیریت محتوای قوی می باشد که با استفاده از آن می توان وب سایت ها و وبلاگ های گوناگونی با هر شرایطی را طراحی کرد چرا که این سیستم و ...


۸۰۵
۰
۱۳ آذر ۱۳۹۹

هوش مصنوعی

هوش مصنوعی یا هوش ماشینی, به هوشمندی نشان داده شده توسط ماشین در شرایط مختلف گفته میشود که مقابل هوش طبیعی در انسان ها قرار دارد که ...


۸۶۰
۰
۱۱ آذر ۱۳۹۹

پی اچ پی - PHP

با استفاده از این زبان می توان وب سایت های پویا طراحی کرد, این زبان می تواند با HTML ادغام شود, در حقیقت یک زبان اسکریپتی متن باز و رایگان است. یعنی زمانی که سرور درخواست ...


۹۴۲
۰
۱۳ آذر ۱۳۹۹

Fatal error: Uncaught wfWAFStorageFileException: Unable to verify temporary file contents for atomic writing. in /home/clonerco/public_html/wp-content/plugins/wordfence/vendor/wordfence/wf-waf/src/lib/storage/file.php:52 Stack trace: #0 /home/clonerco/public_html/wp-content/plugins/wordfence/vendor/wordfence/wf-waf/src/lib/storage/file.php(659): wfWAFStorageFile::atomicFilePutContents('/home/clonerco/...', '<?php exit('Acc...') #1 [internal function]: wfWAFStorageFile->saveConfig('livewaf') #2 {main} thrown in /home/clonerco/public_html/wp-content/plugins/wordfence/vendor/wordfence/wf-waf/src/lib/storage/file.php on line 52