Quantcast
Channel: 看雪安全论坛
Viewing all articles
Browse latest Browse all 9556

【原创】新人发帖 IOS6上光线传感器数据的获取方法 另外请教编程高手一个问题

$
0
0
IOS5上光线传感器的数据获取请参考http://iphonedevwiki.net/index.php/AppleISL29003


但是此方法在IOS6上貌似不行了 通过对系统IOS6 系统API 的逆向分析 得出一个拿IPHONE光线传感器的方法如下:
void handle_event1 (void* target, void* refcon, IOHIDEventQueueRef queue, IOHIDEventRef event){
if (IOHIDEventGetType(event)==kIOHIDEventTypeAmbientLightSensor){ // Ambient Light Sensor Event

int luxValue=IOHIDEventGetIntegerValue(event, (IOHIDEventField)kIOHIDEventFieldAmbientLightSensorLevel); // lux Event Field
int channel0=IOHIDEventGetIntegerValue(event, (IOHIDEventField)kIOHIDEventFieldAmbientLightSensorRawChannel0); // ch0 Event Field
int channel1=IOHIDEventGetIntegerValue(event, (IOHIDEventField)kIOHIDEventFieldAmbientLightSensorRawChannel1); // ch1 Event Field

NSLog(@"IOHID: ALS Sensor: Lux : %d ch0 : %d ch1 : %d by *silver",luxValue,channel0,channel1);
}
}

main(){
int pv1 = 0xff00;
int pv2 = 4;
CFNumberRef mVals[2];
CFStringRef mKeys[2];

mVals[0] = CFNumberCreate(CFAllocatorGetDefault(), kCFNumberSInt32Type, &pv1);
mVals[1] = CFNumberCreate(CFAllocatorGetDefault(), kCFNumberSInt32Type, &pv2);
mKeys[0] = CFStringCreateWithCString(0, "PrimaryUsagePage", 0);
mKeys[1] = CFStringCreateWithCString(0, "PrimaryUsage", 0);

CFDictionaryRef matchInfo = CFDictionaryCreate(CFAllocatorGetDefault(),(const void**)mKeys,(const void**)mVals, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);

hidSysC = IOHIDEventSystemClientCreate(kCFAllocatorDefault);
IOHIDEventSystemClientSetMatching(hidSysC,matchInfo);

id matchingsrvs = IOHIDEventSystemClientCopyServices(hidSysC,0);

if ([matchingsrvs count] > 0) {
for (id srv in matchingsrvs) {
CFTypeRef pValue1 = IOHIDServiceClientCopyProperty(srv,@"PrimaryUsagePage");
CFTypeRef pValue2 = IOHIDServiceClientCopyProperty(srv,@"PrimaryUsage");
CFTypeRef pValue3 = NULL;
NSLog(@"srv%@",srv);
int usagePage;
int usage;
if (CFGetTypeID(pValue1) == CFNumberGetTypeID()) {

CFNumberRef usagePageValue = (CFNumberRef)pValue1;
CFNumberGetValue(usagePageValue, CFNumberGetType(usagePageValue), &usagePage);
NSLog(@"The UsagePage is %d",usagePage);
}
if (pValue2) {
if (CFGetTypeID(pValue2) == CFNumberGetTypeID()) {
CFNumberRef usageValue = (CFNumberRef)pValue2;
CFNumberGetValue(usageValue, CFNumberGetType(usageValue), &usage);
NSLog(@"the usage is %d",usage);
}
}
if (usagePage == 0xff00 && usage ==0x4) {
alssc = (struct __IOHIDServiceClient *)srv;
}
}
}
if (!alssc) {
NSLog(@"cant find matching hid service");
return;
}
inerLoop = CFRunLoopGetCurrent();
IOHIDEventSystemClientScheduleWithRunLoop(hidSysC, inerLoop, kCFRunLoopDefaultMode);
int ri = 500000;
CFNumberRef interval = CFNumberCreate(CFAllocatorGetDefault(), kCFNumberIntType, &ri);
IOHIDServiceClientSetProperty(alssc,@"ReportInterval",interval);
IOHIDServiceClientSetProperty(alssc,@"IOHIDALSTestMode",kCFBooleanFalse);
IOHIDServiceClientSetProperty(alssc,@"MonitorEvents",kCFBooleanTrue);
IOHIDEventSystemClientRegisterEventCallback(hidSysC, handle_event1, NULL, NULL);
CFRunLoopRun();

}
在IPhone4,IPHONE5,IOS6上测试通过

另外这里有个很大的疑惑

CFTypeRef pValue3 = NULL; 这行代码没有任何意义 但是发现如果没有这行代码 上一行的 CFTypeRef pValue2 = IOHIDServiceClientCopyProperty(srv,@"PrimaryUsage"); 返回经常为空指针,如果加上CFTypeRef pValue3 = NULL;或者随便在这里定义一个void*p = null等 上一行代码就返回正常了。。。。。。

由于所有的函数原型都未知 都是我猜跟蒙的 所以严重怀疑是不是我函数原型 比如传入参数个数给的不对 造成了 堆栈不平衡呢?

请论坛大神指教

Viewing all articles
Browse latest Browse all 9556

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>