chan-sccp / pami
PHP 的 Asterisk 管理接口 (AMI) 客户端,基于事件驱动,面向对象(分支)
Requires
- php: >=5.6.0
- psr/log: >= 1.0.0
Requires (Dev)
- evert/phpdoc-md: ~0.2.0
- marcelog/pagi: *
- phing/phing: *
- php-coveralls/php-coveralls: >=1.0.2
- phploc/phploc: *
- phpmd/phpmd: >=2.5.0
- phpunit/phpunit: >=7.0.0
- sebastian/phpcpd: *
- squizlabs/php_codesniffer: >=3.4.0
- theseer/phpdox: >=0.7.0
Replaces
- dkgroot/pami: >=2.0.1
README
分支!
注意,这是对Marcelo Gornstein(https://github.com/marcelog/PAMI)官方发布的分支,该分支已有一段时间未维护(因此进行了分支)。
介绍
PAMI代表PHP Asterisk Manager Interface。正如其名所示,它仅仅是一组php类,可以让你通过观察者-监听器模式向AMI发送命令或接收事件。
背后的想法是,可以通过SOA或ajax轻松实现操作员控制台、监控器等。
- nodejs的端口可在以下位置获得:http://marcelog.github.com/Nami
- erlang的端口可在以下位置获得:https://github.com/marcelog/erlami
资源
- API(Markdown格式)
- API(HTML格式)
- 示例集合
- 2013年阿根廷PHP会议的完整PAGI/PAMI演讲。请查看幻灯片注释以获取完整文本 :)
PHP 版本
注意:PAMI 需要 PHP 5.6+。
安装
将此库添加到您的Composer配置。在composer.json中
"require": { "chan-sccp/pami": "2.*" }
快速入门
对于深入教程: http://marcelog.github.com/articles/pami_introduction_tutorial_how_to_install.html
// Make sure you include the composer autoload. require __DIR__ . '/vendor/autoload.php'; $options = array( 'host' => '2.3.4.5', 'scheme' => 'tcp://', 'port' => 9999, 'username' => 'asd', 'secret' => 'asd', 'connect_timeout' => 10, 'read_timeout' => 10 ); $client = new \PAMI\Client\Impl\ClientImpl($options); // Registering a closure $client->registerEventListener(function ($event) { }); // Register a specific method of an object for event listening $client->registerEventListener(array($listener, 'handle')); // Register an IEventListener: $client->registerEventListener($listener);
使用谓词
在注册事件监听器时,可以使用第二个(可选)参数:一个闭包,它将在调用回调之前被评估。只有当这个谓词返回true时,才会调用回调。
use PAMI\Message\Event\DialEvent; $client->registerEventListener( array($listener, 'handleDialStart'), function ($event) { return $event instanceof DialEvent && $event->getSubEvent() == 'Begin'; }) );
示例
请参阅docs/examples/quickstart/example.php以获取一个非常基本的示例。
AsterTrace是一个完整的应用程序:https://github.com/marcelog/AsterTrace。
此外,您可能还想查看这篇文章:http://marcelog.github.com/articles/php_asterisk_listener_example_using_pami_and_ding.html。
有关使用PAMI异步AGI的示例,请参阅docs/examples/asyncagi。
《软件开发者杂志》(http://sdjournal.org/)的3月版包含一篇关于使用PAMI和PAGI编写电话应用程序的完整文章。
当前支持的事件
随着时间的推移,将添加更多事件。我只能添加我可以测试和使用的那些,所以您的贡献可能会产生差异! ;)
未知(尚未实现)的事件将报告为UnknownEvent,因此您仍然可以捕获它们。如果您捕获了其中之一,请报告它!
- AgentCalled
- AgentComplete
- AgentConnect
- AgentDump
- Agentlogin
- Agentlogoff
- AgentRingNoAnswer
- Agents
- AGIExec
- AGIExecEnd
- AGIExecStart
- Alarm
- AlarmClear
- AorDetail
- AorList
- AorListComplete
- AsyncAGI
- AsyncAGIEnd
- AsyncAGIExec
- AsyncAGIStart
- AttendedTransfer
- AuthDetail
- AuthList
- AuthListComplete
- AuthMethodNotAllowed
- BlindTransfer
- Bridge
- BridgeCreate
- BridgeDestroy
- BridgeEnter
- BridgeInfoChannel
- BridgeLeave
- BridgeListItem
- BridgeVideoSourceUpdate
- CallAnswered
- CallForward
- Cdr
- CEL
- ChallengeResponseFailed
- ChallengeSent
- ChannelTalkingStart
- ChannelTalkingStop
- ChannelUpdate
- ChanSpyStart
- ChanSpyStop
- ConfbridgeEnd
- ConfbridgeJoin
- ConfbridgeLeave
- ConfbridgeList
- ConfbridgeListRooms
- ConfbridgeMute
- ConfbridgeRecord
- ConfbridgeStart
- ConfbridgeStopRecord
- ConfbridgeTalking
- ConfbridgeUnmute
- ContactList
- ContactListComplete
- ContactStatus
- ContactStatusDetail
- CoreShowChannel
- DAHDIChannel
- DAHDIShowChannels
- DBGetResponse
- DeviceStateChange
- DeviceStateListComplete
- DeviceStatus
- Dial
- DialBegin
- DialEnd
- DialState
- DND
- DNDState
- DongleNewCUSD
- DongleNewUSSD
- DongleNewUSSDBase64
- DongleSMSStatus
- DongleStatus
- DongleUSSDStatus
- DTMF
- DTMFBegin
- DTMFEnd
- EndpointDetail
- EndpointDetailComplete
- EndpointList
- EventFactoryImpl.php
- EventMessage.php
- ExtensionStateListComplete
- ExtensionStatus
- Factory
- FailedACL
- FAXSession
- FAXSessionsComplete
- FAXSessionsEntry
- FAXStats
- FAXStatus
- FullyBooted
- Hangup
- HangupHandlerPop
- HangupHandlerPush
- HangupHandlerRun
- HangupRequest
- Hold
- IdentifyDetail
- Impl
- InboundRegistrationDetail
- InvalidAccountID
- InvalidPassword
- InvalidTransport
- JabberEvent
- Join
- Leave
- Link
- ListDialplan
- Load
- LoadAverageLimit
- LocalBridge
- LocalOptimizationBegin
- LocalOptimizationEnd
- Masquerade
- MCID
- MeetmeEnd
- MeetmeJoin
- MeetmeLeave
- MeetmeMute
- MeetmeTalking
- MeetmeTalkRequest
- MemoryLimit
- MessageWaiting
- MiniVoiceMail
- MonitorStart
- MonitorStop
- MusicOnHold
- MusicOnHoldStart
- MusicOnHoldStop
- MWIGet
- MWIGetComplete
- NewAccountCode
- NewCallerid
- Newchannel
- NewConnectedLine
- Newexten
- Newstate
- OriginateResponse
- OutboundRegistrationDetail
- OutboundSubscriptionDetail
- ParkedCall
- ParkedCallGiveUp
- ParkedCallSwap
- ParkedCallTimeOut
- PeerStatus
- Pickup
- PresenceStateChange
- PresenceStateListComplete
- PresenceStatus
- QueueCallerAbandon
- QueueCallerJoin
- QueueCallerLeave
- QueueMember
- QueueMemberAdded
- QueueMemberPause
- QueueMemberPaused
- QueueMemberPenalty
- QueueMemberRemoved
- QueueMemberRinginuse
- QueueMemberStatus
- QueueParams
- QueueSummary
- ReceiveFAX
- Registry
- Reload
- Rename
- RequestBadFormat
- RequestNotAllowed
- RequestNotSupported
- ResourceListDetail
- RTCPReceived
- RTCPReceiverStat
- RTCPSent
- RTPReceiverStat
- RTPSenderStat
- SCCPConfEnd
- SCCPConfEntered
- SCCPConfLeave
- SCCPConfLeft
- SCCPConfLock
- SCCPConfParticipantKicked
- SCCPConfParticipantMute
- SCCPConfParticipantPromotion
- SCCPConfStart
- SCCPConfStarted
- SCCPShowDevice
- SCCPShowLine
- SendFAX
- SessionLimit
- SessionTimeout
- Shutdown
- SIPQualifyPeerDone
- SoftHangupRequest
- SpanAlarm
- SpanAlarmClear
- Status
- Success
- SuccessfulAuth
- TableEnd
- TableStart
- Transfer
- TransportDetail
- UnexpectedAddress
- Unhold
- Unknown
- Unlink
- Unload
- UnParkedCall
- UserEvent
- VarSet
- VgsmMeState
- VgsmNetState
- VgsmSmsRx
当前支持的操作
- AbsoluteTimeout
- 操作
- ActionMessage.php
- AgentLogoff
- Agents
- AGI
- AttendedTransfer
- Atxfer
- BlindTransfer
- Bridge
- BridgeDestroy
- BridgeInfo
- BridgeKick
- BridgeList
- BridgeTechnologyList
- BridgeTechnologySuspend
- BridgeTechnologyUnsuspend
- CancelAtxfer
- Challenge
- ChangeMonitor
- Command
- ConfbridgeKick
- ConfbridgeList
- ConfbridgeListRooms
- ConfbridgeLock
- ConfbridgeMute
- ConfbridgeSetSingleVideoSrc
- ConfbridgeStartRecord
- ConfbridgeStopRecord
- ConfbridgeUnlock
- ConfbridgeUnmute
- ControlPlayback
- CoreSettings
- CoreShowChannels
- CoreStatus
- CreateConfig
- DAHDIDialOffHook
- DAHDIDNDOff
- DAHDIDNDOn
- DAHDIHangup
- DAHDIRestart
- DAHDIShowChannels
- DAHDITransfer
- DBDel
- DBDelTree
- DBGet
- DBPut
- DeviceStateList
- DialplanExtensionAdd
- DialplanExtensionRemove
- DongleReload
- DongleReset
- DongleRestart
- DongleSendPDU
- DongleSendSMS
- DongleSendUSSD
- DongleShowDevices
- DongleStart
- DongleStop
- Events
- ExtensionState
- ExtensionStateList
- FAXSession
- FAXSessions
- FAXStats
- Filter
- GetConfig
- GetConfigJSON
- GetVar
- Hangup
- IAXnetstats
- IAXpeerlist
- IAXpeers
- IAXregistry
- JabberSend
- ListCategories
- ListCommands
- LocalOptimizeAway
- LoggerRotate
- Login
- Logoff
- MailboxCount
- MailboxStatus
- MeetmeList
- MeetmeListRooms
- MeetmeMute
- MeetmeUnmute
- MixMonitor
- MixMonitorMute
- ModuleCheck
- ModuleLoad
- ModuleReload
- ModuleUnload
- Monitor
- MuteAudio
- MWIDelete
- MWIGet
- MWIUpdate
- Originate
- Park
- ParkedCalls
- Parkinglots
- PauseMonitor
- Ping
- PJSIPNotify
- PJSIPQualify
- PJSIPRegister
- PJSIPShowAors
- PJSIPShowAuths
- PJSIPShowContacts
- PJSIPShowEndpoint
- PJSIPShowEndpoints
- PJSIPShowRegistrationInboundContactStatuses
- PJSIPShowRegistrationsInbound
- PJSIPShowRegistrationsOutbound
- PJSIPShowResourceLists
- PJSIPShowSubscriptionsInbound
- PJSIPShowSubscriptionsOutbound
- PJSIPUnregister
- PlayDTMF
- PresenceState
- PresenceStateList
- PRIDebugFileSet
- PRIDebugFileUnset
- PRIDebugSet
- PRIShowSpans
- QueueAdd
- QueueChangePriorityCaller
- QueueLog
- QueueMemberRingInUse
- QueueMemberRingInUse.php
- QueuePause
- QueuePenalty
- QueueReload
- QueueRemove
- QueueReset
- QueueRule
- Queues
- QueueStatus
- QueueSummary
- QueueUnpause
- Redirect
- Reload
- SCCPAnswerCall
- SCCPConference
- SCCPConfigMetaData
- SCCPDeviceAddLine
- SCCPDeviceRestart
- SCCPDeviceSetDND
- SCCPDeviceUpdate
- SCCPDndDevice
- SCCPHangupCall
- SCCPHoldCall
- SCCPLineForwardUpdate
- SCCPMessageDevice
- SCCPMessageDevices
- SCCPMicrophone
- SCCPShowChannels
- SCCPShowConference
- SCCPShowConferences
- SCCPShowDevice
- SCCPShowDevices
- SCCPShowGlobals
- SCCPShowHintLineStates
- SCCPShowHintSubscriptions
- SCCPShowLine
- SCCPShowLines
- SCCPShowMWISubscriptions
- SCCPShowSessions
- SCCPShowSoftkeySets
- SCCPStartCall
- SCCPSystemMessage
- SCCPTokenAck
- SendText
- SetVar
- ShowDialPlan
- SIPNotify
- SIPPeers
- SIPpeerstatus
- SIPQualifyPeer
- SIPShowPeer
- SIPShowRegistry
- SKINNYdevices
- SKINNYlines
- SKINNYshowdevice
- SKINNYshowline
- SorceryMemoryCacheExpire
- SorceryMemoryCacheExpireObject
- SorceryMemoryCachePopulate
- SorceryMemoryCacheStale
- SorceryMemoryCacheStaleObject
- Status
- StopMixMonitor
- StopMonitor
- UnpauseMonitor
- UpdateConfig
- UserEvent
- VGSMSMSTx
- VoicemailRefresh
- VoicemailUsersList
- VoicemailUserStatus
- WaitEvent
调试、日志记录
您可以选择设置一个与PSR-3兼容的记录器
$pami->setLogger($logger);
默认情况下,客户端将使用NullLogger。
开发者
本项目使用phing。当前任务包括
- 测试:运行PHPUnit。
- cs: 运行 CodeSniffer。
- doc: 运行 PhpDocumentor。
- md: 运行 PHPMD。
- build: 这是默认任务,将运行所有其他任务。
运行 phing 任务
要运行一个任务,只需这样做
vendor/bin/phing build
贡献
要贡献
- 确保你打开一个 简洁 和 简短 的拉取请求。
- 添加任何必要的单元测试,以适应新代码或涉及到的更改。
- 运行
phing
并确保在提交拉取请求之前一切正常(让 phpmd 和 CodeSniffer 满意,还要确保 phpDocumentor 不会抛出任何警告,因为我们的所有文档都是自动生成的)。 - 你的代码必须符合 PSR-2,CodeSniffer 应该会处理这个问题。
授权协议
版权所有 2016 Marcelo Gornstein marcelog@gmail.com
根据 Apache License,版本 2.0(“许可协议”);除非遵守许可协议,否则您不得使用此文件。您可以在以下位置获得许可协议的副本:
https://apache.ac.cn/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则在许可协议下分发的软件按照“原样”基础分发,不提供任何明示或暗示的保证或条件。有关许可协议中规定的具体语言管理权限和限制,请参阅许可协议。
此分支的维护者
-
Diederik de Groot ddegroot@talon.nl
-
添加了 SCCP 消息实现。
-
对于从 ActionMessages 返回的 ReponseEvents(返回多个/复杂的结果)进行 ResponseHandling Orig PR:73。
-
注意:在 ResponseHandling 方面得到了 Jacob Kiers 的帮助。
感谢
-
首先感谢 Marcelo Gornstein,他是此模块的原始设计和开发者。更多信息请见:https://github.com/marcelog/PAMI
-
感谢 Jason Blank 在调试队列功能和其他 ami 不一致方面提供帮助。
-
感谢 Francesco Usseglio Gaudi 在调试 Originate 动作方面提供帮助。
-
感谢 Matías Barletta 提供vgms支持。
-
感谢 Eli Hunter 帮助引入 tls 兼容性。
-
感谢 Freddy dafredmail at googlemail 在添加拨号线支持方面的帮助和测试环境。
-
感谢 Joshua Elson 在尝试和调试负载 asterisk 服务器方面的帮助。
-
感谢 Jacob Kiers 帮助引入和测试异步 agi 功能以及 CEL 事件支持。
-
感谢 Richard Baar 发现读取 socket 时缺少 eof 支持、JabberEvent 和 JabberAction 中的 ScreenName 的问题。
-
感谢 Scot Opell 在 5.3.9 和 5.3.10 中帮助调试 stream_get_line()。
-
感谢 Brian (wormling) 在异步agi中尝试和修复错误。
-
感谢 Henning Bragge 在 newstate 事件和队列方面提供帮助。
-
感谢 mbonneau 在 ParkedCall 和 UnParkedCall 事件方面提供帮助。
-
@brenard:更新 ConfBridge。见:Orig PR:179
-
@NikolayRevin:添加动作 QueueMemberRingInUse,并更新 QueueMemberEvent 和 QueueParamsEvent。见:Orig PR:177。
-
@alexmnv:向
ClientImpl
类添加了getSocket()
方法。见:Orig PR:169。 -
@edigomes:添加了 Options-XXXXXX。见:Orig PR:162。
-
@amir200xven:添加了 CDR EVent。见:Orig PR:159。
-
@wizzle:添加了 PJSIPShowEndpoints 等。见:Orig PR:158 和 Orig PR:157。
-
@syco: 扩展了 MonitorAction 功能。参见:原始 PR:149。
-
@ilgiz-badamshin: 扩展了 AsyncAgi 实现。参见:原始 PR:143。
-
@Adrian0350: 添加了 DAHDIChannelEvent。参见:原始 PR:138。
-
@Bloodoff: 添加了 DeviceStateChange/VarSet。参见:原始 PR:126。
-
@thomasvargiu: 修复了 getMessages。参见:原始 PR:122。
-
@sctt: 添加了事件过滤器。参见:原始 PR:107。
-
@alesf: 添加了 QueueEntry。参见:原始 PR:98。
-
@parhamdoustdar: ConfBridge 等等。参见:原始 PR:80。