物聯網平台設計心得 你所不知道的CRC校驗

2021-09-07 05:25:11 字數 2054 閱讀 7612

在物聯網平台設計過程中,我的中介軟體一方面需要處理來自於硬體端的包,另一方面需要處理來自於使用者端的包,使用者端包括web端和手機端等等。所以編寫乙個統一的crc認證是非常必須要。

那麼,在設計開始,crc認證到底是什麼呢?所謂的crc認證,就是指,在硬體端或者使用者端進行資料傳輸前,通過一套演算法,將待傳輸的資料,通過加驗,算出其校驗碼,附加在包體的最後,然後中介軟體收到此包後,對包進行解析,拿出其中的資料內容部分,然後對包重新進行一次crc加驗,如果本次加驗結果和包體附帶的crc校驗碼資料一致,那麼就說明此條資料報是完整的,可用的。反之則證明此包有問題。

所以從上面過程中,我們可以看出crc包含這麼幾個重要的內容:crc生成演算法,crc解析演算法。

crc查表演算法

首先,crc生成演算法如下,從網上隨便都能搜出一堆,我們這裡用的是crc16位的:

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace dsmiddlewire.lib

; // table of crc values for low-order byte

private readonly byte _auchcrclo = new byte

;/// /// 獲得crc16效驗碼

///

///

///

internal ushort calculatecrc16(byte buffer)

return (ushort)(crchi << 8 | crclo);

}/// /// 獲得crc16效驗碼

///

///

///

public static string calculatecrc16(string strpar)

return retstr;}}

}

上面就是利用查表法來生成crc16校驗碼的函式,其機理就是:我通過運算會得到乙個crc校驗碼,然後除以256會得到高位值,餘256會得到低位值,最後將高位值和低位值進行或操作,就是我們的校驗碼了。

crc加驗方法

上面的函式雖然可用,但是生成的卻是string型別的值,在資料傳輸過程中,都是要轉化為byte傳輸的,所以這裡我們需要將得到的數值轉化為byte型別,然後放到資料內容的byte陣列中,傳送給中介軟體:

/*

* 向底層硬體傳送的crc封裝方法

* 1.var crcgenerate = getcrc(result); 先得到crc碼:14321

* 2.得到高位,低位值: 14321/256 = 55, 14321%256=241

* 3.轉為byte,追加到最後兩位byte陣列中,傳給硬體即可

* */

public static byte constructmessagewithcrc(string message)

我解釋下上面的**:messagetoconstruct 是我們的資料內容部分,我們先是將資料內容通過crc16.calculatecrc16函式算出其校驗碼,然後將其最高位和最低位分別放入byte陣列中,然後傳送出去。

crc校驗方法

那麼既然有crc校驗碼的生成,也需要crc校驗碼的解析過程,所謂有攻必有防:

public static bool checkmessagecrc(byte message, out string messagereceived)

上面的過程就是對接收到的資料報,先把資料部分和crc校驗碼部分分開(校驗碼部分很明確佔最後兩個位元組,從crc加驗部分我們就可以看到)。然後再把資料部分重新計算crc校驗碼,和附帶的對比即可。

後話好了,以上就是所有的crc校驗碼內容了,包括加驗和校驗過程,你明白了嗎?

說實在話,翻了許多文章,都沒有我這篇講得透徹。因為我在設計之初,也是找網上的文章,但是均不成功,後來和做硬體的人溝通,然後順利成型。

你所不知道的 const

const 常量是不可修改的,也就是說only read,例如 const int nbuffsize 512 nbuffsize 0 error就是因為const 常量不能修改,所以定義時必須初始化預設在全域性作用域中定義的非const變數可以在整個程式中訪問,例如 int ncounter ex...

你所不知道的background

今天要說說css中background這個屬性裡面的大學問。在乙個宣告中設定所有的背景屬性 body 看到這串 你怕了嗎?知道他們都代表啥意思嘛?不要捉急,來看展開式。展開式 background color設定元素的背景顏色,不能設定到外邊距,可以繼承父級的背景顏色,預設為透明。backgroun...

overflow hidden 你所不知道的事

overflow hidden 你所不知道的事 overflow hidden這個css樣式是大家常用到的css樣式,但是大多數人對這個樣式的理解僅僅侷限於隱藏溢位,而對於清除浮動這個含義不是很了解。這是乙個常用的div寫法,下面我們來書寫樣式。大家可以在dmx中自己做試驗 wai nei 可以看到...