我在ESP8266的網狀網絡(Mesh Network)一文中只是簡單的介紹了Mesh網絡在IoT實踐應用上的意義與作用,也簡單地舉了一個用ESP8266實現方式。但不少的朋友提起這個例子只在太過于簡單,只是一個文字性多播而已,很難體會到Mesh在實際的網絡通信中怎么使用,例如:
- 如何向某一個特定的設備發送信息 ?
- 如何向網內所有的設備廣播信息 ?
- Mesh網絡的具體構成與每個部分的作用是什么樣的 ?
- 設備間如何實現安全通信 ?
由于在ESP8266WiFiMesh
提供的方法實現非常少,具體只有以下幾個:
構造函數 - 用于創建一個WIFI Mesh節點
ESP8266WiFiMesh(uint32_t chip_id, std::function<String(String)> handler);
參數說明:
-
chip_id
- 節點的唯一標識號 -
handler
- 當接收到信息時進行處理的回調方法
初始化方法 - 啟用Mesh網絡必須調用此方法。
void begin();
掃描/發現節點 - 向發現的節點發送一個特定的信息
void attemptScan(String message);
接受連接請求 - 當接收到任何的客戶端時將會啟用此方法。
void acceptRequest();
可見,它在使用Mesh網絡進行通信的幾乎只是個雞肋,所以接下來我會使用 easyMesh 這個庫來實現幾個例子,通過代碼來說明Mesh網絡的具體用法。
easyMesh 這個庫功能比較全面,方法也比較多
-
uint32 getChipId( void ) { return _chipId;}
- 讀取當前芯片的唯一編號 -
void setDebugMsgTypes( uint16_t types )
- 設置調試信息的類型 (具體參考meshPackageType
) -
void debugMsg( debugType type, const char* format ... )
- 發送調試信息 (具體可以參考debugType
枚舉類型) -
void init( String prefix, String password, uint16_t port )
- 初始化Mesh節點 -
void update( void )
- -
bool sendSingle( uint32_t &destId, String &msg )
- 向指定的目標節點單點發送信息 -
bool sendBroadcast( String &msg )
- 向Mesh網絡內的所有節點廣播信息 -
void setReceiveCallback( void(*onReceive)(uint32_t from, String &msg) )
- 設置接受信息的回調方法 -
void setNewConnectionCallback( void(*onNewConnection)(bool adopt) )
- 設置新建連接時的回調方法 -
uint16_t connectionCount( meshConnectionType *exclude = NULL )
- 返回連接到當前節點上的其它節點的數量 -
uint32_t getNodeTime( void )
- 獲取節點的時間
光看eashMesh這個主類提供的方法成員是不是已經完爆ESP8266WiFiMesh? easyMesh 還有很多很好用的內部變量與保護方法,具體你可以參考easyMesh.h文件的內容。
另外,easyMesh 還提供了 easyMeshAP, easyMeshSTA 這些類,有興趣的讀者也可以進行深度的研究。