OpenHarmony之分布式软总线nstackx_device.c(二)

往期知识点记录:

(一)前言

之前已经介绍了nstackx_device.c中用到的设备信息结构体以及在头文件中声明的功能函数。 nstackx_device(一) 下面对函数定义进行具体标注。

(二)函数功能详解

声明三个静态变量,保存设备信息、设备网络接口信息与网络类型

static DeviceInfo g_localDeviceInfo;   //设备信息
static NetworkInterfaceInfo g_interfaceList[NSTACKX_MAX_INTERFACE_NUM]; //设备网络接口信息
static char g_networkType[NETWORKTYPE_LENGTH] = {0}; //网络类型

清除本地数据信息

void ClearLocalData(void)
{
    //清除本地设备信息,每项设置为0
    memset_s(&g_localDeviceInfo, sizeof(g_localDeviceInfo), 0, sizeof(g_localDeviceInfo));
    //清除本地设备网络接口信息
    memset_s(&g_interfaceList, sizeof(g_interfaceList), 0, sizeof(g_interfaceList));
    //清除网络类型
    memset_s(g_networkType, sizeof(g_networkType), 0, sizeof(g_networkType));
}

下面几个函数都是获取本地数据信息: 函数功能:获取本地设备网络接口信息

static const NetworkInterfaceInfo *GetLocalInterface(void)
{
    /* Ethernet have higher priority */
    //网络为以太网,返回相应以太网接口信息
    if (g_interfaceList[NSTACKX_ETH_INDEX].ip.s_addr) {
        return &g_interfaceList[NSTACKX_ETH_INDEX];
    }
    //无线网,返回无线相应接口信息
    if (g_interfaceList[NSTACKX_WLAN_INDEX].ip.s_addr) {
        return &g_interfaceList[NSTACKX_WLAN_INDEX];
    }
    return NULL;
}

函数功能:获取本地IP 函数参数: ip: 用来保存获取的ip信息

static void GetLocalIp(struct in_addr *ip)
{
    //获取本地接口
    const NetworkInterfaceInfo *ifInfo = GetLocalInterface();
    if (ifInfo != NULL) {
        //将ip地址复制到参数ip中
        (void)memcpy_s(ip, sizeof(struct in_addr),
                       &ifInfo->ip, sizeof(struct in_addr));
    } else {
        //不是以太网或者无线网,IP设置为0
        (void)memset_s(ip, sizeof(struct in_addr), 0, sizeof(struct in_addr));
    }
}

函数功能:获取ip的点分十进制表示 函数参数: ipstring:用来保存点分十进制的ip length: 指定分配内存的大小 函数返回:成功返回0,否则返回-1

int GetLocalIpString(char *ipString, size_t length)
{
    struct in_addr ip;
    //获取本地ip
    GetLocalIp(&ip);
    if (ip.s_addr == 0) {
        return NSTACKX_EFAILED;
    }
    //二进制转为点分十进制 ip-->ipstring ,length指定分配内存的大小
    if (inet_ntop(AF_INET, &ip, ipString, length) == NULL) {
        return NSTACKX_EFAILED;
    }
    return NSTACKX_EOK;
}

函数功能: 获取本地设备信息

const DeviceInfo *GetLocalDeviceInfo(void)
{
 return &g_localDeviceInfo;
}

函数功能:更新本地网络接口 函数参数: interfaceInfo: 新接口信息 函数返回值: 成功返回0,否则返回非零

int UpdateLocalNetworkInterface(const NetworkInterfaceInfo *interfaceInfo)
{
    int ret;
    uint32_t i;
    struct in_addr preIp, newIp;   //旧ip与新ip
    if (interfaceInfo == NULL) {
        return NSTACKX_EINVAL;
    }
    GetLocalIp(&preIp);  //得到旧的iP
    //找到要更新的接口
    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)) {
            //用参数interfaceInfo中的IP对本地接口列表中相应的接口ip更新
            ret = memcpy_s(&g_interfaceList[i].ip, sizeof(struct in_addr), &interfaceInfo->ip, sizeof(struct in_addr));
            if (ret != EOK) {
                return NSTACKX_EINVAL;
            }
            break;
        }
    }
    //如果i==最大接口数目,代表接口列表中没有名为interfaceInfo->name的接口
    if (i == NSTACKX_MAX_INTERFACE_NUM) {
        return NSTACKX_EINVAL;
    }
    GetLocalIp(&newIp);  //得到更新后的ip
    //新ip等于旧ip
    if (newIp.s_addr == preIp.s_addr) {
        return NSTACKX_EOK;
    }
    //
    if (interfaceInfo->ip.s_addr == 0) {
        //g_networkType不等于interfaceInfo->name且g_networkType不为空
        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;
}

配置本地设备信息,通过一个本地设备信息结构体NSTACKX_LocalDeviceInfo来配置g_localDeviceInfo。 函数功能:配置本地设备信息 函数参数: localDeviceInfo: 用来配置g_localDeviceInfo 函数返回值: 成功返回0,否则返回非零

