SORU
30 EKİM 2011, Pazar


iPhone Veri Kullanımını Takip/İzleme

Bu konu üzerinde araştırdım ama yararlı çok az bilgi buldum. Bu detaylar aşağıdaki gibi bazı kod pişirmeyi denedim.

Not: Lütfen bu şekilde YİNELENEN işaretleme önce detayları diğer mesajlar ile bu yazı paylaşılan karşılaştırın ve sadece bu konuya göre.

- (NSArray *)getDataCountersForType:(int)type {
    BOOL success;
    struct ifaddrs *addrs = nil;
    const struct ifaddrs *cursor = nil;
    const struct sockaddr_dl *dlAddr = nil;
    const struct if_data *networkStatisc = nil; 

    int dataSent = 0;
    int dataReceived = 0;

    success = getifaddrs(&addrs) == 0;
    if (success) {
        cursor = addrs;
        while (cursor != NULL) {
            if (cursor->ifa_addr->sa_family == AF_LINK) {
                dlAddr = (const struct sockaddr_dl *) cursor->ifa_addr;
                networkStatisc = (const struct if_data *) cursor->ifa_data;

                if (type == WiFi) {
                    dataSent  = networkStatisc->ifi_opackets;
                    dataReceived  = networkStatisc->ifi_ipackets;   
                }
                else if (type == WWAN) {
                    dataSent  = networkStatisc->ifi_obytes;
                    dataReceived  = networkStatisc->ifi_ibytes; 
                }
            }
            cursor = cursor->ifa_next;
        }
        freeifaddrs(addrs);
    }       
    return [NSArray arrayWithObjects:[NSNumber numberWithInt:dataSent], [NSNumber numberWithInt:dataReceived], nil];    
}

Bu kodu bir iPhone cihazın internet kullanım bilgi ve uygulama tek başına değil) toplar.

Şimdi, eğer ben internet üzerinden WiFi veya 3G, aldığım veri (bayt) ifi_obytes (gönderilen) ve ifi_ibytes (alınan) ama sanırım almalıyım WiFi kullanımı ifi_opackets ifi_ipackets.

Ayrıca bir kablosuz ağa bağlı değilim, ama internet kullanıyorum, hala değer ifi_obytes ifi_ibytes eklenen eklemek istedim.

Uygulama yanlış anlamak ya da ben olabilir. Biri bana yardım etmen gerek.


Edit: Yerine çalıştım AF_LINK AF_INET (sockaddr_dl yerinesockaddr_in). Bu uygulama çöker.

CEVAP
4 Kasım 2011, Cuma


Şey pdp_ip0 arayüzler, tüm pdpXXX MİNİ arayüzleri farklı fonksiyonlar, sesli posta, genel ağ arayüzü için ayrılmış.

apple forumu okudum : OS süreç, süreç olarak ağ istatistikleri tutmaz. Gibi, bu soruna kesin bir çözüm yok. Ancak, her ağ arabirimi için ağ istatistikleri alabilirsiniz.

Genel en0 Wi-Fi arayüzü ve pdp_ip0 içinde MİNİ arabirimi.

Bilgi, belirli bir tarih-saat beri/hücresel ağ veri wifi almak için iyi bir yol yoktur!

(ifa_data->veri istatistik ifi_obytes ve ifa_data->ifi_ibytes) önceki cihazı yeniden saklı.

neden bilmiyorum, ama ifi_opackets ve ifi_ipackets lo0 (ana arayüzü bence) sadece gösterilir.

Evet. Sonra cihaz WiFi ile bağlı olduğunu ve bu yöntem ağ bayt alışverişi ve sadece internet sağladığı için internet if_iobytes değerleri hala kullanmıyor .

#include <arpa/inet.h>
#include <net/if.h>
#include <ifaddrs.h>
#include <net/if_dl.h>

static NSString *const DataCounterKeyWWANSent = @"WWANSent";
static NSString *const DataCounterKeyWWANReceived = @"WWANReceived";
static NSString *const DataCounterKeyWiFiSent = @"WiFiSent";
static NSString *const DataCounterKeyWiFiReceived = @"WiFiReceived";

NSDictionary *DataCounters()
{

    struct ifaddrs *addrs;
    const struct ifaddrs *cursor;

    u_int32_t WiFiSent = 0;
    u_int32_t WiFiReceived = 0;
    u_int32_t WWANSent = 0;
    u_int32_t WWANReceived = 0;

    if (getifaddrs(&addrs) == 0)
    {
        cursor = addrs;
        while (cursor != NULL)
        {
            if (cursor->ifa_addr->sa_family == AF_LINK)
            {
#ifdef DEBUG
                const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data;
                if(ifa_data != NULL)
                {
                    NSLog(@"Interface name %s: sent %tu received %tu",cursor->ifa_name,ifa_data->ifi_obytes,ifa_data->ifi_ibytes);
                }
#endif

                // name of interfaces:
                // en0 is WiFi
                // pdp_ip0 is WWAN
                NSString *name = [NSString stringWithFormat:@"%s",cursor->ifa_name];
                if ([name hasPrefix:@"en"])
                {
                    const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data;
                    if(ifa_data != NULL)
                    {
                        WiFiSent  = ifa_data->ifi_obytes;
                        WiFiReceived  = ifa_data->ifi_ibytes;
                    }
                }

                if ([name hasPrefix:@"pdp_ip"])
                {
                    const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data;
                    if(ifa_data != NULL)
                    {
                        WWANSent  = ifa_data->ifi_obytes;
                        WWANReceived  = ifa_data->ifi_ibytes;
                    }
                }
            }

            cursor = cursor->ifa_next;
        }

        freeifaddrs(addrs);
    }

    return @{DataCounterKeyWiFiSent:[NSNumber numberWithUnsignedInt:WiFiSent],
             DataCounterKeyWiFiReceived:[NSNumber numberWithUnsignedInt:WiFiReceived],
             DataCounterKeyWWANSent:[NSNumber numberWithUnsignedInt:WWANSent],
             DataCounterKeyWWANReceived:[NSNumber numberWithUnsignedInt:WWANReceived]};
}

Geliştirilmiş kopyala/yapıştır desteği !

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Police

    Android Poli

    21 NİSAN 2010
  • andyabc45

    andyabc45

    1 Mayıs 2011
  • MkElite

    MkElite

    13 NİSAN 2012