知识总结
- 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中的功能函数进行一个封装和检查
-
枚举变量初始化的三个状态
通过静态变量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;
}
- 设备登记函数
将NSTACKX_Local设备信息登记到g_localDeviceInfo中
- 调用登记RegisterCapability之前进行参数校验的上层封装函数
- 保存服务数据到本地设备信息中(存入g_localDeviceInfo中)
nstackx_device.c
- 全局的三个数据结构体中的数据进行重置的函数,关闭服务时会调用其进行数据的清除
- 根据连接模式的不同返回不同长度的g_interfaceList分为两种模式一种是以太网有线网络ETH;另一种是WLAN无线局域网端口
- 获取本地接口表中的IP存入in_addr *ip所指的数据块中
- 功能函数用于比较给定的两个参数
- 将通过接口获取的信息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;
}
- 将得到的设备hash存入g_localDeviceInfo中
- 将localDeviceInfo中的信息保存到g_localDeviceInfo中
- 通过IP地址的是否保存来判断WiFi是否连接的函数
- 两个登记函数——将不同的信息添加到g_localDeviceInfo中
感谢阅读点赞和评论