首先,要拿到蘋(píng)果公司的MFI認(rèn)證罢艾,然后要定義至少一種命令協(xié)議楣颠,讓配件支持,Apple 并不負(fù)責(zé)提供協(xié)議的注冊(cè)機(jī)制咐蚯,制造商必須自己決定支持哪些協(xié)議童漩,為了防止命名沖
突,協(xié)議的名字是反向的 DNS 字符串春锋,類(lèi)似com.apple.myProtocol矫膨。
定義好協(xié)議后,要在工程中聲明協(xié)議期奔,在Info.plist的UISupportedExternalAccessoryProtocols鍵中聲明豆拨。
工程里要添加ExternalAccessory 框架。
通過(guò)EAAccessoryManager獲取配件列表能庆,通過(guò)EAAccessory與配件建立連接施禾,就可以創(chuàng)建一個(gè)EASession回話,與配件進(jìn)行通訊搁胆。
具體的可以參照蘋(píng)果官方文檔http://www.apple.com.cn/developer/library/ios/featuredarticles/ExternalAccessoryPT/Introduction/Introduction.html弥搞。
詳細(xì)代碼參照官方EADemo實(shí)例邮绿,里面實(shí)現(xiàn)的很清楚。
我的任務(wù)是將圖片讀進(jìn)去攀例,提取它的raw數(shù)據(jù)船逮,但由于圖片是96x96像素,就是說(shuō)raw數(shù)據(jù)大小有96x96x4個(gè)bit粤铭,大約40k挖胃,輸出到配件后要進(jìn)行寫(xiě)入,速度太慢梆惯,所以將raw數(shù)
據(jù)經(jīng)過(guò)處理酱鸭,去掉透明度,RGB分別取5位垛吗,6位凹髓,5位,這樣大約剩20k怯屉,即使這樣也要將每個(gè)數(shù)據(jù)包分段發(fā)送蔚舀,每段256個(gè)字節(jié),發(fā)送數(shù)據(jù)前锨络,加上一個(gè)文件頭赌躺,每一段加上一個(gè)
段頭,每一段發(fā)送之后等待硬件響應(yīng)羡儿,響應(yīng)之后才能發(fā)送下一段寿谴,1s之內(nèi)沒(méi)有接受響應(yīng)則終止發(fā)送。部分代碼如下:
[html] view plaincopy
UIImage *img=[UIImage imageNamed:myFilePath];//myFilePath位圖片路徑
CGImageRef cgimage=img.CGImage;
CFDataRef dataref=CGDataProviderCopyData(CGImageGetDataProvider(cgimage));//獲取圖片cfdata數(shù)據(jù)
int cgdatalength=CFDataGetLength(dataref);
UInt8 *pixelByteData=(UInt8 )malloc(cgdatalength);
CFDataGetBytes(dataref, CFRangeMake(0,cgdatalength),pixelByteData);
int eachgroupnum=256;//每一段數(shù)據(jù)大小為256bit
int groumpcount=cgdatalength/(eachgroupnum2);//分段總數(shù)
NSMutableData *data1 = [NSMutableData data];
const char buf = [self.ID UTF8String];//將命令頭處理為字節(jié)流
if (buf)
{
uint32_t len = strlen(buf);
char singleNumberString[3] = {'\0', '\0', '\0'};
uint32_t singleNumber = 0;
for(uint32_t i = 0 ; i < len; i+=2)
{
if ( ((i+1) < len) && isxdigit(buf[i]) && (isxdigit(buf[i+1])) )
{
singleNumberString[0] = buf[i];
singleNumberString[1] = buf[i + 1];
sscanf(singleNumberString, "%x", &singleNumber);
uint8_t tmp = (uint8_t)(singleNumber & 0x000000FF);
[data1 appendBytes:(void )(&tmp) length:1];
}
else
{
break;
}
}
}
[data1 appendBytes:(void )(&groumpcount) length:1];//將分段總數(shù)添加到字節(jié)流中
[[EADSessionController sharedController] writeData:data1];//發(fā)送文件頭
//將圖片字節(jié)流數(shù)據(jù)分成groumpcount分失受,每個(gè)像素點(diǎn)去掉透明體讶泰,3字節(jié)RGB處理成2字節(jié),讀入字節(jié)流緩沖區(qū)
NSMutableData datas = [NSMutableData data];
UInt16 temp=0;
for(int i=0;i<groumpcount;i++)
{
[datas appendBytes:(void )(&i) length:1];//段首編號(hào)部分
[datas appendBytes:(void )(&groumpcount) length:1];//段首編號(hào)分段總數(shù)部分
for(int j=eachgroupnumi2;j<eachgroupnum(i+1)2;j=j+4)
{
temp=pixelByteData[j+2];
temp+=pixelByteData[j+1]32;
temp+=pixelByteData[j]2048;
uint8_t tmp1 = (uint8_t)(temp & 0x0000FF00);
uint8_t tmp2 = (uint8_t)(temp & 0x000000FF);
[datas appendBytes:(void *)(&tmp1) length:1];
[datas appendBytes:(void *)(&tmp2) length:1];
}
if (i==0) {
[[EADSessionController sharedController] writeData:datas];//第一段數(shù)據(jù)直接發(fā)送
}
else{
if(readdatabuf==0xff0000){//readdatabuf為硬件響應(yīng)發(fā)回的數(shù)據(jù)拂到,當(dāng)以一段數(shù)據(jù)成功接受后痪署,給應(yīng)用發(fā)回0xff0000,且readdatabuf值存儲(chǔ)最后 一次硬件響應(yīng)
[[EADSessionController sharedController] writeData:datas];//發(fā)送下一段數(shù)據(jù)
readdatabuf=0;//清空上一次接受的數(shù)據(jù)
[datas setData:nil];//清空上一次發(fā)送的數(shù)據(jù)
continue;//結(jié)束本次循環(huán)
}
[self performSelector:@selector(laterwritedata:) withObject:datas afterDelay:1];
if(temp==NO)
{
break;//1s之內(nèi)沒(méi)有收到硬件的響應(yīng)兄旬,跳出循環(huán)狼犯,終止發(fā)送
}
}
readdatabuf=0;//清空上一次接受的數(shù)據(jù)
[datas setData:nil];//清空上一次發(fā)送的數(shù)據(jù)
}
-(void) laterwritedata:(NSMutableData *)data
{
if(readdatabuf==0xff0000){
temps=YES;//temp位YES,表示已得到響應(yīng)领铐,可以進(jìn)行下一段的發(fā)送
[[EADSessionController sharedController] writeData:data];
}
else
{
temps=NO;
}
}
頂
0