C語言設計模式(自我揣摩)

NBModule.h服務器

#ifndef _NBMODULEFRAME_H__
#define _NBMODULEFRAME_H__


#include "total.h"



enum NBModuleStat_Enum
{
    SuccessStat = 0,
    WillOpClPowerStat,  // 須要關機開機解決的狀態
    WillResetStat,           // 須要復位解決的狀態
    OpreErrorStat          //  操做模組錯誤屢次,解救不回來,再也不操做
};


typedef struct NBModuleData_S
{
    char iccid[21];   // iccid
    char csq;         // 信號質量
    char RegMobileNetState;     // 註冊基站狀態   1成功 0失敗
    char ConnectMqttState;      // mqtt鏈接狀態 1是成功 0 失敗
}NBModuleData_S;


typedef struct NBModuleFrame_S
{
    uint8_t commonfunc_num;
    uint8_t PowerControlNum;                // 電源開關機控制次數
    uint8_t MaxPowerControlNum;             // 最大電源開關機次數
    uint8_t ResetControlNum;                // 復位次數
    uint8_t MaxResetControlNum;             // 容許最大的復位次數

    int16_t (*GprsMqttSetUp)(struct NBModuleFrame_S *pNBModule);      // 組網與mqtt創建過程
    int16_t (*OpenModulePower)(void);       // 開電源
    int16_t (*CloseModulePower)(void);      // 關電源
    int16_t (*ResetModule)(void);           // 復位
    int16_t (*CommonFunc[6])(void);         // 普通聯網過程
    int16_t (*MqttConfig)(void);
    int16_t (*MqttOpen)(void);
    int16_t (*MqttSub)(void);
    int16_t (*MqttPub)(uint8_t *mutual_buf, uint16_t mutual_len, char *pubTopic);
}NBModuleFrame_S;



uint8_t NBModuleFrame_S_Init(struct NBModuleFrame_S *NBModule);


extern struct NBModuleData_S g_NBModuleData;    // NB模組數據導爲全局


#endif

 

NBModule.c網絡

#include "NBModuleFrame.h"


struct NBModuleData_S g_NBModuleData;


/*************************************
 *
 * Funciton Name     : OpenModulePower_F
 * Function          : 模組開機
 *
 *
 *************************************/
static int16_t OpenModulePower_F(void)
{
return SuccessStat;
}

/*************************************
 *
 * Funciton Name     : CloseModulePower_F
 * Function          : 模組關機
 *
 *
 *************************************/
static int16_t CloseModulePower_F(void)
{

    return SuccessStat;
}

/*************************************
 *
 * Funciton Name     : ResetModule_F
 * Function          : 復位模組
 *
 *
 *************************************/
static int16_t ResetModule_F(void)
{
return SuccessStat;
}

/*************************************
 *
 * Funciton Name     : ATCmd_F
 * Function          : AT命令
 *
 *
 *************************************/
static int16_t ATCmd_F(void)
{
   return WillOpClPowerStat;
}

/*************************************
 *
 * Funciton Name     : ATEcho_F
 * Function          : 關回顯
 *
 *
 *************************************/
static int16_t ATEcho_F(void)
{
    return WillOpClPowerStat;
}

/*************************************
 *
 * Funciton Name     : ATICCID_F
 * Function          : 查詢ICCID
 *
 *
 *************************************/
static int16_t ATICCID_F(void)
{
   return WillOpClPowerStat;
}

/*************************************
 *
 * Funciton Name     : ATCgreg_F
 * Function          : 查詢注網是否成功
 *
 *
 *************************************/
static int16_t ATCgreg_F(void)
{
   return WillOpClPowerStat;
}

/*************************************
 *
 * Funciton Name     : ATCsq_F
 * Function          : 查詢信號質量
 *
 *
 *************************************/
static int16_t ATCsq_F(void)
{
   return WillOpClPowerStat;
}



/*************************************
 *
 * Funciton Name     : ATMqttConfig_F
 * Function          : 配置鏈接Mqtt的服務器IP端口、客戶端ID(NB_Client_ICCID)、
 *                    300keeplive、user、password、clean(1:客戶端段線時服務器丟棄客戶端信息)、encrypt(0不加密)
 *
 *
 *************************************/
static int16_t ATMqttConfig_F(void)
{
return WillOpClPowerStat;
}

/*************************************
 *
 * Funciton Name     : ATMqttOpen_F
 * Function          
 *
 *
 *************************************/
static int16_t ATMqttOpen_F(void)
{
 return WillOpClPowerStat;
}

/*************************************
 *
 * Funciton Name     : ATMqttSub_F
 * Function          : 
 *************************************/
static int16_t ATMqttSub_F(void)
{
  return WillOpClPowerStat;
}


/*************************************
 *
 * Funciton Name     : ATMqttPub_F
 * Function          
 *
 *************************************/
static int16_t ATMqttPub_F(uint8_t *mutual_buf, uint16_t mutual_len, char *pubTopic)
{
   return SuccessStat;
}

/*************************************
 *
 * Funciton Name     : GprsMqttSetUp_F
 * Function          : 模組網絡創建過程
 *
 *
 *************************************/
