הגדרת sip trunk עם freeswitch

freeswitch שונה מאוד מאסטריסק בתפיסה של איך דברים עובדים.
במידה ונרצה להוציא שיחות או להכניס שיחות, אין צורך בהגדרות מיוחדות, למעט הגדרות acl לכתובות ip. כלומר בברירת מחדל אין צורך ככה סתם להגדיר sip trunk בשביל שדברים יפעלו עבור ספק מסויים.

אך במידה ויש צורך להגדרות מיוחדות, או הגדרות של ביצוע פעולת register, אז אנחנו זקוקים להגדיר sip trunk, אך גם שם ישנם 2 גישות, אשר מוגדרות תחת sip_profiles:

  1. internal
  2. external

הרעיון של sip_profiles הוא כאשר צריך להגדיר דברים תחת רשת פרטית (lan) מול דברים השייכים לרשת ציבורית (wan). למעשה זו סוג הפרדה של השימושים במערכת, אשר מאפשרת להתנהג שונה בהתאם למקור ההגדרות. אפשר להגדיר את זה כרשת trusted מול רשת שהיא untrusted אם זה נוח יותר.

בברירת המחדל, internal מוגדר להשתמש עם sip בפורטים של 5060 ו 5061 (אם זה sip או sips). בעוד שרשת external מוגדר בברירת המחדל להשתמש בפורטים 5080 ו5081.

השאלה הנזרקת לאוויר, היא מה קורה כאשר הרשת החיצונית נכנסת דרך 5060, והתשובה היא שfreeswitch מכניס ל header בקשה לעבור ל5080, ובמידת האפשר מעביר את התקשורת לשם, ואם לא, אז נשארים על 5060, אבל היא לא נחשבת לרשת trusted.

העניין הוא, שזה לא נעצר בפורטים, או בהפרדה הזו, אלא זה ממש מסייע למפות מההתחלה עד הסוף מאיפה השיחה מגיעה. האם היא נכנסת מרשת internal או external (למשל), ובכך גם להתנהג לגמרי שונה ולהיכנס ל context לגמרי שונים (כפי שמוגדר בברירת המחדל).
כך למשל, אפשר להגדיר טלפונים (מכשירי טלפון, להבדיל משלוחות המוגדרות ב directory) ב internal בעוד ש sip trunk (או gateway כשם נוסף) לספקית חיצונית נגדיר ב external.

עוד יתרון בהגדרת trunk הוא היכולת למדוד כמות שיחות נכנסות ויוצאות לפי ה trunk. הבעיה היא שנכון לכתיבת פוסט זה, רק כאשר יש רישום (register) הדבר מתבצע על ידי המערכת. אך הודות למבנה של Freeswitch, ניתן גם ליצור משהו משלנו.

במדינת ישראל, ספקית הSIP הנפוצה ביותר היא 012, והיות ואין תעוד (שאני מכיר) כיצד לבצע חיבור אליה באמצעות freeswitch, אדגים כיצד הוא צריך להראות כאן (הגדרה הפשוטה ביותר שיש):

<include>
  <gateway name="012">
    <param name="proxy" value="<012 sip address>" />
    <param name="realm" value="<012 sip address>" />
     <param name="username" value="none" />
     <param name="password" value="none" />
     <param name="register" value="false"/>
     <param name="ping" value="25"/>
     <param name="inbound-codec-prefs" value="PCMA,PCMU"/>
     <param name="outbound-codec-prefs" value="PCMA,PCMU"/>
     <param name="caller-id-in-from" value="true"/>
     <param name="retry-seconds" value="30"/>
  </gateway>
</include>

אסביר בקצרה מה הולך בקוד למעלה:
הגדרתי gateway בשם 012 (אפשר לשנות לו את השם, אבל חשוב שיהיה ייחודי במערכת עבור gateway) ואשים אותו כמובן תחת external.

למרות ש realm הוא הגדרת בסיס, אשר כל הגדרה אחרת הדורשת את כתובת הספק יורשת ממנה, מצאתי כי לפעמים כתיבה של proxy עם אותה הכתובת עוזרת להבנה ולפעמים אף שליטה טובה יותר, ולכן הכנסתי את שניהם.

012 אינה דורשת רישום או הזדהות של משתמש וסיסמה, אך בהגדרת gateway אנחנו חייבים להכניס אותם ולכן כתבתי בהם none. אבל ציינתי כי אין לבצע פעולת רישום (כלומר header של register).

ציינתי כי ברצוני לבצע פעולת ping. אם אתם מגיעים מאסטריסק, אז זו בעצם הגדרת qualify. כלומר הוא שולח בקשת options וסופר את התגובה (אם הגיעה) חזרה על כך שיש תקשורת עם הצד השני.
ציינתי כי כמות הזמן בין שליחה אחת לשניה (עד שנקבל אישור מהשרת של 012) יהיה 25 שניות (בין כל מספר שליחות עד לקבלת תשובה).
ניתן להגדיר גם כמה מינימום ומקסימום של בקשת options ישלחו לפני קביעה שאין (או יש) תגובה ראויה מהשרת.

ציינתי גם מה הם הקודקים שיש להשתמש כאשר נכנסת ויוצאת (לפחות מה אנחנו מעדיפים שיהיה בו שימוש), במקרה הזה ציינתי את alaw ו ulaw.

בcaller-id-in-from ציינתי כי אנחנו מקבלים/שולחים את ה callerid דרך השדה של From.

ולקינוח הגדרתי כמה זמן יש לחכות בין ניסיון אחד לשני, במידה ויש בעיה (30 שניות).

כאשר מדובר ב012, חשוב להגדיר בהגדרות של switch.conf.xml את הטווח של ה RTP שמתקבל אלינו תחת ההגדרות של rtp-start-port ו  rtp-end-port‏. נכון לכתיבת הפוסט זה טווח בין 5000 ל29000.

בנוסף להגדרות כאן, אפשר גם להוסיף למשל משתנים אשר יוגדרו כאשר משתמשים ב trunk הזה, ובכך לדעת למפות אפילו יותר טוב מה ואיך דברים הגיעו.

במידה ונרצה להוציא שיחה באמצעות ה trunk, נעשה זאת בצורה הבאה:

<extension name="012 usage">
    <condition field="destination_number" expression="^(0722.*)$">
      <action application="set" data="effective_caller_id_number=722244440"/>
      <!-- action application="ringback" /-->
      <action application="log" data="INFO outgoing call to $1" />
      <action application="bridge" data="{sip_from_uri=sip:${caller_id_number}@example.com}sofia/gateway/012/$1"/>
     </condition>
   </extension>

ועכשיו כאשר יחיגו כל מספר המתחיל ב0722 בתוך context נכון, אנחנו נוציא שיחה דרך ה gateway של 012 עם אותו מספר. וכפי שאפשר לראות, "גנבנו" את המספר דרך group של regex, לא לפני שנכתוב בלוג שאנחנו הולכים לבצע את הפעולה הזו.
ההגדרה לפני ה sofia/gateway/012 אומרת כי אנחנו כופים את הcallerid בשדה ה form עם הdomain של המרכזיה (או כתובת ip).

כתיבת תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s