Using windows 8 Push notifications on Asterisk and PJSIPS
|
Using windows 8 Push notifications on Asterisk and PJSIPS and Zoiper soft Phones
I have decided to dedicate some time to make a great system that should soon handle Microsoft Push Notifications, as well as Google and iOS using Asterisk sip with or without PJSIP and/or IAX with good debugging and error reporting. Since I Grabbed my new Nokia Lumia 530 for only 30 bucks, I’m compelled to get it working so everyone can experience the benefits of Microsoft Push Notifications and VoIP Extensions.
I have received most of my Bases from Zoiper (First free Mobile sip phone open to use on any PBX for windows 8 phones)
http://www.zoiper.com/en/tutorials/push-notifications
Also Took some debugging methods from
http://pbxinaflash.com/community/index.php?threads/wp8-zoiper-client-push-notification.15832/
There are still a lot of issues with this, and so far I have gotten SIP to work, still working on PJSIP but got it working with a ugly hack which should be fixed soon.
OPERATING ENVIRONMENT:
- Asterisk: version (13) running as full VM on a Microsoft Azure server (Should Work with any version)
- FreePBX version (12) (Should Work with any version)
- Zoiper, Windows Phone Edition (v.1.0.2.0) as SIP client. Configured for “Push Notification” as per “Help, Tutorial…” section in the settings page of the client itself.
- CentOs 6.6 (shouldn’t matter to much though)
BACKGROUND:
- “Push Notifications” tutorial published by ZoiPer
IMPLEMENTATION:
The somewhat modified / corrected shell script (see below) from the tutorial is used to send the push notification to Microsoft’s MPNS servers, to notify the phone of the incoming call.
I Followed Manfred Koroschetz in calling it “zoiperpush.sh” and to place it in the “/var/lib/asterisk/agi-bin” folder, giving it permissions (+x) and user:group (asterisk:asterisk) so that asterisk can execute it.
Download The most up2date files:
{phocadownload view=file|id=9|target=s}
{phocadownload view=file|id=10|target=s}
In my concept ill be dedicating 10 extensions for windows phones 0-9 and will work with another 10 for iOS and Android later Setting Debugging will display as much info about the channel as i could.. but soon will also send email on reason for fail if failed.______________________________
Dial Plan
_________________________________________________________
[from-internal-custom]
include => from-ZoiperPush
[ivr-2-custom]
include => from-ZoiperPush
[handler]
exten => addheader,1,Set(location2=PJSIP_HEADER(read,X-PUSH-URI))
exten => addheader,2,Set(location3=PJSIP_HEADER(read,X-PUSH-URI=))
[who-r-u]
exten => s,1,agi(googletts.agi,”Hi Can i please get your name followed by the pound sign?”,en)
exten => s,n(record),agi(speech-recog.agi,en-US)
exten => s,n,Verbose(1,Script returned: ${confidence} , ${utterance})
;Check the probability of a successful recognition:
exten => s,n(success),GotoIf($[“${confidence}” > “0.01”]?playback:retry)
;Playback the text:
exten => s,n(playback),agi(googletts.agi,”Thank you ${utterance} I will save this for future calls”,en)
; Cache CallerID
exten => s,n,System(echo “${CALLERID(num)}” “${utterance}” >> /etc/asterisk/callerID.conf)
exten => s,n,Set(CALLERID(name)=${utterance})
exten => s,n,goto(from-ZoiperPush,${extenstion},29)
;Retry in case speech recognition wasn’t successful:
exten => s,n(retry),agi(googletts.agi,”Can you please repeat more clearly?”,en)
exten => s,n,goto(record)
exten => s,n(fail),agi(googletts.agi,”Failed to get speech data.”,en)
exten => s,n(end),Hangup()
[from-ZoiperPush]
; In this setup please make an extenstion 3000 – 3009 for MS Push
; Google TTS and Voice recognition would be installed if the googletts.agi isnt found.
; If you are using Distro’s that include this already you can commit out line 3 and 4.
; You will also need to manually load / install the module chan_slim required for Google TTS
exten => _300X,1,Answer
exten => _300X,n,Set(debug=1)
exten => _300X,n,GotoIf($[${ISNULL(${SHELL(cat /var/lib/asterisk/agi-bin/googletts.agi | grep “#!/usr/bin/env perl”)})}]?:start)
exten => _300X,n,System( yum install -y perl perl-libwww-perl perl-JSON sox cpan flac \; cd /usr/src \; wget http://sourceforge.net/projects/mpg123/files/mpg123/1.14.2/mpg123-1.14.2.tar.bz2/download \; tar -xjvf download \; cd mpg123* \; ./configure \; make \; make install \; rm -rf mpg123* \; ln -s /usr/local/bin/mpg123 /usr/bin/mpg123 \; wget https://github.com/downloads/zaf/asterisk-googletts/asterisk-googletts-0.6.tar.gz / \; tar xvfz asterisk-googletts-0.6.tar.gz \; cd asterisk-googletts* \; cp googletts.agi /var/lib/asterisk/agi-bin/googletts.agi \; wget https://github.com/zaf/asterisk-speech-recog/tarball/master \; tar xvfz master \; cd zaf* \; cp -R * /var/lib/asterisk/agi-bin/ \; chown -R asterisk:asterisk /var/lib/asterisk/agi-bin/ \; cpan JSON -y)
exten => _300X,n(start),NoOp(**WP8 Push Notification: ext: ${EXTEN}, callerID: ${CALLERID(num)} **)
exten => _30XX,n,Set(extenstion=${EXTEN})
exten => _300X,n,GotoIf($[${ISNULL(${SHELL(cat /etc/asterisk/callerID.conf | grep -R “${CALLERID(num)}” | cut -d ” ” -f2)})}]?:cacheCCID)
exten => _300X,n,GotoIf($[“${CALLERID(num)}” = “”]?who-r-u,s,1)
exten => _300X,n,GotoIf($[“foo${CALLERID(num)}” = “foo”]?who-r-u,s,1)
exten => _300X,n,GotoIf($[“${CALLERID(name)}” = “${CALLERID(num)}”]?who-r-u,s,1)
exten => _300X,n,GotoIf($[“${CALLERID(name):0:9}” = “Anonymous”]?who-r-u,s,1)
exten => _300X,n,GotoIf($[“${CALLERID(name):0:7}” = “Unknown”]?who-r-u,s,1)
exten => _300X,n,GotoIf($[“${CALLERID(num):0:7}” = “Private”]?who-r-u,s,1)
exten => _300X,n,GotoIf($[“${CALLERID(name):0:7}” = “Private”]?who-r-u,s,1)
exten => _300X,n,GotoIf($[“${CALLERID(num):0:10}” = “Restricted”]?who-r-u,s,1)
exten => _300X,n,GotoIf($[“${CALLERID(num):0:4}” = “PSTN”]?who-r-u,s,1)
exten => _300X,n,GotoIf($[ 0 = 0 ]?29)
exten => _300X,27(cacheCCID),Set(CALLERID(name)=${SHELL(cat /etc/asterisk/callerID.conf | grep -R “${CALLERID(num)}” | cut -d ” ” -f2)})
exten => _300X,28,Verbose(1, Outgoing Caller ID: {$CALLERID(all)})
exten => _300X,29,GotoIf(${ISNULL(${SIPPEER(${EXTEN},codecs)})}?:100)
exten => _300X,30,GotoIf(${ISNULL(${PJSIP_ENDPOINT(${EXTEN},allow)})}?:200)
exten => _300X,31,GotoIf(${ISNULL(${IAXPEER(${EXTEN},codecs)})}?:300)
exten => _300X,n,GotoIf($[“${codecs}” = “”]?nochan:100)
exten => _300X,n(nochan),NoOp(** Unable to determin channel type ${EXTEN} not available **)
exten => _300X,n,agi(googletts.agi,”The Extenstion your trying to reach does not exsist, Sending you back to the main IVR to re-try good bye.”,en) ; Exten dont have a codec so must not be setup
exten => _300X,n,Goto(ivr-2,s,1) ; Please change to go to the Context of your choice.
; Asterisk SIP
exten => _300X,100,Set(location=${DB(SIP/Registry/${EXTEN})})
exten => _300X,n,Verbose(0, getting push info “${location}” );
exten => _300X,n,GotoIf($[${REGEX(“X-PUSH-URI” ${location})}]?sip-runscript:cacheuri)
exten => _300X,n(cacheuri),Set(location=’${SHELL(cat /etc/asterisk/pushuri.conf | grep -R “${EXTEN}” | cut -d ” ” -f2)}’)
exten => _300X,n,GotoIf($[${REGEX(“X-PUSH-URI” ${location})}]?sip-runscript:XXXXXXX)
;if the following line is ran then there is no URI in registration or in cache, may need register zoiper first and copy the registration string to the following example
exten => _300X,n(XXXXXXX),Set(location=’0.0.0.0:12345:3600:${EXTEN}:sip:${EXTEN}@0.0.0.0:48574,rinstance=1d02f625bec01f51,transport=UDP,X-PUSH-URI=http://s.notify.live.net/u/1/bn1/HmQAAABIJvDa7TlcHYdOD8P8GKw5K14l7MmE_eS_NeuMzo4h-AF32Y-pf_8Ux0XF24N5AIY1fV3InvnglTNyjJlFRByH/d2luZG93c3Bob25lZGVmYXVsdA/EW_BnIu3fUOH7FePoWYHNw/mdWiTaGBmvmq8Bc6a1kHWu41kJ4′)
exten => _300X,n(sip-runscript),System(/var/lib/asterisk/agi-bin/zoiperpush.sh “${location}”)
exten => _300X,n,NoOp(**Sript Result: ${SYSTEMSTATUS} **)
exten => _300X,n,Gotoif($[“${SYSTEMSTATUS}” == “SUCCESS”]?skip)
exten => _300X,n,NoOp(** WP8 Push Notification: Script ERROR ext: ${EXTEN} not available **)
exten => _300X,n,Goto(${EXTEN},exit)
exten => _300X,n(skip),NoOp(** WP8 Push Notification: Playing Progress Announcement **)
;exten => _300X,n,Playback(pls-wait-connect-call,noanswer) ; The Original Line if google TTS is not used
exten => _300X,n,agi(googletts.agi,”Hi “${CALLERID(name)}” Please wait while i try to reach extenstion ${EXTEN} .”,en) ; Google text to Speech Intro
exten => _300X,n,GotoIf($[${ISNULL(${SHELL(cat /etc/asterisk/pushuri.conf | grep -R “${EXTEN}” | cut -d ” ” -f2)})}]?:Dial)
exten => _300X,n,GotoIf($[${REGEX(“0.0.0.0” ${location})}]?Dial:)
exten => _300X,n,System(echo “${EXTEN}” ‘${location}’ >> /etc/asterisk/pushuri.conf)
exten => _300X,n(Dial),Wait(4)
exten => _300X,n,Dial(SIP/${EXTEN},30)
exten => _300X,n,Goto(${EXTEN},exit)
; Asterisk PJSIP – Asterisk will not supprt making the register heaaders show push data while using pjsips atm will be working on a workaround soon.
exten => _300X,200,Set(trust=${PJSIP_ENDPOINT(${EXTEN},trust_id_inbound)})
exten => _300X,201,Set(location=${PJSIP_HEADER(read,X-PUSH-URI)})
; exten => _300X,hint,PJSIP/${EXTEN}
exten => _300X,n,Verbose(0, getting push info “${location} ${location1} ${location}” );
exten => _300X,n,GotoIf($[${location} >= “X-PUSH-URI”]?pjsip-runscript:)
exten => _300X,n,GotoIf($[REGEX(“X-PUSH-URI” “${location}” )]?pjsip-runscript:)
exten => _300X,n,Set(location=${SHELL(cat /etc/asterisk/pushuri.conf | grep -R “${EXTEN}” | cut -d ” ” -f2)})
exten => _300X,n,GotoIf($[REGEX(“X-PUSH-URI” “${location}”)]?pjsip-runscript:)
;exten => _300X,n,Set(location=’0.0.0.4:12345:3600:${EXTEN}:sip:${EXTEN}@192.168.111.34:48574,rinstance=1d02f625bec01f51,transport=UDP,X-PUSH-URI=http://s.notify.live.net/u/1/bn1/HmQAAABIJvDa7TlcHYdOD8P8GKw5K14l7MmE_eS_NeuMzo4h-AF32Y-pf_8Ux0XF24N5AIY1fV3InvnglTNyjJlFRByH/d2luZG93c3Bob25lZGVmYXVsdA/EW_BnIu3fUOH7FePoWYHNw/mdWiTaGBmvmq8Bc6a1kHWu41kJ4′)
exten => _300X,n(pjsip-runscript),System(/var/lib/asterisk/agi-bin/zoiperpush.sh ${location})
exten => _300X,n,NoOp(**Sript Result: ${SYSTEMSTATUS} **)
exten => _300X,n,Gotoif($[“${SYSTEMSTATUS}” == “SUCCESS”]?skip2)
exten => _300X,n,NoOp(** WP8 Push Notification: Script ERROR ext: ${EXTEN} not available **)
exten => _300X,n,Goto(${EXTEN},exit)
exten => _300X,n(skip2),NoOp(** WP8 Push Notification: Playing Progress Announcement **)
exten => _300X,n,Playback(pls-wait-connect-call,noanswer)
exten => _300X,n,GotoIf($[${ISNULL(${SHELL(cat /etc/asterisk/pushuri.conf | grep -R “${EXTEN}” | cut -d ” ” -f2)})}]?:Dial2)
exten => _300X,n,System(echo “${EXTEN}” ‘${location}’ >> /etc/asterisk/pushuri.conf)
exten => _300X,n(Dial2),Wait(6)
exten => _300X,n,Dial(PJSIP/${EXTEN},40)
;exten => _300X,n,Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})})
exten => _300X,n,Goto(${EXTEN},exit)
; Asterisk IAX – Not yet tested, and not 100% Sure push works with IAX yet
exten => _300X,300,Set(location=${DB(IAX2/Registry/${EXTEN})})
exten => _300X,n,Verbose(0, getting push info “${location}” );
exten => _300X,n,GotoIf($[${REGEX(“X-PUSH-URI” ${location})}]?sip-runscript:cacheuri)
exten => _300X,n(cacheuri),Set(location=’${SHELL(cat /etc/asterisk/pushuri.conf | grep -R “${EXTEN}” | cut -d ” ” -f2)}’)
exten => _300X,n,GotoIf($[${REGEX(“X-PUSH-URI” ${location})}]?sip-runscript:XXXXXXX)
;if the following line is ran then there is no URI in registration or in cache, may need register zoiper first and copy the registration string to the following example
exten => _300X,n(XXXXXXX),Set(location=’0.0.0.0:12345:3600:${EXTEN}:sip:${EXTEN}@0.0.0.0:48574,rinstance=1d02f625bec01f51,transport=UDP,X-PUSH-URI=http://s.notify.live.net/u/1/bn1/HmQAAABIJvDa7TlcHYdOD8P8GKw5K14l7MmE_eS_NeuMzo4h-AF32Y-pf_8Ux0XF24N5AIY1fV3InvnglTNyjJlFRByH/d2luZG93c3Bob25lZGVmYXVsdA/EW_BnIu3fUOH7FePoWYHNw/mdWiTaGBmvmq8Bc6a1kHWu41kJ4′)
exten => _300X,n(sip-runscript),System(/var/lib/asterisk/agi-bin/zoiperpush.sh “${location}”)
exten => _300X,n,NoOp(**Sript Result: ${SYSTEMSTATUS} **)
exten => _300X,n,Gotoif($[“${SYSTEMSTATUS}” == “SUCCESS”]?skip)
exten => _300X,n,NoOp(** WP8 Push Notification: Script ERROR ext: ${EXTEN} not available **)
exten => _300X,n,Goto(${EXTEN},exit)
exten => _300X,n(skip),NoOp(** WP8 Push Notification: Playing Progress Announcement **)
;exten => _300X,n,Playback(pls-wait-connect-call,noanswer) ; The Original Line if google TTS is not used
exten => _300X,n,agi(googletts.agi,”Hi “${CALLERID(name)}” Please wait while i try to reach extenstion ${EXTEN} .”,en) ; Google text to Speech Intro
exten => _300X,n,GotoIf($[${ISNULL(${SHELL(cat /etc/asterisk/pushuri.conf | grep -R “${EXTEN}” | cut -d ” ” -f2)})}]?:Dial)
exten => _300X,n,GotoIf($[${REGEX(“0.0.0.0” ${location})}]?Dial:)
exten => _300X,n,System(echo “${EXTEN}” ‘${location}’ >> /etc/asterisk/pushuri.conf)
exten => _300X,n(Dial),Wait(4)
exten => _300X,n,Dial(IAX2/${EXTEN},20)
exten => _300X,n,Goto(${EXTEN},exit)
; EXIT Call
exten => _30XX,n(exit),NoOp(** WP8 Push Notification: Goodby **)
exten => _30XX,n,GotoIf($[“${debug}” = “0”]?VS)
; Get call details, For Debuging (Beta)
exten => _30XX,n,DumpChan()
exten => _30XX,n,Set(uri=${SIPCHANINFO(uri)})
exten => _30XX,n,Noop(SIPRI=${SIPURI})
exten => _30XX,n,Noop(CONTEXT=${CONTEXT})
exten => _30XX,n,Set(ChannelType=${CHANNEL:0:3})
exten => _30XX,n,Noop(CHANNEL=${CHANNEL})
exten => _30XX,n,Noop(CALLERID=${CALLERID(all)})
exten => _30XX,n,Noop(CALLERID(name)=${CALLERID(name)})
exten => _30XX,n,Noop(CALLERID(number)=${CALLERID(number)})
exten => _30XX,n,Noop(EPOCH=${EPOCH})
exten => _30XX,n,Noop(EXTEN=${EXTEN})
exten => _30XX,n,Noop(PRIORITY=${PRIORITY})
exten => _30XX,n,Noop(UNIQUEID=${UNIQUEID})
exten => _30XX,n,Noop(HANGUPCAUSE=${HANGUPCAUSE})
; Virtual Secretary
exten => _30XX,n(VS),Set(TIMEOUT(digit)=5)
exten => _300X,n(secretary),agi(googletts.agi, I am so sorry ${CALLERID(name)}”. I was not able to reach extenstion ${EXTEN}. However I do have other ways of finding people. Please press 1 for me to try other numbers or press 2 to leave a voice message.”,en,any) ; Google text to Speech Intro
exten => _300X,n,WaitExten()
exten => i,1,agi(googletts.agi,”Invalid extension. Rewind!!!”,en)
exten => i,n,goto(_300X,secretary)
exten => t,1,agi(googletts.agi,”You still there? Your request has timed out. lets start over.”,en)
exten => t,n,goto(_300X,secretary)
exten => h,1,Hangup()
exten => 1,1,agi(googletts.agi, “Good choice. please sit back an wait a moment while i locate extenstion ${extenstion}.”,en) ; Sending Call FreePBX FollowMe
exten => 1,n,goto(ext-findmefollow,FM${extenstion},1)
exten => 2,1,agi(googletts.agi, Ok ok sending you to voicemail. I hope you have a Great Day!”,en); Google text to Speech Intro
exten => 2,n,goto(${extenstion},vm)
;end calls with VM or FollowME
exten => _30XX,n(vm),GotoIf($[“${DIALSTATUS}” = “BUSY”]?busy:unavail)
exten => _30XX,n,VoiceMail(${EXTEN}@default,u)
exten => _30XX,n,Hangup()
exten => _30XX,n(unavail),VoiceMail(${EXTEN}@default,u)
exten => _30XX,n,Hangup()
exten => _30XX,n(busy),VoiceMail(${EXTEN}@default,b)
exten => _30XX,n,Hangup() ; To be safe, clean up the call after an answer by hanging up
exten => _30XX,n,Goto(s-NOANSWER,1) ; Handle any unhandled status the same way we handle NOANSWER
______________________________
Zoiperpush.sh
__________________________________________
#!/bin/bash
set -x
printResult() {
echo “<root>”
echo -e “\t<code>”$1″</code>”
echo -e “\t<X_NotificationStatus>”$2″</X_NotificationStatus>”
echo -e “\t<X_DeviceConnectionStatus>”$3″</X_DeviceConnectionStatus>”
echo -e “\t<X_SubscriptionStatus>”$4″</X_SubscriptionStatus>”
echo “</root>”
}
CURL=`which curl`
if [ -z $CURL ];
then
echo “Curl not found”
exit 1
fi
if [ -z $1 ]; then
echo “Url is not set”
exit 1
fi
URL=”$(echo $1 | sed -n -e ‘s/^.*X-PUSH-URI=//p’)”
i=0
max_i=3
while [ 1 ]
do
if [ $i -ge $max_i ];
then
exit 0;
fi
let i++
headers=`$CURL -s –data ‘<?xml version=’1.0′ encoding=’utf-8′?><root><Value1>Zoiper</Value1><Value2>Incoming</Value2><Value3>Call</Value3></root>’ -D – $URL -v -H “ContentLength:notificationMessage.Length” -H “Content-Type:text/xml” -H “X-NotificationClass:3” | tr -d ‘\r’ `
#curl -v -H “Content-Type:text/xml” -H “X-WindowsPhone-Target:Toast” -H “X-NotificationClass:2” -X POST -d “<?xml version=’1.0′ encoding=’utf-8′?><wp:Notification xmlns:wp=’WPNotification’><wp:Toast><wp:Text1>My title</wp:Text1><wp:Text2>My subtitle</wp:Text2></wp:Toast></wp:Notification>”
code=`echo “$headers” | head -n 1`
X_NotificationStatus=`echo “$headers” | grep “X-NotificationStatus” | sed ‘s#X-NotificationStatus: ##’ | sed -e ‘s/^\s*//g’ -e ‘s/\s*$//g’ `
X_DeviceConnectionStatus=`echo “$headers” | grep “X-DeviceConnectionStatus” | sed ‘s#X-DeviceConnectionStatus: ##’ | sed -e ‘s/^\s*//g’ -e ‘s/\s*$//g’ `
X_SubscriptionStatus=`echo “$headers” | grep “X-SubscriptionStatus” | sed ‘s#X-SubscriptionStatus: ##’ | sed -e ‘s/^\s*//g’ -e ‘s/\s*$//g’ `
if [ “$code” != “HTTP/1.1 200 OK” ];
then
break;
fi
if [ “$X_NotificationStatus” != “Suppressed” ];
then
break;
fi
if [ “$X_DeviceConnectionStatus” != “Connected” ];
then
break;
fi
if [ “$X_SubscriptionStatus” != “Active” ]; then
break;
fi
done
printResult “$code” “$X_NotificationStatus” “$X_DeviceConnectionStatus” “$X_SubscriptionStatus”
______________________________________________________________________________________
Zoiper |
Asterisk |
PJSIPS |
IAX |
On my private server it seems everything works but when the script is ran and Microsoft sends a signal to Zoiper for registering , All the extensions on the phone register except the one where asterisk and the phone is behind Nat..
I will be doing further testing though on this |
Seems asterisk and Zoiper both behind Nat, the registration after push misses the asterisk behind the Nat | My first problem with PJSIP and Asterisk13 was During Registration it was kicking out the URL and sometimes even rejecting registration..
By default PJSIP has strict Registrations enabled , so i had to disable that before compiling PJSIPS: echo “#define PJSIP_REGISTER_CLIENT_CHECK_CONTACT 0” > /usr/src/pjproject-2.2.1/pjlib/include/pj/config_site.h which allowed me to register, but still removed some headers lol |
I hear IAX doesn’t support headers and if so I’m unsure as of now how to catch the URL using IAX. |
Sometimes the registration screen is stuck on registering… hitting the connect button does seem to reconnect to asterisk but doesn’t show on the phone in curtain circumstances | I also removed Qualify in my testing, since dial plan seems to fail even if registered but qualify fast talked to phone in allowed time | I have asked Freepbx / Asterisk to see why these push headers are stopping me from registering:
http://community.freepbx.org/t/pjsip-headers-are-being-rejected-or-altered/26463 |
|
I do not believe asterisk is accepting the registration limit that Zoiper is trying to establish, I think the Sip Max registration is what is being forced. If unchanged, registration will die soon. | Even after phone registers with push, there is no way to extract the data from PJSIPS in asterisk Dial Plan as of yet, I was told this should change in a couple weeks | ||
It seems even after upgrading to latest version when the windows phone restarts even though it shows codecs enabled they really are not.
[2015-01-06 09:13:44] WARNING[59719][C-0000000f]: channel.c:5070 ast_write: Codec mismatch on channel PJSIP/3003-0000001b setting write format to ulaw from none native formats (nothing) if i unregistered all extensions except the one testing, i don’t get these errors, other extensions has unsupported video codecs, since pjsips wasn’t compiled with video it should error , just not with this extension. |
Haven’t gotten to publishing errors yet
[2015-01-06 09:06:51] WARNING[58345]: res_pjsip_pubsub.c:2858 pubsub_on_rx_publish_request: No registered publish handler for event presence |
||
Default outgoing extension seems to reset upon exit and restart.
If only 1 extension it probably wouldn’t matter. also wouldn’t matter if using for only outgoing calls |
|||
unknown codec errors even when only ulaw is enabled.
NOTICE[4911][C-00000001]: res_rtp_asterisk.c:4478 ast_rtp_read: Unknown RTP codec 126 received from |
Published on: Mar 03, 2021
No Comments yet! Be the first one to write.