您的位置:首页 > 移动开发 > IOS开发

ios 硬件设备获取

2014-07-09 15:00 295 查看
以下内容从他处获得,于大家分享

电池信息可以从UIDevice batteryLevel得到,但是只能精确到0.05.

- (NSDictionary*)batteryLevel

{

CFTypeRef blob = IOPSCopyPowerSourcesInfo();

        CFArrayRef sources = IOPSCopyPowerSourcesList(blob);

        

        CFDictionaryRef pSource = NULL;

        const void *psValue;

        

        int numOfSources = CFArrayGetCount(sources);

        if (numOfSources == 0)

        {

                CFRelease(blob);

                CFRelease(sources);

                NSLog(@"qhk: Error in CFArrayGetCount");

                return nil;

        }

        

        for (int i = 0 ; i < numOfSources ; i++)

        {

                pSource = IOPSGetPowerSourceDescription(blob, CFArrayGetValueAtIndex(sources, i));

                if (!pSource)

                {

                        CFRelease(blob);

                        CFRelease(sources);

                        NSLog(@"qhk: Error in IOPSGetPowerSourceDescription");

                        return nil;

                }

                

                psValue = (CFStringRef)CFDictionaryGetValue(pSource, CFSTR(kIOPSNameKey));

                

                int curCapacity = 0;

                int maxCapacity = 0;

//                double percent;

                

                psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSCurrentCapacityKey));

                CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &curCapacity);

                

                psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSMaxCapacityKey));

                CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &maxCapacity);

                

//                percent = ((double)curCapacity/(double)maxCapacity * 100.0f);

                

                NSNumber* no1 = [NSNumber numberWithInt:curCapacity];

                NSNumber* no2= [NSNumber numberWithInt:maxCapacity];

                

                CFRelease(blob);

                CFRelease(sources);

                

                return [NSDictionary dictionaryWithObjectsAndKeys:no1, @"no1", no2, @"no2", nil];

                

//                return percent;

//                return (NSInteger)(percent + 0.5f);

        }

//#endif

        

        CFRelease(blob);

        CFRelease(sources);

        

        return nil;

}

这个可以精确到0.01,但是好像与系统显示的仍有偏差。

得到平台号:

- (NSString*) doDevicePlatform

{

    size_t size;

    int nR = sysctlbyname("hw.machine", NULL, &size, NULL, 0);

    char *machine = (char *)malloc(size);

    nR = sysctlbyname("hw.machine", machine, &size, NULL, 0);

    NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];

    free(machine);

    return platform;

}

在根据平台号得到手机型号:

比如:

   if ([platform isEqualToString:@"iPhone1,1"])

    {

        return @"iPhone";

    }

    if ([platform isEqualToString:@"iPhone1,2"])

    {

        return @"iPhone3G";

    }

    if ([platform isEqualToString:@"iPhone2,1"])

    {

        return @"iPhone3GS";

    }

    if ([platform isEqualToString:@"iPhone3,1"])

    {

        return @"iPhone4";

    } 

得到mac地址:

- (void)printmacinfo

{

        bool success;

        struct ifaddrs *addrs;

        const struct ifaddrs *cursor;

        const struct sockaddr_dl *dlAddr;

        const uint8_t *base;

        

        success = getifaddrs(&addrs) == 0;

        if (success)

        {

                cursor = addrs;

                NSInteger idx = 0;

                while (cursor != NULL)

                {

                        ++idx;

                        NSString* macTitle = nil;

                        if ((cursor->ifa_flags & IFF_LOOPBACK) == 0 )

                        {

                                char* ifaname = (char *)cursor->ifa_name;

                                char* addr = inet_ntoa(((struct sockaddr_in *)cursor->ifa_addr)->sin_addr);

                                printf("%s ", ifaname);

                                printf("%s\n", addr);

//                                NSString* tmpstr1 = [NSString stringWithCString:ifaname encoding:NSUTF8StringEncoding];

//                                NSString* tmpstr2 = [NSString stringWithCString:addr encoding:NSUTF8StringEncoding];

//                                NSString *tmpStr = [NSString stringWithFormat:@"%@ %@", tmpstr1, tmpstr2];

                                

                                macTitle = [NSString stringWithFormat:@"%d %s %s", idx, ifaname, addr];

                                

                                [_arrKey addObject:macTitle];

                        }

                        if ( (cursor->ifa_addr->sa_family == AF_LINK)

                                && (((const struct sockaddr_dl *) cursor->ifa_addr)->sdl_type ==IFT_ETHER)

                                )

                        {

                                dlAddr = (const struct sockaddr_dl *) cursor->ifa_addr;

                                // fprintf(stderr, " sdl_nlen = %d\n", dlAddr->sdl_nlen);

                                // fprintf(stderr, " sdl_alen = %d\n", dlAddr->sdl_alen);

                                base = (const uint8_t *) &dlAddr->sdl_data[dlAddr->sdl_nlen];

                                printf(" MAC address ");

                                NSMutableString* tmpString = [[[NSMutableString alloc] initWithString:@"Mac:"] autorelease];

                                for (int i = 0; i < dlAddr->sdl_alen; i++)

                                {

                                        if (i != 0)

                                        {

                                                printf(":");

                                                [tmpString appendString:@":"];

                                        }

                 
d370
                      printf("%02x", base);

                                        [tmpString appendFormat:@"%02X", base];

                                } 

                                printf("\n");

                                [_dic setObject:tmpString forKey:macTitle];

                        }

                        else if (macTitle != nil)

                        {

                                [_dic setObject:@"" forKey:macTitle];

                        }

                        cursor = cursor->ifa_next;

                }

        }

}

