往期知识点记录:
- 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
- 【OpenHarmony】鸿蒙南向开发保姆级知识点汇总~
- OpenHarmony源码分析之分布式软总线:trans_service模块(1)/认证通道管理
- OpenHarmony源码分析之分布式软总线:trans_service模块(2)/会话管理之新会话
- OpenHarmony源码分析之分布式软总线:trans_service模块(3)/线程同步锁管理
- OpenHarmony源码分析之分布式软总线:trans_service模块(4)/TCP会话管理
- OpenHarmony源码分析之分布式软总线:trans_service模块(5)/TCP会话管理
- OpenHarmony源码分析之分布式软总线:trans_service模块(6)/TCP会话管理
- OpenHarmony源码分析之分布式软总线:trans_service/message.c文件分析
- OpenHarmony源码分析之分布式软总线:trans_service/tcp_session.c
- OpenHarmony源码分析之分布式软总线:msg_get_deviceid.c文件分析
- 持续更新中……
一、概述
该文件代码的功能主要是提供以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🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新学习资源,请看下图提示: