OpenHarmony之分布式软总线coap服务发现初始化
前言
coap_service.c这个文件是在设备启动时,为设备服务发现进行前期初始化并且负责注册设备信息和服务。初始化包括coap socket、消息队列线程、监听线程等。初始化之后就可以注册功能服务啦。下面来分析coap_service.c具体是如何做前期准备的。
代码分析
Coap服务发现初始化,这是调用NSTACKX_Init进行的,之后详细分析
1 /* 2 函数功能: coap初始化,为服务发现做准备 3 函数参数:无 4 函数返回值: 成功返回0,否则返回-1 5 详细: 6 1.调用NSTACKX_Init,去初始cJSON_HOOK使其提供malloc, realloc和free函数,初始服务发现所需数据和结构,比如coap socket g_serverFd message id,wifi事件,消息队列等 7 */ 8 int CoapInit(void) 9 { 10 int ret = NSTACKX_Init(); 11 if (ret != 0) { 12 SOFTBUS_PRINT("[DISCOVERY] CoapInit NSTACKX_Init fail\n"); 13 return ERROR_FAIL; 14 } 15 return ERROR_SUCCESS; 16 }
本地设备信息的注册
1 /* 2 函数功能: 注册设备信息 3 函数参数: 无 4 函数返回: 成功返回0, 失败返回非0 5 详细: 6 1. 声明NSTACKX_LocalDeviceInfo 结构体并为其初始化 7 2. 使用CoapGetLocalDeviceInfo获取设备信息 ,信息保存在之前声明的NSTACKX_LocalDeviceInfo结构体 8 3. 使用localDeviceInfo配置g_localDeviceInfo,并用DEV_HASH_ID设置g_localDeviceInfo->deviceHash 9 */ 10 int CoapRegisterDeviceInfo(void) 11 { 12 NSTACKX_LocalDeviceInfo localDeviceInfo; 13 int ret; 14 (void)memset_s(&localDeviceInfo, sizeof(NSTACKX_LocalDeviceInfo), 0, sizeof(NSTACKX_LocalDeviceInfo)); 15 // 得到设备信息 16 ret = CoapGetLocalDeviceInfo(&localDeviceInfo); 17 if (ret != 0) { 18 return ERROR_FAIL; 19 } 20 //使用localDeviceInfo配置g_localDeviceInfo,并用DEV_HASH_ID设置g_localDeviceInfo->deviceHash 21 ret = NSTACKX_RegisterDeviceAn(&localDeviceInfo, DEV_HASH_ID); 22 if (ret != 0) { 23 SOFTBUS_PRINT("[DISCOVERY] CoapRegisterDeviceInfo RegisterDeviceAn fail\n"); 24 return ERROR_FAIL; 25 } 26 return ERROR_SUCCESS; 27 }
设备默认服务注册
1 /* 2 函数功能:注册设备默认服务 3 函数参数:无 4 函数返回值:成功返回0,否则返回非零 5 详细: 6 1. 获取设备信息 7 2. 声明一个char数组,长度为默认服务最大的数据长度,并初始化为0 8 3. 将info->devicePort 以 port:info->devicePort格式,输入到serviceData 9 4. 调用NSTACKX_RegisterServiceData 去注册设备服务,最终会保存在g_localDeviceInfo.serviceData 10 */ 11 int CoapRegisterDefualtService(void) 12 { 13 //获取设备信息 14 DeviceInfo *info = GetCommonDeviceInfo(); 15 if (info == NULL) { 16 return ERROR_FAIL; 17 } 18 //默认服务数据 最长16字节,设备可以有的最长服务数据64字节 19 char serviceData[MAX_DEFAULT_SERVICE_DATA_LEN] = {0}; 20 // 21 if (sprintf_s(serviceData, sizeof(serviceData), "port:%d", info->devicePort) == -1) { 22 return ERROR_FAIL; 23 } 24 //设备注册服务数据 25 return NSTACKX_RegisterServiceData(serviceData); 26 }
如果不是默认服务,就进行给定服务注册
1 /* 2 函数功能:注册服务(设备功能) 3 函数参数: 4 1. capabilityBitmap : 功能位图数组 5 2. length: capabilityBitmap数组长度 6 3. capabilityData : 功能数据 7 函数返回值:成功返回0,否则非零 8 详细: 9 1.检查capabilityData和capabilityBitmap是否为空 10 2.注册设备功能,最终会用capbilityBitmap设置g_localDeviceInfo.capabilityBitmap 11 3.注册服务(功能)数据,最终会保存在g_localDeviceInfo.serviceData中 12 */ 13 int CoapRegistService(const unsigned int capabilityBitmap[], int length, const char* capabilityData) 14 { 15 if (capabilityData == NULL || capabilityBitmap == NULL) { 16 return ERROR_INVALID; 17 } 18 if (NSTACKX_RegisterCapability(MAX_CAPABILITY_NUM, capabilityBitmap) != 0) { 19 SOFTBUS_PRINT("[DISCOVERY] CoapRegistService RegisterCapability fail\n"); 20 return ERROR_CAPABLITY_FAIL; 21 } 22 if (NSTACKX_RegisterServiceData(capabilityData) != 0) { 23 return ERROR_SERVICEDATA_FAIL; 24 } 25 (void)length; 26 return ERROR_SUCCESS; 27 }
分类:
OpenHarmony
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)