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 | 用户体系和消息通道 |
呼叫平台 | FreeSWITCH | SIP 呼叫控制 |
呼叫发起 | originate | 使用 API 或 ESL 脚本 |
SIP 客户端 | WebRTC / Zoiper | 终端实际承载语音 |
呼叫状态 | Event Socket | 回传给 IM |