package io.evercam.network;
import io.evercam.Vendor;
import io.evercam.network.discovery.Device;
import io.evercam.network.discovery.DiscoveredCamera;
import io.evercam.network.discovery.MacAddress;
import io.evercam.network.discovery.Port;
import io.evercam.network.discovery.PortScan;
import io.evercam.network.query.EvercamQuery;
import io.evercam.network.query.PublicVendor;
import java.util.ArrayList;
public abstract class IdentifyCameraRunnable implements Runnable {
private String ip;
public IdentifyCameraRunnable(String ip) {
this.ip = ip;
}
@Override
public void run() {
EvercamDiscover.printLogMessage("Identifying : " + ip);
try {
String macAddress = MacAddress.getByIpLinux(ip);
if (!macAddress.equals(Constants.EMPTY_MAC)) {
Vendor vendor = EvercamQuery.getCameraVendorByMac(macAddress);
if (vendor != null) {
String vendorId = vendor.getId();
if (!vendorId.isEmpty()) {
EvercamDiscover.printLogMessage(ip
+ " is identified as a camera, vendor is: "
+ vendorId);
// Then fill details discovered from IP scan
DiscoveredCamera camera = new DiscoveredCamera(ip);
camera.setMAC(macAddress);
camera.setVendor(vendorId);
// Start port scan
PortScan portScan = new PortScan();
portScan.start(ip);
ArrayList<Port> activePortList = portScan
.getActivePorts();
if (activePortList.size() > 0) {
camera = camera.mergePorts(activePortList);
}
onCameraFound(camera, vendor);
}
} else {
Device device = new Device(ip);
device.setMAC(macAddress);
device.setPublicVendor(PublicVendor.getByMac(macAddress)
.getCompany());
onNonCameraDeviceFound(device);
}
}
} catch (Exception e) {
if (Constants.ENABLE_LOGGING) {
e.printStackTrace();
}
}
EvercamDiscover.printLogMessage("Identification finished: " + ip);
onFinished();
}
public abstract void onCameraFound(DiscoveredCamera discoveredCamera,
Vendor vendor);
public abstract void onNonCameraDeviceFound(Device device);
public abstract void onFinished();
}