赞
踩
主要是nstackx类型的localDeviceInfo的信息验证和读写,通过COAP协议的发现服务初始化获取设备连接信息,然后进行层层的解析得到deviceInfo通过中间数据结构nstackx LocalDeviceInfo最终存入g_localDeviceInfo这个本地全局设备信息结构体中
名字中带有nstackx的头文件有五个这里分别对其进行介绍
1. nstackx_common:定义了CoapInitDiscovery函数
2. nstackx_database:定义了数据的处理函数比如初始化,清除,空间分配,查找等
3. nstackx_device:定义了网络通道的状态枚举变量和重要的结构体DeviceInfo用于存储设备的信息以及登记和查询信息等相关函数的定义
4. nstackx_error:定义了各种错误类型(0表示OK负数表示不同的错误类型)
5. nstackx:主要定义了一系列NSTACKX的各种MAX和两个用于存储设备信息的结构体
该文件主要完成了NSTACKX的初始化和设备信息的本地化
大多函数是对nstackx_device.c中的功能函数进行一个封装和检查
枚举变量初始化的三个状态
通过静态变量g_nstackInitState来控制初始化的流程
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; }
//将传入的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; }
感谢阅读点赞和评论
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。