Visual Basic VoIP developers 101
Part 2: Visual Basic example on recording VoIP calls, call routing
Learn how to do more advanced tasks using Visual Basic. This guide shows you how to log, record and finally route calls. At the end of this task, you can use the Ozeki Phone System to a whole new level.
Download
Visual Basic example on recording VoIP calls, call routing- Download example project: OPS_SimpleExamples_Visual_Basic_Source.zip (23.2 MB)
- Download exe demo: OPS_SimpleExamples_Visual_Basic_Exedemo.zip (12 KB)
- Reference manual: http://www.ozekiphone.com/examples/doc/
Introduction
On the previous page the first part of VB.NET VoIP developers 101 could be read. That guide presented the prerequisites of doing basic tasks, such as SMS sending/receiving or making/receiving a call using your own Visual Basic application. This article focuses on far more advanced features, like call logging, call recording and call routing.
Part 1: Visual Basic example on sending SMS, making VoIP calls
Connecting to PBX
At the beginning, make an OpsClient department. You can login, if you import the Login function. It has three parameters: first the IP address of the server, the second is the username and the third one is the password. The successful login depends on the return value of the Login function. You can login to the PBX, using your default admin user data. You can extend the database by adding new users at Connections menu, Office users menu item, selecting the Add user option. Whether a user is able to sign in through API, depends on the value of his user profile. You are able to set up more user profile. Select Security form at PBX features menu, Preferences menu item to do this. Enabling is possible by using the Allow this user to configure the PBX through the API option.
1. Log calls
To start log calls, you need to successfully login, then subscribe to the SessionCreated event, which changes call receiving. VoIPEventArgs type parameter contains the active calls. Through the Item attribute of this parameter you can access the call, that created the event. So, you can query the information about the call or connect AudioSender and AudioReceiver. As a result, you can talk to clients separately at the same time, log calls and play an audio file.
Sub Initialized()
Dim opsClient As OpsClient = New OpsClient()
Dim result = opsClient.Login("ozekixepbx.ip", "admin", "abc12345")
AddHandler opsClient.SessionCreated, AddressOf SessionCreated
End Sub
Private Sub SessionCreated(ByVal sender As Object, ByVal e As Ozeki.VoIP.VoIPEventArgs(Of ISession))
Console.Clear()
Console.WriteLine("SessionID: " + e.Item.SessionID)
Console.WriteLine("Call direction: " + e.Item.CallDirection)
Console.WriteLine("Caller: " + e.Item.Caller)
Console.WriteLine("Callee: " + e.Item.Callee)
Console.WriteLine("Ring duration: " + e.Item.RingDuration.ToString())
Console.WriteLine("State: " + e.Item.State)
Console.WriteLine("State duration: " + e.Item.StateDuration.ToString())
Console.WriteLine("Start time: " + e.Item.StartTime)
Console.WriteLine("Talk duration: " + e.Item.TalkDuration.ToString())
End Sub
2. Record calls
Call recording is happening with SessionCreated and SessionsCompleted events. SessionCreated events occur when you answer a call. Therefore, you attach an AudioReceiver to the call, which you can verify by importing ConnectAudioReceiver function. With the first parameter, you can choose which voice you would like to record; and the second parameter is a Recorder object. Either MP3StreamRecorder (calls created in an MP3 file) or WaveStreamRecorder (calls created in a wav file). The constructor of both classes is waiting the path of the file. Start your recording by applying StartStreaming method. When you hang up your call, SessionCompleted event starts. You need to finish the earlier started Streaming at SessionCreated. Use the Dispose() method of the recorder object to do this.
Module CallRecording
Public mp3StreamRecorder As MP3StreamRecorder
'Public waveStreamRecorder As WaveStreamRecorder
Sub Initialized()
Dim opsClient As OpsClient = New OpsClient()
Dim result = opsClient.Login("ozekixepbx.ip", "admin", "abc12345")
AddHandler opsClient.SessionCreated, AddressOf SessionCreated
AddHandler opsClient.SessionCompleted, AddressOf SessionCompleted
End Sub
Private Sub SessionCreated(ByVal sender As Object, ByVal e As Ozeki.VoIP.VoIPEventArgs(Of ISession))
mp3StreamRecoder = New MP3StreamRecorder("Record.mp3")
'waveStreamRecorder = New WaveStreamPlayback("Record.wav")
e.Item.ConnectAudioReceiver(OPSSDKCommon.Model.Call.CallParty.All, mp3StreamRecoder)
'e.Item.ConnectAudioReceiver(OPSSDKCommon.Model.Call.CallParty.All, waveStreamRecorder)
mp3StreamRecoder.StartStreaming()
'waveStreamRecorder.StartStreaming()
End Sub
Private Sub SessionCompleted(ByVal sender As Object, ByVal e As Ozeki.VoIP.VoIPEventArgs(Of ISession))
mp3StreamRecorder.Dispose()
'waveStreamRecorder.Dispose()
End Sub
End Module
3. Call routing
PBX provides not just dial plan, but also another opportunity to froward calls. Import SetCallRoutingInterceptor() method of OpsClient departement. It has one parameter, that implements the IcallRoutingInterceptor interface but first you have to create a definition. This is the GetDestination() method. The function gets the data of the call in a function. The return value is a Destination object, which contains the parameters of the call forward. While creating, Destination class waits for the identity of the call, the target number, identity of the target extension and the number of times the call was dialled. Call will be declined, if the parameters of dialedNumber and the extensonId are null. If *90 is dialed, the sample program sets "do not disturb" state and declines every call. To change it, dial *91. If you do not want to forward the call, you can give back the null value and the call will be handeled by the rules of dial plan.
Sub Initialized()
Dim opsClient As OpsClient = New OpsClient()
Dim result = opsClient.Login("ozekixepbx.ip", "admin", "abc12345")
opsClient.SetCallRoutingInterceptor(New MyCallRoutingInterceptor())
End Sub
Public Class MyCallRoutingInterceptor
Implements ICallRoutingInterceptor
Private DnDExtensions As List(Of String) = New List(Of String)
Private sync As Object = New Object()
Public Function GetDestination(ByVal routeParams As OPSSDKCommon.Model.Route.RouteParams) As OPSSDKCommon.Model.Route.Destination Implements OPSSDK.ICallRoutingInterceptor.GetDestination
SyncLock (sync)
If (DnDExtensions.Contains(routeParams.Destination.DialedNumber)) Then
Return New Destination(routeParams.CallerInfo.Owner, Nothing, Nothing, 10)
ElseIf (routeParams.Destination.DialedNumber = "*90" And Not DnDExtensions.Contains(routeParams.CallerInfo.Owner)) Then
DnDExtensions.Add(routeParams.CallerInfo.Owner)
ElseIf (routeParams.Destination.DialedNumber = "*91" And DnDExtensions.Contains(routeParams.CallerInfo.Owner)) Then
DnDExtensions.Remove(routeParams.CallerInfo.Owner)
End If
End SyncLock
Return Nothing
End Function
End Class
Part 1: Visual Basic example on sending SMS, making VoIP calls
If you have any questions or need assistance, please contact us atΒ info@ozekiphone.com
Dig deeper!
People who read this also read...