Преглед изворни кода

LightControl Service Interfaces is under implementing.

Trishia пре 4 година
родитељ
комит
0acbb3d9f3

+ 74 - 1
app/src/main/java/org/iotivity/bridge/homeserver/BridgeServer.java

@@ -17,10 +17,14 @@ import org.iotivity.OCMethod;
 import org.iotivity.bridge.homeserver.handler.BridgeInitHandler;
 import org.iotivity.bridge.homeserver.handler.BridgeInitHandler;
 import org.iotivity.bridge.homeserver.handler.FactoryPresetsHandler;
 import org.iotivity.bridge.homeserver.handler.FactoryPresetsHandler;
 import org.iotivity.bridge.homeserver.handler.server.GetLightRequestHandler;
 import org.iotivity.bridge.homeserver.handler.server.GetLightRequestHandler;
+import org.iotivity.bridge.homeserver.handler.server.GetRequestHandler;
 import org.iotivity.bridge.homeserver.handler.server.PostLightRequestHandler;
 import org.iotivity.bridge.homeserver.handler.server.PostLightRequestHandler;
+import org.iotivity.bridge.homeserver.handler.server.PostRequestHandler;
 import org.iotivity.bridge.homeserver.handler.server.PutLightRequestHandler;
 import org.iotivity.bridge.homeserver.handler.server.PutLightRequestHandler;
+import org.iotivity.bridge.homeserver.handler.server.PutRequestHandler;
 import org.iotivity.bridge.homeserver.model.Bridge;
 import org.iotivity.bridge.homeserver.model.Bridge;
 import org.iotivity.bridge.homeserver.model.Light;
 import org.iotivity.bridge.homeserver.model.Light;
+import org.iotivity.bridge.homeserver.model.OCFDevice;
 import org.iotivity.bridge.homeserver.model.VirtualOCFDevice;
 import org.iotivity.bridge.homeserver.model.VirtualOCFDevice;
 import org.iotivity.bridge.homeserver.utils.Utils;
 import org.iotivity.bridge.homeserver.utils.Utils;
 import org.iotivity.oc.OcBridge;
 import org.iotivity.oc.OcBridge;
@@ -167,6 +171,75 @@ public class BridgeServer {
         return null ;
         return null ;
     }
     }
 
 
