Home

Awesome

clj-asterisk

clj-asterisk is a Clojure binding for Asterisk Manager API.

Install

Add the following dependency to your project.clj file:

[clj-asterisk "0.2.5"]

Usage

Logging in

When logging in, you can subscribe to events or not using the :with-events and :no-events keywords. The login function returns the context object to be used in future action invocations.


(:require [clj-asterisk.manager :as manager)

(manager/with-config
  {:name "asterisk.host"}
  (manager/login "user" "secret" :no-events)) => {context}

Sending Commands

Commands are sent using the action function. In case the command parameter has a :Timeout key the action waits that time for the response instead of the default, 5000 ms.


(:require [clj-asterisk.manager :as manager)

(manager/with-config
  {:name "asterisk.host"}
  (let [context (manager/login "user" "secret" :no-events)]
    (manager/with-connection context
      (manager/action :PING)))) => {:Response "Success" :ActionID "2" :Ping "Pong" :Timestamp "1358699209.141867"}

(manager/with-config
  {:name "asterisk.host"}
  (let [context (manager/login "user" "pass" :with-events)]
    (manager/with-connection context
      (let [response (manager/action :Originate {:Channel "SIP/1000"
                                                 :Context "test-context"
                                                 :Exten "1000"
                                                 :Priority "1"
                                                 :Timeout 60000
                                                 :CallerID "99970"
                                                 :Variables {:VAR "value"})]
        response)))) => {:Message "Originate successfully queued", :Response "Success"}

Originating Calls

In order to send many calls over the same connection the :Async parameter should be used.


(manager/with-config
  {:name "asterisk.host"}
  (let [context (manager/login "user" "pass" :with-events)]
    (manager/with-connection context
      (let [response (manager/action :Originate {:Channel "SIP/1000"
                                                 :Context "test-context"
                                                 :Exten "1000"
                                                 :Priority "1"
                                                 :Timeout 60000
                                                 :CallerID "99970"
                                                 :Async "true"
                                                 :Variables {:VAR "value"}})]
        response)))) => {:Reason "4", :Response "Success"}

In this case the response packet contains the completion reason according to these statuses:

Connected = "4"
Busy = "5"
Congestion = "8"
No Answer = "3"
Failure = "0"

Consider this strategy will block your thread until dialing completion, not until call completion. In case you need to know when the call ends you need to wait for the Hangup event.

Waiting for events

Events are dispatched using the multimethod handle-event and dispatching on the event name, so you decide which events to handle declaring each needed multimethod.


(:require [clj-asterisk.manager :as manager]
          [clj-asterisk.events :as events])

(defmethod events/handle-event "FullyBooted"
  [event context]
  (println event)) => {:Status "Fully Booted", :Privilege "system,all", :Event "FullyBooted"}

(manager/with-config
  {:name "asterisk.host"}
  (manager/login "user" "secret" :with-events))

Executing CLI Commands

CLI Commands are supported using the :COMMAND action, if the command succeeds the response string is made available as a sequence of lines in the Data attribute of the response map.

(manager/with-config
        {:name "asterisk.host"}
        (let [context (manager/login "user" "password" :no-events)]
          (manager/with-connection context
            (select-keys (manager/action :COMMAND {:command "core show channels"})
                         [:Response :Data]))))
      => {:Response "Success"
          :Data ("Channel              Location             State   Application(Data)             "
                 "0 active channels"
                 "0 active calls"
                 "11 calls processed")

TODO

License

Copyright (C) 2013 Guillermo Winkler

Distributed under the Eclipse Public License, the same as Clojure.