コード例 #1
0
    def send_answer(self, start_port, payload):
        options = {"ICE": "remove", "label": "callee", "generate RTCP": "on"}
        sdp_answer = self.commands.answer(
            generate_sdp('127.0.0.1', start_port, payload=payload),
            # generate_sdp(self.sdp_address, start_port),
            str(start_port - 2) + "-" + str(start_port),
            "from-tag" + str(start_port - 2),
            "to-tag" + str(start_port - 2),
            **options)

        if not self.ws:
            send(self.address, self.port, sdp_answer, self.sdp_address,
                 start_port)
        else:
            ws_send(self.address,
                    self.port,
                    sdp_answer,
                    bind_address=self.sdp_address,
                    bind_port=start_port)
コード例 #2
0
    def delete_calls(self):
        ''' Delete calls from rtpengine

        Iterate through the generated calls and delete them from 
        rtpengine based on their call_id and from-tag. 
        '''

        if not self.ws:
            for call in self.calls:
                send(self.address, self.port,
                     self.commands.delete(call['call_id'], call['from-tag']),
                     self.sdp_address, 3000)
        else:
            for call in self.calls:
                ws_send(self.address,
                        self.port,
                        self.commands.delete(call['call_id'],
                                             call['from-tag']),
                        bind_address=self.sdp_address,
                        bind_port=3000)
コード例 #3
0
def check_delete():
    # print(len(kubernetes_apis))
    for a in kubernetes_apis:
        if RTPE_PROTOCOL == 'ws':
            query = ws_send(RTPE_PROTOCOL,
                            RTPE_PORT,
                            commands.query(a.call_id),
                            sock=ws_sock)
        if RTPE_PROTOCOL == 'udp':
            query = send(RTPE_ADDRESS, RTPE_PORT, commands.query(a.call_id),
                         LOCAL_ADDRESS, 2002)
        if query['result'] == 'error':
            a.delete_resources()
            kubernetes_apis.remove(a)
コード例 #4
0
def create_resource(call_id, from_tag, to_tag):
    global kubernetes_apis

    for a in kubernetes_apis:
        if a.call_id == call_id:
            return

    if RTPE_PROTOCOL == 'udp':
        query = send(RTPE_ADDRESS, RTPE_PORT, commands.query(call_id),
                     LOCAL_ADDRESS, 2998)
    if RTPE_PROTOCOL == 'ws':
        query = ws_send(RTPE_ADDRESS,
                        RTPE_PORT,
                        commands.query(call_id),
                        sock=ws_sock)

    from_port = query['tags'][from_tag]['medias'][0]['streams'][0][
        'local port']
    from_c_address = query['tags'][from_tag]['medias'][0]['streams'][0][
        'endpoint']['address']
    from_c_port = query['tags'][from_tag]['medias'][0]['streams'][0][
        'endpoint']['port']
    to_port = query['tags'][to_tag]['medias'][0]['streams'][0]['local port']
    to_c_address = query['tags'][to_tag]['medias'][0]['streams'][0][
        'endpoint']['address']
    to_c_port = query['tags'][to_tag]['medias'][0]['streams'][0]['endpoint'][
        'port']

    kubernetes_apis.append(
        KubernetesAPIClient(in_cluster=True,
                            call_id=call_id,
                            tag=from_tag,
                            local_ip=from_c_address,
                            local_rtp_port=from_c_port,
                            local_rtcp_port=from_c_port + 1,
                            remote_rtp_port=from_port,
                            remote_rtcp_port=from_port + 1,
                            without_jsonsocket=WITHOUT_JSONSOCKET,
                            ws=True))
    kubernetes_apis.append(
        KubernetesAPIClient(in_cluster=True,
                            call_id=call_id,
                            tag=to_tag,
                            local_ip=to_c_address,
                            local_rtp_port=to_c_port,
                            local_rtcp_port=to_c_port + 1,
                            remote_rtp_port=to_port,
                            remote_rtcp_port=to_port + 1,
                            without_jsonsocket=WITHOUT_JSONSOCKET,
                            ws=True))
