[asterisk-users] AMI extension states

Anthony Francis anthonyf at rockynet.com
Thu Sep 20 12:28:14 CDT 2007



Philipp Kempgen wrote:
> Anthony Francis wrote:
>
>   
>> Here is what I use.
>>
>> sub devstate2str($)
>> {
>>   #func name stolen directly from asterisk
>>   #takes int devstate and returns string val
>>   my $ids              = shift;
>>   my $devstatestring   = {};
>>   $devstatestring->{0} = "Unknown";     #0 AST_DEVICE_UNKNOWN | Valid, 
>> but unknown state
>>   $devstatestring->{1} = "Not in use";  #1 AST_DEVICE_NOT_INUSE | Not used
>>   $devstatestring->{2} = "In use";      #2 AST_DEVICE IN USE | In use
>>   $devstatestring->{3} = "Busy";        #3 AST_DEVICE_BUSY | Busy
>>   $devstatestring->{4} = "Invalid";     #4 AST_DEVICE_INVALID | Invalid 
>> - not known to Asterisk
>>   $devstatestring->{5} = "Unavailable"; #5 AST_DEVICE_UNAVAILABLE | 
>> Unavailable (not registred)
>>   $devstatestring->{6} = "Ringing";     #6 AST_DEVICE_RINGING | Ring, 
>> ring, ring
>>   return $devstatestring->{$ids};
>> }
>>
>> LIke the comment says, I stole it direct from the source. A code of 16 
>> may be a typo in which case you have found a bug.
>>
>> Philipp Kempgen wrote:
>>     
>>> Hi,
>>>
>>> Is there a list of all the extension states as sent by the
>>> manager interface? (I know I could look them up in the source
>>> but that involves some "backtracing".)
>>>
>>> The ones I know are:
>>>
>>> -1: no hint for the extension
>>>  0: registered && idle
>>>  1: busy
>>>  4: unreachable, not registered
>>>  8: ringing
>>>
>>> I've recently seen 16 (== hold?) but can't find that value
>>> documented anywhere.
>>>       
>
> Thanks, but I think device states are different from extension states.
> (Please correct me If I'm mistaken.)
>
> Device states from devicestate.h:
> ---cut---
> /*! Device is valid but channel didn't know state */
> #define AST_DEVICE_UNKNOWN	0
> /*! Device is not used */
> #define AST_DEVICE_NOT_INUSE	1
> /*! Device is in use */
> #define AST_DEVICE_INUSE	2
> /*! Device is busy */
> #define AST_DEVICE_BUSY		3
> /*! Device is invalid */
> #define AST_DEVICE_INVALID	4
> /*! Device is unavailable */
> #define AST_DEVICE_UNAVAILABLE	5
> /*! Device is ringing */
> #define AST_DEVICE_RINGING	6
> /*! Device is ringing *and* in use */
> #define AST_DEVICE_RINGINUSE	7
> /*! Device is on hold */
> #define AST_DEVICE_ONHOLD	8
> ---cut---
>
> I was looking for the extension states as sent by the manager interface.
> Extension states from pbx.h:
> ---cut---
> /*! \brief Extension states */
> enum ast_extension_states {
> 	AST_EXTENSION_REMOVED = -2,	/*!< Extension removed */
> 	AST_EXTENSION_DEACTIVATED = -1,	/*!< Extension hint removed */
> 	AST_EXTENSION_NOT_INUSE = 0,	/*!< No device INUSE or BUSY  */
> 	AST_EXTENSION_INUSE = 1 << 0,	/*!< One or more devices INUSE */
> 	AST_EXTENSION_BUSY = 1 << 1,	/*!< All devices BUSY */
> 	AST_EXTENSION_UNAVAILABLE = 1 << 2, /*!< All devices UNAVAILABLE/UNREGISTERED */
> 	AST_EXTENSION_RINGING = 1 << 3,	/*!< All devices RINGING */
> 	AST_EXTENSION_ONHOLD = 1 << 4,	/*!< All devices ONHOLD */
> };
> ---cut---
>
> 1<<4 == 16, so probably this is the value I observed.
> But there some mangling occurs in ast_extension_state2() in pbx.c like
> if (inuse && ring)
> 		return (AST_EXTENSION_INUSE | AST_EXTENSION_RINGING);
> which would return
> 1<<0 | 1<<3 == 1|8 == 9
> So the extension state is some kind of a bit mask.
>
> I think I have found what I was looking for. :)
>
> Thanks,
>   Philipp Kempgen
>
>   
Umm, that is the code I use in my manager interface monitoring software, 
and it works. of course I am using 1.2.18 and perhaps you are using a 
different version.

-- 
Thank you and have a wonderful day,

Anthony Francis
Rockynet VOIP
(303) 444-7052 opt 2
voip at rockynet.com




More information about the asterisk-users mailing list