码迷,mamicode.com
首页 > 其他好文 > 详细

painlessMesh入门

时间:2018-07-04 11:38:09      阅读:364      评论:0      收藏:0      [点我收藏+]

标签:oid   增量   成员函数   ssm   信息   tde   通过   好的   延迟   

  painlessMesh是一个库,它负责使用esp8266和esp32硬件创建一个简单的网格网络。目的是让程序员可以使用一个网格网络,而不必担心网络的结构或管理方式。

真正的自组网

         painlessMesh是一个真正的临时网络,这意味着不需要计划、中央控制器或者路由器。任何一个或多个节点的系统都会自动组织成功能完备的网格。网格的最大大小(我们认为)受到堆中可以分配给子连接缓冲区的内存数量的限制,因此应该非常高。

 

基于JSON

       painlessMesh使用JSON对象进行所有的消息传递。这有几个原因。首先,它使代码和消息具有可读性,易于理解;其次,它使与javascript前端、web应用程序和其他应用程序集成无痛网格变得无痛。有些性能丢失了,但是我还没有遇到性能问题。如果有人想要贡献的话,转换成二进制消息传递是相当直接的。

 

无线和网路

       painlessMesh被设计为与Arduino一起使用,但是它不使用Arduino WiFi库,因为我们遇到了性能问题(主要是延迟)。而是使用本地的esp32和esp8266 SDK库进行联网,这些库可以通过Arduino IDE获得。不过,希望对大多数用户来说,使用哪些网络库并不重要,因为您只需包含painlessMesh.h,运行init(),然后通过API工作库。

 

painlessMesh不是IP网络

       painlessMesh不创建节点的TCP/IP网络。相反,每个节点都是由它的32位chipId惟一标识的,它是在SDK中使用system_get_chip_id()调用从esp8266/esp32检索的。每个节点都有一个唯一的数字。可以将消息广播到网格上的所有节点,也可以特定地发送到由其“nodeId”标识的单个节点。

 

局限和警告

  • 尽量避免在代码中使用delay()。为了维护网格,我们需要在后台执行一些任务。使用delay()将阻止这些任务的发生,并可能导致网格失去稳定性/崩溃。相反,我们建议使用painlessMesh中包含的调度器。该调度器是微修改的TaskScheduler库版本。文档可以在这里找到。有关如何使用调度器的其他示例,请参见示例文件夹。
  • painlessMesh订阅WiFi事件(ESP8266和ESP32)。请注意,因此painlessMesh可能与试图绑定到相同事件的用户程序/其他库不兼容。
  • 尽量在每分钟发送的消息(尤其是广播消息)的数量上保持保守。这是为了防止硬件过载。esp8266和esp32在处理能力/内存方面都是有限的,因此很容易超载和破坏网格。尽管无痛网格试图阻止这种情况的发生,但并非总是能做到。
  • 由于高流量,消息可能丢失或丢失,您不能依赖于所有要传递的消息。其中一个建议是,每隔一段时间重新发送一次消息。即使有一些人失踪了,大多数人也应该经历。另一种方法是让节点在收到消息时发送回复。如果发送节点在一定时间内没有得到回复,则可以重新发送消息。

 

安装

  Arduino库管理器和platformio库注册表中都包含了painlessMesh,可以通过这两种方法轻松安装。

 

依赖关系

  •        painlessMesh使用了以下库,这些库可以通过Arduino库管理器进行安装
  •        ArduinoJson
  •   TaskScheduler
  •   ESPAsyncTCP (ESP8266)
  •   AsyncTCP (ESP32)
  •   如果使用platformio来安装库,那么依赖项将自动安装。

 

示例

       这里有一个基本的示例用法。当节点连接到网格上时,它会闪烁几次内置的LED(在sp -12中)。进一步的示例在示例目录下,并在https://platformio.org/lib/show/1269/painlessMesh页面上显示。

 

贡献

       我们尝试遵循git流开发模型。这意味着我们有一个开发分支和主分支。所有开发都是在特性分支下完成的,这些分支在完成后并入了开发分支。当新版本发布时,我们将开发分支合并到主分支。有关详细信息,请参阅贡献文件https://gitlab.com/painlessMesh/painlessMesh/blob/master/CONTRIBUTING.md

 

寻求帮助

       在维基上有帮助,你也可以在我们的gitter频道上找到我们。https://gitter.im/painlessMesh/Lobby

 

PainlessMesh API

        使用painlessMesh是无痛的

  首先包括库并创建一个类似这样的无痛网格对象..

#include <painlessMesh.h>
painlessMesh  mesh;

  主要成员函数包括在下面。完整的doxygen生成的文档可以在这里找到https://painlessmesh.gitlab.io/painlessMesh/classpainlessMesh.html

 

成员函数

