OpenHarmony之分布式软总线discovery_service.c(三)

48 阅读2分钟
/*
    函数功能:wifi事件触发器
*/
void WifiEventTrigger(unsigned int para)
{
    //获取设备信息
    DeviceInfo *localDev = GetCommonDeviceInfo();
    if (localDev == NULL) {
        return;
    }
    int ret;
    if (para) {
        //wifi IP
        char wifiIp[MAX_DEV_IP_LEN] = {0};
        CoapGetIp(wifiIp, MAX_DEV_IP_LEN, 0);   //获取设备连接wifi后ip 地址
        if (strcmp(wifiIp, "0.0.0.0") == 0) {
            SOFTBUS_PRINT("[DISCOVERY] WifiEventTrigger new event interupt.\n");
            return;
        }
        ret = memcpy_s(localDev->deviceIp, sizeof(localDev->deviceIp), wifiIp, sizeof(wifiIp));  //使用wifi ip 设置 deviceIP
    } else {
        ret = memset_s(localDev->deviceIp, sizeof(localDev->deviceIp), 0, sizeof(localDev->deviceIp));
    }
    if (ret != ERROR_SUCCESS) {
        return;
    }
    //启动软总线
    if (BusManager(para) != ERROR_SUCCESS) {
        SOFTBUS_PRINT("[DISCOVERY] WifiEventTrigger StartBusManager(%d) fail\n", para);
        return;
    }
   //注册设备信息
    if (CoapRegisterDeviceInfo() != ERROR_SUCCESS) {
        SOFTBUS_PRINT("[DISCOVERY] WifiEventTrigger CoapRegisterDeviceInfo fail\n");
        return;
    }
    //注册服务
    if (DoRegistService(COAP) != ERROR_SUCCESS) {
        SOFTBUS_PRINT("[DISCOVERY] WifiEventTrigger DoRegistService fail\n");
        return;
    }
}
/*
    函数功能:撤销服务
    函数参数: 无
    函数返回值: 成功返回0,否则非0
    详细:
        1.首先关闭软总线
        2.释放g_publishModule,g_capabilityData
        3.释放有关coap的信息
        4.将wifi回调函数设置为NULL
        5.释放设备信息
        6.将服务初始化标志设置为0
*/
int DeinitService(void)
{
    int ret = BusManager(0);
    if (ret != ERROR_SUCCESS) {
        SOFTBUS_PRINT("[DISCOVERY] DeinitService BusManager(0) fail\n");
    }
    if (g_publishModule) {
        free(g_publishModule);
        g_publishModule = NULL;
    }
    if (g_capabilityData) {
        free(g_capabilityData);
        g_capabilityData = NULL;
    }
    ret = CoapDeinit();
    if (ret != ERROR_SUCCESS) {
        SOFTBUS_PRINT("[DISCOVERY] DeinitService CoapDeinit fail\n");
    }
    RegisterWifiCallback(NULL);
    DeinitCommonManager();
    g_isServiceInit = 0;
    return ERROR_SUCCESS;
}
/*
    函数功能:初始化服务
    函数参数: 无
    函数返回值: 成功返回0,否则非0
    详细:
        1.设备服务是否已经初始化过
        2.初始化设备信息
        3.为发布模块分配存储空间
        4.为功能数据分配存储空间
        5.注册wifi回调函数
        6.初始化coap相关参数 Cjson钩子 消息id,套接字等
        7.将IP更新事件写入到消息队列中
        8.注册设备信息
        9.将初始化标记置为1
*/
int InitService(void)
{   
    //设备服务是否初始化
    if (g_isServiceInit != 0) {
        return ERROR_SUCCESS;
    }
    //初始化设备信息
    if (InitCommonManager() != 0) {
        SOFTBUS_PRINT("[DISCOVERY] InitService InitCommonManager fail\n");
        DeinitService();
        return ERROR_FAIL;
    }
    //为发布服务模块分配存储空间
    g_publishModule = calloc(1, sizeof(PublishModule) * MAX_MODULE_COUNT);
    if (g_publishModule == NULL) {
        DeinitService();
        return ERROR_NOMEMORY;
    }
    //为各个发布模块功能数据分配空间
    g_capabilityData = calloc(1, MAX_SERVICE_DATA_LEN);
    if (g_capabilityData == NULL) {
        DeinitService();
        return ERROR_NOMEMORY;
    }
    //注册wifi回调函数,就是成功连入wifi后做的操作
    RegisterWifiCallback(WifiEventTrigger);
    int ret = CoapInit(); //初始化coap
    if (ret != ERROR_SUCCESS) {
        SOFTBUS_PRINT("[DISCOVERY] InitService CoapInit fail\n");
        DeinitService();
        return ret;
    }
    CoapWriteMsgQueue(UPDATE_IP_EVENT);
    ret = CoapRegisterDeviceInfo();
    if (ret != ERROR_SUCCESS) {
        SOFTBUS_PRINT("[DISCOVERY] InitService CoapRegisterDeviceInfo fail\n");
        DeinitService();
        return ret;
    }
    //将设备服务初始化标志设为1
    g_isServiceInit = 1;
    SOFTBUS_PRINT("[DISCOVERY] InitService ok\n");
    return ERROR_SUCCESS;
}