其他分享
首页 > 其他分享> > OpenHarmony之分布式软总线nstackx_common分析

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