openim+接入freeswitch语音

架构设计:OpenIM + FreeSWITCH 实现用户语音通话

css复制编辑 ┌──────────────┐         发起通话       ┌─────────────┐ │   用户A(IM) ├──────────────────────▶│ OpenIM 服务 │ └──────────────┘                       └────┬────────┘ │ ▼ ┌────────────────┐ │ Call Server/Bot │──┐ └────────────────┘  │ ▼ ┌─────────────┐   ┌─────────────┐ │ FreeSWITCH  │◀─▶│ SIP 客户端 A │ └─────┬───────┘   └─────────────┘ │ ┌─────▼───────┐ │ SIP 客户端 B│◀─ 用户B(接听) └─────────────┘


🛠️ 实现步骤

1. 为每个 OpenIM 用户配置 SIP 账号

FreeSWITCH 的 directory/default/ 配置中,为每个 IM 用户生成 SIP 账号:

xml复制编辑<user id="userA"> <params> <param name="password" value="1234"/> </params> <variables> <variable name="user_context" value="default"/> </variables> </user>

用户在前端登录 WebRTC(或 SIP 客户端)时使用对应账号。


2. OpenIM 发起呼叫请求(Bot 或业务后端)

json复制编辑POST /api/call/invite {  "callerIM": "userA",  "calleeIM": "userB"}

后端维护一个 IM <=> SIP 的映射表,例如:

json复制编辑{  "userA": "1001",  "userB": "1002"}


3. 后端调用 FreeSWITCH originate

调用 ESL / mod_event_socket / fs_cli:

bash复制编辑originate sofia/internal/1001%192.168.1.10 &bridge(sofia/internal/1002%192.168.1.10)

或在 Node.js / Python 脚本中使用 ESL 客户端发起。


4. 前端 UI 控制(WebRTC 或嵌入 SIP)

用户登录 OpenIM 时同时登录 SIP(WebRTC 或 WebPhone)

点击通话按钮时,发送 IM 通知 + 后端发起 SIP 呼叫

呼叫接通后使用 SIP 通道通话,IM 实时同步状态消息


5. 通话状态通过 OpenIM 通知回传

你可以使用 FreeSWITCH 的 mod_event_socket,监听如下事件:

txt复制编辑CHANNEL_ANSWER CHANNEL_HANGUP CHANNEL_BRIDGE

然后通过 OpenIM 的 send_msg 向用户推送消息:

json复制编辑{  "sendID": "system",  "recvID": "userA",  "content": { "content": "已接通通话,通话时长 52 秒" },  "contentType": 101}


✅ 技术点小结

模块工具/协议说明
IM系统OpenIM用户体系和消息通道
呼叫平台FreeSWITCHSIP 呼叫控制
呼叫发起originate使用 API 或 ESL 脚本
SIP 客户端WebRTC / Zoiper终端实际承载语音
呼叫状态Event Socket回传给 IM