Страница 1 из 1

прикручивал goip к FreeSwitch

Добавлено: 22 апр 2016, 17:40
alex
создал домен для goip, сделал регистрацию каждому каналу, в var.xml ввел переменную ${my_count}=0
самое интересное в диалплане


Код: Выделить всё

<extension name="160415">


    <X-PRE-PROCESS cmd="include" data="include/allow_ip.xml"/>

<!-- check, how many matches  -->
     <condition regex="any" break="never">
        <regex field="${my_count}" expression="^24$"/>
                <action application="hangup" data="NORMAL_TEMPORARY_FAILURE"/>
    </condition>


    <condition field="destination_number" expression="^0415#7(\d+)$">
            <action application="set" data="my_count=${expr(1+${my_count})}"/>

            <action application="set" data="bypass_media=false"/>
            <action application="set" data="proxy_media=true"/>
            <!-- это опция необходима для того что бы by посылался на корректный ip, без нее почему то by шлет на   внутренний ip клиента-->
            <action application="set" data="sip-force-contact=NDLB-connectile-dysfunction"/>


            <action application="set" data="hangup_after_bridge=true"/>
            <action application="set" data="goip=${distributor(160415)}"/>

            <action application="set" data="userfield=${goip}"/>

<!-- https://wiki.freeswitch.org/wiki/Hangup_Causes 606-USER_NOT_REGISTERED     | 42 SWITCH_CONGESTION -->
            <action application="set" data="continue_on_fail=42,606"/>

<!--            <action application="log" data="WARNING call befor limit, ${1} from ${caller_id_number}"/> -->


            <action application="limit" data="hash ${domain} ${goip} 1/1 !NORMAL_TEMPORARY_FAILURE"/>
            <action application="limit" data="hash ${domain} ${goip} 1 !NORMAL_TEMPORARY_FAILURE"/>

            <action application="log" data="WARNING domain:  sip:${goip}8$1@${sip_to_host}"/>
            <!-- издеваемся над sip заголовком, без этого работать не будет -->
            <action application="bridge" data="{sip_invite_req_uri=sip:${goip}8$1@${sip_to_host},sip_cid_type=none}sofia/goip/${goip}"/>
            <action application="log" data="WARNING domain:  ${domain} | goip_line: ${goip} |my_count: ${my_count}"/>


            <action application="transfer" data="${destination_number}"/>


    </condition>

</extension>