コード例 #5
0
    def generate_calls(self, cnt):
        ''' Generate a given number of calls.

        The first call will have these ports: offer - 3002 and answer - 
        3004 and it will increase always by two. This is important to debug
        if somethin went wrong. 

        It will use the ffmpeg command to create subprocesses which runs 
        almost side-by-side. 

        Watch out for the cnt because it can produce a huge load cause the 
        ffmpeg memory usage. 

        Args:
        cnt: Number of concurrent calls. 
        '''

        start_port = 3000
        offers = []
        answers = []
        caller_source_ports = []
        callee_source_ports = []
        caller_destinations = []
        callee_destinations = []

        for _ in range(cnt):
            # Offer
            start_port += 2
            self.send_offer(start_port, self.codecs[0])

            # Answer
            start_port += 2
            self.send_answer(start_port, self.codecs[1])

            if not self.ws:
                query = send(
                    self.address, self.port,
                    self.commands.query(
                        str(start_port - 2) + "-" + str(start_port)),
                    self.sdp_address, 2998)
            else:
                query = ws_send(self.address,
                                self.port,
                                self.commands.query(
                                    str(start_port - 2) + "-" +
                                    str(start_port)),
                                bind_address=self.sdp_address,
                                bind_port=2998,
                                delay=5)

            offer_rtp_port = query['tags'][
                "from-tag" +
                str(start_port - 2)]['medias'][0]['streams'][0]['local port']
            answer_rtp_port = query['tags'][
                "to-tag" +
                str(start_port - 2)]['medias'][0]['streams'][0]['local port']

            offer_rtcp_port = query['tags'][
                "from-tag" +
                str(start_port - 2)]['medias'][0]['streams'][1]['local port']
            answer_rtcp_port = query['tags'][
                "to-tag" +
                str(start_port - 2)]['medias'][0]['streams'][1]['local port']

            print(
                f'Offer RTP port: {offer_rtp_port}, RTCP port {offer_rtcp_port}!'
            )
            print(
                f'Answer RTP port: {answer_rtp_port}, RTCP port {answer_rtcp_port}!'
            )

            if not self.rtpsend:
                offers.append(
                    f'rtp://{self.address}:{str(offer_rtp_port)}?localrtpport={str(start_port - 2)}'
                )
                answers.append(
                    f'rtp://{self.address}:{str(answer_rtp_port)}?localrtpport={str(start_port)}'
                )
            else:
                caller_source_ports.append(str(start_port - 2))
                callee_source_ports.append(str(start_port))
                caller_destinations.append(self.address + '/' +
                                           str(offer_rtp_port))
                callee_destinations.append(self.address + '/' +
                                           str(answer_rtp_port))

            if not self.sidecar:
                # Offer
                self.apis.append(
                    KubernetesAPIClient(
                        self.in_cluster,
                        call_id=str(start_port - 2) + "-" + str(start_port),
                        tag="from-tag" + str(start_port - 2),
                        # local_ip='127.0.0.1',
                        local_ip=self.sdp_address,
                        local_rtp_port=start_port - 2,
                        local_rtcp_port=start_port - 1,
                        remote_rtp_port=offer_rtp_port,
                        remote_rtcp_port=offer_rtcp_port,
                        without_jsonsocket=self.without_jsonsocket))

                # Answer
                self.apis.append(
                    KubernetesAPIClient(
                        self.in_cluster,
                        call_id=str(start_port - 2) + "-" + str(start_port),
                        tag="to-tag" + str(start_port - 2),
                        # local_ip='127.0.0.1',
                        local_ip=self.sdp_address,
                        local_rtp_port=start_port,
                        local_rtcp_port=start_port + 1,
                        remote_rtp_port=answer_rtp_port,
                        remote_rtcp_port=answer_rtcp_port,
                        without_jsonsocket=self.without_jsonsocket))

        # time.sleep(1)
        if self.audio_file:
            ffmpeg(self.audio_file, cnt, offers, answers, self.codecs)
        elif self.rtpsend:
            rtpsend(self.rtpsend, cnt, caller_source_ports,
                    caller_destinations, callee_source_ports,
                    callee_destinations)
        else:
            time.sleep(600)
