当前位置:   article > 正文

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

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和两个用于存储设备信息的结构体
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

.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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  1. 将得到的设备hash存入g_localDeviceInfo中
    在这里插入图片描述
  2. 将localDeviceInfo中的信息保存到g_localDeviceInfo中
    在这里插入图片描述
  3. 通过IP地址的是否保存来判断WiFi是否连接的函数
    在这里插入图片描述
  4. 两个登记函数——将不同的信息添加到g_localDeviceInfo中
    在这里插入图片描述

感谢阅读点赞和评论

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/243886
推荐阅读
相关标签
  

闽ICP备14008679号