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等 上一行代码就返回正常了。。。。。。
由于所有的函数原型都未知 都是我猜跟蒙的 所以严重怀疑是不是我函数原型 比如传入参数个数给的不对 造成了 堆栈不平衡呢?
请论坛大神指教
但是此方法在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等 上一行代码就返回正常了。。。。。。
由于所有的函数原型都未知 都是我猜跟蒙的 所以严重怀疑是不是我函数原型 比如传入参数个数给的不对 造成了 堆栈不平衡呢?
请论坛大神指教