+    public int addVirtualOCFDevice(String virtual_di, String device_type, String devicename, String econame) {
+
+        // Add Virtual Device for Light
+        OCUuid uuid = OCUuidUtil.stringToUuid(virtual_di);
+        int vod_index = OCBridge.addVirtualDevice(uuid.getId(),
+                econame, "/oic/d", device_type,  // "oic.d.virtual" automatically added by internal api implements
+                devicename, "ocf.2.0.0", "ocf.res.1.3.0,ocf.sh.1.3.0",
+                new OCAddDeviceHandler() {
+                    @Override
+                    public void handler() {
+                        Log.d(TAG, "inside VirtualDevice.OCAddDeviceHandler.handler()");
+                    }
+                });
+
+        if (vod_index != 0) {
+            Log.d(TAG, "VOD Index = " + vod_index + ", VOD Count = " + OCBridge.getVirtualDeviceCount());
+
+            light = new Light(devicename);
+            OCDeviceInfo dev_info = OCCoreRes.getDeviceInfo(vod_index);
+            OCVirtualDevice vod_info = OCBridge.getVirtualDeviceInfo(vod_index);
+            Log.d(TAG, "VOD Info = " + vod_info);
+            if (vod_info != null) {
+                Log.d(TAG, "Virtual Server[" + vod_info.getIndex() + "] "
+                        + " DeviceId = " + OCUuidUtil.bytesToString(vod_info.getId())
+                        + ", Econame = " + vod_info.getEconame() + ", Name = " + dev_info.getName()
+                        + " was added");
+
+
+                // Add VOD Data
+                VirtualOCFDevice vod = new VirtualOCFDevice(vod_index, devicename, econame,
+                        OCUuidUtil.bytesToString(vod_info.getId()));
+                vod.setDiscovered(true);
+                vod.setAddedToBridge(true);
+                bridge.addOrReplaceVODList(vod);
+
+                // set immutable device id for Platform Independent Identifier (piid)
+                OCMain.setImmutableDeviceIdentifier(vod_index, OCUuidUtil.stringToUuid(virtual_di));
+                Log.d(TAG, "Virtual Server [" + vod_info.getIndex() + "] "
+                        + ", Virtual Device Id = " + virtual_di
+                        + ", Device Id = " + OCUuidUtil.uuidToString(dev_info.getDi())
+                        + ", Device Piid = " + OCUuidUtil.uuidToString(dev_info.getPiid()));
+
+                // Add OCF Virtual Device IDD
+                //byte[] idd_bytes = Utils.getFileBytes("idds/virtual_ocf_device_light_IDD.cbor", activity); // example : "dummy_bridge_bridge_device_IDD.cbor"
+                //OCIntrospection.setIntrospectionData(vod_index, idd_bytes);
+            }
+        }
+        return vod_index ;
+    }
+
+    public void addVirtualDeviceResource(int vod_index, OCFDevice device, String resource_name, String resource_uri, String resource_type, String interfaces) {
+
+        int interfaceMask = Utils.interfacesStringToMask(interfaces);
+
+        // Add Device Resource and Handler
+        OCResource resource = OCMain.newResource(resource_name, resource_uri, (short)1, (long)vod_index);
+        OCMain.resourceBindResourceType(resource, resource_type);
+        OCMain.resourceBindResourceInterface(resource, interfaceMask);
+        OCMain.resourceSetDefaultInterface(resource, interfaceMask);
+        OCMain.resourceSetDiscoverable(resource, true);
+        OCMain.resourceSetObservable(resource, true);
+        //TODO : check if it is needed for notifying to client
+        //OCMain.resourceSetPeriodicObservable(resource, 60); // seconds
+        OCMain.resourceSetRequestHandler(resource, OCMethod.OC_GET, new GetRequestHandler(service, device));
+        OCMain.resourceSetRequestHandler(resource, OCMethod.OC_POST, new PostRequestHandler(service, device));
+        OCMain.resourceSetRequestHandler(resource, OCMethod.OC_PUT, new PutRequestHandler(service, device));
+        OCMain.addResource(resource);
+    }
+
     public void addLightVirtualOCFServer(String virtual_di, String devicename, String econame) {
     public void addLightVirtualOCFServer(String virtual_di, String devicename, String econame) {
 
 
         // Add Virtual Device for Light
         // Add Virtual Device for Light
@@ -245,7 +318,7 @@ public class BridgeServer {
         }
         }
 
 
     }
     }
-    
+
 
 
     public void removeLightVirtualOCFDevice(int vod_index) {
     public void removeLightVirtualOCFDevice(int vod_index) {
 
 

+ 18 - 0
app/src/main/java/org/iotivity/bridge/homeserver/BridgeService.java

@@ -530,6 +530,24 @@ public class BridgeService extends IntentService {
         }
         }
     };
     };
 
 
+    public String doGetLightControlResource(String device_uuid, String resource_uri) {
+        try {
+            String properties = lightBinder.doGetResourceProperties(device_uuid, resource_uri);
+            return properties ;
+        } catch (RemoteException e) {
+            Log.e(TAG, "Light Control Service Remote Error : ", e);
+        }
+        return null ;
+    }
+
+    public void doPostLightControlResource(String device_uuid, String resource_uri, String prop_data) {
+        try {
+            lightBinder.doPostResourceProperties(device_uuid, resource_uri, prop_data);
+        } catch (RemoteException e) {
+            Log.e(TAG, "Light Control Service Remote Error : ", e);
+        }
+    }
+
     public void msg(String msg) {
     public void msg(String msg) {
         mHandler.sendMessage(mHandler.obtainMessage(MSG_STRING, msg));
         mHandler.sendMessage(mHandler.obtainMessage(MSG_STRING, msg));
     }
     }

+ 87 - 0
app/src/main/java/org/iotivity/bridge/homeserver/handler/server/GetRequestHandler.java

