本文将继续分析设备之间的身份认证过程的相关细节,主要是针对数据包类型为MODULE_CONNECTION的处理过程。主要源代码在wifi_auth_manager.c文件的函数OnModuleMessageReceived()中。
/*
函数功能:处理接收到的消息,解析并按规则回复给对端
函数参数:
conn:设备连接信息
seq:数据包序列号
msg:cJSON格式的数据包负载消息
函数返回值:无
详细:
*/
void OnMessageReceived(AuthConn *conn, long long seq, const cJSON *msg)
{
if (conn == NULL || msg == NULL) {
return;
}
SOFTBUS_PRINT("[AUTH] OnMessageReceived begin\n");
//获取json指定的对象成员"CODE"
cJSON *codeJson = cJSON_GetObjectItem(msg, "CODE");
//判断codeJson是否为数字类型的成员,如果不是,就直接返回
if ((codeJson == NULL) || (!cJSON_IsNumber(codeJson))) {
return;
}
int code = codeJson->valueint;//取出json中的值
switch (code) {
case CODE_VERIFY_IP: {
OnVerifyIp(conn, seq, msg);//处理"验证IP"请求消息并回复对端
break;
}
case CODE_VERIFY_DEVID: {
OnVerifyDeviceId(conn, seq, msg);//处理"验证DeviceId"请求消息并回复对端
break;
}
default:
break;
}
}
/*
函数功能:处理"验证IP"请求消息并回复对端
函数参数:
conn:认证连接信息
seq:数据包序列号
request:请求消息的内容
函数返回值:无
详细:
*/
void OnVerifyIp(AuthConn *conn, long long seq, const cJSON *request)
{
if (conn == NULL || request == NULL) {
return;
}
DeviceInfo *localDevInfo = BusGetLocalDeviceInfo();//获取本地设备信息
if (localDevInfo == NULL) {
return;
}
ConnInfo connInfo = {0};
connInfo.maxVersion = BUS_V2;//总线版本
connInfo.minVersion = BUS_V2;
//解析请求消息,更新普通连接信息结构体和认证连接结构体
int ret = MsgVerifyIpUnPack(request, &connInfo, conn);
if (ret != 0) {
return;
}
//构造回复验证IP的消息
cJSON *reply = MsgVerifyIpPack(&connInfo, localDevInfo, g_authPort, g_sessionPort);
if (reply == NULL) {
return;
}
//构造/封装身份认证Post消息并发送给对端,MODULE_CONNECTION表示请求认证连接(暂定)
ret = AuthConnPostMessage(conn->fd, MODULE_CONNECTION, FLAG_REPLY, seq, reply);
cJSON_Delete(reply);
reply = NULL;
if (ret != 0) {
return;
}
conn->onlineState = ONLINE_YES;//将该认证连接的在线状态改为:在线
SOFTBUS_PRINT("[AUTH] OnVerifyIp ok\n");
}
/*
函数功能:处理"验证DeviceId"请求消息并回复对端
函数参数:
conn:认证连接信息
seq:数据包序列号
request:请求消息的内容
函数返回值:无
详细:
*/
void OnVerifyDeviceId(const AuthConn *conn, long long seq, const cJSON *request)
{
if (conn == NULL || request == NULL) {
return;
}
char *deviceId = GetJsonString(request, "DEVICE_ID");//获取消息中的设备id
if (deviceId == NULL) {
return;
}
DeviceInfo *info = BusGetLocalDeviceInfo();//获取本地设备信息
if (info == NULL) {
return;
}
//打包"验证DeviceId"回复消息,封装成cJSON格式的回复消息
cJSON *reply = MsgVerifyDeviceIdPack(info);
if (reply == NULL) {
return;
}
//构造/封装身份认证Post消息并发送给对端,MODULE_CONNECTION表示请求认证连接(暂定)
(void)AuthConnPostMessage(conn->fd, MODULE_CONNECTION, FLAG_REPLY, seq, reply);
cJSON_Delete(reply);
reply = NULL;
SOFTBUS_PRINT("[AUTH] OnVerifyDeviceId ok\n");
return;
}
至此,设备之间的身份可信认证过程基本结束。