Получить правила переадресации вызовов клиента Lync с использованием серверных технологий (UCMA или MSPL)
Как я могу получить правила переадресации вызовов (маршрутизации) клиента Lync в управляемом приложении SIP (серверные технологии, такие как MSPL или UCMA)? Единственное, что я нашел, это статья о том, как вы можете сделать это на стороне клиента с помощью Lync SDK.
Также этот Ответ, и эта статья MSDN, и этот Вопрос, кажется, указывают на то, что он работает, но мне нужен этот параметр в определенный момент (если пользователь подключен к сети или нет), а не как только он входит в свою учетную запись Lync и публикует свое присутствие информация, как видно из ссылки № 1. Также необходимо получить это для любого клиента без предварительного создания UserEndpoint. Так что было бы лучше, если это возможно с ApplicationEndpoint (или другим методом).
Насколько я выяснил, должна быть возможность получить параметры пересылки из метаданных присутствия, но я не получаю эту информацию.
var categories = new string[] {
"state",
//"routing" // ?
};
var asyncresult = presenceSvc.BeginPresenceQuery(sips, categories, null, null, null);
var result = presenceSvc.EndPresenceQuery(asyncresult).ToList();
1 ответ
Вы не можете сделать это с ApplicationEndpoint. Вы должны иметь UserEndpoint. Тем не менее, вы можете создать UserEndpoint, которому просто нужны CollaborationPlateform и SipUser, а не какие-либо пароли.
Для моего приложения я декомпилировал SEFAUtil.exe через ILSpy, чтобы понять, как они работали в своих программах. Я советую вам взглянуть на это.
Это моя техника, чтобы она работала:
1 / Создание UserEndPoint
При создании конечной точки пользователя вы должны подписаться на это присутствие, чтобы получить информацию, даже если он не подключен
userEndpoint.LocalOwnerPresence.BeginSubscribe(null, null);
2/ Подписаться на событие PresenceNotificationReceived
userEndpoint.LocalOwnerPresence.PresenceNotificationReceived += OnCategoryNotificationReceived;
private static void OnCategoryNotificationReceived(object sender, LocalPresentityNotificationEventArgs e)
{
// Here you get the PresenceCategory and all the data of the user
foreach (PresenceCategoryWithMetaData current in e.AllCategories)
{
if (current.Name == "routing" && current.ContainerId == 0 && current.InstanceId == 0L)
// Creation of your Routing, I stock it in a Property
_routingCategory = new Routing(current);
}
// I set my event to continue my main thread
_routingCategoryUpdated.Set();
}
3 / Показать информацию, которую вы хотите
// Wait until you get the information of the user
if (!_routingCategoryUpdated.WaitOne(10000))
{
Console.WriteLine("TimeOut Getting Informations");
return;
}
// Just display all the data you can need
else
{
Console.WriteLine($"User Aor: {userEndPointTarget.OwnerUri}");
Console.WriteLine($"Display Name: {userEndPointTarget.OwnerDisplayName}");
Console.WriteLine($"UM Enabled: {userEndPointTarget.UmEnabled}");
Console.WriteLine($"Simulring enabled: {_routingCategory.SimultaneousRingEnabled}");
if (_routingCategory.SimultaneousRingEnabled && _routingCategory.SimultaneousRing != null)
{
foreach (string time in _routingCategory.SimultaneousRing)
{
Console.WriteLine($"Simul_Ringing to: {time}");
}
}
if (_routingCategory.DelegateRingEnabled)
{
if (_routingCategory.SkipPrimaryEnabled)
{
Console.Out.Write("Forwarding calls to Delegates: ");
}
else if (_routingCategory.UserWaitTimebeforeTeamOrDelegates.TotalSeconds > 0.0)
{
Console.Out.Write($"Delay Ringing Delegates (delay:{ _routingCategory.UserWaitTimebeforeTeamOrDelegates.TotalSeconds} seconds): ");
}
else
{
Console.Out.Write("Simultaneously Ringing Delegates: ");
}
foreach (string delegateCurrent in _routingCategory.Delegates)
{
Console.Out.Write($"{delegateCurrent} ");
}
Console.Out.WriteLine();
}
else if (_routingCategory.TeamRingEnabled)
{
if (_routingCategory.UserWaitTimebeforeTeamOrDelegates.TotalSeconds > 0.0)
{
Console.Out.Write($"Delay Ringing Team (delay:{_routingCategory.UserWaitTimebeforeTeamOrDelegates.TotalSeconds} seconds). Team: ");
}
else
{
Console.Out.Write("Team ringing enabled. Team: ");
}
foreach (string currentTeam in _routingCategory.Team)
{
Console.Out.Write($"{currentTeam} ");
}
Console.Out.WriteLine();
}
else if (_routingCategory.CallForwardToTargetsEnabled)
{
if (_routingCategory.CallForwardingEnabled)
{
Console.Out.WriteLine($"Forward immediate to: {_routingCategory.CallForwardTo}");
}
else
{
Console.Out.WriteLine($"User Ring time: {_routingCategory.UserOnlyWaitTime}");
Console.Out.WriteLine($"Call Forward No Answer to: {_routingCategory.CallForwardTo[0]}");
}
}
else if (userEndPointTarget.UmEnabled)
{
Console.Out.WriteLine($"User Ring time: {_routingCategory.UserOnlyWaitTime}");
Console.Out.WriteLine("Call Forward No Answer to: voicemail");
}
else
{
Console.Out.WriteLine("CallForwarding Enabled: false");
}