файл - включенный includ`ом, в котором разрешаем invite с конкретных IP.

Код: Выделить всё

cat /etc/freeswitch/dialplan/public/include/allow_ip.xml

    <condition regex="any">

        <regex field="network_addr" expression="^1\.2\.3\.4$"/>
        <regex field="network_addr" expression="^5\.6\.7\.8$"/>

    </condition>

Re: прикручивал goip к FreeSwitch

Добавлено: 10 июн 2020, 16:58
admin
Спустя несколько лет вновь вернулся к подобной задаче, как с чистого листа все началось.. :)
итак чуть более детально.

/etc/freeswitch/directory/default.xml
<group name="goip">
<users>
<X-PRE-PROCESS cmd="include" data="goip/*.xml"/>
</users>
</group>

создаем каталог, туда кидаем наши настроечки:
на Гоипе делал регистрацию по линии, т.к., почему так - вопрос исключительно административный..
пример /etc/freeswitch/directory/goip/26801.xml:
/etc/freeswitch/directory/goip/26801.xml [----] 60 L:[ 1+10 11/ 18] *(431 / 687b) 0048 0x030
<include>
<user id="26801">
<params>
<param name="password" value="77777777777"/>
</params>
<variables>
<variable name="toll_allow" value="domestic,international,local"/>
<variable name="accountcode" value="26801"/>
<variable name="user_context" value="default"/>
<variable name="effective_caller_id_name" value="Extension 26801"/>
<variable name="effective_caller_id_number" value="26801"/>
<variable name="outbound_caller_id_name" value="$${outbound_caller_name}"/>
<variable name="outbound_caller_id_number" value="$${outbound_caller_id}"/>
<variable name="callgroup" value="goip"/>
</variables>
</user>
</include>
и так 8 раз, т.к. шлюз 8 потовый.

в var.xml
<!-- goip SIP Profile -->
<X-PRE-PROCESS cmd="set" data="goip_auth_calls=true"/>
<X-PRE-PROCESS cmd="set" data="goip_sip_port=5051"/>
<X-PRE-PROCESS cmd="set" data="goip_tls_port=5052"/>
<X-PRE-PROCESS cmd="set" data="goip_ssl_enable=false"/>

в /etc/freeswitch/sip_profiles/ удалил internal т.к. не пользуюсь, переименовал его в /etc/freeswitch/sip_profiles/goip.xml
и там подправил переменные портов

т.е. мы сейчас сказали фрисвичу быть сервером для гоиповских линий, на гоипе в секции
Advance SIP -> STUN Server : stun.freeswitch.org
Advance SIP -> Call OUT Auth Mode : IP
Advance SIP -> Signaling NAT Traversal : STUN
in basic config - config by line

для генерации звонкам бы позвонить из скрипта python я использую:

originate =f'originate {{continue_on_fail=true,sim_id={v["sim_name"]},file_a={v["file_a"]},timeout_out={v["timeout_out"]},sip_contact_user={v["channel_goip"]}+{v["b_number"]},sip_invite_req_uri=sip:{v["channel_goip"]}+{v["b_number"]}@{v["socket"]},sip_cid_type=none,originate_timeout=40,origination_caller_id_number={v["a_number"]},gnore_early_media=true,hangup_after_bridge=true}}sofia/goip/{v["channel_goip"]}+{v["b_number"]}@{v["socket"]} gen_out_200522 XML public {v["a_number"]} {v["a_number"]} 60'


узнать о сокете куда пулять звонок можно из функции
def get_fs_users(connectFs):
ch_socket={}
users = connectFs.api('list_users group goip').getBody()
for i in users.splitlines():
if len(i) > 10 and '|' in i:
try:
ch = i.split('|')
if '@' in ch[4]:
socket = ch[4].split('@')
# {'35501': '1.2.3.4:5219', '35502': '1.2.3.4::5220', ....'}
ch_socket[ch[0]]=socket[1]
except Exception as e:
print(f'err ch_socket: {e} - {i}')
return ch_socket
я писал через acyncio
по окончанию звонка мне необохдимо было статистику снимать
<action application="set" data="session_in_hangup_hook=true"/>
<action application="set" data="api_hangup_hook=python fs.hangup ${sim_id}"/>
фс не хотел по имени файла грузить скрипт, хотел только что б модулем ему подгружались, и где меняется пути с 2.7 на 3.7 питон я не обнаружил, лень было ковыряться, поэтому тупо написал скрипт
/usr/lib/python2.7/fs/hangup.py
туда же положил /usr/lib/python2.7/fs/__init__.py - обозначив что это модуль у нас будет
ну и написал что то в этом духе:
import pymysql
from freeswitch import *

# обязательно наличие этой функции
def fsapi(session, stream, env, args):
con = pymysql.connect('localhost', 'scheduler', 'scheduler', 'scheduler', cursorclass=pymysql.cursors.DictCursor)

with con:
cur = con.cursor()
req='update sql requst ... where sim_id={}'.format(args)
caller = session.getVariable("caller")
caller_id_number = session.getVariable("caller_id_number")
direction = session.getVariable("direction")
answer_epoch = session.getVariable("answer_epoch")
duration = session.getVariable("duration")
stream.write(' req: ')
stream.write(req)
stream.write(' caller: ')
stream.write(caller)
stream.write(' caller_id_number: ')
stream.write(caller_id_number)
stream.write(' direction: ')
stream.write(direction)
stream.write(' answer_epoch: ')
stream.write(answer_epoch)
stream.write(' duration: ')
stream.write(duration)
cur.execute(req)



кто в теме - тот поймет,