@@ -0,0 +1,87 @@
+package org.iotivity.bridge.homeserver.handler.server;
+
+import android.util.Log;
+
+import org.iotivity.OCCoreRes;
+import org.iotivity.OCInterfaceMask;
+import org.iotivity.OCRequest;
+import org.iotivity.OCRequestHandler;
+import org.iotivity.OCStatus;
+import org.iotivity.OCUuid;
+import org.iotivity.OCUuidUtil;
+import org.iotivity.bridge.homeserver.BridgeService;
+import org.iotivity.bridge.homeserver.model.Light;
+import org.iotivity.bridge.homeserver.model.OCFDevice;
+import org.iotivity.oc.OcCborEncoder;
+import org.iotivity.oc.OcUtils;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Properties;
+
+public class GetRequestHandler implements OCRequestHandler {
+
+    private static final String TAG = GetRequestHandler.class.getSimpleName();
+
+    private BridgeService service;
+    private OCFDevice device;
+
+    public GetRequestHandler(BridgeService service, OCFDevice device) {
+        this.service = service;
+        this.device = device;
+    }
+
+    @Override
+    public void handler(OCRequest request, int interfaces) {
+        Log.d(TAG, "inside Get Request Handler");
+
+        OCUuid uuid = OCCoreRes.getDeviceId(request.getResource().getDevice());
+        String device_uuid = OCUuidUtil.uuidToString(uuid);
+        String resource_uri = request.getResource().getUri();
+
+        service.msg("Get "+resource_uri+" of "+device_uuid+" Request Received.");
+
+        OcCborEncoder root = OcCborEncoder.createOcCborEncoder(OcCborEncoder.EncoderType.ROOT);
+        switch (interfaces) {
+            case OCInterfaceMask.BASELINE: {
+                root.processBaselineInterface(request.getResource());
+                break;
+            }
+            case OCInterfaceMask.R:
+            case OCInterfaceMask.RW:
+            case OCInterfaceMask.S:
+            case OCInterfaceMask.A:
+                // TODO : doGetProperties with Light Control Service
+                service.doGetDeviceResource(device_uuid, resource_uri);
+
+                OCFDevice.Resource resource = device.getResource(request.getResource().getUri());
+                if(resource!=null) {
+                    service.msg("\t\t" + OCFDevice.RESOURCE_NAME_KEY + ": " + device.getDeviceName());
+                    Properties properties = resource.getProperties();
+                    Iterator<String> it = properties.stringPropertyNames().iterator();
+                    while(it.hasNext()) {
+                        String key = it.next();
+                        Object value = properties.get(key);
+                        service.msg("\t\t" + key + ": " + value);
+                        if(value instanceof Boolean) {
+                            root.setBoolean(key, (boolean)value);
+                        } else if(value instanceof String) {
+                            root.setTextString(key, (String)value);
+                        } else if(value instanceof Integer || value instanceof Long) {
+                            root.setLong(key, (long)value);
+                        } else if(value instanceof Double || value instanceof Float) {
+                            root.setDouble(key, (double)value);
+                        }
+                    }
+                }
+                break;
+            default:
+                break;
+        }
+        root.done();
+        service.msg("Get "+request.getResource().getUri()+" Response Sent.");
+        service.printLine();
+
+        OcUtils.sendResponse(request, OCStatus.OC_STATUS_OK);
+    }
+}

+ 80 - 0
app/src/main/java/org/iotivity/bridge/homeserver/handler/server/PostRequestHandler.java

@@ -0,0 +1,80 @@
+package org.iotivity.bridge.homeserver.handler.server;
+
+import android.util.Log;
+
+import org.iotivity.OCCoreRes;
+import org.iotivity.OCMain;
+import org.iotivity.OCRepresentation;
+import org.iotivity.OCRequest;
+import org.iotivity.OCRequestHandler;
+import org.iotivity.OCStatus;
+import org.iotivity.OCType;
+import org.iotivity.OCUuid;
+import org.iotivity.OCUuidUtil;
+import org.iotivity.bridge.homeserver.BridgeService;
+import org.iotivity.bridge.homeserver.model.Light;
+import org.iotivity.bridge.homeserver.model.OCFDevice;
+import org.iotivity.oc.OcCborException;
+import org.iotivity.oc.OcRepresentation;
+import org.iotivity.oc.OcUtils;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+public class PostRequestHandler implements OCRequestHandler {
+
+    private static final String TAG = PostRequestHandler.class.getSimpleName();
+
+    private BridgeService service;
+    private OCFDevice device;
+
+    public PostRequestHandler(BridgeService service, OCFDevice device) {
+        this.service = service;
+        this.device = device;
+    }
+
+    @Override
+    public void handler(OCRequest request, int interfaces) {
+        Log.d(TAG, "inside Post Request Handler");
+
+        OCUuid uuid = OCCoreRes.getDeviceId(request.getResource().getDevice());
+        String device_uuid = OCUuidUtil.uuidToString(uuid);
+        String resource_uri = request.getResource().getUri();
+
+        service.msg("Post "+resource_uri+"of "+device_uuid+" Request Received.");
+        try {
+
+            OcRepresentation rep = new OcRepresentation(request.getRequestPayload());
+            JSONObject obj = new JSONObject();
+            while (rep != null) {
+                if(rep.getType() == OCType.OC_REP_BOOL) {
+                    obj.put(rep.getKey(), rep.getBoolean());
+                    service.msg("\t\t" + rep.getKey() + ": " + rep.getBoolean());
+                } else if(rep.getType() == OCType.OC_REP_STRING) {
+                    obj.put(rep.getKey(), rep.getString());
+                    service.msg("\t\t" + rep.getKey() + ": " + rep.getString());
+                } else if(rep.getType() == OCType.OC_REP_INT) {
+                    obj.put(rep.getKey(), rep.getLong());
+                    service.msg("\t\t" + rep.getKey() + ": " + rep.getLong());
+                } else if(rep.getType() == OCType.OC_REP_DOUBLE) {
+                    obj.put(rep.getKey(), rep.getDouble());
+                    service.msg("\t\t" + rep.getKey() + ": " + rep.getDouble());
+                } else if(rep.getType() == OCType.OC_REP_ARRAY) {
+                    obj.put(rep.getKey(), rep.getArray());
+                    service.msg("\t\t" + rep.getKey() + ": " + rep.getArray().toString());
+                }
+
+                rep = rep.getNext();
+            }
+            // TODO : doPostProperties() with Light Control Service
+            service.doPostDeviceResource(device_uuid, resource_uri, obj.toString());
+
+        } catch (JSONException e) {
+            Log.e(TAG, "JSON Error", e);
+        } catch (OcCborException e) {
+            Log.e(TAG, "CBOR Error", e);
+        }
+
+        service.printLine();
+        OcUtils.sendResponse(request, OCStatus.OC_STATUS_CHANGED);
+    }
+}

