package io.evercam.connect.discover.bonjour; import android.content.Context; import android.os.AsyncTask; import java.io.IOException; import java.util.Enumeration; import javax.jmdns.JmDNS; import javax.jmdns.ServiceEvent; import javax.jmdns.ServiceInfo; import javax.jmdns.ServiceListener; import io.evercam.connect.DiscoverMainActivity; import io.evercam.connect.db.Camera; import io.evercam.connect.db.CameraOperation; import io.evercam.connect.net.NetInfo; public class JmdnsDiscover { JmDNS jmdns; private String axisVideoService = "_axis-video._tcp.local."; // for Axis camera only private Camera camera; private ServiceInfo info; private CameraOperation cameraOperation; public NetInfo netInfo; public JmdnsDiscover(NetInfo netInfo, Context ctxt) { this.netInfo = netInfo; cameraOperation = new CameraOperation(ctxt); } public void startJmdnsDiscovery() { new JmdnsTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } private Camera getCameraFromBonjour(String type, String name) { info = jmdns.getServiceInfo(type, name); int httpport = info.getPort(); String ip = String.valueOf(info.getHostAddress()); Camera bonjourCamera = new Camera(ip); for(Enumeration<String> names = info.getPropertyNames(); names.hasMoreElements(); ) { String prop = names.nextElement(); String mac = info.getPropertyString(prop); bonjourCamera.setMAC(mac); } String model = name.substring(0, name.indexOf("-") - 1); bonjourCamera.setHttp(httpport); bonjourCamera.setVendor("AXIS"); bonjourCamera.setModel(model); bonjourCamera.setFlag(1); bonjourCamera.setBonjour(1); bonjourCamera.setActive(1); bonjourCamera.setFirstSeen(DiscoverMainActivity.getSystemTime()); bonjourCamera.setLastSeen(DiscoverMainActivity.getSystemTime()); return bonjourCamera; } private class JmdnsTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { try { jmdns = JmDNS.create(); jmdns.addServiceListener(axisVideoService, new ServiceListener() { @Override public void serviceAdded(ServiceEvent e) { final String serviceName = e.getName(); camera = getCameraFromBonjour(axisVideoService, serviceName); if(cameraOperation.isExisting(camera.getIP(), netInfo.getSsid())) { camera.setLastSeen(DiscoverMainActivity.getSystemTime()); cameraOperation.updateBonjourCamera(camera, netInfo.getSsid()); } else { cameraOperation.insertCamera(camera, netInfo.getSsid()); } } @Override public void serviceRemoved(ServiceEvent e) { } @Override public void serviceResolved(ServiceEvent arg0) { } }); } catch(IOException e) { e.printStackTrace(); } return null; } } }