一、簡介
ios與硬體裝置模組(c語言)通訊,ios傳送訊息指令給硬體,硬體收到訊息後,進行邏輯處理,再將應答訊息返回ios解析,介面展示結果
c語言採用unsigned char接收二進位制資料,ios需要將16進製制資料轉換成byte陣列,以nsdata型別向裝置傳送協議
unsigned char(等於byte) 1個位元組 值域範圍:0~255
*_t型別為:
序號型別
位元組長度
1uint8_t
1位元組2
uint16_t
2位元組3
uint32_t
4位元組4
uint64_t
8位元組
二、傳送協議訊息
1.將拼接的16進製制訊息內容轉換為data資料
nsdata *verificationdata =[self converthexstrtodata:msgcontent];
2.呼叫crc16方法,將訊息內容生成4位校驗碼,返回(訊息內容+crc校驗碼)
nsdata *converdata =[self calcrcwithdata:verificationdata];
3.將訊息體內容進行轉義處理,比如:aa <————> bb後緊跟乙個 01
nsstring *strmsg =[self convertdatatohexstr:finaldatam];
4.在轉義內容前後增加標識位
nsstring *flagbit = @"ff";
5.拆分nsstring字元,每2位轉換為unsigned char,放入陣列中
nsdata *trandata2 =[self converthexstrtodata:strmsg];6.通過tcp將nsdata資料傳送給裝置
三、接收應答訊息
1.解析裝置返回的應答資料,轉換為16進製制字串
nsdata *datamsg = [nsdata datawithbytes:bytes length:sizeof(bytes)];
2.判斷應答字串前字尾是否為「ff「
nsstring *heademsg = [strmsg substringwithrange:range];
range.location = [strmsg length]-2;
nsstring *footmsg = [strmsg substringwithrange:range];
bool result1 = [@"ff" caseinsensitivecompare:heademsg] == nsorderedsame;
bool result2 = [@"ff" caseinsensitivecompare:footmsg] == nsorderedsame;
if(result1 == yes && result2)else
3.將應答字串反轉義
nsdata *finalunescapesdata= [self
unescapesdata
:verificationdata];
nsstring *unescapesstr =[self
convertdatatohexstr:finalunescapesdata];
4.呼叫crc16方法,將訊息體生成4位校驗碼
nsdata *crcdata = [self calcrcvalidcodewithdata:[self converthexstrtodata:msg1]];
nsstring *crcstr =[self convertdatatohexstr:crcdata];
5.判斷生成的校驗碼和應答字串的校驗碼是否一致
bool valideresult = [validcodemsg caseinsensitivecompare:crcstr] == nsorderedsame;
if(valideresult)else
四、通用轉換方法
1.將16進製制字串轉換成nsdata
+ (nsmutabledata *)converthexstrtodata:(nsstring *)str
nsmutabledata *hexdata = [[nsmutabledata alloc] initwithcapacity:8];
nsrange range;
if ([str length] %2 ==0) else
for (nsinteger i = range.location; i < [str length]; i +=2)
return hexdata;
}
2.將nsdata轉換成16進製制的字串
+ (nsstring *)convertdatatohexstr:(nsdata *)data
nsmutablestring *string = [[nsmutablestring alloc] initwithcapacity:[data length]];
[data enumeratebyterangesusingblock:^(const void *bytes, nsrange byterange,bool *stop) else
}}];
return
string;
}
3.將16進製制字串轉成nsdata+crc資料
+ (nsdata *)calcrcwithdata:(nsdata *)visibledata
4、獲取crc校驗碼
+ (nsdata *)calcrcvalidcodewithdata:(nsdata *)visibledata
5、對data+crc資料進行轉義
+ (nsdata *)escapeddata:(nsdata *)converdata
else
if (mybytes[i] == 0xcc)
else
}return finaldatam;
}
6、對data+crc資料進行反轉義
+ (nsdata *)unescapesdata:(nsdata *)converdata
else
if (mybytes[i] == 0xdd && mybytes[i+1] == 02)
else
}return finaldatam;
}
objective c延展類目協議
objective c中提供了可以讓我們擴充套件類定義的手段 類目,延展和協議。類目 為已知的類增加新的方法 延展 通知在本類的定義裡使用類目來宣告私有方法 協議 協議宣告了可以被任何類實現的方法。注意 這些手段只能增加類的方法,並不能用於增加例項變數,要增加類的例項變數,只能通過定義子類來間接實現...
Objective C 協議 分類 擴充套件
1.協議是一種要求,或者一種規則 2.對程式來講,是只宣告,不實現 3.協議必須被某個類採納且在該類中給出協議中方法的函式體 4.對於採納協議的類,可以和其他類一樣使用建乙個協議myprotocol h檔案 import protocol czmyprotocol property nsstring...
Objective C中的類別和非正式協議
在編寫物件導向的程式時,你經常希望向現有的類新增一些新的行為 你總是能夠為物件提供使用這些新方法的新手段。當希望為現有的類增加新行為時,我們通常會建立子類,但是有時候子類並不方便。例如,你可能會希望為nsstring類增加一些新行為,但是你知道nsstring實際上只是乙個類簇的前台表示,因而無法為...