+ 28 - 0
app/src/main/java/org/iotivity/bridge/homeserver/handler/server/PutRequestHandler.java

@@ -0,0 +1,28 @@
+package org.iotivity.bridge.homeserver.handler.server;
+
+import android.util.Log;
+
+import org.iotivity.OCRequest;
+import org.iotivity.OCRequestHandler;
+import org.iotivity.bridge.homeserver.BridgeService;
+import org.iotivity.bridge.homeserver.model.Light;
+import org.iotivity.bridge.homeserver.model.OCFDevice;
+
+public class PutRequestHandler implements OCRequestHandler {
+
+    private static final String TAG = PutRequestHandler.class.getSimpleName();
+
+    private BridgeService service;
+    private OCFDevice device;
+
+    public PutRequestHandler(BridgeService service, OCFDevice device) {
+        this.service = service;
+        this.device = device;
+    }
+
+    @Override
+    public void handler(OCRequest request, int interfaces) {
+        Log.d(TAG, "inside Put Request Handler");
+        new PostRequestHandler(service, device).handler(request, interfaces);
+    }
+}

+ 141 - 0
app/src/main/java/org/iotivity/bridge/homeserver/model/OCFDevice.java

@@ -0,0 +1,141 @@
+package org.iotivity.bridge.homeserver.model;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Properties;
+
+public class OCFDevice {
+
+    // device key name
+    static public final String NAME_KEY = "n";
+    static public final String ECONAME_KEY = "econame";
+    static public final String DI_KEY = "di";
+
+    // resource key name
+    static public final String RESOURCE_NAME_KEY = "n" ;
+    static public final String RESOURCE_INTERFACE_KEY = "if" ;
+    static public final String RESOURCE_TYPE_KEY = "rt" ;
+
+    private String device_name ;
+    private String device_type ;
+    private String device_id ;
+    private ArrayList<Resource> resources = new ArrayList<Resource>() ;
+
+    public class Resource {
+
+        private String resource_name ;
+        private String resource_uri ;
+        private String resource_rt ;
+        private String resource_if ;
+        private Properties properties = new Properties() ;
+
+        public Resource(String resource_name, String resource_uri, String resource_rt, String resource_if) {
+            this.resource_name = resource_name ;
+            this.resource_uri = resource_uri ;
+            this.resource_rt = resource_rt ;
+            this.resource_if = resource_if ;
+        }
+
+        public String getResourceName() { return resource_name; }
+        public void setResourceName(String resource_name) {
+            this.resource_name = resource_name ;
+        }
+
+        public String getResourceUri() {
+            return resource_uri;
+        }
+        public void setResourceUri(String resource_uri) {
+            this.resource_uri = resource_uri;
+        }
+
+        public String getResourceType() {
+            return resource_rt;
+        }
+        public void setResourceType(String resource_rt) {
+            this.resource_rt = resource_rt;
+        }
+
+        public String getResourceInterface() {
+            return resource_if;
+        }
+
+        public void setResourceInterface(String resource_if) {
+            this.resource_if = resource_if;
+        }
+
+        public Properties getProperties() {
+            return properties;
+        }
+
+        public void addOrReplaceProperty(String key, Object value) {
+            properties.put(key, value);
+        }
+    };
+
+    public OCFDevice(String device_name) {
+
+        this.device_name = device_name;
+    }
+
+    public OCFDevice(String device_name, String device_type, String device_id) {
+
+        this.device_name = device_name ;
+        this.device_type = device_type ;
+        this.device_id = device_id ;
+    }
+
+    public String getDeviceName() {
+        return device_name;
+    }
+    public void setDeviceName(String name) {
+        this.device_name = name ;
+    }
+
+    public String getDeviceType() {
+        return device_type;
+    }
+    public void setDeviceType(String device_type) {
+        this.device_type = device_type;
+    }
+
+    public String getDeviceId() {
+        return device_id;
+    }
+    public void setDeviceId(String device_id) {
+        this.device_id = device_id;
+    }
+
+    public ArrayList<Resource> getResources() {
+        return resources;
+    }
+
+    public Resource getResource(String resource_uri) {
+        for(Resource resource : resources) {
+            if (resource.getResourceUri().equalsIgnoreCase(resource_uri)) {
+                return resource ;
+            }
+        }
+        return null ;
+    }
+
+    public void addResource(String resource_name, String resource_uri, String resource_type, String resource_if) {
+        resources.add(new Resource(resource_name, resource_uri, resource_type, resource_if));
+    }
+
+    public void removeResource(int index) {
+        resources.remove(index);
+    }
+
+    public void removeResource(String uri) {
+        ArrayList<Resource> resources1 = (ArrayList<Resource>)resources.clone();
+        for(int loop = 0 ; loop < resources1.size() ; loop++) {
+            Resource resource1 = resources1.get(loop);
+            if(resource1.getResourceUri().equals(uri)) resources.remove(loop) ;
+        }
+    }
+
+    public void addProperty(String resource_uri, String key, Object value) {
+        Resource resource = getResource(resource_uri);
+        resource.addOrReplaceProperty(key, value);
+    }
+}

