一、概述
从本文开始,将介绍在HiChain机制中如何处理本端接收到的数据及其响应对端的过程。这个过程的入口函数为receive_data,在receive_data函数中,主要分为三个阶段:消息解析阶段、消息处理阶段和通知对端阶段,本文的重点是总体分析receive_data函数,然后对消息解析阶段的部分内容进行分析。
二、源码分析
这一模块的源码位于:/base/security/deviceauth。
- receive_data函数的整体分析:
/*
函数功能:HiChain处理接收到的消息数据
函数参数:
handle:HiChain实例对象,这里其实是void *类型
data:待处理的的消息数据
函数返回值:
成功:返回0
失败:返回其他
*/
DLL_API_PUBLIC int32_t receive_data(hc_handle handle, struct uint8_buff *data)
{
LOGI("Begin receive data");
check_ptr_return_val(handle, HC_INPUT_ERROR);//检查实例对象是否为空
check_ptr_return_val(data, HC_INPUT_ERROR);//检查数据是否为空
check_ptr_return_val(data->val, HC_INPUT_ERROR);//检查数据地址是否为空
LOGI("Receive data from peer");
struct hichain *hichain = (struct hichain *)handle;//定义局部变量接收该hichain实例
struct message receive = {
0, 0, 0 };//初始化接收消息体
struct message send = {
INFORM_MESSAGE, 0, 0 };//初始化发送消息体
void *send_data = NULL;//声明发送消息的地址
uint32_t send_data_len = 0;
int32_t ret = deserialize_message(data, &receive);//反序列化/无序化消息,即解析data原始消息内容,封装成格式化的消息保存在receive指向的地址空间中,通过执行对应消息码类型的解析函数进行解析
if (ret != HC_OK) {
goto inform;
}
struct header_analysis nav = navigate_message(receive.msg_code);//导航消息,根据消息码查表,得到 "消息模块-消息类型(消息码低四位)-是否请求消息" 一一对应的格式
ret = check_message_support(hichain, &nav, &receive);//检查消息是否可支持,解析出操作码,并与消息码进行对应,检查是否一致
if (ret != HC_OK) {
goto inform;
}
//若消息合法且系统可支持,则继续
ret = build_object(hichain, nav.modular, !nav.is_request_msg, NULL);//构建HC子对象,根据nav.is_request_msg判断是否属于客户端
if (ret != HC_OK) {
goto inform;
}
ret = proc_message(hichain, &nav, &receive, &send);//根据modular和is_request_msg查询全局分布式消息表,找到对应的消息处理函数并执行
if (ret != HC_OK) {
goto inform;
}
ret = connect_message(hichain, &nav, &send);//连接消息
inform:<