1 #ifndef _IOTSLAVE_HPP__
2 #define _IOTSLAVE_HPP__
10 #include <dlfcn.h> // For dlopen, dlsym, etc.
13 #include "IoTDeviceAddress.hpp"
14 #include "IoTRelation.hpp"
17 /** Class IoTSlave is a communication class
18 * that interacts with IoTSlave.java to set up C++
19 * objects in Sentinel.
21 * @author Rahmadi Trimananda <rtrimana @ uci.edu>
25 // Enumeration of master-slave communication codes
32 CREATE_NEW_IOTRELATION,
35 GET_ADD_IOTSET_OBJECT,
36 GET_DEVICE_IOTSET_OBJECT,
38 GET_IOTRELATION_FIRST_OBJECT,
39 GET_IOTRELATION_SECOND_OBJECT,
40 GET_ZB_DEV_IOTSET_OBJECT,
42 REINITIALIZE_IOTSET_FIELD,
43 REINITIALIZE_IOTRELATION_FIELD,
49 // Defining generic function pointers for
50 // create, destroy, and init functions of each class object
51 typedef void* create_t(void**);
52 typedef void destroy_t(void*);
53 typedef void init_t(void*);
60 const static int RCVBUFSIZE = 1024; // Size of receive buffer
61 const static int SKELPARAMSIZE = 3; // Number of params for skeleton
62 const static int STUBPARAMSIZE = 6; // Number of params for stub
63 const static string FILEPATH; // File path
64 const static string FILEEXT; // File extension
65 const static string SOEXT; // Shared object (.so) extension
66 const static string STRINGCLASS; // String class
67 const static string INTCLASS; // Int class
68 const static string CREATEFUNCTION; // The create function in class
69 const static string DESTROYFUNCTION; // The destroy function in class
70 const static string INITFUNCTION; // The init function in class
71 const static string LOCALHOST; // String "localhost"
72 const static string SHELL; // String ".sh"
78 string mainObjectName;
80 string objectClassName;
81 string objectInterfaceName;
82 string objectSkelClass; // Need to send from Java IoTSlave: sMessage.getObjectInterfaceName() + SKEL_CLASS_SUFFIX
83 string objectStubClass; // Need to send from Java IoTSlave: sMessage.getObjectStubInterfaceName() + STUB_CLASS_SUFFIX
86 vector<int> ports; // Now used to contain callback ports
87 string objectFieldName; // Field name that is going to be initialized with IoTSet or IoTRelation
88 unordered_set<void*>* isetObject; // Set of object
89 IoTSet<void*>* iotsetObject; // IoTSet of object
90 vector<IoTSet<void*>*> vecIoTSet; // IoTSet of object
91 void* irelFirstObject; // First object of IoTRelation
92 void* irelSecondObject; // Second object of IoTRelation
93 unordered_multimap<void*,void*>* irelObject; // Relation of object
94 IoTRelation<void*,void*>* iotrelObject; // IoTRelation of objects
95 vector<IoTRelation<void*,void*>*> vecIoTRel; // IoTRelation of object
98 ofstream log; // Log the messages
99 vector<string> args; // Hold the arguments for constructor (in string format)
100 vector<string> argClasses; // Hold the argument classes
101 bool isDriverObject; // Set to true if this is IoTSlave instance for a driver object
102 void* objMainCls; // Main class handler, i.e. driver or controller object
103 void* objSkelCls; // Skeleton handler
104 void* objStubCls; // Stub handler
105 unordered_map<string, void*> mapObjNameStub; // Mapping between object name and stub
107 create_t* create_object;
108 destroy_t* destroy_object;
113 IoTSlave(string _serverAddress, int _serverPort, string _objectName);
116 string getServerAddress();
118 string getObjectName();
119 void sendInteger(int intSend);
121 void sendString(string strSend);
124 void unzipFile(string fileName);
127 bool recvEndTransfer();
128 void commIoTMaster();
129 void createObject(); // Create driver object
130 void createMainObject(); // Create main object
131 void createNewIoTSet();
132 void createNewIoTRelation();
133 void getDeviceIoTSetObject();
134 void getIoTRelationFirstObject();
135 void getIoTRelationSecondObject();
136 void reinitializeIoTSetField();
137 void reinitializeIoTRelationField();
138 void getIoTSetObject();
139 void invokeInitMethod();
143 // Private helper functions
144 int* byteToInt(int* result, char* bytes);
145 char* intToByteArray(int i, char* bytes);
146 char* recvIter(char* recvBuffer, int recvLen);
147 char* recvFileIter(char* recvBuffer, int recvLen);
148 void* getObjectConverted(void* retObj, string object, string objectClass);
149 void openFile(string fileName);
150 void writeToFile(string logMsg);
152 void getObjectHandler(string objectClassName);
153 void instantiateMainObject();
154 void instantiateDriverObject();
155 void instantiateSkelObject();
156 void instantiateStubObject();
157 void runInitObject(IoTSlave* iotslave);
158 void getIoTSetRelationObject();
162 // Constant initialization
163 const string IoTSlave::FILEPATH = "./";
164 const string IoTSlave::FILEEXT = "_cpp.log";
165 const string IoTSlave::SOEXT = ".so";
166 const string IoTSlave::STRINGCLASS = "string";
167 const string IoTSlave::INTCLASS = "int";
168 const string IoTSlave::CREATEFUNCTION = "create";
169 const string IoTSlave::DESTROYFUNCTION = "destroy";
170 const string IoTSlave::INITFUNCTION = "init";
171 const string IoTSlave::LOCALHOST = "localhost";
172 const string IoTSlave::SHELL = ".sh";