2010-02-23 7 views
5

Tôi đang phát triển một ứng dụng với PHP và Máy chủ Asterisk. Một trong những tính năng của ứng dụng là kiểm tra trạng thái cuộc gọi (đổ chuông, trả lời, treo ...) của một ID người gọi cụ thể, vì vậy tôi muốn biết cách thực hiện điều này, bởi vì tôi đang cố gắng với một ổ cắm và tình trạng lệnh nhưng tôi nghĩ rằng nó phải là một cách tốt hơn để làm điều đó.Làm cách nào để biết trạng thái cuộc gọi - Asterisk và PHP?

Xin cảm ơn trước.

Trả lời

4

Bạn đang sử dụng API nào để viết chương trình này? AMI? AGI? FastAGI? DeadAGI? Gọi tệp? Có rất nhiều cách để có được thông tin này.

LƯU Ý: Bạn không thể biết liệu kênh có bị treo hay không trừ khi bạn đang sử dụng tệp cuộc gọi và/hoặc quyền truy cập CDR.

Với AMI, bạn có thể sử dụng lệnh Trạng thái (được ghi ở đây: http://www.voip-info.org/wiki/view/Asterisk+Manager+API+Action+Status).

Với AGI, bạn sẽ biết trạng thái như được xác định bởi chương trình của bạn. Nếu bạn vẫn còn trong kịch bản AGI của bạn, sau đó cuộc gọi vẫn đang trong tiến trình và đã được trả lời.

Nếu bạn đang sử dụng tệp cuộc gọi và bạn có thuộc tính Lưu trữ được đặt thành 'có', sau đó khi cuộc gọi kết thúc, bạn có thể kiểm tra thư mục outoing_done (thường là/var/lib/asterisk/outgoing_done /) cho tập tin cuộc gọi. Khi bạn đọc callfile, bạn sẽ nhận thấy rằng Asterisk đã nối thêm một trạng thái ở cuối tập tin cuộc gọi, nó sẽ cho bạn biết trạng thái cuối cùng của cuộc gọi.

Cách TỐT NHẤT cách nhận thông tin này là nhờ tập lệnh PHP của bạn được đọc từ bản ghi CDR trên máy chủ Asterisk của bạn. Có bản ghi CDR của bạn đăng nhập vào cơ sở dữ liệu MySQL, sau đó kéo bản ghi cho cuộc gọi của bạn từ cơ sở dữ liệu.

+0

Ok ... đây là điều. Tôi nhận được ID được gọi là tham số GET từ de URL ('$ _GET ['calledID']'). Tôi cần nhận trạng thái cuộc gọi của id người gọi đó. (Tôi không thực hiện cuộc gọi bằng PHP) – Harph

+0

Vì bạn không có ID kênh của cuộc gọi, không có cách nào để trực tiếp nhận được thông tin này. Thay vào đó, bạn phải sử dụng cơ sở dữ liệu CDR Asterisk. Nếu bạn có bản ghi CDR của bạn đi đến một cơ sở dữ liệu (thường là MySQL) thì chỉ cần có tập lệnh PHP của bạn kết nối với db SQL và thực hiện một truy vấn cho callerID mà bạn có từ tập lệnh của mình. Tìm cuộc gọi cuối cùng được thực hiện bởi ID người gọi đã cho bằng cách sử dụng câu lệnh SELECT. Sau đó, chỉ cần trích xuất thông tin bạn cần (như thời gian gọi, kết thúc thời gian gọi, trạng thái cuộc gọi, v.v.) – rdegges

+0

Vâng, bạn nói đúng, tôi có thể nhận trạng thái cuộc gọi bằng cách sử dụng Cơ sở dữ liệu nhật ký CDR, nhưng điều này chỉ hoạt động khi cuộc gọi kết thúc, vì bản ghi nhật ký được tạo khi cuộc gọi kết thúc. Tôi cần phải có được trạng thái trên thời gian thực bằng cách sử dụng các biến mà điện thoại có thể gửi cho tôi thông qua URL. Bất kỳ ý tưởng? – Harph

2

Harph,

Bạn có thể tạo trình nền AMI để nghe sự kiện AMI được phát trực tiếp từ Asterisk. Tôi đã thực hiện điều này nhiều lần, một trong số đó là dành cho GUI Asterisk. Nếu bạn tạo một bảng cho trạng thái trong cơ sở dữ liệu của mình, bạn có thể tạo một daemon để nghe các sự kiện AMI và cập nhật trạng thái khi chúng xảy ra. Sau đó, trang web của bạn sẽ không phải tương tác với Asterisk chút nào, nó sẽ chỉ cần đọc trạng thái từ cơ sở dữ liệu.

Liên kết sau đây là từ dự án GUI Asterisk. Nó được viết bằng javascript, do đó, php của bạn sẽ có một chút khác biệt, nhưng điều này sẽ cung cấp cho bạn một cơ sở tốt để bắt đầu. Bắt đầu với dòng 574.

http://svn.asterisk.org/view/asterisk-gui/branches/2.0/config/js/welcome.js?view=markup

Một trong những khác biệt quan trọng trong javascript vs php là javascript phải sử dụng daemon http Asterisk thay vì một kết nối ổ cắm thẳng vào AMI. Bởi vì điều này nó phải sử dụng công cụ 'waitevent'. Nhưng kể từ khi bạn sẽ sử dụng một kết nối socket TCP, chỉ cần giữ looping một tuyên bố đọc.

Hy vọng điều này sẽ hữu ích! Phương pháp này có vẻ đáng tin cậy nhất khi cố gắng lấy thông tin từ Asterisk.

1

Tôi thực sự sử dụng HTML5 webSockets và AsterClick, một daemon trung gian tôi đã viết bằng PHP.

AsterClick, theo như tôi biết, sự kiện thực sự chỉ được điều khiển Giao diện Asterisk AMI cho HTML5 trên hành tinh. Tất cả các giải pháp khác hiện có vẫn đang bị bỏ phiếu bị bỏ phiếu máy chủ.

Tôi có thể xem trạng thái cuộc gọi trong thời gian thực, có nguồn gốc. chuyển giữa (hàng đợi, meetme, đậu xe, cá nhân) chỉ đơn giản bằng cách kéo-n-thả trong trình duyệt của tôi. Tôi có thể tạo các mục adplan quay số không hoạt động mà không cần viết cho kế hoạch quay số hoặc về cơ bản bất cứ điều gì khác Asterisk AMI có thể làm với KHÔNG POLLING bao giờ hết.

Trong Javascript tôi có thể sử dụng hàm addEventListener() thực sự lấy tên sự kiện AMI làm tham số. Có KHÔNG POLLING, nhưng thay vì khi AMI Asterisk phát ra một sự kiện được gửi đến trình duyệt của tôi qua webSocket, hãy tạo sự kiện xử lý dữ liệu và phát ra nhiều sự kiện hơn trong trình duyệt.

Tôi cũng có một công cụ gọi là WBEA cho phép tôi triển khai các ứng dụng HTML5 AsterClick giống như các ứng dụng trên máy tính để bàn độc lập cho Windows và Linux.

0

tôi sử dụng lệnh CLI để kiểm tra kênh status.Here là mã php Tôi sử dụng

<?php 
    $socket = fsockopen("111.11.11.111",$portno, $errno, $errstr, $timeout); 
    fputs($socket, "Action: Login\r\n"); 
    fputs($socket, "UserName: username\r\n"); 
    fputs($socket, "Secret: secret\r\n\r\n"); 


    $channel=$_GET['value']; //pass channel through GET method 


    echo"<pre>"; 
    fwrite($socket, "Action: Status\r\n"); 
    fwrite($socket, "Command: Lists channel status ".$channel."\r\n\r\n"); 
    $wrets=""; 


    fputs($socket, "Action: Logoff\r\n\r\n"); 

    while (!feof($socket)) { 
     $wrets .= fread($socket, 8192).'</br>'; 
    } 

    echo $wrets."<br/>"; 

    fclose($socket);  

    ?>