package io.evercam.network.discovery;
import io.evercam.network.Constants;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Locale;
import org.json.JSONObject;
/**
* The serializable camera object returned from discovery.
*/
public class DiscoveredCamera extends Device implements Serializable,
DeviceInterface {
private static final long serialVersionUID = 2100241933714349000L;
private String name = "";
private String vendor = "";
private String model = "";
private int upnp = 0; // 1: yes 0:no
private int bonjour = 0;
private int onvif = 0;
private int http = 0;
private int rtsp = 0;
private int ftp = 0;
private int ssh = 0;
private int https = 0;
private int exthttp = 0;
private int extrtsp = 0;
private int extftp = 0;
private int extssh = 0;
private int exthttps = 0;
private int flag = Constants.TYPE_OTHERS; // 1: camera, 2: router, 3:other
private String ssid = "";
private String firstSeen;
private String lastSeen;
private String username;
private String password;
private String jpg;
private String h264;
private int portForwarded = 0; // 1:yes 0:no
private int evercamConnected = 0; // 1:yes 0:no
private int active = 0; // 1:yes 0:no
private String vendorThumbnailUrl = "";
private String modelThumbnailUrl = "";
private String notes = "";
public DiscoveredCamera(String ip) {
super(ip);
}
public String getName() {
return name;
}
public String getVendor() {
return vendor;
}
public void setName(String name) {
this.name = name;
}
public void setVendor(String vendor) {
this.vendor = vendor;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
// public int getUpnp()
// {
// return upnp;
// }
//
// public void setUpnp(int upnp)
// {
// this.upnp = upnp;
// }
//
// public int getBonjour()
// {
// return bonjour;
// }
//
// public void setBonjour(int bonjour)
// {
// this.bonjour = bonjour;
// }
//
// public int getOnvif()
// {
// return onvif;
// }
//
// public void setOnvif(int onvif)
// {
// this.onvif = onvif;
// }
public int getHttp() {
return http;
}
public void setHttp(int http) {
this.http = http;
}
public int getRtsp() {
return rtsp;
}
public void setRtsp(int rtsp) {
this.rtsp = rtsp;
}
// public int getFtp()
// {
// return ftp;
// }
//
// public void setFtp(int ftp)
// {
// this.ftp = ftp;
// }
//
// public int getSsh()
// {
// return ssh;
// }
//
// public void setSsh(int ssh)
// {
// this.ssh = ssh;
// }
public int getExthttp() {
return exthttp;
}
public void setExthttp(int exthttp) {
this.exthttp = exthttp;
}
public int getExtrtsp() {
return extrtsp;
}
public void setExtrtsp(int extrtsp) {
this.extrtsp = extrtsp;
}
// public int getExtftp()
// {
// return extftp;
// }
//
// public void setExtftp(int extftp)
// {
// this.extftp = extftp;
// }
//
// public int getExtssh()
// {
// return extssh;
// }
//
// public void setExtssh(int extssh)
// {
// this.extssh = extssh;
// }
//
// public void setFlag(int flag)
// {
// this.flag = flag;
// }
//
// public int getFlag()
// {
// return flag;
// }
// public String getSsid()
// {
// return ssid;
// }
//
// public void setSsid(String ssid)
// {
// this.ssid = ssid;
// }
//
// public String getFirstSeen()
// {
// return firstSeen;
// }
//
// public void setFirstSeen(String firstSeen)
// {
// this.firstSeen = firstSeen;
// }
//
// public String getLastSeen()
// {
// return lastSeen;
// }
//
// public void setLastSeen(String lastSeen)
// {
// this.lastSeen = lastSeen;
// }
//
// public int getActive()
// {
// return active;
// }
//
// public void setActive(int active)
// {
// this.active = active;
// }
//
// public boolean isActive()
// {
// return getActive() == 1;
// }
@Override
public String toString() {
return "Camera [ip=" + ip + ", name=" + name + ", externalIp="
+ externalIp + ", mac=" + mac + ", vendor=" + vendor
+ ",model=" + model + ",bonjour=" + bonjour + ",upnp=" + upnp
+ ",onvif=" + onvif + ",http=" + http + ",rtsp=" + rtsp
+ ",https=" + https + ",ftp=" + ftp + ",ssh=" + ssh
+ ",extrtsp=" + extrtsp + ",exthttp=" + exthttp + ",flag="
+ flag + ",firstseen=" + firstSeen + ",lastseen=" + lastSeen
+ ",username=" + username + ",password=" + password + ",jpg="
+ jpg + ",h264=" + h264 + ",ssid=" + ssid + ",active=" + active
+ ",vendorThumbnail=" + vendorThumbnailUrl + "]";
}
public int getHttps() {
return https;
}
public void setHttps(int https) {
this.https = https;
}
public int getExthttps() {
return exthttps;
}
public void setExthttps(int exthttps) {
this.exthttps = exthttps;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String getJpg() {
return jpg;
}
public String getH264() {
return h264;
}
public void setJpg(String jpg) {
this.jpg = jpg;
}
public void setH264(String h264) {
this.h264 = h264;
}
// public int getPortForwarded()
// {
// return portForwarded;
// }
//
// public void setPortForwarded(int portForwarded)
// {
// this.portForwarded = portForwarded;
// }
//
// public int getEvercamConnected()
// {
// return evercamConnected;
// }
public String getVendorThumbnail() {
return vendorThumbnailUrl;
}
public void setVendorThumbnail(String thumbnail) {
this.vendorThumbnailUrl = thumbnail;
}
public String getModelThumbnail() {
return modelThumbnailUrl;
}
public void setModelThumbnail(String thumbnailUrl) {
this.modelThumbnailUrl = thumbnailUrl;
}
// public void setEvercamConnected(int evercamConnected)
// {
// this.evercamConnected = evercamConnected;
// }
public boolean hasHTTP() {
if (getHttp() > 0) {
return true;
}
return false;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
public boolean hasRTSP() {
if (getRtsp() != 0) {
return true;
}
return false;
}
public boolean hasHTTPS() {
if (getHttps() != 0) {
return true;
}
return false;
}
public boolean hasExternalHttp() {
if (getExthttp() != 0) {
return true;
}
return false;
}
public boolean hasExternalRtsp() {
if (getExtrtsp() != 0) {
return true;
}
return false;
}
public boolean hasExternalHttps() {
if (getExthttps() != 0) {
return true;
}
return false;
}
public boolean hasModel() {
if (getModel() != null && !getModel().equals("")) {
return true;
}
return false;
}
public boolean hasModelThumbnailUrl() {
return !getModelThumbnail().isEmpty();
}
public boolean hasVendorThumbnailUrl() {
return !getVendorThumbnail().isEmpty();
}
public boolean hasMac() {
if (getMAC() != null && !getMAC().equals("")
&& !getMAC().equals(Constants.EMPTY_MAC)) {
return true;
}
return false;
}
public boolean hasVendor() {
if (getVendor() != null && !getVendor().equals("")) {
return true;
}
return false;
}
public boolean hasJpgURL() {
if (getJpg() != null && !getJpg().isEmpty() && getJpg() != "/") {
return true;
}
return false;
}
public boolean hasH264URL() {
if (getH264() != null && !getH264().isEmpty() && getH264() != "/") {
return true;
}
return false;
}
public boolean modelContainsVendorName() {
if (getModel().toUpperCase(Locale.UK).contains(
getVendor().toUpperCase(Locale.UK))) {
return true;
}
return false;
}
public boolean hasExternalIp() {
if (getExternalIp() != null && !getExternalIp().isEmpty()) {
return true;
}
return false;
}
public boolean hasName() {
return !getName().isEmpty();
}
public boolean hasValidIpv4Address() {
return IpTranslator.isValidIpv4Addr(getIP());
}
public boolean hasPassword() {
return getPassword() != null;
}
public boolean hasUsername() {
return getUsername() != null;
}
/**
* Merge camera 2 to camera 1, the values in cameras will be kept.
*/
public DiscoveredCamera merge(DiscoveredCamera discoveredCamera) {
if (discoveredCamera.hasMac()) {
setMAC(discoveredCamera.getMAC());
}
if (discoveredCamera.hasRTSP()) {
setRtsp(discoveredCamera.getRtsp());
}
if (!hasVendor() && discoveredCamera.hasVendor()) {
setVendor(discoveredCamera.getVendor());
}
if (!hasHTTP() && discoveredCamera.hasHTTP()) {
setHttp(discoveredCamera.getHttp());
}
if (!hasModel() && discoveredCamera.hasModel()) {
setModel(discoveredCamera.getModel());
}
if (discoveredCamera.hasExternalHttp()) {
setExthttp(discoveredCamera.getExthttp());
}
if (discoveredCamera.hasExternalRtsp()) {
setExtrtsp(discoveredCamera.getExtrtsp());
}
if (discoveredCamera.hasName()) {
setName(discoveredCamera.getName());
}
if (discoveredCamera.hasExternalIp()) {
setExternalIp(discoveredCamera.getExternalIp());
}
if (discoveredCamera.hasUsername()) {
setUsername(discoveredCamera.getUsername());
}
if (discoveredCamera.hasPassword()) {
setPassword(discoveredCamera.getPassword());
}
if (discoveredCamera.hasModelThumbnailUrl()) {
setModelThumbnail(discoveredCamera.getModelThumbnail());
}
if (discoveredCamera.hasVendorThumbnailUrl()) {
setVendorThumbnail(discoveredCamera.getVendorThumbnail());
}
if (discoveredCamera.hasJpgURL()) {
setJpg(discoveredCamera.getJpg());
}
if (discoveredCamera.hasH264URL()) {
setH264(discoveredCamera.getH264());
}
return this;
}
public DiscoveredCamera mergePorts(ArrayList<Port> portsList) {
if (portsList.size() > 0) {
for (Port port : portsList) {
if (port.isHttp()) {
setHttp(port.getValue());
} else if (port.isRtsp()) {
setRtsp(port.getValue());
}
}
}
return this;
}
public JSONObject toJsonObject() {
LinkedHashMap<String, Object> jsonOrderedMap = new LinkedHashMap<String, Object>();
jsonOrderedMap.put("lan_ip", getIP());
jsonOrderedMap.put("friendly_name", getName());
jsonOrderedMap.put("mac_address", getMAC());
jsonOrderedMap.put("wan_ip", getExternalIp());
jsonOrderedMap.put("vendor_id", getVendor());
jsonOrderedMap.put("model_id", getModel());
jsonOrderedMap.put("lan_http_port", hasHTTP() ? getHttp()
: JSONObject.NULL);
jsonOrderedMap.put("lan_rtsp_port", hasRTSP() ? getRtsp()
: JSONObject.NULL);
jsonOrderedMap.put("upnp_wan_http_port",
hasExternalHttp() ? getExthttp() : JSONObject.NULL);
jsonOrderedMap.put("upnp_wan_rtsp_port",
hasExternalRtsp() ? getExtrtsp() : JSONObject.NULL);
jsonOrderedMap.put("default_username", getUsername());
jsonOrderedMap.put("default_password", getPassword());
jsonOrderedMap.put("http_jpg_path", getJpg());
jsonOrderedMap.put("rtsp_h264_path", getH264());
jsonOrderedMap.put("vendor_thumbnail_url", getVendorThumbnail());
jsonOrderedMap.put("model_thumbnail_url", getModelThumbnail());
jsonOrderedMap.put("notes", getNotes());
return new JSONObject(jsonOrderedMap);
}
/**
* Check if two cameras with different IP address duplicate with each other
*
* @param camera
* the discovered camera to compare to
* @return true if they duplicate, otherwise return false
*/
public boolean isduplicateWith(DiscoveredCamera camera) {
if (camera == null)
return false;
if (camera.getHttp() == getHttp() && camera.getRtsp() == getRtsp()
&& camera.getMAC().equals(getMAC())
&& !camera.getIP().equals(getIP())
&& camera.getVendor().equals(getVendor())
&& camera.getModel().equals(getModel())
&& camera.getExthttp() == getExthttp()
&& camera.getExtrtsp() == getExtrtsp()) {
return true;
}
return false;
}
}