How can I add multiple metadata entries to a single hardware using the C# language? ( VPS Toolkit sample → VpsConfiguration → VpsConfiguration.csproj → VpsCameraBuilder.cs)
With modification de code :“”"
public static void BuildCameraForEachChild(
Item itemSelectedCameraGroup,
string cameraFormat,
string cameraGroupName,
string cameraSuffix,
string metadataGroupName,
string metadataSuffix,
string managementServerUrl,
string vpsServiceUrls,
string gstreamerPipelineConfig)
{
List cameraItems = itemSelectedCameraGroup.GetChildren();
string cameraNameH = “VPS_CAM”;
string username = string.Empty; // Setting username empty will create the hardware with the rights of the user running the recording server
string password = string.Empty;
Guid recordingServerId = none;
ManagementServer managementServer = new ManagementServer(Configuration.Instance.ServerFQID.ServerId);
foreach (Item cameraItem in cameraItems)
{
if (cameraItem.FQID.Kind == Kind.Camera && cameraItem.FQID.FolderType == [FolderType.No](https://FolderType.No "https://FolderType.No"))
{
recordingServerId = cameraItem.FQID.ParentId;
}
}
Guid hardwareId = AddHardware(managementServerUrl, recordingServerId, username, password, cameraNameH, cameraGroupName, metadataGroupName);
Hardware hardware = new Hardware(EnvironmentManager.Instance.MasterSite.ServerId, $“Hardware[{hardwareId.ToString()}]”);
hardware.Name = cameraNameH;
hardware.Enabled = true;
hardware.Save();
//…
MetadataGroup metadataGroup = managementServer.MetadataGroupFolder.MetadataGroups.FirstOrDefault(g => g.Name == metadataGroupName);
if (metadataGroup == null)
{
// Create the metadata group if it does not already exist
AddDeviceGroupServerTask task = managementServer.MetadataGroupFolder.AddDeviceGroup();
task.GroupName = metadataGroupName;
task.GroupDescription = "";
ServerTask result = task.Execute();
while (true)
{
StateEnum state = result.State;
if (state == StateEnum.Error || state == StateEnum.Success)
{
break;
}
System.Threading.Thread.Sleep(500);
result.UpdateState();
}
if (result.State != StateEnum.Error)
{
metadataGroup = new MetadataGroup(Configuration.Instance.ServerFQID.ServerId, result.Path);
}
}
var cameraName= “”;
var namemeta = “”;
cameraName = cameraFormat;
foreach (Item cameraItem in cameraItems)
{
if (cameraItem.FQID.Kind == Kind.Camera && cameraItem.FQID.FolderType == [FolderType.No](https://FolderType.No "https://FolderType.No"))
{
if (cameraName == cameraFormat)
{
cameraName = cameraFormat.Replace("##[#CAMERA\_NAME](javascript:void\(0\); "#CAMERA_NAME")###", [cameraItem.Name](https://cameraItem.Name "https://cameraItem.Name"));
namemeta = [cameraItem.Name](https://cameraItem.Name "https://cameraItem.Name");
}
BuildOneCamera(cameraItem, managementServer, hardwareId, metadataGroup, hardware, cameraName, cameraGroupName, cameraSuffix, metadataGroupName, metadataSuffix, managementServerUrl, vpsServiceUrls, gstreamerPipelineConfig);
}
}
}
public static void BuildOneCamera(Item itemSelectedCamera,
ManagementServer managementServer,
Guid hardwareId,
MetadataGroup metadataGroup,
Hardware hardware,
string hardwareName,
string cameraGroupName,
string cameraSuffix,
string metadataGroupName,
string metadataSuffix,
string managementServerUrl,
string vpsServiceUrls,
string gstreamerPipelineConfig)
{
// get an instance of the source camera first, if it’s been deleted this will throw an exception
Camera sourceCamera = new Camera(itemSelectedCamera.FQID);
// Populate the camera device in the new hardware with relevant properties
ConfigureHardware(hardware, itemSelectedCamera.FQID.ObjectId.ToString(), vpsServiceUrls, gstreamerPipelineConfig);
// Name and enable the new metadata device
var metadata = new Metadata(itemSelectedCamera.FQID.ServerId, hardware.MetadataFolder.Metadatas.First().Path.ToString())
{
//Metadata metadata = hardware.MetadataFolder.Metadatas.First();
Name = $"{hardwareName} - {metadataSuffix}",
Enabled = true
};
metadata.Save();
// Add the new metadata device to a specific metadata group.
// Don’t fail if the metadata group was not created. It does not prevent the process from running, it is merely convenience for the end user.
metadataGroup?.MetadataFolder.AddDeviceGroupMember(metadata.Path);
// Set the newly created metadata device as “related metadata device” for the original source camera device.
// This will cause the computed metadata’s bounding boxes to appear in the Smart Client.
ClientSettings clientSettings = sourceCamera.ClientSettingsFolder.ClientSettings.FirstOrDefault();
clientSettings.Related += $“,{metadata.Path}”;
clientSettings.Save();
}
“”"
Problem :
Result code with modified


