ESP8266 Mesh发包流程介绍

前言

最近在调试ESP8266的mesh功能,盯了几天的代码和调试信息,终于发现了mesh在使用上十分简单(遗憾的是对它的工作原理一无所知),个人感觉其他的发包程序基本上都是按照这个流程来的,因此决定把这个mesh的json发包函数的流程记录下来,以供日后参考。

程序源码

void ICACHE_FLASH_ATTR mesh_json_bcast_test()
{
    char buf[32];
    uint8_t src[6];
    uint8_t dst[6];
    struct mesh_header_format *header = NULL;
    /** 获取mac地址 */
    if (!wifi_get_macaddr(STATION_IF, src)) 
    {
        MESH_PARSER_PRINT("bcast get sta mac fail\n");
        return;
    }

    os_memset(buf, 0, sizeof(buf));
    os_sprintf(buf, "%s", "{\"bcast\":\"");
    os_sprintf(buf + os_strlen(buf), MACSTR, MAC2STR(src));
    os_sprintf(buf + os_strlen(buf), "%s", "\"}\r\n");

    os_memset(dst, 0, sizeof(dst));  // use bcast to get all the devices working in mesh from root.
    /** 创建一个数据包 */
    header = (struct mesh_header_format *)espconn_mesh_create_packet(
    dst,     // destiny address (bcast)
    src,     // source address
    false,   // not p2p packet
    true,    // piggyback congest request
    M_PROTO_JSON,   // packe with JSON format
    os_strlen(buf), // data length
    false,   // no option
    0,       // option total len
    false,   // no frag
    0,       // frag type, this packet doesn't use frag
    false,   // more frag
    0,       // frag index
    0);      // frag length
    /** 进行数据包地址正确性检查 */
    if (!header) 
    {
        MESH_PARSER_PRINT("bcast create packet fail\n");
        return;
    }
    /** 设置用户数据 */
    if (!espconn_mesh_set_usr_data(header, buf, os_strlen(buf))) 
    {
        MESH_DEMO_PRINT("bcast set user data fail\n");
        MESH_DEMO_FREE(header);
        return;
    }
    /** 发送数据 */
    if (espconn_mesh_sent(&g_ser_conn, (uint8_t *)header, header->len)) 
    {
        MESH_DEMO_PRINT("bcast mesh is busy\n");
        espconn_mesh_connect(&g_ser_conn);
        MESH_DEMO_FREE(header);
        return;
    }

    MESH_DEMO_FREE(header);
}

流程介绍

  1. 首先通过wifi_get_macaddr来获取模块的mac地址。
  2. 配置用户数据包(buf)的内容。
  3. 初始化目标mac地址(MAC地址为零的话视为向网络中所有设备发送数据包)。
  4. 通过调用espconn_mesh_create_packet函数创建一个数据包(由指针header指向这个数据包)。
  5. 通过调用espconn_mesh_set_usr_data函数将用户数据包中的内容添加进将要发送的数据包中。
  6. 通过调用espconn_mesh_sent函数发送数据(数据发送完成后需要用户手动释放这个数据包的内存)。

从上述流程图可以看出json发包首先需要创建并配置数据包,然后设置该数据包的用户数据,最后在通过发包程序发送数据。

相关API介绍

一、wifi_get_macaddr

功能查询MAC地址-
函数原型bool wifi_get_macaddr(uint8 if_index,uint8 *macaddr)-
参数if_index获取到的soft-ap当前的配置
参数枚举STATION_IF0x00
-SOFTAP_IF0x01
参数*macaddr获取到的mac地址
返回值true获取mac地址成功
-false获取mac地址失败

二、espconn_mesh_create_packet

功能创建mesh数据包-
函数原型void * espconn_mesh_create_packet ( uint8_t* dst_addr, uint8_t* src_addr, bool p2p, bool piggyback_cr, enum mesh_usr_proto_type proto, uint16_t data_len, bool option, uint16_t ot_len, bool frag, enum mesh_option_type frag_type, bool mf, uint16_t frag_idx, uint16_t frag_id )-
参数*dst_addr接收方的mac地址(为零的话表示接收方为网内的所有设备)
参数*src_addr发送方的mac地址
参数p2p是否为节点到节点的数据包(bool类型)
参数piggyback_crpiggyback流请求(bool类型)
参数proto获取到的soft-ap当前的配置
参数枚举M_PROTO_NONE用户数据为网络管理包
-M_PROTO_HTTP用户数据风格为HTTP风格
-M_PROTO_JSON用户数据风格为JSON风格
-M_PROTO_MQTT用户数据风格为MQTT风格
-M_PROTO_BIN用户数据风格为二进制风格
参数data_len用户数据的长度
参数option操作选项使能(bool类型)
参数ot_len操作选项数据长度
参数fragfragmentation使能标志(bool类型)
参数frag_typefragmentation类型
参数枚举M_O_CONGEST_REQ堵塞请求
-M_O_CONGEST_RESP响应堵塞请求
-M_O_ROUTER_SPREAD路由器信息拓展选项
-M_O_ROUTE_ADD节点加入选项
-M_O_ROUTE_DEL节点推出选项
-M_O_TOPO_REQ拓扑请求选项
-M_O_TOPO_RESP拓扑响应选项
-M_O_MCAST_GRP组列表的群播
-M_O_MESH_FRAGmesh管理片段选项
-M_O_USR_FRAG用户数据片段
-M_O_USR_OPTION用户选项
参数mf更多的fragmentation
参数frag_idxfragmentation首
参数frag_idfragmentation id
返回值void *返回一个由系统创建的数据包的地址(该地址空间需要用户手动释放)

三、 espconn_mesh_set_usr_data

功能设置mesh发送包的用户数据-
函数原型bool espconn_mesh_set_usr_data ( struct mesh_header_format* head, uint8_t* usr_data, uint16_t data_len )-
参数*head发送包的地址
参数*usr_data用户数据缓存区
参数data_len数据长度
返回值true设置成功
-false设置失败

四、 espconn_mesh_sent

功能mesh发送数据包-
函数原型int8_t espconn_mesh_sent ( struct espconn* usr_esp, uint8* pdata, uint16 len )-
参数*usr_esp网络连接结构体
参数*pdata数据包的地址
参数len数据包的长度
返回值ESPCONN_OK(0)发送成功
-ESPCONN_MEM(-1)内存不足
-ESPCONN_MAXNUM(-7)发送数据缓存区已满
-ESPCONN_ARG(-12)非法参数
-ESPCONN_IF(-14)发送UDP数据失败

参考资料

[1]. ESP8266 Mesh 用户手册
[2]. ESP8266 ESP-MESH API 参考
[3]. ESP8266Non-OS SDK API参考

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值