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
  1. Download example project: OPS_SimpleExamples_Visual_Basic_Source.zip (23.2 MB)
  2. Download exe demo: OPS_SimpleExamples_Visual_Basic_Exedemo.zip (12 KB)
  3. 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
	

Code 1 - Visual Basic code for call logging

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
	

Code 2 - Visual Basic code for call recording

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
	

Code 3 - Visual Basic code for call routing

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...