170 likes | 437 Views
Intro to the External Accessory Framework. Andrew Craze @ AndrewCr acraze at dxysolutions.com. Agenda. What is the EA Framework useful for? What hardware can I talk to? How do I use the EA Framework? Why/how do I get more info from Apple under the MFi NDA?.
E N D
Intro to the External Accessory Framework Andrew Craze @AndrewCr acraze at dxysolutions.com
Agenda What is the EA Framework useful for? What hardware can I talk to? How do I use the EA Framework? Why/how do I get more info from Apple under the MFi NDA?
What can I do with EAAccessory? Application [not accessory] -side code Enumerate connected accessories Open a serial session with an accessory Communicate via streams and get notifications
What can’t I do with EAAccessory? Pair or make the connection with a BlueTooth device Use (any) BlueTooth profiles
Hardware Options • Consumer-ready (pre-built cables) • Like RedPark’s • Build-your-own, with 3rd-party firmware • Like BlueGiga’s • Build-your-own, with DIY firmware • Join the MFi program for Docs
Easier Hardware(Examples, probably not the only options) RedPack’s Serial Cable BlueGiga’siWrap Firmware
Application Checklist • Link with ExternalAccessory.framework • Add protocol(s) to info.plist • Use EAAccessoryManager to find your device • Add a delegate (EAAccessoryDelegate) to your accessory’s object • Connect with your chosen protocol • Manage the I/O stream data
Use EAAccessoryManager to find your device [[NSNotificationCenterdefaultCenter] addObserver:self selector:@selector(_accessoryDidConnect:) name:EAAccessoryDidConnectNotification object:nil]; [[NSNotificationCenterdefaultCenter] addObserver:self selector:@selector(_accessoryDidDisconnect:) name:EAAccessoryDidDisconnectNotification object:nil]; [[EAAccessoryManagersharedAccessoryManager] registerForLocalNotifications]; _accessoryList = [[NSMutableArrayalloc] initWithArray:[[EAAccessoryManagersharedAccessoryManager] connectedAccessories]];
Add delegate to your accessory’s object, connect to streams [_accessorysetDelegate:self]; _session = [[EASessionalloc] initWithAccessory:_accessoryforProtocol:_protocolString]; if (_session) { [[_sessioninputStream] setDelegate:self]; [[_sessioninputStream] scheduleInRunLoop:[NSRunLoopcurrentRunLoop] forMode:NSDefaultRunLoopMode]; [[_sessioninputStream] open]; [[_sessionoutputStream] setDelegate:self]; [[_sessionoutputStream] scheduleInRunLoop:[NSRunLoopcurrentRunLoop] forMode:NSDefaultRunLoopMode]; [[_sessionoutputStream] open]; } else { NSLog(@"creating session failed"); }
Manage the I/O stream data, part 1 - (void)stream:(NSStream *)aStreamhandleEvent:(NSStreamEvent)eventCode { switch (eventCode) { caseNSStreamEventNone: break; caseNSStreamEventOpenCompleted: break; caseNSStreamEventHasBytesAvailable: [self_readData]; break; caseNSStreamEventHasSpaceAvailable: [self_writeData]; break; caseNSStreamEventErrorOccurred: break; caseNSStreamEventEndEncountered: break; default: break; } }
Manage the I/O stream data, part 2 - (void)_readData { #define EAD_INPUT_BUFFER_SIZE 128 uint8_tbuf[EAD_INPUT_BUFFER_SIZE]; while ([[_sessioninputStream] hasBytesAvailable]) { NSIntegerbytesRead = [[_sessioninputStream] read:buf maxLength:EAD_INPUT_BUFFER_SIZE]; if (_readData == nil) { _readData = [[NSMutableDataalloc] init]; } [_readDataappendBytes:(void *)buflength:bytesRead]; //NSLog(@"read %d bytes from input stream", bytesRead); } [[NSNotificationCenterdefaultCenter] postNotificationName:EADSessionDataReceivedNotification object:self userInfo:nil]; } - (NSData *)readData:(NSUInteger)bytesToRead { NSData *data = nil; if ([_readDatalength] >= bytesToRead) { NSRange range = NSMakeRange(0, bytesToRead); data = [_readDatasubdataWithRange:range]; [_readDatareplaceBytesInRange:rangewithBytes:NULLlength:0]; } return data; }
The MFi Program Separate NDA, over-and-above the iOS developer program Free, but you must be a bona-fide company (and prove it!) Plan on a month to get fully-approved Docs on everything you need to know for accessory-side development
Handy reference links (No endorsement expressed or implied. So there.) External Accessory Framework Reference (from Apple)http://developer.apple.com/library/ios/#documentation/ExternalAccessory/Reference/ExternalAccessoryFrameworkReference/_index.html#//apple_ref/doc/uid/TP40008235 Apple’s EADemo sample codehttp://developer.apple.com/library/ios/#samplecode/EADemo/Introduction/Intro.html Apple MFi pagehttps://developer.apple.com/programs/mfi/ Redpark Serial Cablehttp://redpark.com/c2db9.html BlueGiga’siWrap firmware (for their BlueTooth modules)http://www.bluegiga.com/iWRAP_module_firmware
Questions, Maybe Answers Andrew Craze @AndrewCr http://blog.andrewcraze.com acrazeat dxysolutions.com