IEEE 802.15.4 開發者指南¶
簡介¶
IEEE 802.15.4 工作組專注於標準化底層兩層:媒體訪問控制 (MAC) 和物理訪問 (PHY)。 上層主要有兩種選擇:
ZigBee - ZigBee 聯盟的專有協議
6LoWPAN - 基於低速率個人區域網路的 IPv6 網路
Linux-wpan 的目標是提供 IEEE 802.15.4 和 6LoWPAN 協議的完整實現。 IEEE 802.15.4 是一組協議,用於組織低速率無線個人區域網路。
該協議棧由三個主要部分組成
IEEE 802.15.4 層; 我們選擇使用普通的 Berkeley 套接字 API,通用 Linux 網路堆疊來傳輸 IEEE 802.15.4 資料訊息,以及透過 netlink 的特殊協議來進行配置/管理
MAC - 提供對共享通道的訪問和可靠的資料傳遞
PHY - 表示裝置驅動程式
套接字 API¶
int sd = socket(PF_IEEE802154, SOCK_DGRAM, 0);
地址族、套接字地址等在 include/net/af_ieee802154.h 標頭或使用者空間包中的特殊標頭中定義(請參閱 https://linux-wpan.org/wpan-tools.html 或 git 樹 https://github.com/linux-wpan/wpan-tools)。
6LoWPAN Linux 實現¶
IEEE 802.15.4 標準規定 MTU 為 127 位元組,一旦啟用安全性,在鏈路吞吐量為 250 kbps 或更低的無線鏈路上,實際 MAC 負載約為 80 個八位位元組。[RFC4944] 6LoWPAN 適配格式被指定用於在這樣的受限鏈路上承載 IPv6 資料報,同時考慮到無線感測器網路等應用中預期的有限頻寬、記憶體或能量資源。[RFC4944] 定義了網格定址標頭以支援子 IP 轉發、分片標頭以支援 IPv6 最小 MTU 要求 [RFC2460] 和 IPv6 資料報的無狀態標頭壓縮(LOWPAN_HC1 和 LOWPAN_HC2),以將相對較大的 IPv6 和 UDP 標頭減少到(在最佳情況下)幾個位元組。
2011 年 9 月釋出了標準更新 - [RFC6282]。 它棄用了 HC1 和 HC2 壓縮,並定義了 IPHC 編碼格式,該格式在此 Linux 實現中使用。
與 6lowpan 相關的所有程式碼都可以在檔案中找到:net/6lowpan/* 和 net/ieee802154/6lowpan/*
要設定 6LoWPAN 介面,您需要:1. 新增 IEEE802.15.4 介面並設定通道和 PAN ID; 2. 透過以下命令新增 6lowpan 介面:# ip link add link wpan0 name lowpan0 type lowpan 3. 啟動“lowpan0”介面
驅動程式¶
與 WiFi 一樣,有幾種型別的裝置實現 IEEE 802.15.4。 1) ‘HardMAC’。 MAC 層在裝置本身中實現,裝置匯出管理(例如 MLME)和資料 API。 2) ‘SoftMAC’ 或僅是無線電。 這些型別的裝置只是無線電收發器,可能帶有一些加速功能,例如自動 CRC 計算和比較、自動 ACK 處理、地址匹配等。
每種型別的裝置都需要不同的方法才能連線到 Linux 核心。
HardMAC¶
請參閱標頭 include/net/ieee802154_netdev.h。 您必須實現 Linux net_device,其中 .type = ARPHRD_IEEE802154。 資料透過普通的 sk_buffs 與套接字系列程式碼交換。 在 skb 接收時,skb->cb 必須包含額外的資訊,如 struct ieee802154_mac_cb 中所述。 在資料包傳輸期間,skb->cb 用於為裝置的 header_ops->create 函式提供額外的資料。 請注意,此資料稍後可能會被覆蓋(當套接字程式碼將 skb 提交到 qdisc 時),因此如果您稍後需要 cb 中的某些內容,您應該自己將資訊儲存在 skb->data 中。
要連線 MLME 介面,您必須使用指向 struct ieee802154_mlme_ops 例項的指標填充您的 net_device 的 ml_priv 欄位。 欄位 assoc_req、assoc_resp、disassoc_req、start_req 和 scan_req 是可選的。 所有其他欄位都是必需的。
SoftMAC¶
MAC 是 IEEE 802.15.4 Linux 堆疊中的中間層。 目前,它為驅動程式註冊和從屬介面的管理提供了一個介面。
注意:目前僅支援監視器裝置型別 - 它是用於網路嗅探器(例如 WireShark)的 IEEE 802.15.4 堆疊介面。
此層即將擴充套件。
請參閱標頭 include/net/mac802154.h 和 drivers/net/ieee802154/ 中的多個驅動程式。
偽造驅動程式¶
此外,還有一個驅動程式可用,它使用 SoftMAC(fakelb - IEEE 802.15.4 迴環驅動程式)介面模擬真實裝置。 此選項提供了一種無需使用真實硬體即可測試和除錯堆疊的可能性。
裝置驅動程式 API¶
include/net/mac802154.h 定義了以下函式
-
struct ieee802154_dev *ieee802154_alloc_device(size_t priv_size, struct ieee802154_ops *ops)¶
IEEE 802.15.4 相容裝置的分配。
-
void ieee802154_free_device(struct ieee802154_dev *dev)¶
釋放已分配的裝置。
-
int ieee802154_register_device(struct ieee802154_dev *dev)¶
在系統中註冊 PHY。
-
void ieee802154_unregister_device(struct ieee802154_dev *dev)¶
釋放已註冊的 PHY。
告訴 802.15.4 模組 skb 中有一個新的接收幀,其中包含來自硬體裝置的 RF 鏈路質量指示符 (LQI)。
告訴 802.15.4 模組 skb 中的幀正在或將要透過硬體裝置傳輸
裝置驅動程式必須至少在 IEEE 802.15.4 操作結構中實現以下回調
struct ieee802154_ops {
...
int (*start)(struct ieee802154_hw *hw);
void (*stop)(struct ieee802154_hw *hw);
...
int (*xmit_async)(struct ieee802154_hw *hw, struct sk_buff *skb);
int (*ed)(struct ieee802154_hw *hw, u8 *level);
int (*set_channel)(struct ieee802154_hw *hw, u8 page, u8 channel);
...
};
-
int start(struct ieee802154_hw *hw)¶
802.15.4 模組為硬體裝置初始化呼叫的處理程式。
-
void stop(struct ieee802154_hw *hw)¶
802.15.4 模組為硬體裝置清理呼叫的處理程式。
802.15.4 模組為 skb 中要透過硬體裝置傳輸的每個幀呼叫的處理程式。
-
int ed(struct ieee802154_hw *hw, u8 *level)¶
802.15.4 模組為來自硬體裝置的能量檢測呼叫的處理程式。
-
int set_channel(struct ieee802154_hw *hw, u8 page, u8 channel)¶
設定無線電以偵聽硬體裝置的特定通道。
此外,還應填寫 IEEE 802.15.4 裝置操作結構。