得到4种内存信息:

        mach_msg_type_number_t count = HOST_VM_INFO_COUNT;

        vm_statistics_data_t vmstat;

        if (host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmstat, &count) != KERN_SUCCESS)

        {

                NSLog(@"Failed to get VM statistics.");

                [_dic setObject:@"Failed to get VM statistics." forKey:KTTMemorySize_Wire];

        }

        else

        {

                float total = vmstat.wire_count + vmstat.active_count + vmstat.inactive_count + vmstat.free_count;

                float wired = vmstat.wire_count / total * 100;

                float active = vmstat.active_count / total * 100;

                float inactive = vmstat.inactive_count / total * 100;

                float free = vmstat.free_count / total * 100;

//                NSString *str = [NSString stringWithFormat:@"%d %d %d %d %.2f %.2f %.2f %.2f %.0f %.0f"

//                                                 , vmstat.wire_count, vmstat.active_count, vmstat.inactive_count, vmstat.free_count

//                                                 , wired, active, inactive, free

//                                                 , total, total * pageSize

//                                                 ];

        }

cpu和总线频率:

        int result;

        mib[0] = CTL_HW;

        mib[1] = HW_CPU_FREQ;

        length = sizeof(result);

        if (sysctl(mib, 2, &result, &length, NULL, 0) < 0)

        {

                perror("getting cpu frequency");

        }

        printf("CPU Frequency = %u hz\n", result);

        

        int result2;

        mib[0] = CTL_HW;

        mib[1] = HW_BUS_FREQ;

        length = sizeof(result2);

        if (sysctl(mib, 2, &result2, &length, NULL, 0) < 0)

        {

                perror("getting bus frequency");

        }

        printf("Bus Frequency = %u hz\n", result);

网络方面使用的苹果列子文档中的Reachability.h和Reachability.m

外部ip访问http://automation.whatismyip.com/n09230945.asp即可知道。

gethostbyname可知内部局域网ip。

 NetworkStatus netstatus = [reachable currentReachabilityStatus];

    switch (netstatus)

        {

                case NotReachable:

                        // 没有网络连接

                        reachableStatus = NSLocalizedString(@"No Network", "");

                        break;

                case ReachableViaWWAN:

                        // 使用3G网络

                        reachableStatus = @"GPRS/3G";

                        break;

                case ReachableViaWiFi:

                        // 使用WiFi网络

                        reachableStatus = @"WIFI";

                        break;

    }

这个可知网络类型。

内存大小:

    size_t size = sizeof(int);

    int results;

    int mib[2] = {CTL_HW, HW_PHYSMEM};

    sysctl(mib, 2, &results, &size, NULL, 0);

总磁盘大小:

NSDictionary *fattributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil];

[fattributes objectForKey:NSFileSystemSize];

剩余空间:

[fattributes objectForKey:NSFileSystemFreeSize];

手机号码:

这个也是undocument api

NSString* phoneNumber = CTSettingCopyMyPhoneNumber();

NSArray *getValue(NSString *iosearch)

{

    mach_port_t          masterPort;

    CFTypeID             propID = (CFTypeID) NULL;

    unsigned int         bufSize;

        

    kern_return_t kr = IOMasterPort(MACH_PORT_NULL, &masterPort);

    if (kr != noErr) return nil;

        

    io_registry_entry_t entry = IORegistryGetRootEntry(masterPort);

    if (entry == MACH_PORT_NULL) return nil;

        

    CFTypeRef prop = IORegistryEntrySearchCFProperty(entry, kIODeviceTreePlane, (CFStringRef) iosearch, nil, kIORegistryIterateRecursively);

    if (!prop) return nil;

        

        propID = CFGetTypeID(prop);

    if (!(propID == CFDataGetTypeID())) 

        {

                mach_port_deallocate(mach_task_self(), masterPort);

                CFRelease(prop);

                return nil;

        }

        

    CFDataRef propData = (CFDataRef) prop;

    if (!propData)

        {

                CFRelease(prop);

                return nil;

        }

        

    bufSize = CFDataGetLength(propData);

    if (!bufSize)

        {

                CFRelease(prop);

                return nil;

        }

        

    NSString *p1 = [[[NSString alloc] initWithBytes:CFDataGetBytePtr(propData) length:bufSize encoding:1] autorelease];

    mach_port_deallocate(mach_task_self(), masterPort);

        CFRelease(prop);

    return [p1 componentsSeparatedByString:@"\0"];

}

这个可以用来得到部分数据。

- (NSString *) imei

{

        NSArray *results = getValue(@"device-imei");

        if (results) return [results objectAtIndex:0];

        return nil;

}

- (NSString *) serialnumber

{

        NSArray *results = getValue(@"serial-number");

        if (results) return [results objectAtIndex:0];

        return nil;

}

- (NSString *) backlightlevel

{

        NSArray *results = getValue(@"backlight-level");

        if (results) return [results objectAtIndex:0];

        return nil;

}

分别得到imei,序列号,背光
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios ios设备 ios开发