Snmpv3 read multiple devices with different settings

Hello

I try to read multiple devices with different settings.
It’s ok with the first, but when the second start, the first break with a security name error.
Some thinks must not be shared between devices, but I don’t success to separate thinks.

securityName = new OctetString(paramSecurityName);

OID authProtocol = checkSettingsV3.getAuthProtocol();
OID privProtocol = checkSettingsV3.getPrivProtocol();
OctetString authPassphrase = checkSettingsV3.getAuthPassphrase();
OctetString privPassphrase = checkSettingsV3.getPrivPassphrase();
int securityLevel = checkSettingsV3.getSecurityLevel();

OctetString localEngineId = new OctetString(MPv3.createLocalEngineID());

logger.info("[{}] localEngineId={}",deviceName,localEngineId.toString());

SecurityProtocols securityProtocols = SecurityProtocols.getInstance();
securityProtocols.addDefaultProtocols();
securityProtocols.addAuthenticationProtocol(new AuthMD5());
securityProtocols.addPrivacyProtocol(new PrivDES());

USM usm = new USM(securityProtocols, localEngineId, 0);

SecurityModels.getInstance().addSecurityModel(usm);

if (paramMibFilePath != null){
		if (!paramMibFilePath.isEmpty()){
				addTagFromMibFile(paramMibFilePath);
		}
}
if(paramTargetAddress instanceof UdpAddress) {
		logger.debug("[{}] Use UDP TransportMapping",deviceName);
		transport = new DefaultUdpTransportMapping();
} else {
		logger.debug("[{}] Use TCP TransportMapping",deviceName);
		transport = new DefaultTcpTransportMapping();
}

snmp = new Snmp(transport);

snmp.getUSM().addUser(securityName, new UsmUser(securityName, authProtocol, authPassphrase, privProtocol, privPassphrase));
SecurityModels.getInstance().addSecurityModel(new TSM(localEngineId, false));

// Do not forget this line!
transport.listen();

// setting up target
target = new UserTarget();
target.setAddress(paramTargetAddress);
target.setRetries(paramReadRetries);
target.setTimeout(paramReadTimeoutMs);
target.setVersion(SnmpConstants.version3);
target.setSecurityLevel(securityLevel);
target.setSecurityName(securityName);

targetWrite = new UserTarget();
targetWrite.setAddress(paramTargetAddress);
targetWrite.setRetries(paramWriteRetries);
targetWrite.setTimeout(paramWriteTimeoutMs);
targetWrite.setVersion(SnmpConstants.version3);
targetWrite.setSecurityLevel(securityLevel);
targetWrite.setSecurityName(securityName);

I finally find the solution with:

https://doc.snmp.app/pages/viewpage.action?pageId=1441800

Just a doubt how to transform:

SecurityModels.getInstance().addSecurityModel(TSM(localEngineId, false));

for multiple users

If you use TSM instead of USM, then you do not need to do special handling for users with same security name but different engine ID (= different target).

TSM uses (X.500) certificates for authentication which are not localised by any engine ID.