static int16_t GprsMqttSetUp_F(struct NBModuleFrame_S *pNBModule)
{
    uint8_t Fori = 0;
    int16_t ret = 0;


    
    pNBModule->OpenModulePower();       // 開機
    pNBModule->PowerControlNum = 0;
    pNBModule->ResetControlNum = 0;

GoExe:
    for ( Fori = 0; Fori < pNBModule->commonfunc_num; Fori++ )
    {
        ret = pNBModule->CommonFunc[Fori]();

        if ( ret == WillOpClPowerStat )    // 須要開關機解決
        {
            if ( pNBModule->PowerControlNum++ >= pNBModule->MaxPowerControlNum ) // 超過最大容許的開關機次數
            {
                return OpreErrorStat;
            }

            pNBModule->CloseModulePower();  // 關機

            
            pNBModule->OpenModulePower();   // 開機

            Fori = 0;
        }
        else if ( ret == WillResetStat )    // 須要復位解決
        {
            if ( pNBModule->ResetControlNum++ >= pNBModule->MaxResetControlNum ) // 超過最大容許的復位次數
            {
                return OpreErrorStat;
            }

            Fori = 0;
    
            // 復位
            pNBModule->ResetModule();
        }
    }

    ret = pNBModule->MqttConfig();

    if ( ret == WillOpClPowerStat )
    {
        if ( pNBModule->PowerControlNum++ >= pNBModule->MaxPowerControlNum ) // 超過最大容許的開關機次數
        {
            return OpreErrorStat;
        }

        pNBModule->CloseModulePower();  // 關機
        

        pNBModule->OpenModulePower();   // 開機

        goto GoExe;
    }
    else if ( ret == WillResetStat )
    {
        if ( pNBModule->ResetControlNum++ >= pNBModule->MaxResetControlNum ) // 超過最大容許的復位次數
        {
            return OpreErrorStat;
        }

        // 復位
        pNBModule->ResetModule();

        goto GoExe;
    }


    ret = pNBModule->MqttOpen();

    if ( ret == WillOpClPowerStat )
    {
        if ( pNBModule->PowerControlNum++ >= pNBModule->MaxPowerControlNum ) // 超過最大容許的開關機次數
        {
            return OpreErrorStat;
        }

        pNBModule->CloseModulePower();  // 關機
        

        pNBModule->OpenModulePower();   // 開機

        goto GoExe;
    }
    else if ( ret == WillResetStat )
    {
        if ( pNBModule->ResetControlNum++ >= pNBModule->MaxResetControlNum ) // 超過最大容許的復位次數
        {
            return OpreErrorStat;
        }

        // 復位
        pNBModule->ResetModule();

        goto GoExe;
    }

    ret = pNBModule->MqttSub();

    if ( ret == WillOpClPowerStat )
    {
        if ( pNBModule->PowerControlNum++ >= pNBModule->MaxPowerControlNum ) // 超過最大容許的開關機次數
        {
            return OpreErrorStat;
        }

        pNBModule->CloseModulePower();  // 關機


        pNBModule->OpenModulePower();   // 開機

        goto GoExe;
    }
    else if ( ret == WillResetStat )
    {
        if ( pNBModule->ResetControlNum++ >= pNBModule->MaxResetControlNum ) // 超過最大容許的復位次數
        {
            return OpreErrorStat;
        }

        // 復位
        pNBModule->ResetModule();

        goto GoExe;
    }
    else if ( ret == SuccessStat )
    {
        return SuccessStat;
    }


    return OpreErrorStat;
}


uint8_t NBModuleFrame_S_Init(struct NBModuleFrame_S *NBModule)
{
    uint8_t index = 0;
    
    NBModule->MaxPowerControlNum = 3;
    NBModule->MaxResetControlNum = 3;
    NBModule->PowerControlNum = 0;
    NBModule->ResetControlNum = 0;


    NBModule->CommonFunc[index++] = ATCmd_F;
    NBModule->CommonFunc[index++] = ATEcho_F;
    NBModule->CommonFunc[index++] = ATICCID_F;
    NBModule->CommonFunc[index++] = ATCgreg_F;
    NBModule->CommonFunc[index++] = ATCsq_F;
    //NBModule->CommonFunc[index++] = ATCMDNS_F;

    NBModule->OpenModulePower = OpenModulePower_F;
    NBModule->CloseModulePower = CloseModulePower_F;
    NBModule->ResetModule = ResetModule_F;
    
    NBModule->MqttConfig = ATMqttConfig_F;
    NBModule->MqttOpen = ATMqttOpen_F;
    NBModule->MqttSub = ATMqttSub_F;
    NBModule->MqttPub = ATMqttPub_F;

    NBModule->GprsMqttSetUp = GprsMqttSetUp_F;

    NBModule->commonfunc_num = index;
    
    return index;
}

 

main.c框架

int main(void)
{
            struct NBModuleFrame_S NBModule;     // NB模組框架
            int16_t ret = 0;
            
            memset(&NBModule, 0, sizeof(struct NBModuleFrame_S));

            NBModuleFrame_S_Init(&NBModule);
            
            // 聯網過程
            ret = NBModule.GprsMqttSetUp(&NBModule);
            
            
            if ( ret == SuccessStat )
            {
                     printf("Success\r\n");      
            }
    
}

 

面向對象的方法將二者結合,當低耦合時,爲固有緊密耦合的元素和內容的封裝提升內聚力。C不是面嚮對象語言,能夠用於開發基於對象或面向對象的嵌入式系統。ui

相關文章
相關標籤/搜索