如何在Unix系统下通过PHP/Node.js使用TAPI 2.0/2.1对接PBX实现呼叫与事件获取
在Unix环境下用PHP/Node.js对接PBX(基于TAPI 2.0/2.1需求)
首先明确:TAPI 2.0/2.1是Windows专属的电话应用编程接口,Unix/Linux系统没有原生支持。要在Unix下实现对接,核心思路是绕开直接的TAPI调用,转而使用PBX设备提供的跨平台替代协议(比如SIP、Asterisk AMI、REST API),或者通过中间件桥接TAPI到Unix环境。
一、PHP实现方案
1. 基于SIP协议对接(多数PBX支持)
大部分现代PBX都支持SIP,这是Unix下最直接的对接方式。可以用PHP的SIP客户端库,或者通过curl调用PBX提供的SIP REST接口。
呼叫操作示例
<?php // 假设PBX提供SIP REST API接口 $pbxApiUrl = 'http://your-pbx-ip:port/api/sip/call'; $headers = [ 'Content-Type: application/json', 'Authorization: Bearer your-api-token' ]; $payload = json_encode([ 'from' => '1001', 'to' => '1002', 'context' => 'internal' ]); $ch = curl_init($pbxApiUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); // 处理响应 if ($response) { $result = json_decode($response, true); if ($result['status'] === 'success') { echo "呼叫发起成功,呼叫ID:{$result['call_id']}"; } else { echo "呼叫失败:{$result['message']}"; } } ?>
获取PBX事件
如果PBX支持WebSocket推送通话状态变更等事件,可使用PHP的react/socket库监听:
<?php require 'vendor/autoload.php'; $loop = React\EventLoop\Factory::create(); $client = new React\Socket\Connector($loop); $client->connect('ws://your-pbx-ip:port/ws/events')->then(function (React\Socket\ConnectionInterface $conn) { echo "连接到PBX事件推送服务器\n"; // 发送认证消息(根据PBX要求调整) $conn->write(json_encode(['action' => 'login', 'token' => 'your-api-token']) . "\n"); // 监听事件 $conn->on('data', function ($data) { $event = json_decode($data, true); echo "收到事件:" . print_r($event, true) . "\n"; // 按需处理不同事件类型 if ($event['type'] === 'incoming_call') { echo "新来电:{$event['from']} -> {$event['to']}\n"; } }); }, function (Exception $e) { echo "连接失败:{$e->getMessage()}\n"; }); $loop->run(); ?>
2. 基于Asterisk AMI(针对Asterisk系列PBX)
如果你的PBX是Asterisk,可使用php-ami库对接Asterisk管理接口:
- 呼叫操作:发送
Originate命令发起通话 - 事件监听:订阅AMI事件流获取通话状态
二、Node.js实现方案
1. 基于SIP协议对接
用Node.js的sip.js处理SIP信令,或者直接调用PBX的REST API:
呼叫操作示例(REST API方式)
const axios = require('axios'); async function makeCall() { try { const response = await axios.post('http://your-pbx-ip:port/api/sip/call', { from: '1001', to: '1002', context: 'internal' }, { headers: { 'Authorization': 'Bearer your-api-token', 'Content-Type': 'application/json' } }); if (response.data.status === 'success') { console.log(`呼叫发起成功,呼叫ID:${response.data.call_id}`); } else { console.error(`呼叫失败:${response.data.message}`); } } catch (error) { console.error('请求出错:', error.message); } } makeCall();
获取PBX事件(WebSocket方式)
用ws库监听PBX的WebSocket事件推送:
const WebSocket = require('ws'); const ws = new WebSocket('ws://your-pbx-ip:port/ws/events'); ws.on('open', () => { console.log('连接到PBX事件服务器'); // 发送认证信息(按PBX要求配置) ws.send(JSON.stringify({ action: 'login', token: 'your-api-token' })); }); ws.on('message', (data) => { const event = JSON.parse(data); console.log('收到事件:', event); if (event.type === 'incoming_call') { console.log(`来电提醒:${event.from} 呼叫 ${event.to}`); } else if (event.type === 'call_connected') { console.log(`通话接通:${event.call_id}`); } }); ws.on('close', () => { console.log('与PBX事件服务器断开连接'); });
2. 基于Asterisk AMI
用asterisk-manager库对接Asterisk:
const AsteriskManager = require('asterisk-manager'); const ami = new AsteriskManager(5038, 'your-asterisk-ip', 'admin', 'your-ami-password', true); // 发起呼叫 ami.action({ action: 'Originate', channel: 'SIP/1001', exten: '1002', context: 'internal', priority: 1 }, (err, res) => { if (err) { console.error('呼叫失败:', err); } else { console.log('呼叫发起成功:', res); } }); // 监听事件 ami.on('managerevent', (event) => { console.log('收到AMI事件:', event); if (event.event === 'Newchannel') { console.log('新通道创建:', event.channel); } else if (event.event === 'Hangup') { console.log('通话挂断:', event.channel); } });
关键注意事项
- 确认PBX支持的协议:优先查看PBX官方文档,确认是否提供SIP、REST API、AMI等跨平台接口,不要执着于TAPI(Unix无原生支持)。
- 权限与认证:多数PBX接口需要API Token或账号密码认证,确保权限配置正确。
- 事件推送稳定性:若PBX不支持WebSocket,可采用轮询API获取状态,但WebSocket是更高效的方案。
内容的提问来源于stack exchange,提问作者Luigi
相关产品推荐
相关产品推荐