int ConfigureLocalDeviceInfo(const NSTACKX_LocalDeviceInfo *localDeviceInfo)
{
    //设备id
    char deviceId[NSTACKX_MAX_DEVICE_ID_LEN];
    //二进制网络字节序IP地址
    struct in_addr ipAddr;
    //网络接口信息
    NetworkInterfaceInfo interfaceInfo;
    //
    (void)memset_s(&interfaceInfo, sizeof(interfaceInfo), 0, sizeof(interfaceInfo));
    (void)memcpy_s(deviceId, sizeof(deviceId), g_localDeviceInfo.deviceId, sizeof(deviceId));
    //如果字符串的复制没有成功
    if (strcpy_s(g_localDeviceInfo.deviceId, sizeof(g_localDeviceInfo.deviceId), localDeviceInfo->deviceId) != EOK) {
        //进行一般内存的复制
        if (memcpy_s(g_localDeviceInfo.deviceId, sizeof(g_localDeviceInfo.deviceId),
            deviceId, sizeof(deviceId)) != EOK) {
        }
        return NSTACKX_EINVAL;
    }
    //将点分十进制地址转为二进制网络字节序的IP地址,并将网络名复制到接口信息name中
    if ((inet_pton(AF_INET, localDeviceInfo->networkIpAddr, &ipAddr) == 1) &&
        (strcpy_s(interfaceInfo.name, sizeof(interfaceInfo.name), localDeviceInfo->networkName) == EOK)) {
        interfaceInfo.ip = ipAddr;   //将网络字节序ip地址赋值给接口信息中的ip
        UpdateLocalNetworkInterface(&interfaceInfo);  //用得到的interfaceInfo更新本地设备接口信息
    }
    //如果配置设备信息中的设备名中为空,或者配置设备名时错误
    if (strlen(localDeviceInfo->name) == 0 || (strncpy_s(g_localDeviceInfo.deviceName,
        sizeof(g_localDeviceInfo.deviceName), localDeviceInfo->name, NSTACKX_MAX_DEVICE_NAME_LEN - 1) != EOK)) {
        //使用默认设备名
        (void)strcpy_s(g_localDeviceInfo.deviceName, sizeof(g_localDeviceInfo.deviceName), NSTACKX_DEFAULT_DEVICE_NAME);
    }
    //配置设备版本信息
    if (strcpy_s(g_localDeviceInfo.version, sizeof(g_localDeviceInfo.version), localDeviceInfo->version) != EOK) {
        return NSTACKX_EINVAL;
    }
    //设置设备类型
    g_localDeviceInfo.deviceType = localDeviceInfo->deviceType;
    return NSTACKX_EOK;
}

最后就是对设备功能和服务数据的注册 函数功能:注册设备功能 函数参数: capabilityBitmapNum:功能位图数量 capabilityBitmap : 用于设置g_localDeviceInfo中capabilityBitmap功能位图 函数返回值: 成功返回0,否则非零

int RegisterCapability(uint32_t capabilityBitmapNum, const uint32_t capabilityBitmap[])
{
    //为g_localDeviceInfo中capabilityBitmap分配空间并初始化为0
    (void)memset_s(g_localDeviceInfo.capabilityBitmap, sizeof(g_localDeviceInfo.capabilityBitmap),
        0, sizeof(g_localDeviceInfo.capabilityBitmap));
    //如果capabilityBitmapNum不为0
    if (capabilityBitmapNum) {
        //将所有功能位图复制到g_localDeviceInfo.capabilityBitmap
        if (memcpy_s(g_localDeviceInfo.capabilityBitmap, sizeof(g_localDeviceInfo.capabilityBitmap),
            capabilityBitmap, sizeof(uint32_t) * capabilityBitmapNum) != EOK) {
            return NSTACKX_EFAILED;
        }
    }
    //更新g_localDeviceInfo.capabilityBitmapNum
    g_localDeviceInfo.capabilityBitmapNum = capabilityBitmapNum;
    return NSTACKX_EOK;
}

函数功能: 注册服务数据 函数参数: serviceData:服务数据 length: 数据长度 函数返回值: 成功返回0,否则返回非零

int RegisterServiceData(const char* serviceData, int length)
{
    //服务数据为空
    if (serviceData == NULL) {
        return NSTACKX_EINVAL;
    }
    //分配存储服务数据的空间,并初始化为0
    (void)memset_s(g_localDeviceInfo.serviceData, sizeof(g_localDeviceInfo.serviceData),
        0, sizeof(g_localDeviceInfo.serviceData));
    //将服务数据复制到设备信息服务数据属性中
    if (strcpy_s(g_localDeviceInfo.serviceData, NSTACKX_MAX_SERVICE_DATA_LEN, serviceData) != EOK)  {
        return NSTACKX_EFAILED;
    }
    (void)length;
    return NSTACKX_EOK;
}

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请看下图提示:
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值