+ 25 - 1
app/src/main/java/org/iotivity/bridge/homeserver/utils/Utils.java

@@ -6,6 +6,7 @@ import android.util.Pair;
 import android.webkit.DownloadListener;
 import android.webkit.DownloadListener;
 import android.widget.Switch;
 import android.widget.Switch;
 
 
+import org.hamcrest.core.StringEndsWith;
 import org.iotivity.OCEndpoint;
 import org.iotivity.OCEndpoint;
 import org.iotivity.OCInterfaceMask;
 import org.iotivity.OCInterfaceMask;
 import org.iotivity.OCResourcePropertiesMask;
 import org.iotivity.OCResourcePropertiesMask;
@@ -130,10 +131,33 @@ public class Utils {
             }
             }
             interfaces.append("CREATE");
             interfaces.append("CREATE");
         }
         }
-
         return interfaces.toString();
         return interfaces.toString();
     }
     }
 
 
+    public static int interfacesStringToMask(String interfaceMask) {
+
+        switch (interfaceMask) {
+            case "BASELINE":
+                return OCInterfaceMask.BASELINE ;
+            case "LL":
+                return OCInterfaceMask.LL ;
+            case "B":
+                return OCInterfaceMask.B ;
+            case "R":
+                return OCInterfaceMask.R ;
+            case "RW":
+                return OCInterfaceMask.RW ;
+            case "S":
+                return OCInterfaceMask.S ;
+            case "A":
+                return OCInterfaceMask.A ;
+            case "CREATE":
+                return OCInterfaceMask.CREATE ;
+            default:
+                return OCInterfaceMask.BASELINE ;
+        }
+    }
+
     public static String propertiesMaskToString(int propertiesMask) {
     public static String propertiesMaskToString(int propertiesMask) {
         StringBuilder resourceProperties = new StringBuilder();
         StringBuilder resourceProperties = new StringBuilder();
         if ((propertiesMask & OCResourcePropertiesMask.OC_DISCOVERABLE) > 0) {
         if ((propertiesMask & OCResourcePropertiesMask.OC_DISCOVERABLE) > 0) {