objective c和硬體協議通訊

2021-08-03 13:51:11 字數 3491 閱讀 3373

一、簡介

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實際上只是乙個類簇的前台表示,因而無法為...