- AndrewCraze.com
Download
Report
Transcript - AndrewCraze.com
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 3 -party firmware
Like BlueGiga’s
• Build-your-own, with DIY firmware
Join the MFi program for Docs
rd
Easier Hardware
(Examples, probably not the only options)
RedPack’s Serial Cable
BlueGiga’s iWrap 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
Link with ExternalAccessory.framework
Add protocol(s) to info.plist
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(_accessoryDidConnect:)
name:EAAccessoryDidConnectNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(_accessoryDidDisconnect:)
name:EAAccessoryDidDisconnectNotification
object:nil];
[[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications];
_accessoryList = [[NSMutableArray alloc]
initWithArray:[[EAAccessoryManager sharedAccessoryManager]
connectedAccessories]];
Use EAAccessoryManager to find your device
[_accessory setDelegate:self];
_session = [[EASession alloc] initWithAccessory:_accessory forProtocol:_protocolString];
if (_session)
{
[[_session inputStream] setDelegate:self];
[[_session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[[_session inputStream] open];
[[_session outputStream] setDelegate:self];
[[_session outputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[[_session outputStream] open];
}
else
{
NSLog(@"creating session failed");
}
Add delegate to your accessory’s object, connect to streams
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
switch (eventCode) {
case NSStreamEventNone:
break;
case NSStreamEventOpenCompleted:
break;
case NSStreamEventHasBytesAvailable:
[self _readData];
break;
case NSStreamEventHasSpaceAvailable:
[self _writeData];
break;
case NSStreamEventErrorOccurred:
break;
case NSStreamEventEndEncountered:
break;
default:
break;
}
}
Manage the I/O stream data, part 1
- (void)_readData {
#define EAD_INPUT_BUFFER_SIZE 128
uint8_t buf[EAD_INPUT_BUFFER_SIZE];
while ([[_session inputStream] hasBytesAvailable])
{
NSInteger bytesRead = [[_session inputStream] read:buf
maxLength:EAD_INPUT_BUFFER_SIZE];
if (_readData == nil) {
_readData = [[NSMutableData alloc] init];
}
[_readData appendBytes:(void *)buf length:bytesRead];
//NSLog(@"read %d bytes from input stream", bytesRead);
}
[[NSNotificationCenter defaultCenter] postNotificationName:EADSessionDataReceivedNotification
object:self
userInfo:nil];
}
- (NSData *)readData:(NSUInteger)bytesToRead
{
NSData *data = nil;
if ([_readData length] >= bytesToRead) {
NSRange range = NSMakeRange(0, bytesToRead);
data = [_readData subdataWithRange:range];
[_readData replaceBytesInRange:range withBytes:NULL length:0];
}
return data;
}
Manage the I/O stream data, part 2
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_r
ef/doc/uid/TP40008235
Apple’s EADemo sample code
http://developer.apple.com/library/ios/#samplecode/EADemo/Introduction/Intro.html
Apple MFi page
https://developer.apple.com/programs/mfi/
Redpark Serial Cable
http://redpark.com/c2db9.html
BlueGiga’s iWrap firmware (for their BlueTooth modules)
http://www.bluegiga.com/iWRAP_module_firmware
Questions, Maybe Answers
Andrew Craze
@AndrewCr
http://blog.andrewcraze.com
acraze at dxysolutions.com