daasiot_python
daaswrapper.cpp
Go to the documentation of this file.
1#include "daaswrapper.h"
2#include <iostream>
3#include <fstream>
4#include <nlohmann/json.hpp>
5#include <ifaddrs.h>
6#include <net/if.h>
7#include <sys/types.h>
8#include <dirent.h>
9#include <sys/stat.h>
10#include <unistd.h>
11#include <fstream>
12#include <regex>
13#include <vector>
14#include <string>
15#include "net_utils.h"
16#include <set>
17#include <sstream>
18#include <algorithm>
19#include <ifaddrs.h>
20#include <net/if.h>
21#include <sys/types.h>
22#include <dirent.h>
23#include <unistd.h>
24using json = nlohmann::json;
25#define NODE_LHVER "GNUSDK"
26namespace daas {
27namespace api {
28
29DaasWrapper::DaasWrapper(const char* configPath, IDaasApiEvent* handler)
30 : eventHandler(handler)
31{
32
33 daasInstance = new DaasAPI(handler,NODE_LHVER);
34
35}
36
42
43
44
45std::vector<InterfaceInfo> DaasWrapper::listSystemInterfaces() {
46 std::vector<InterfaceInfo> interfaces;
47 std::set<std::string> seen;
48
49 struct ifaddrs* ifaddr;
50 if (getifaddrs(&ifaddr) == -1) return interfaces;
51
52 for (struct ifaddrs* ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next) {
53 if (!ifa->ifa_name) continue;
54
55 std::string name = ifa->ifa_name;
56 if (seen.count(name)) continue;
57 seen.insert(name);
58
59 InterfaceInfo info;
60 info.name = name;
61 info.status = (ifa->ifa_flags & IFF_UP) ? "UP" : "DOWN";
62
63 // Leggi tipo da /sys/class/net/<iface>/uevent
64 // Leggi tipo da /sys/class/net/<iface>/uevent
65std::string uevent_path = "/sys/class/net/" + name + "/uevent";
66std::ifstream uevent_file(uevent_path);
67std::string line, devtype;
68
69while (std::getline(uevent_file, line)) {
70 if (line.find("DEVTYPE=") == 0) {
71 devtype = line.substr(8);
72 break;
73 }
74}
75
76// Se uevent non contiene DEVTYPE, prova con /type
77if (devtype.empty()) {
78 std::string type_path = "/sys/class/net/" + name + "/type";
79 std::ifstream type_file(type_path);
80 int type_value = 0;
81 if (type_file >> type_value) {
82 switch (type_value) {
83 case 1: devtype = "ether"; break;
84 case 772: devtype = "loopback"; break;
85 case 512: devtype = "wlan"; break;
86 default: devtype = "unknown"; break;
87 }
88 }
89}
90
91 if (devtype == "wlan") info.type = "WiFi";
92 else if (devtype == "ether") info.type = "Ethernet";
93 else if (name == "lo") info.type = "Loopback";
94 else if (!devtype.empty()) info.type = devtype;
95 else info.type = "Unknown";
96
97 interfaces.push_back(info);
98 }
99
100 freeifaddrs(ifaddr);
101
102 // Aggiunta interfacce Bluetooth hci*
103 DIR* bt_dir = opendir("/sys/class/bluetooth");
104 if (bt_dir) {
105 struct dirent* ent;
106 while ((ent = readdir(bt_dir)) != nullptr) {
107 std::string hci = ent->d_name;
108 if (hci.find("hci") == 0 && seen.count(hci) == 0) {
109 InterfaceInfo info;
110 info.name = hci;
111 info.type = "Bluetooth (HCI)";
112 info.status = "UNKNOWN"; // puoi usare hcitool/hciconfig in futuro, DA VALUTARE PERCHE' RICHIEDE PERMESSI ELEVATI
113 interfaces.push_back(info);
114 }
115 }
116 closedir(bt_dir);
117 }
118
119 return interfaces;
120}
121
122std::vector<std::string> DaasWrapper::getActiveInterfaces() {
124}
125
126
128 return daasInstance->listAvailableDrivers();
129}
130
132 return daasInstance->getStatus();
133}
134
136 return daasInstance->status(din);
137}
138
139const nodestate_t& DaasWrapper::fetch(din_t din, uint16_t opts){
140 return daasInstance->fetch(din,opts);
141}
142
144 return daasInstance->listNodes();
145}
147 return daasInstance->storeConfiguration(storage_interface);
148}
149
150bool DaasWrapper::loadConfiguration(IDepot* storage_interface){
151 return daasInstance->loadConfiguration(storage_interface);
152}
153
154
156 return daasInstance->doInit(sid, din);
157}
158
160 return daasInstance->doPerform(mode);
161}
162
164 return daasInstance->doEnd();
165}
166
168 return daasInstance->doReset();
169}
170
172 return daasInstance->getVersion();
173}
175 const char *version = daasInstance->getVersion();
176 const char *build = daasInstance->getBuildInfo();
177
178 if (!version) version = "UNKNOWN";
179 if (!build) build = "UNKNOWN";
180
181 snprintf(infoBuffer,sizeof(infoBuffer),"Version: %s | Build: %s",version,build);
182 return infoBuffer;
183
184}
186 return daasInstance->enableDriver(link, driver);
187}
188
189daas_error_t DaasWrapper::setupNode(din_t sid, din_t din, link_t link, const char *uri){
190 daas_error_t err;
191 err = doInit(sid,din);
192 if (err != ERROR_NONE) return err;
193 err = enableDriver(link,uri);
194 if (err != ERROR_NONE) return err;
195
196 return ERROR_NONE;
197
198}
199
200/*daas_error_t DaasWrapper::setupNode(const char* configFilePath) {
201 std::ifstream file(configFilePath);
202 if (!file.is_open()) return ERROR_UNKNOWN;
203
204 json config;
205 file >> config;
206
207 configCache["sid"] = std::to_string(config["sid"].get<int>());
208 configCache["din"] = std::to_string(config["din"].get<int>());
209 configCache["link"] = std::to_string(config["link"].get<int>());
210 configCache["uri"] = config["uri"].get<std::string>();
211
212 din_t sid = static_cast<din_t>(config["sid"].get<int>());
213 din_t din = static_cast<din_t>(config["din"].get<int>());
214 link_t link = static_cast<link_t>(config["link"].get<int>());
215 std::string uri = config["uri"].get<std::string>();
216
217 return setupNode(sid,din,link,uri.c_str());
218}*/
219
220
221
222daas_error_t DaasWrapper::setupNode(const char* configFilePath) {
223 std::ifstream file(configFilePath);
224 if (!file.is_open()) return ERROR_UNKNOWN;
225
226 json config;
227 file >> config;
228
229 // Cache SID e DIN
230 din_t sid = static_cast<din_t>(config["sid"].get<int>());
231 din_t din = static_cast<din_t>(config["din"].get<int>());
232 configCache["sid"] = std::to_string(sid);
233 configCache["din"] = std::to_string(din);
234
235 // Pulisce eventuali vecchi driver
236 driversCache.clear();
237
238 // Legge array di driver
239 for (const auto& drv : config["drivers"]) {
240 link_t link = static_cast<link_t>(drv["link"].get<int>());
241 std::string uri = drv["uri"].get<std::string>();
242
243 driversCache.push_back(DriverConfig{link, uri});
244 }
245
246 // Inizializza il nodo
247 daas_error_t err = doInit(sid, din);
248 if (err != ERROR_NONE) return err;
249
250 // Attiva tutti i driver letti da file
251 for (const auto& drv : driversCache) {
252 err = enableDriver(drv.link, drv.uri.c_str());
253 if (err != ERROR_NONE) return err;
254 }
255
256 return ERROR_NONE;
257}
258
259
260
262 return daasInstance->map(din);
263}
264
265daas_error_t DaasWrapper::map(din_t din, link_t link, const char* uri) {
266 return daasInstance->map(din, link, uri);
267}
268
269daas_error_t DaasWrapper::map(din_t din, link_t link, const char* uri, const char* securityKey) {
270 return daasInstance->map(din, link, uri, securityKey);
271}
272
274 return daasInstance->remove(din);
275}
276
278 return daasInstance->locate(din);
279}
280
282 return daasInstance->availablesPull(din, count);
283}
284
286 return daasInstance->pull(din, inboundDDO);
287}
288
290 return daasInstance->push(din, outboundDDO);
291}
292
294 return daasInstance->frisbee(din);
295}
296
298 this->eventHandler = handler;
299}
300
301} // namespace api
302} // namespace daas
void setEventHandler(IDaasApiEvent *event)
Imposta un nuovo handler eventi.
std::vector< std::string > getActiveInterfaces()
daas_error_t pull(din_t din, DDO **inboundDDO)
Riceve un pacchetto DDO dal nodo remoto.
daas_error_t doPerform(performs_mode_t mode)
Attiva l'esecuzione interna del nodo.
DaasWrapper(const char *config, IDaasApiEvent *eventHandler)
Costruttore.
daas_error_t enableDriver(link_t link, const char *driver)
Abilita un driver su uno specifico link.
const nodestate_t & fetch(din_t din, uint16_t opts)
daas_error_t doInit(din_t sid, din_t din)
Inizializza il nodo DaaS con SID e DIN.
daas_error_t setupNode(din_t sid, din_t din, link_t link, const char *uri)
daas_error_t map(din_t din)
Mappa un nodo con DIN noto nella rete (formato base)
daas_error_t remove(din_t din)
Rimuove un nodo precedentemente mappato.
daas_error_t doEnd()
Termina le attivitą del nodo.
bool loadConfiguration(IDepot *storage_interface)
Carica la configurazione usando un'interfaccia IDepot.
const nodestate_t & status(din_t din)
daas_error_t doReset()
Resetta lo stato del nodo.
bool storeConfiguration(IDepot *storage_interface)
Salva la configurazione corrente usando un'interfaccia IDepot.
const char * getVersion()
Restituisce la versione della libreria libdaas.a.
std::vector< InterfaceInfo > listSystemInterfaces()
daas_error_t availablesPull(din_t din, uint32_t &count)
Restituisce il numero di pacchetti disponibili da ricevere.
const char * listAvailableDrivers()
const char * getInfos()
daas_error_t push(din_t din, DDO *outboundDDO)
Invia un pacchetto DDO al nodo remoto.
daas_error_t locate(din_t din)
Localizza un nodo in rete.
daas_error_t frisbee(din_t din)
Esegue un invio rapido (fire-and-forget)
link_t
daas_error_t
@ ERROR_UNKNOWN
@ ERROR_NONE
uint32_t din_t
Vector< din_t > dinlist_t
performs_mode_t
#define NODE_LHVER
nlohmann::json json
std::vector< std::string > listSystemNetworkInterfaces()
Definition net_utils.cpp:9
Rappresenta la configurazione di un driver DaaS.
Definition daaswrapper.h:27