分布式软总线/discovery/coap/nstackx相关代码解读

知识总结

  • ETH与WLAN
    这里可以扩展四个重要的接口标识
  • LO回环接口: 虚拟网络接口本地IP127.0.0.1
  • ETH以太网接口: 每个硬件网卡对应一个以太网接口,由网卡的驱动程序控制
  • BR网桥接口: 来链路层中实现中继和转发的技术
  • WLAN无线接口: 无线网卡对应的接口

总结概述

主要是nstackx类型的localDeviceInfo的信息验证和读写,通过COAP协议的发现服务初始化获取设备连接信息,然后进行层层的解析得到deviceInfo通过中间数据结构nstackx LocalDeviceInfo最终存入g_localDeviceInfo这个本地全局设备信息结构体中

代码详解

.h文件解读

名字中带有nstackx的头文件有五个这里分别对其进行介绍
1. nstackx_common:定义了CoapInitDiscovery函数
2. nstackx_database:定义了数据的处理函数比如初始化,清除,空间分配,查找等
3. nstackx_device:定义了网络通道的状态枚举变量和重要的结构体DeviceInfo用于存储设备的信息以及登记和查询信息等相关函数的定义
4. nstackx_error:定义了各种错误类型(0表示OK负数表示不同的错误类型)
5. nstackx:主要定义了一系列NSTACKX的各种MAX和两个用于存储设备信息的结构体

.c文件解读

nstackx_common.c

该文件主要完成了NSTACKX的初始化和设备信息的本地化

大多函数是对nstackx_device.c中的功能函数进行一个封装和检查

  1. 枚举变量初始化的三个状态
    在这里插入图片描述
    通过静态变量g_nstackInitState来控制初始化的流程

  2. NSTACKX的初始化函数和消除初始化函数

static uint8_t g_nstackInitState = NSTACKX_INIT_STATE_START;
//NSTACKX的初始化(包括hook的初始化和COAP发现服务的初始化)
int NSTACKX_Init()
{
    int ret;
    //当不处于初始化开始状态则说明已经初始化完成则返回EOK
    if (g_nstackInitState != NSTACKX_INIT_STATE_START) {
        return NSTACKX_EOK;
    }
    //初始化hook钩
    g_nstackInitState = NSTACKX_INIT_STATE_ONGOING;
    cJSON_InitHooks(NULL);

    //初始化coap发现服务
    ret = CoapInitDiscovery();
    if (ret != NSTACKX_EOK) {
        //初始化失败则GOTO销毁NSTACKX
        goto L_ERR_INIT;
    }
    g_nstackInitState = NSTACKX_INIT_STATE_DONE;
    return NSTACKX_EOK;

L_ERR_INIT:
    ret = NSTACKX_Deinit();
    if (ret != NSTACKX_EOK) {
        SOFTBUS_PRINT("[DISCOVERY] deinit fail\n");
    }
    return NSTACKX_EFAILED;
}

//销毁初始化函数
int NSTACKX_Deinit(void)
{
    if (g_nstackInitState == NSTACKX_INIT_STATE_START) {
        return NSTACKX_EOK;
    }
	
	//关闭COAP发现服务
    int ret = CoapDeinitDiscovery();
    if (ret != NSTACKX_EOK) {
        return ret;
    }
    //利用函数memset_s将本地三个全局变量用0覆盖(g_localDeviceInfo g_interfaceList g_networkType)
    ClearLocalData();
    //将状态变为开始(如果要重新进行初始化需要状态在开始)
    g_nstackInitState = NSTACKX_INIT_STATE_START;
    return NSTACKX_EOK;
}
  1. 设备登记函数
    将NSTACKX_Local设备信息登记到g_localDeviceInfo中
    在这里插入图片描述
  2. 调用登记RegisterCapability之前进行参数校验的上层封装函数
    在这里插入图片描述
  3. 保存服务数据到本地设备信息中(存入g_localDeviceInfo中)
    在这里插入图片描述

