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不是面向对象语言,可以用于开发基于对象或面向对象的嵌入式系统。
C语言设计模式(自我揣摩)的更多相关文章
- Go语言设计模式之函数式选项模式
Go语言设计模式之函数式选项模式 本文主要介绍了Go语言中函数式选项模式及该设计模式在实际编程中的应用. 为什么需要函数式选项模式? 最近看go-micro/options.go源码的时候,发现了一段 ...
- 学习java23种设计模式自我总结
首先先做个广告,以前看过@maowang 这位大神转的Java开发中的23种设计模式详解(转) ,但是看了之后都忘差不多了, 所以,开个帖子边学习边自我总结(纯手敲).一直以来像这种需要长久的运动,真 ...
- C语言设计模式-封装-继承-多态
快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...
- Go语言设计模式实践:迭代器(Iterator)
关于本系列 决定开个新坑. 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只 ...
- Go语言设计模式实践:组合(Composite)
关于本系列 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只能靠看标准库源代 ...
- Go语言设计模式汇总
目录 设计模式背景和起源 设计模式是什么 Go语言模式分类 个人观点 Go语言从面世就受到了业界的普遍关注,随着区块链的火热Go语言的地位也急速蹿升,为了让读者对设计模式在Go语言中有一个初步的了解和 ...
- C语言设计模式
一 .C语言和设计模式(继承.封装.多态) C++有三个最重要的特点,即继承.封装.多态.我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性. ( ...
- java设计模式自我总结---代理模式
代理模式是给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,通俗的来讲代理模式就是我们生活中常见的中介. Spring 的AOP面向切面就是使用动态代理模式来实现的: 打个比方说:我要买房 ...
- java设计模式自我总结---适配器模式
上一篇博客说完了 java 23 中设计模式中的五种 创建性模式,由于篇幅过长,新开一贴今天开始学习结构型模式, 结构型模式包括以下七种:适配器模式.装饰模式.代理模式.外观模式.桥接模式.组合模式. ...
随机推荐
- lumen发送邮件配置
composer.json 增加 "illuminate/mail":"5.6"composer update -vvvconfig 目录新建mail.php ...
- centos8平台使用loginctl管理登录用户与session
一,loginctl的用途: 控制 systemd 登录管理器 管理当前登录的用户和session 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/a ...
- C# Webservice中如何实现方法重载--(方法名同名时出现的问题)
本文摘抄自:http://blog.sina.com.cn/s/blog_53b720bb0100voh3.html 1.Webservice中的方法重载问题(1)在要重载的WebMethod上打个M ...
- Git高级使用教程
Git 与 SVN 区别 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的 ...
- zctf2016_note2:一个隐蔽的漏洞点挖掘
代码量挺大的,逆起来有难度 功能挺全,啥都有 main函数 add函数,有heaparray并且无pie保护,考虑unlink show函数,可以泄漏地址用 edit函数,有两种edit方式 dele ...
- Java8新特性探索之Lambda表达式
为什么引入Lambda表达式? Lambda 表达式产生函数,而不是类. 在 JVM(Java Virtual Machine,Java 虚拟机)上,一切都是一个类,因此在幕后执行各种操作使 lamb ...
- 撸个反向代理,激活JRebel~
持续原创输出,点击上方蓝字关注我 目录 前言 本地反向代理 服务器反向代理[个人推荐] IDEA安装JRebel并激活 服务器安装JRebel并激活 总结 前言 热部署相信大家都听说过,比如Sprin ...
- Linux 系统编程 学习:11-线程:线程同步
Linux 系统编程 学习:11-线程:线程同步 背景 上一讲 我们介绍了线程的属性 有关设置.这一讲我们来看线程之间是如何同步的. 额外安装有关的man手册: sudo apt-get instal ...
- JAVA学习线路:day14-网络编程
心得: 我是一名正在自学的java的即将毕业的大学生 总结笔记是为了让自己更好的理解和加深印象.可能不是那么美观,自己可以看懂就好 所有的文档和源代码都开源在GitHub: https://githu ...
- 排序算法—快速排序(Quick Sort)
快速排序(Quick Sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. ...