- 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