コード例 #6
0
async def ws_processing(websocket, path):
    global ws_sock
    if RTPE_CONTROLLER == 'l7mp':
        # websocket init
        ws_base_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ws_base_sock.connect((RTPE_ADDRESS, RTPE_PORT))

        # enableTrace(True)
        data = None
        try:
            data = parse_data(await websocket.recv())
            if "call-id" in data:
                ws_sock = create_connection(
                    f'ws://{RTPE_ADDRESS}:{RTPE_PORT}',
                    subprotocols=["ng.rtpengine.com"],
                    origin='127.0.0.1',
                    socket=ws_base_sock,
                    header=[f'callid: {data["call-id"]}'])
            else:
                ws_sock = create_connection(f'ws://{RTPE_ADDRESS}:{RTPE_PORT}',
                                            subprotocols=["ng.rtpengine.com"],
                                            origin='127.0.0.1',
                                            socket=ws_base_sock)
            response = ws_send(RTPE_ADDRESS, RTPE_PORT, data, sock=ws_sock)
            # pprint(response)
            if 'sdp' in response:
                response['sdp'] = response['sdp'].replace(
                    '127.0.0.1', '192.168.99.103')
            time.sleep(1)
            await websocket.send(data['cookie'] + " " +
                                 bc.encode(response).decode())
        except websockets.exceptions.ConnectionClosedError:
            pass

        if data['command'] == 'delete':
            delete_kube_resources(data['call-id'])
        if data['command'] == 'answer':
            create_resource(data['call-id'], data['from-tag'], data['to-tag'])

        ws_sock.close()
        ws_base_sock.close()
    if RTPE_CONTROLLER == 'envoy':
        ENVOY_MGM_ADDRESS = socket.gethostbyname_ex(
            os.getenv('ENVOY_MGM_ADDRESS'))[2][0]
        ENVOY_MGM_PORT = int(os.getenv('ENVOY_MGM_PORT'))

        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        sock.bind(('127.0.0.1', 2000))

        # websocket init
        ws_base_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ws_base_sock.connect((RTPE_ADDRESS, RTPE_PORT))

        # enableTrace(True)
        data = None
        try:
            data = parse_data(await websocket.recv())
            if "call-id" in data:
                ws_sock = create_connection(
                    f'ws://{RTPE_ADDRESS}:{RTPE_PORT}',
                    subprotocols=["ng.rtpengine.com"],
                    origin='127.0.0.1',
                    socket=ws_base_sock,
                    header=[f'callid: {data["call-id"]}'])
            else:
                ws_sock = create_connection(f'ws://{RTPE_ADDRESS}:{RTPE_PORT}',
                                            subprotocols=["ng.rtpengine.com"],
                                            origin='127.0.0.1',
                                            socket=ws_base_sock)
            response = ws_send(RTPE_ADDRESS, RTPE_PORT, data, sock=ws_sock)
            pprint(response)
            if 'sdp' in response:
                response['sdp'] = response['sdp'].replace(
                    '127.0.0.1', '192.168.99.103')
            time.sleep(1)
            await websocket.send(data['cookie'] + " " +
                                 bc.encode(response).decode())
        except websockets.exceptions.ConnectionClosedError:
            pass

        # if data['command'] == 'delete':
        # delete_kube_resources(data['call-id'])
        if data['command'] in ['answer', 'delete']:
            query = ws_send(RTPE_ADDRESS,
                            RTPE_PORT,
                            commands.query(data['call-id']),
                            sock=ws_sock)

            caller_port = query['tags'][
                data['from-tag']]['medias'][0]['streams'][0]['local port']
            callee_port = query['tags'][
                data['to-tag']]['medias'][0]['streams'][0]['local port']

            json_data = json.dumps({
                "caller_rtp": caller_port,
                "caller_rtcp": caller_port + 1,
                "callee_rtp": callee_port,
                "callee_rtcp": callee_port + 1
            }).encode('utf-8')

            sock.sendto(json_data, (ENVOY_MGM_ADDRESS, ENVOY_MGM_PORT))
            sock.close()

        ws_sock.close()
        ws_base_sock.close()