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不是面向对象语言,可以用于开发基于对象或面向对象的嵌入式系统。