標籤:style blog http os 使用 ar sp 資料 2014
昨天大體上熟悉了TIMAC內建的CC2530的示範常式,今天先從示範抓包入手,分析四種不同的配置工程在空中傳輸的差異。隨後,會按照掃描、組網、入網等MAC層介面函數入手,結合IEEE 802.15.4標準規範和能夠看到的函數介面代碼,來學習MAC的一些操作處理。
前面提到了,常式有四種網路組建方式,分為非信標直接模式,非信標間接模式,信標直接模式,
信標間接模式
。以下分別來抓包,結合具體程式碼分析,安全傳輸模式最後另作分析。
1. 非信標直接模式
對於非信標網路的建立,裝置上電開機後,會掃描預設通道,如果此通道上沒有其他協調器存在,它會將自己設定為協調器。
先通過 MSA_ScanReq(MAC_SCAN_ACTIVE, 3) 命令MAC層執行主動掃描過程,掃描結果以MAC_MLME_SCAN_CNF訊息反饋給應用程式層,在應用程式層執行 MSA_CoordinatorStartup(),設定協調器的MAC層相關參數,例如協調器擴充地址、短地址、Beacon幀的內容、接收機空閑時保持開啟狀態、是否允許入網等一系列參數,設定完成後,調用MAC_MlmeStartReq()來啟動協調器網路,MAC層完成此操作後,以MAC_MLME_START_CNF訊息通知應用程式層。
注意,協調器的擴充地址、短地址和PAN ID都是固定寫在程式中的,終端裝置的擴充地址前6個位元組是固定的,後兩個位元組隨機產生,短地址由協調器為其分配,PAN ID是寫死的。
協調器建立網路請求:
因為是非信標模式,建立網路的前提是周圍沒有其他網路,發出一個信標探測即可。
終端先發起掃描,發現掃描裡面有Beacon的響應,產生MAC_MLME_BEACON_NOTIFY_IND訊息,然後通過MAC層的回呼函數,嚮應用層發起MAC_MLME_BEACON_NOTIFY_IND訊息。終端在解析超幀結構時,會擷取超幀結構中的BO和SO,將其設定為自身的BO和SO值,這樣,就可以加入任何不同類型的網路了。在隨後的MAC層的掃描確認響應MAC_MLME_SCAN_CNF中,通過一些條件判斷,然後發送請求串連指令,MAC_MlmeAssociateReq,當MAC層完成了此動作,以MAC_MLME_ASSOCIATE_CNF通知應用程式層。
終端掃描過程的抓包如下:
終端請求加入網路的抓包如下:
至此,協調器和終端之間已經建立好聯絡。接下來就是雙發收發資料。
協調器向終端發送資料,由於是直接模式,協調器無需等待終端的poll請求,想發就發。
實際的資料發送很簡單,就不了。收發雙方通過預先設定好的發送資料內容來相互確認發送的正確性與否。唯一要注意的是,協調器發送資料,會向所有已經串連的裝置發送資料。終端裝置收到資料後,會將資料原封不動的回顯給協調器。
以上就是非信標直接模式的整個過程。
2. 非信標間接模式
有了上面非信標直接模式的經驗,現在分析非信標間接模式就清楚明白多了。這個模式與第一種模式的區別就在終端裝置是以間接模式接入網路,也就是說,終端裝置會定時向協調器發送poll輪詢,已獲知協調器是否有發給自己的資料,協調器那邊發送資料,也只有等到對於終端發來資料請求,才會真正給終端發送資料,再次之前,都是緩衝著的。
從程式上來看,間接模式下,終端在於協調器建立聯絡後開啟了一個MSA_POLL_EVENT定時事件,核心是執行MAC_MlmePollReq介面函數。當MAC層完成Poll操作時,會反饋給應用程式層MAC_MLME_POLL_CNF事件。如果協調器有資料要發送給終端,則MAC_MLME_POLL_CNF事件的狀態結果為SUCCESS,同時向終端發送對於的資料,終端的MAC層收到此資料後,嚮應用層發送MAC_MCPS_DATA_IND事件通知。
終端發送poll請求資料的抓包:
這裡,讓人奇怪的一點是,poll操作會反饋MAC_MLME_POLL_CNF訊息給應用程式層,但是在應用程式層,switch的條件判斷也判斷到該訊號的產生,但是單步的時候進不去,設定斷點無效,懷疑可能被編譯器最佳化了,在響應語句裡面操作一些全域變數,果然又可以進去了。
3. 信標模式直接模式
在信標模式下,整個網路自己會維護同步關係,因此不需要輪訓,終端裝置只會有直接模式接入網路這一種情況。
設定方法見學習筆記(一).在這裡要注意一點,信標模式下,協調器的BO和SO數值要和終端的BO、SO數值一致,否則無法接入網路,因為信標網路的標識就是SO和BO,不同的SO和BO代表不同的信標網路,要入網,肯定要在同一信標網路下才行的。
信標模式下,協調器建立網路的掃描方式改為被動掃描,顧名思義,被動用於監聽通道上的beacon幀。信標網路相比於非信標網路來說,除了網路的自動同步外,允許協調器裝置進入低功耗模式,但能否真正進入,還要看其他相關設定。
信標模式協調器建網抓包:
在沒有其他終端入網之前,協調器是不用發送信標同步訊號的,信標是用來同步的,既然網路目前只有一個節點,那也就沒有必要同步啦。
在允許協調器進入代碼中,TI的代碼有一處寫的不好,
#define MSA_PWR_MGMT_ENABLED FALSE /* Enable or Disable power saving */
明明是使能宏,數值卻是FALSE. 調試了一會兒就發現了這個問題,TI這份代碼估計是不想讓協調器進入省電模式。像這種定義宏含義與實際設定的值不符合的情況,就是個大坑,自己別挖坑,也要提防著代碼裡面這樣的坑。
經過初步的測試,發現信標網路的建網和入網時間都很長,可能是需要掃描每一個通道上是否有信標響應,16個通道依次等待逾時造成的。對於信標網路的終端裝置,有如下額外的處理流程:
設定好相關的BO和SO的值就,然後開啟同步請求,如果MAC層發現失步了,則會嚮應用層發送MAC_MLME_SYNC_LOSS_IND事件通知。協調器發現自己有子節點後,開始定時發送信標幀,預設時間為15s。現有的代碼,沒有對同步幀進行進一步的處理。
信標模式下,協調器主動向終端發送資料的抓包:
信標模式下,終端主動向協調器發送資料的抓包:
好了,以上就是三種不同方式的網路建立和收發資料的總體流程。下面,要開始介紹安全相關的東西。
4. 安全傳輸
安全傳輸,就是開啟MAC層的加密功能,以非信標模式下的為例子,安全模式,只不過是多加了兩個宏,一個是FEATURE_MAC_SECURITY,另一個是HAL_AES宏。在代碼中的體現,就是添加了很多有關安全的初始化。
MAC層有四種傳輸幀,信標幀、資料幀、ACK幀、命令幀。PHY層的PIB資料庫,對於輸出幀和輸入幀,定義了不同的安全屬性。主要有四個比較重要的參數,下面一一來介紹。
uint8 msa_securityLevel = MAC_SEC_LEVEL_NONE; //這個參數用於實際傳輸過程中的加密等級
uint8 msa_keyIdMode = MAC_KEY_ID_MODE_NONE; //金鑰索引的模式
uint8 msa_keySource[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8 msa_keyIndex = 0; //金鑰索引值
這樣來介紹吧,MAC為了加密,肯定要用到AES硬體加密引擎,有引擎就肯定有密鑰,有密鑰就肯定不止一個密鑰,很多個密鑰怎麼組織呢?那就把他們放在一個表裡,取個名字叫做msa_KeyTable,有keyTableEntries個這樣的表。這麼多密鑰,如果不指定,肯定要用一個預設的密鑰,這個預設的密鑰叫做msa_keyDefaultSource,實際使用的key為msa_keySource。對不同類型的幀,有著不同的安全層級要求,MAC層有4種幀,因此,也要個對於的表,叫做msa_securityLevelTable
下面是終端裝置發送加密內容的抓包圖:
在安全控制域中,Level為加密強度,密鑰模式為1,金鑰索引為3.後面的為加密的MAC負載資訊。需要注意的一點是,在加密通訊中,掃描網路、請求入網是不用加密的。在接收方,當傳遞到應用程式層時,已經是解密後的資料了,無需做其他的處理。
總結一下:以上就是TIMAC基本的應用和大概的入網流程的解釋,還有很多地方沒有深入去理解,希望能夠協助到大家。
能夠分享的技術,才能讓別人看到你的不足。我有很多不足,希望能夠不斷改進自己。
TIMAC 學習筆記(二)