You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:45:26