6LoWPAN Mesh
MeshInterface 类层次结构
Arm Mbed Mesh API 允许应用程序通过 Nanostack 网络栈使用 IPv6 网状网络拓扑。
Mbed OS 提供两种类型的基于 IPv6 的网状网络:
- 6LoWPAN_ND,松散地遵循 Zigbee-IP 规范。
- Thread,遵循 Thread 组的规范。
Nanostack 是提供这两种协议的网络栈。有关栈内部的更多信息,请参阅 6LoWPAN 网状技术部分。应用程序开发人员通过 Mbed Mesh API 使用 Nanostack。
应用程序可以使用 LoWPANNDInterface 或 ThreadInterface 对象连接到网状网络。成功连接后,应用程序可以使用 Mbed C++ 套接字 API 创建套接字以启动与远程对等方的通信。
您可以通过在 mbed_app.json 中提供值来配置网格接口,作为网状配置部分文档。
用法
- 创建网络接口和驱动程序对象。
- 使用给定的 PHY 驱动程序初始化接口。
- 连接到网络。
支持的网状网络模式
目前,支持 6LoWPAN-ND(邻居发现)和 Thread 自举模式。
网络连接状态
初始化后,网络状态为 MESH_DISCONNECTED。连接成功后,状态将更改为 MESH_CONNECTED,当与网络断开连接时,状态将更改回 MESH_DISCONNECTED。
如果出现连接错误,状态将更改为某些连接错误状态。在错误状态下,不需要发出断开连接请求,并且允许应用程序再次尝试连接。
入门
有关用法,请参阅示例应用程序 mbed-os-example-mesh-minimal。
Mesh 类参考
公共成员函数 | |
virtual MeshInterface * | meshInterface () |
公共成员函数继承自 NetworkInterface | |
virtual const char * | get_mac_address () |
virtual const char * | get_ip_address () |
virtual const char * | get_netmask () |
virtual const char * | get_gateway () |
virtual nsapi_error_t | set_network (const char *ip_address, const char *netmask, const char *gateway) |
virtual nsapi_error_t | set_dhcp (bool dhcp) |
virtual nsapi_error_t | connect ()=0 |
virtual nsapi_error_t | disconnect ()=0 |
virtual nsapi_error_t | gethostbyname (const char *host, SocketAddress *address, nsapi_version_t version=NSAPI_UNSPEC) |
virtual nsapi_value_or_error_t | gethostbyname_async (const char *host, hostbyname_cb_t callback, nsapi_version_t version=NSAPI_UNSPEC) |
virtual nsapi_error_t | gethostbyname_async_cancel (int id) |
virtual nsapi_error_t | add_dns_server (const SocketAddress &address) |
virtual void | attach (mbed::Callback< void(nsapi_event_t, intptr_t)> status_cb) |
virtual nsapi_connection_status_t | get_connection_status () const |
virtual nsapi_error_t | set_blocking (bool blocking) |
virtual EthInterface * | ethInterface () |
virtual WiFiInterface * | wifiInterface () |
virtual CellularBase * | cellularBase () |
virtual EMACInterface * | emacInterface () |
静态公共成员函数 | |
static MeshInterface * | get_default_instance () |
静态公共成员函数继承自 NetworkInterface | |
static NetworkInterface * | get_default_instance () |
静态保护的成员函数 | |
static MeshInterface * | get_target_default_instance () |
静态保护的成员函数继承自 NetworkInterface | |
static NetworkInterface * | get_target_default_instance () |
其他继承成员 | |
继承自的公共类型 NetworkInterface | |
typedef mbed::Callback< void(nsapi_error_t result, SocketAddress *address)> | hostbyname_cb_t |
继承自的公共类型 DNS | |
typedef mbed::Callback< void(nsapi_error_t result, SocketAddress *address)> | hostbyname_cb_t |
受保护的成员函数继承自 NetworkInterface | |
virtual NetworkStack * | get_stack ()=0 |
Mesh 示例
下面的应用程序演示了一个简单的灯光控制应用程序,其中设备可以控制网络中所有设备的 LED 状态。您可以为不安全的 6LoWPAN-ND 或 Thread 网络构建应用程序。
/*
* Copyright (c) 2016 ARM Limited. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "mbed.h"
#include "rtos.h"
#include "NanostackInterface.h"
#include "mbed-trace/mbed_trace.h"
#include "mesh_nvm.h"
#if MBED_CONF_APP_ENABLE_LED_CONTROL_EXAMPLE
#include "mesh_led_control_example.h"
#endif
void trace_printer(const char* str) {
printf("%s\n", str);
}
#define ATMEL 1
#define MCR20 2
#define NCS36510 3
#define KW24D 4
#define MESH_LOWPAN 3
#define MESH_THREAD 4
#if MBED_CONF_APP_RADIO_TYPE == ATMEL
#include "NanostackRfPhyAtmel.h"
NanostackRfPhyAtmel rf_phy(ATMEL_SPI_MOSI, ATMEL_SPI_MISO, ATMEL_SPI_SCLK, ATMEL_SPI_CS,
ATMEL_SPI_RST, ATMEL_SPI_SLP, ATMEL_SPI_IRQ, ATMEL_I2C_SDA, ATMEL_I2C_SCL);
#elif MBED_CONF_APP_RADIO_TYPE == MCR20 || MBED_CONF_APP_RADIO_TYPE == KW24D
#include "NanostackRfPhyMcr20a.h"
NanostackRfPhyMcr20a rf_phy(MCR20A_SPI_MOSI, MCR20A_SPI_MISO, MCR20A_SPI_SCLK, MCR20A_SPI_CS, MCR20A_SPI_RST, MCR20A_SPI_IRQ);
#elif MBED_CONF_APP_RADIO_TYPE == NCS36510
#include "NanostackRfPhyNcs36510.h"
NanostackRfPhyNcs36510 rf_phy;
#endif //MBED_CONF_APP_RADIO_TYPE
#if MBED_CONF_APP_MESH_TYPE == MESH_LOWPAN
LoWPANNDInterface mesh;
#elif MBED_CONF_APP_MESH_TYPE == MESH_THREAD
ThreadInterface mesh;
#endif //MBED_CONF_APP_MESH_TYPE
static Mutex SerialOutMutex;
void serial_out_mutex_wait()
{
SerialOutMutex.lock();
}
void serial_out_mutex_release()
{
SerialOutMutex.unlock();
}
int main()
{
mbed_trace_init();
mbed_trace_print_function_set(trace_printer);
mbed_trace_mutex_wait_function_set( serial_out_mutex_wait );
mbed_trace_mutex_release_function_set( serial_out_mutex_release );
printf("Start mesh-minimal application\n");
printf("Build: %s %s\nMesh type: %d\n", __DATE__, __TIME__, MBED_CONF_APP_MESH_TYPE);
#if MBED_CONF_APP_ENABLE_LED_CONTROL_EXAMPLE
if (MBED_CONF_APP_BUTTON != NC && MBED_CONF_APP_LED != NC) {
start_blinking();
} else {
printf("pins not configured. Skipping the LED control.\n");
}
#endif
printf("\n\nConnecting...\n");
mesh.initialize(&rf_phy);
mesh_nvm_initialize();
int error = mesh.connect();
if (error) {
printf("Connection failed! %d\n", error);
return error;
}
while (NULL == mesh.get_ip_address())
Thread::wait(500);
printf("connected. IP = %s\n", mesh.get_ip_address());
#if MBED_CONF_APP_ENABLE_LED_CONTROL_EXAMPLE
// Network found, start socket example
if (MBED_CONF_APP_BUTTON != NC && MBED_CONF_APP_LED != NC) {
cancel_blinking();
start_mesh_led_control_example((NetworkInterface *)&mesh);
}
#endif
}
相关内容
- Nanostack 技术参考资料。