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

C语言设计模式(自我揣摩)的更多相关文章

  1. Go语言设计模式之函数式选项模式

    Go语言设计模式之函数式选项模式 本文主要介绍了Go语言中函数式选项模式及该设计模式在实际编程中的应用. 为什么需要函数式选项模式? 最近看go-micro/options.go源码的时候,发现了一段 ...

  2. 学习java23种设计模式自我总结

    首先先做个广告,以前看过@maowang 这位大神转的Java开发中的23种设计模式详解(转) ,但是看了之后都忘差不多了, 所以,开个帖子边学习边自我总结(纯手敲).一直以来像这种需要长久的运动,真 ...

  3. C语言设计模式-封装-继承-多态

    快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...

  4. Go语言设计模式实践:迭代器(Iterator)

    关于本系列 决定开个新坑. 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只 ...

  5. Go语言设计模式实践:组合(Composite)

    关于本系列 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只能靠看标准库源代 ...

  6. Go语言设计模式汇总

    目录 设计模式背景和起源 设计模式是什么 Go语言模式分类 个人观点 Go语言从面世就受到了业界的普遍关注,随着区块链的火热Go语言的地位也急速蹿升,为了让读者对设计模式在Go语言中有一个初步的了解和 ...

  7. C语言设计模式

    一 .C语言和设计模式(继承.封装.多态) C++有三个最重要的特点,即继承.封装.多态.我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性. ( ...

  8. java设计模式自我总结---代理模式

    代理模式是给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,通俗的来讲代理模式就是我们生活中常见的中介. Spring 的AOP面向切面就是使用动态代理模式来实现的: 打个比方说:我要买房 ...

  9. java设计模式自我总结---适配器模式

    上一篇博客说完了 java 23 中设计模式中的五种 创建性模式,由于篇幅过长,新开一贴今天开始学习结构型模式, 结构型模式包括以下七种:适配器模式.装饰模式.代理模式.外观模式.桥接模式.组合模式. ...

随机推荐

  1. Harbor 安装教程

    Harbor 安装教程 一. CentOS设置 1. 更换阿里源 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com ...

  2. Python函数递归调用

    函数的递归调用: 是函数嵌套调用的一种特殊形式 具体是指: 在调用一个函数的过程中又直接或间接地调用到了本身 # 直接调用本身 def func(): print('我是func') func() f ...

  3. collection v1.3.1升级全记录

    collection v1.3.1升级全记录 项目地址: https://github.com/jianfengye/collection 欢迎star. collection 手册地址: http: ...

  4. react-native中textInput在androidTV上的焦点处理(坑篇)

    react-native中,开发androidTV输入框的焦点处理. 复述流程: 安卓TV上,无法通过上下左右键,以及遥控器的上下左右来获取输入框焦点. 原因: 脸书的锅,但没修,这里官方的说法,Te ...

  5. SQL注入的一些学习

    -------------------------------------- 这是我之前发布到的其他的一个网址,这里的话我重新总结 可能分很多,我也不是很清楚,只是皮毛的研究了一下 1,sql按数据库 ...

  6. Redis---07主从复制(哨兵模式)

    一.什么是哨兵模式 基于主从复制的一般模式(一主二从)下,当发生主机发生宕机时,会通过流言协议判断主机是不是宕机,是的话则会通过投票协议自动把某一个从机转换成主机. 二.设置哨兵模式的配置文件 通过r ...

  7. plc模拟量采集模块的作用

    在工业控制中,某些输入量(如压力.温度.流量.转速等)是连续变化的模拟量,某些执行机构(如伺服电动机.调节阀.记录仪等)要求PLC输出模拟信号,而PLC的CPU只能处理数字量.模拟量首先被传感器和变送 ...

  8. python使用redis缓存数据库

    Redis 关注公众号"轻松学编程"了解更多. Windows下直接解压可用,链接:https://pan.baidu.com/s/1rD4ujoN7h96TtHSu3sN_hA ...

  9. twoSum问题的核心思想

    Two Sum 系列问题在 LeetCode 上有好几道,这篇文章就挑出有代表性的几道,介绍一下这种问题怎么解决. TwoSum I 这个问题的最基本形式是这样:给你一个数组和一个整数 target, ...

  10. hashmap源码面试分析

    HashMap源码问题解析 问: 说一说对hash的理解 答: hash是对任意长度的输入输出为相同长度的输出 问: hash算法的问题 答: hash冲突问题 问: hash冲突是否可以避免 答: ...