Procházet zdrojové kódy

动态DHCP支持modbus——TCP

liyi před 1 rokem
rodič
revize
498ab9bb72
1 změnil soubory, kde provedl 54 přidání a 1 odebrání
  1. 54 1
      ip/src/cascade.c

+ 54 - 1
ip/src/cascade.c

@@ -1920,6 +1920,56 @@ static int set_modbus(cascade_handle_t *cas, ModbusInfo_t *info)
     // }    
     return 0;
 }
+#include <net/if.h>
+#include <ifaddrs.h>
+
+static int get_ipaddr(int family, char *iface, char *addr, char *netmask)
+{
+    struct ifaddrs *ifap, *ifa;
+
+    if (getifaddrs(&ifap) == -1) {
+        LOGE("___getifaddrs() error\n");
+        return -1;
+    }
+
+    for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
+        if (ifa->ifa_addr != NULL && ifa->ifa_addr->sa_family == family) {
+            if(family==AF_INET) {
+                struct sockaddr_in *sa,*msk;
+                sa = (struct sockaddr_in *)  ifa->ifa_addr;
+                msk = (struct sockaddr_in *) ifa->ifa_netmask;
+
+                if(addr) {
+                    inet_ntop(family, &sa->sin_addr, addr, INET6_ADDRSTRLEN);
+                    printf("___addr: %s\n", addr);
+                }
+
+                if(netmask) {
+                    inet_ntop(family, &msk->sin_addr, netmask, INET6_ADDRSTRLEN);
+                    //printf("___netmask: %s\n", netmask);
+                }
+            }
+            else {
+                struct sockaddr_in6 *sa,*msk;
+                sa = (struct sockaddr_in6 *)  ifa->ifa_addr;
+                msk = (struct sockaddr_in6 *) ifa->ifa_netmask;
+                
+                if(addr) {
+                    inet_ntop(family, &sa->sin6_addr, addr, INET6_ADDRSTRLEN);
+                    //printf("___addr6: %s\n", addr);
+                }
+
+                if(netmask) {
+                    inet_ntop(family, &msk->sin6_addr, netmask, INET6_ADDRSTRLEN);
+                    //printf("___netmask6: %s\n", netmask);
+                }
+            }
+        }
+    }
+    freeifaddrs(ifap);
+    
+    return 0;
+}
 
 int cascade_init(void)
 {
@@ -1953,7 +2003,10 @@ int cascade_init(void)
     thread_start(THREAD_ID_SCAN, scan_thread, cas, 4*MB, 0);
     GlobalDeviceManager* dm =get_dm();
     NetworkInfo_t net = {0};
-    sys_get_net(&net,IP_V4);
+    //sys_get_net(&net,IP_V4);
+    int family = AF_INET;
+    r = get_ipaddr(family, "eth0", net.ip_address, net.mask);
+
     uint8_t addr = 0;
     if(dm->_globalDevInfo._gmodbus_info.product_modbus_type == 0)
     {