void painlessMesh::init(String ssid, String password, uint16_t port = 5555, WiFiMode_t connectMode = WIFI_AP_STA, _auth_mode authmode = AUTH_WPA2_PSK, uint8_t channel = 1, phy_mode_t phymode = PHY_MODE_11G, uint8_t maxtpw = 82, uint8_t hidden = 0, uint8_t maxconn = 4)  

  将其添加到setup()函数中。初始化网状网络。这个例程做以下事情。

  开始一个无线网络

  开始搜索作为网络一部分的其他wifi网络

  登录到它找到的最好的网格网络节点,如果没有找到任何东西,它将在5秒内启动新的搜索。

  ssid= 你的mesh网络名称。 所有节点共享相同的AP ssid。 他们有别于BSSID。password= 你的mesh网络的wifi密码。port= 希望mesh服务器运行的TCP端口。如果没有指定,默认为5555。 connectMode = 在WIFI_AP、WIFI_STA和WIFI_AP_STA(默认)模式之间切换

void painlessMesh::stop() 

  停止节点。这将导致节点与所有其他节点断开连接,并停止/发送消息。

void painlessMesh::update( void )  

  将它添加到loop()函数中这个例程运行各种维护任务……虽然不是很有趣,但没有它,事情就不会有结果。

void painlessMesh::onReceive( &receivedCallback )  

  为该节点上的任何消息设置回调例程。回调例程具有以下结构。

void receivedCallback( uint32_t from, String &msg )

  每当这个节点接收到一条消息时,这个回调例程就会被调用。from是消息的原始发送者的id, msg是包含消息的字符串。信息可以是任何东西。JSON、其他一些文本字符串或二进制数据。

void painlessMesh::onNewConnection( &newConnectionCallback )  

  这将在每次本地节点创建新连接时触发。回调具有以下结构。

void newConnectionCallback( uint32_t nodeId )

  nodeId是网格中新的已连接节点ID。

void painlessMesh::onChangedConnections( &changedConnectionsCallback ) 

  每当网格拓扑发生变化时,就会发生这种情况。回调具有以下结构。

void onChangedConnections()

  这里没有传递参数。这只是一个信号。

bool painlessMesh::isConnected( nodeId ) 

  返回当前连接到网格的给定节点。

  nodeId是请求引用的节点ID。

void painlessMesh::onNodeTimeAdjusted( &nodeTimeAdjustedCallback )  

  这将在每次调整本地时间以使其与网格时间同步时触发。回调具有以下结构。

void onNodeTimeAdjusted(int32_t offset)

  offset是计算并应用于本地时钟的调整增量。

void onNodeDelayReceived(nodeDelayCallback_t onDelayReceived) 

当收到一个请求后,收到一个延迟量减响应时,就会触发。回调具有以下结构。

  void onNodeDelayReceived(uint32_t nodeId, int32_t delay)

  nodeId发起响应的节点。

  delay 单向网络旅行延迟在微秒。

void onNodeDelayReceived(uint32_t nodeId, int32_t delay) 

 

bool painlessMesh::sendBroadcast( String &msg, bool includeSelf = false) 

  将msg发送到整个网格网络的每个节点。默认情况下,当前节点被排除在接收消息之外(includeSelf = false)。includeSelf = true重写此行为,导致在发送广播消息时调用receivedCallback。

  如果一切正常,返回true;如果没有,返回false。将错误消息打印到串行。打印,如果有失败。

bool painlessMesh::sendSingle(uint32_t dest, String &msg)  

  将msg发送到具有Id == dest的节点。

  如果一切正常,返回true;如果没有,返回false。将错误消息打印到串行。打印,如果有失败。

String painlessMesh::subConnectionJson()  

  返回JSON格式的网格拓扑。

std::list painlessMesh::getNodeList()  

  获取所有已知节点的列表。这包括直接和间接连接到当前节点的节点。

uint32_t painlessMesh::getNodeId( void )  

  返回正在运行的节点的pid。

uint32_t painlessMesh::getNodeTime( void )

  返回网格时间基微秒计数器。从第一个节点启动开始滚动71分钟。

  节点尝试使用基于SNTP的协议来保持一个公共的时间基同步

bool painlessMesh::startDelayMeas(uint32_t nodeId)  

  向节点发送一个数据包,以测量到该节点的网络旅行延迟。如果nodeId连接到网格,则返回true,否则返回false。在调用此函数之后,用户程序必须等待由指定的回调形式的响应

void painlessMesh:onNodeDelayReceived(nodeDelayCallback_t onDelayReceived)

  nodeDelayCallback_t是void(uint32_t nodeId,int32_t delay)形式的函数。

void painlessMesh::stationManual( String ssid, String password, uint16_t port, uint8_t *remote_ip )

  将节点连接到网格外的AP。当指定remote_ip和端口时,节点在建立WiFi连接后打开TCP连接。

  注意: mesh必须与AP位于同一WiFi通道上。

painlessMesh入门

标签:oid   增量   成员函数   ssm   信息   tde   通过   好的   延迟   

原文地址:https://www.cnblogs.com/taoxu991/p/9262017.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!