Browse Source

fix: 修改多并发拨打问题

余尚辉 5 months ago
parent
commit
0e1a1d79f1

+ 4 - 6
docker-compose.yml

@@ -1,12 +1,10 @@
-version: '3'
 services:
   pjsua:
-    image: pjsua2:v2.14.1009
+    image: pjsua2:v2.14.1019
     container_name: pjsua
-    ports:
-      - 8000:8000/tcp
     restart: always
+    network_mode: host
     volumes:
-      - /Users/yushanghui/hongshantianping/git/voice-gateway-service:/code
+      - /home/hongshan/voice-gateway-service:/code
     environment:
-      - SERVE_HOST=192.168.100.159
+      - SERVE_HOST=192.168.100.159

+ 19 - 5
pjproject/pjlib/include/pj/config_site.h

@@ -1,7 +1,21 @@
+#   define PJ_SCANNER_USE_BITWISE       0
+#   undef PJ_OS_HAS_CHECK_STACK
+#   define PJ_OS_HAS_CHECK_STACK        0
+#   define PJ_LOG_MAX_LEVEL             5
+#   define PJ_IOQUEUE_MAX_HANDLES       1024
+#   define PJSIP_MAX_TSX_COUNT          ((640*1024)-1)
+#   define PJSIP_MAX_DIALOG_COUNT       ((640*1024)-1)
+#   define PJSIP_UDP_SO_SNDBUF_SIZE     (24*1024*1024)
+#   define PJSIP_UDP_SO_RCVBUF_SIZE     (24*1024*1024)
+#   define PJ_DEBUG                     1
+#   define PJSIP_SAFE_MODULE            0
+#   define PJ_HAS_STRICMP_ALNUM         0
+#   define PJSIP_UNESCAPE_IN_PLACE      1
+
 #   define PJSUA_MAX_CALLS              512
+#   define PJSUA_MAX_ACC                512
+#   define PJSUA_MAX_PLAYERS            512
+#   define PJSUA_MAX_RECORDERS          512
+#   define PJSUA_MAX_CONF_PORTS         (PJSUA_MAX_CALLS+2*PJSUA_MAX_PLAYERS)
+#   define PJSUA_MAX_BUDDIES            4096
 
-#	define PJSUA_MAX_ACC                       32
-#	define PJSUA_MAX_PLAYERS                   32
-#	define PJSUA_MAX_RECORDERS                 32
-#	define PJSUA_MAX_CONF_PORTS                (PJSUA_MAX_CALLS+2*PJSUA_MAX_PLAYERS)
-#	define PJSUA_MAX_BUDDIES                   32

+ 1 - 1
src/core/callcenter/esl/client.py

@@ -88,7 +88,7 @@ class InboundClient:
             random_index = abs(mmh3.hash(random_id)) % len(self.executors)
         else:
             random_index = random.randint(0, len(self.executors) - 1) if self.executors else 0
-        # print('choose_thread_pool_executor.index=', random_index, call_id, device_id, wdh_device_id)
+        print('choose_thread_pool_executor.index=', random_index, call_id, device_id, wdh_device_id) 
         return self.executors.get(random_index)
 
     def process_esl_event(self, e):

+ 1 - 1
src/core/callcenter/esl/handler/channel_park_handler.py

@@ -28,7 +28,7 @@ class ChannelParkHandler(EslEventHandler):
         device_id = event.getHeader("Unique-ID")
         service = event.getHeader("variable_service")
         print(f"Incoming call with UUID: {device_id}  {service} is transfer to {destination}")
-        # self.inbound_client.con.execute("transfer", f"{destination} XML default", call_uuid)
+        #self.inbound_client.con.execute("transfer", f"{destination} XML pbx.fuxicarbon.com", device_id)
         # self.con.execute("answer", "", call_uuid)
         Cache.add_device_user_part(device_id, destination)
         self.inbound_client.con.execute("bridge", f"user/{destination}", device_id)

+ 16 - 10
src/core/voip/bot.py

@@ -251,8 +251,8 @@ class MyCall(pj.Call):
         self.player_complete_dict[player_id] = False
         print('self.player_complete_dict[player_id]D:', player_id, player_file, self.player_complete_dict[player_id])
         self.player = MyAudioMediaPlayer(player_id, self.aud_med, on_complete=self.on_media_player_complete)
-        # self.player.createPlayer(player_file, pj.PJMEDIA_FILE_NO_LOOP)
-        self.player.createPlaylist(player_file, f'my_hello_playlist{player_id}', pj.PJMEDIA_FILE_NO_LOOP)
+        self.player.createPlayer(player_file[0], pj.PJMEDIA_FILE_NO_LOOP)
+        #self.player.createPlaylist(player_file, f'my_hello_playlist{player_id}', pj.PJMEDIA_FILE_NO_LOOP)
         self.player.startTransmit(self.aud_med)
 
     def on_receiver_asr_result(self, message, *args):
@@ -384,7 +384,7 @@ class ToTextBotAgent:
 
 class BotAgent:
 
-    def __init__(self, logger, user_part_range=range(1001, 1011), host=SERVE_HOST, port="5060", password="slibra@#123456"):
+    def __init__(self, logger, user_part_range=range(1001, 1019), host="pbx.fuxicarbon.com", port="5060", password="slibra@#123456"):
         self.logger = logger
         self.user_part_range, self.host, self.port, self.password = user_part_range, host, port, password
         self.user_part_pool = queue.Queue(maxsize=len(user_part_range))
@@ -397,18 +397,24 @@ class BotAgent:
     def create_pjsua2(self):
         # Create and initialize the library
         ep_cfg = pj.EpConfig()
-        ep_cfg.uaConfig.threadCnt = 0
-        ep_cfg.uaConfig.mainThreadOnly = True
-        ep_cfg.uaConfig.maxCalls = 10
-        ep_cfg.uaConfig.maxAccounts = 10
+        ep_cfg.uaConfig.threadCnt = 32
+        ep_cfg.uaConfig.mainThreadOnly = False
+        ep_cfg.uaConfig.maxCalls = 20
+        ep_cfg.uaConfig.maxAccounts = 20
         ep_cfg.medConfig.noVad = True
-        ep_cfg.logConfig.level = 4
-        ep_cfg.logConfig.consoleLevel = 4
+        ep_cfg.logConfig.level = 5
+        ep_cfg.logConfig.consoleLevel = 5
         self.ep.libCreate()
         self.ep.libInit(ep_cfg)
 
         aud_dev_mgr = self.ep.audDevManager()
         aud_dev_mgr.setNullDev()  # 使用虚拟音频设备(如果没有实际设备)
+        # Set up media configuration, particularly jitter buffer
+        media_cfg = pj.MediaConfig()
+        media_cfg.jbMinPre = 4  # Minimum pre-fetch frames
+        media_cfg.jbMaxPre = 16  # Maximum pre-fetch frames
+        media_cfg.noVad = True  # Disable Voice Activity Detection if needed
+        self.ep.medConfig = media_cfg  # Apply media config to endpoint
 
         # Create SIP transport. Error handling sample is shown
         sipTpConfig = pj.TransportConfig()
@@ -430,7 +436,7 @@ class BotAgent:
 
             acfg.natConfig.iceEnabled = True
             acfg.natConfig.turnEnabled = True
-            acfg.natConfig.turnServer = "stun:192.168.100.159:3478"
+            acfg.natConfig.turnServer = "stun:pbx.fuxicarbon.com:3478"
             # acfg.natConfig.turnUsername = "username"
             # acfg.natConfig.turnPassword = "password"