OpenHarmony源码分析之分布式软总线:msg_get_deviceid.c文件分析

100 篇文章 2 订阅
100 篇文章 1 订阅

往期知识点记录:

一、概述

该文件代码的功能主要是提供以cJSON格式获取各个设备的信息,包括设备id、链接信息、设备名、设备类型等。下面将对该文件的每一个函数进行详细分析。

二、源码分析

msg_get_deviceid.c

/*
 * Copyright (c) 2020 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include "msg_get_deviceid.h"
#include "message.h"
#define CMD_TAG "TECmd"
#define DATA_TAG "TEData"
#define DEVICEID_TAG "TEDeviceId"
#define CMD_GET_AUTH_INFO "getAuthInfo"
#define CMD_RET_AUTH_INFO "retAuthInfo"
#define DEVICE_CONN_CAP_WIFI 0x1f
#if defined(__LITEOS_M__) || defined(__LITEOS_RISCV__)
#define DEVICE_TYPE_DEFAULT "DEV_L0"
#else
#define DEVICE_TYPE_DEFAULT "DEV_L1"
#endif
/*
函数功能:将deviceId打包成json格式的Get消息
函数参数:
    devInfo:本地设备信息
    cmd:Get命令内容
函数返回值:
    成功:返回封装好的cJSON格式的消息
    失败:返回NULL
详细:
*/
static cJSON *MsgGetDeviceIdpack(const DeviceInfo *devInfo, const char *cmd)
{
    cJSON *msg = cJSON_CreateObject();//创建一个cJSON对象
    if (msg == NULL) {
        return NULL;
    }
    if (cJSON_AddStringToObject(msg, CMD_TAG, cmd) == NULL) {//添加一个string类型的成员到cJSON对象msg中,键为CMD_TAG,值为传入cmd的值
        cJSON_Delete(msg);
        return NULL;
    }
    if (cJSON_AddStringToObject(msg, DATA_TAG, devInfo->deviceId) == NULL) {//添加一个string类型的成员到cJSON对象msg中,键为DATA_TAG,值为deviceId
        cJSON_Delete(msg);
        return NULL;
    }
    return msg;
}
/*
函数功能:解析消息获取设备id(deviceId)和认证id(authId)
函数参数:
    msg:接收到的cJSON消息
    conn:认证设备连接信息
    cmd:命令
函数返回值:
    成功:返回0
    失败:返回-1
详细:
*/
static int MsgGetDeviceIdunpack(const cJSON *msg, AuthConn *conn, const char *cmd)
{
    char *msgCmd = GetJsonString(msg, CMD_TAG);//获取消息中键为CMD_TAG的值
    char *msgData = GetJsonString(msg, DATA_TAG);//获取消息中键为DATA_TAG的值
    char *msgAuthId = GetJsonString(msg, DEVICEID_TAG);//获取消息中键为DEVICEID_TAG的值
    if (msgCmd == NULL || msgData == NULL || msgAuthId == NULL) {//若数据包不合法,则返回-1
        return -1;
    }
    if (strcmp(msgCmd, cmd) != 0) {//如果消息中命令与传入的命令不符,则返回-1
        return -1;
    }
    if (strcpy_s(conn->deviceId, sizeof(conn->deviceId), msgData) != EOK) {//将消息中的msgData拷贝给认证设备连接的设备id
        return -1;
    }
    if (strcpy_s(conn->authId, sizeof(conn->authId), msgAuthId) != EOK) {//将消息中的msgAuthId拷贝给认证设备连接的认证id
        return -1;
    }
    return 0;
}
/*函数功能:解析消息获取设备id(deviceId)和认证id(authId)*/
int MsgGetDeviceIdUnPack(const cJSON *msg, AuthConn *conn)
{
    if (msg == NULL || conn == NULL) {
        return -1;
    }
    int ret = MsgGetDeviceIdunpack(msg, conn, CMD_GET_AUTH_INFO);
    if (ret != 0) {
        return -1;
    }
    return 0;
}
/*函数功能:将deviceId打包成json格式的Get消息*/
cJSON *MsgGetDeviceIdPack(const DeviceInfo *devInfo)
{
    if (devInfo == NULL) {
        return NULL;
    }
    return MsgGetDeviceIdpack(devInfo, CMD_RET_AUTH_INFO);
}
/*
函数功能:打包验证IP的消息,封装成cJSON格式的消息
函数参数:
    connInfo:普通连接信息
    devInfo:本地设备信息
    authPort:认证端口
    sessionPort:会话端口
函数返回值:
    成功:返回封装好的cJSON格式的消息
    失败:返回NULL
详细:
*/
cJSON* MsgVerifyIpPack(const ConnInfo *connInfo, const DeviceInfo *devInfo, int authPort, int sessionPort)
{
    if (connInfo == NULL || devInfo == NULL) {
        return NULL;
    }
    cJSON *msg = cJSON_CreateObject();//创建一个cJSON对象
    if (msg == NULL) {
        return NULL;
    }
    if (cJSON_AddNumberToObject(msg, "CODE", CODE_VERIFY_IP) == NULL) {//添加成员"CODE"
        goto ERR_EXIT;
    }
    if (cJSON_AddNumberToObject(msg, "BUS_MAX_VERSION", connInfo->maxVersion) == NULL) {//添加成员"BUS_MAX_VERSION"
        goto ERR_EXIT;
    }
    if (cJSON_AddNumberToObject(msg, "BUS_MIN_VERSION", connInfo->minVersion) == NULL) {//添加成员"BUS_MIN_VERSION"
        goto ERR_EXIT;
    }
    if (cJSON_AddNumberToObject(msg, "AUTH_PORT", authPort) == NULL) {//添加成员"AUTH_PORT"
        goto ERR_EXIT;
    }
    if (cJSON_AddNumberToObject(msg, "SESSION_PORT", sessionPort) == NULL) {//添加成员"SESSION_PORT"
        goto ERR_EXIT;
    }
    if (cJSON_AddNumberToObject(msg, "CONN_CAP", DEVICE_CONN_CAP_WIFI) == NULL) {//添加成员"CONN_CAP"
        goto ERR_EXIT;
    }
    if (cJSON_AddStringToObject(msg, "DEVICE_NAME", devInfo->deviceName) == NULL) {//添加成员"DEVICE_NAME"
        goto ERR_EXIT;
    }
    if (cJSON_AddStringToObject(msg, "DEVICE_TYPE", DEVICE_TYPE_DEFAULT) == NULL) {//添加成员"DEVICE_TYPE"
        goto ERR_EXIT;
    }
    if (cJSON_AddStringToObject(msg, "DEVICE_ID", devInfo->deviceId) == NULL) {//添加成员"DEVICE_ID"
        goto ERR_EXIT;
    }
    if (cJSON_AddStringToObject(msg, "VERSION_TYPE", devInfo->version) == NULL) {//添加成员"VERSION_TYPE"
        goto ERR_EXIT;
    }
    return msg;
ERR_EXIT:
    if (msg != NULL) {
        cJSON_Delete(msg);
    }
    return NULL;
}
/*
函数功能:逐字段解析对端发送来的json消息,并更新相关属性结构体(如普通连接信息ConnInfo、认证连接信息AuthConn)
函数参数:
    msg:对端发送来的json格式的消息
    connInfo:设备连接信息
    conn:认证设备连接信息
函数返回值:
    成功:返回0
    失败:返回-1
详细:
*/
int MsgVerifyIpUnPack(const cJSON *msg, ConnInfo *connInfo, AuthConn *conn)
{
    if (msg == NULL || connInfo == NULL || conn == NULL) {
        return -1;
    }
    int maxVersion;
    if (GetJsonInt(msg, "BUS_MAX_VERSION", &maxVersion) != 0) {//获取消息中的最大总线版本号BUS_MAX_VERSION
        return -1;
    }
    int minVersion;
    if (GetJsonInt(msg, "BUS_MIN_VERSION", &minVersion) != 0) {//获取消息中的最小总线版本号BUS_MIN_VERSION
        return -1;
    }
    int connMaxVersion = connInfo->maxVersion;//获取当前连接的默认最大总线版本号
    int connMinVersion = connInfo->minVersion;
    if (maxVersion > connMaxVersion) {//如果对端最大总线版本号大于当前连接的默认最大总线版本号
        maxVersion = connMaxVersion;//赋予当前连接的默认最大总线版本号
    }
    if (minVersion < connMinVersion) {//如果对端最小总线版本号小于当前连接的默认最小总线版本号
        minVersion = connMinVersion;//赋予当前连接的默认最小总线版本号
    }
    conn->busVersion = maxVersion;//赋予认证连接的总线版本号为对端最大总线版本号
    connInfo->maxVersion = maxVersion;
    connInfo->minVersion = minVersion;
    char *deviceName = GetJsonString(msg, "DEVICE_NAME");//从消息中获取设备名DEVICE_NAME
    char *deviceType = GetJsonString(msg, "DEVICE_TYPE");//从消息中获取设备类型DEVICE_TYPE
    if (deviceName == NULL || deviceType == NULL) {
        return -1;
    }
    if (strcpy_s(connInfo->deviceName, sizeof(connInfo->deviceName), deviceName) != EOK) {//将设备名赋给普通连接信息结构体
        return -1;
    }
    if (strcpy_s(connInfo->deviceType, sizeof(connInfo->deviceType), deviceType) != EOK) {//将设备类型赋给普通连接信息结构体
        return -1;
    }
    if (GetJsonInt(msg, "AUTH_PORT", &(conn->authPort)) != 0) {//获取认证端口更新认证连接信息AuthConn
        return -1;
    }
    if (GetJsonInt(msg, "SESSION_PORT", &(conn->sessionPort)) != 0) {//获取会话端口更新认证连接信息AuthConn
        return -1;
    }
    return 0;
}
/*
函数功能:打包验证DeviceId的消息,封装成cJSON格式的消息
函数参数:
    info:本地设备信息
函数返回值:
    成功:返回封装好的cJSON格式的消息
    失败:返回NULL
详细:
*/
cJSON *MsgVerifyDeviceIdPack(DeviceInfo *info)
{
    if (info == NULL) {
        return NULL;
    }
    cJSON *msg = cJSON_CreateObject();//创建一个cJSON对象
    if (msg == NULL) {
        return NULL;
    }
    if (cJSON_AddNumberToObject(msg, "CODE", CODE_VERIFY_DEVID) == NULL) {//添加成员"CODE"
        cJSON_Delete(msg);
        return NULL;
    }
    if (cJSON_AddStringToObject(msg, "DEVICE_ID", info->deviceId) == NULL) {//添加成员"DEVICE_ID"
        cJSON_Delete(msg);
        return NULL;
    }
    return msg;
}

写在最后

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值