nstackx_device.c

  1. 全局的三个数据结构体中的数据进行重置的函数,关闭服务时会调用其进行数据的清除
    在这里插入图片描述
  2. 根据连接模式的不同返回不同长度的g_interfaceList分为两种模式一种是以太网有线网络ETH;另一种是WLAN无线局域网端口
    在这里插入图片描述
  3. 获取本地接口表中的IP存入in_addr *ip所指的数据块中
    在这里插入图片描述
  4. 功能函数用于比较给定的两个参数
    在这里插入图片描述
  5. 将通过接口获取的信息IP存入本地的g_interfaceList中并且再一次进行检查
//将传入的interfaceInfo中的IP赋给本地的g_interfaceList.ip再进行一次检查
int UpdateLocalNetworkInterface(const NetworkInterfaceInfo *interfaceInfo)
{
    int ret;
    uint32_t i;
    struct in_addr preIp, newIp;

    if (interfaceInfo == NULL) {
        return NSTACKX_EINVAL;
    }

    GetLocalIp(&preIp);
    for (i = 0; i < NSTACKX_MAX_INTERFACE_NUM; i++) {
        if (NetworkInterfaceNamePrefixCmp(interfaceInfo->name, g_interfaceList[i].name)
            && (i == NSTACKX_ETH_INDEX || i == NSTACKX_WLAN_INDEX)) {
            ret = memcpy_s(&g_interfaceList[i].ip, sizeof(struct in_addr), &interfaceInfo->ip, sizeof(struct in_addr));
            if (ret != EOK) {
                return NSTACKX_EINVAL;
            }
            break;
        }
    }

    if (i == NSTACKX_MAX_INTERFACE_NUM) {
        return NSTACKX_EINVAL;
    }

    GetLocalIp(&newIp);
    if (newIp.s_addr == preIp.s_addr) {
        return NSTACKX_EOK;
    }

    if (interfaceInfo->ip.s_addr == 0) {
        if (strcmp(g_networkType, interfaceInfo->name) != 0 && strcmp(g_networkType, "") != 0) {
            return NSTACKX_EOK;
        }
    } else {
        ret = strncpy_s(g_networkType, sizeof(g_networkType), interfaceInfo->name, strlen(interfaceInfo->name));
        if (ret != EOK) {
            return NSTACKX_EFAILED;
        }
    }

    return NSTACKX_EOK;
}
  1. 将得到的设备hash存入g_localDeviceInfo中
    在这里插入图片描述
  2. 将localDeviceInfo中的信息保存到g_localDeviceInfo中
    在这里插入图片描述
  3. 通过IP地址的是否保存来判断WiFi是否连接的函数
    在这里插入图片描述
  4. 两个登记函数——将不同的信息添加到g_localDeviceInfo中
    在这里插入图片描述

感谢阅读点赞和评论

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
LWM2M是Lightweight M2M的缩写,它是一种设备管理和交互接口协议,定义在CoAP协议之上。它基于IPSO对设备模型进行了标准化,提供了一组轻量级的设备管理和交互接口协议。LWM2M的实现主要有C语言的Wakaama和Java语言的Leshan。它的应用场景适合于CoAP协议,并且相对于CoAP协议更方便地实现设备的管理。通过LWM2M,M2M管理平台可以向远程设备发送读取、写入、创建、执行等操作,从设备的固件资源中读取值,写入新值,创建新的对象实例,执行操作等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [什么是物联网?常见IoT 物联网协议最全讲解](https://blog.csdn.net/klandor2008/article/details/109006947)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [物联网常用的网络协议:MQTT、AMQP、HTTP、CoAP、LwM2M](https://blog.csdn.net/weixin_47567401/article/details/113810919)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [lwm2m和coap协议 简解读](https://blog.csdn.net/qq_15165093/article/details/105348197)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

国家一级假勤奋研究牲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值