OpenHarmony之分布式软总线nstackx_common分析
作者:互联网
前言
coap_service.c代码中基本上每个接口函数都调用了nstackx_common.c中的接口,最终nstackx_common.c中的接口函数再调用coap_discover.c中的接口函数。所以coap_service.c中的接口函数是对外提供的顶层接口,分析过程也是从顶层宏观调用到下层实现细节。
代码分析
初始过程中有三种状态:初始化开始,初始化进行中,初始化完成。
1 enum { 2 NSTACKX_INIT_STATE_START = 0, 3 NSTACKX_INIT_STATE_ONGOING, 4 NSTACKX_INIT_STATE_DONE, 5 };
其中使用一个8位无符号数来表示初始化过程中状态的变化static uint8_t g_nstackInitState = NSTACKX_INIT_STATE_START;
coap服务发现初始化时调用了NSTACKX_Init
1 /* 2 函数功能: 为coao发现前期初始化 3 函数参数: 无 4 函数返回值: 成功或者已经初始化返回0,否则返回非零 5 详细: 6 1.首先设置初始化状态为初始化正在进行 7 2.调用cJSON_InitHooks为cJSON提供malloc, realloc和free函数(使用默认malloc,free) 8 3.调用CoapInitDiscovery,初始化coap发现的参数和结构(coap socket g_serverFd message id,coap wifi 事件,消息队列线程,coap监听线程) 9 4.上述过程成功之后,要将初始状态设置初始化完成,否则就需要调用NSTACKX_Deinit恢复为原始状态 10 */ 11 int NSTACKX_Init() 12 { 13 int ret; 14 if (g_nstackInitState != NSTACKX_INIT_STATE_START) { 15 return NSTACKX_EOK; 16 } 17 g_nstackInitState = NSTACKX_INIT_STATE_ONGOING; 18 //为cJSON提供malloc, realloc和free函数 19 cJSON_InitHooks(NULL); 20 ret = CoapInitDiscovery(); 21 if (ret != NSTACKX_EOK) { 22 goto L_ERR_INIT; 23 } 24 g_nstackInitState = NSTACKX_INIT_STATE_DONE; 25 return NSTACKX_EOK; 26 //如果上述一步出错那么就需要恢复为原始状态 27 L_ERR_INIT: 28 ret = NSTACKX_Deinit(); 29 if (ret != NSTACKX_EOK) { 30 SOFTBUS_PRINT("[DISCOVERY] deinit fail\n"); 31 } 32 return NSTACKX_EFAILED; 33 }
设备注册与服务数据注册
1 /* 2 函数功能: 注册设备 3 函数参数: 4 1.localDeviceInfo: 本地设备信息 5 2. deviceHash : 设备hash 6 函数返回值: 成功返回0,否则非零 7 详细: 8 1. 判断是否已经初始化完毕了 9 2、 判断本地设备信息是否为空 10 3、 使用localDeviceInfo配置本地设备信息g_localDeviceInfo 11 4、 设置设备Hash 12 */ 13 int NSTACKX_RegisterDeviceAn(const NSTACKX_LocalDeviceInfo *localDeviceInfo, uint64_t deviceHash) 14 { 15 //如果还没初始化完成 16 if (g_nstackInitState != NSTACKX_INIT_STATE_DONE) { 17 return NSTACKX_EFAILED; 18 } 19 //本地设备信息为空 20 if (localDeviceInfo == NULL) { 21 return NSTACKX_EINVAL; 22 } 23 //配置本地设备信息 24 if (ConfigureLocalDeviceInfo(localDeviceInfo) != NSTACKX_EOK) { 25 return NSTACKX_EINVAL; 26 } 27 //设置设备的哈希值 28 SetDeviceHash(deviceHash); 29 return NSTACKX_EOK; 30 } 31 /* 32 函数功能: 初始化之后需要去设置设备功能 33 函数参数: 34 1.capabilityBitmapNum : 功能数量 35 2. capabilityBitmap : 保存了功能位图 36 函数返回值: 成功返回0,否则返回非零 37 详细 : 38 1. 判断是否已经初始化完毕了 39 2. 判断功能数量是否大于设备所可以拥有的最大功能数量 40 3. 调用RegisterCapability,去设置设备功能 41 */ 42 int NSTACKX_RegisterCapability(uint32_t capabilityBitmapNum, const uint32_t capabilityBitmap[]) 43 { 44 if (g_nstackInitState != NSTACKX_INIT_STATE_DONE) { 45 return NSTACKX_EFAILED; 46 } 47 if (capabilityBitmapNum > NSTACKX_MAX_CAPABILITY_NUM) { 48 return NSTACKX_EINVAL; 49 } 50 if (RegisterCapability(capabilityBitmapNum, capabilityBitmap) != NSTACKX_EOK) { 51 return NSTACKX_EINVAL; 52 } 53 return NSTACKX_EOK; 54 } 55 /* 56 函数功能:设置设备服务数据 57 函数参数: 58 serviceData: 服务数据 59 函数返回值: 成功返回0,否则返回非零 60 详细: 61 1. 检查服务数据是否为空 62 2. 检查设备是否已经初始化完毕 63 3. 检查服务数据长度是否大于最大服务数据长度 64 4. 调用RegisterServiceData,设置g_localDeviceInfo中的serviceData 65 */ 66 int NSTACKX_RegisterServiceData(const char* serviceData) 67 { 68 if (serviceData == NULL) { 69 return NSTACKX_EINVAL; 70 } 71 //如果设备初始化过了 72 if (g_nstackInitState != NSTACKX_INIT_STATE_DONE) { 73 return NSTACKX_EFAILED; 74 } 75 //服务数据长度 76 unsigned int serviceLen = strlen(serviceData); 77 if (serviceLen >= NSTACKX_MAX_SERVICE_DATA_LEN) { 78 return NSTACKX_EINVAL; 79 } 80 if (RegisterServiceData(serviceData, serviceLen + 1) != NSTACKX_EOK) { 81 return NSTACKX_EINVAL; 82 } 83 return NSTACKX_EOK; 84 }
标签:OpenHarmony,return,初始化,EOK,nstackx,STATE,INIT,NSTACKX,common 来源: https://www.cnblogs.com/zjra/p/16353120.html