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 中设计模式中的五种 创建性模式,由于篇幅过长,新开一贴今天开始学习结构型模式, 结构型模式包括以下七种:适配器模式.装饰模式.代理模式.外观模式.桥接模式.组合模式. ...
随机推荐
- spring cloud:搭建基于consul的服务提供者集群(spring cloud hoxton sr8 / spring boot 2.3.4)
一,搭建基于consul的服务提供者集群 1,consul集群,共3个实例: 2, 服务提供者集群:共2个实例: 3,服务消费者:一个实例即可 4,consul集群的搭建,请参考: https://w ...
- spring boot:spring security用mysql数据库实现RBAC权限管理(spring boot 2.3.1)
一,用数据库实现权限管理要注意哪些环节? 1,需要生成spring security中user类的派生类,用来保存用户id和昵称等信息, 避免页面上显示用户昵称时需要查数据库 2,如果需要在页面上显示 ...
- 第二十五章 ansible基础
一.Ansible概述 1.什么是Ansible Ansible是一个自动化统一配置管理工具,自动化主要体现在Ansible集成了丰富模块以及功能组件,可以通过一个命令完成一系列的操作,进而能减少重复 ...
- Java 8新特性--Stream API
Java 8 API添加了一个新的抽象称为流Stream,以一种声明的方式处理数据,可以极大提高程序员的生产力,写出高效.干净.简洁的代码.这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可 ...
- JS常用事件的总结
JS常用事件的总结 outsbumit 表单提交事件 onload 页面加载事件 onclick 鼠标单击某个对象事件 ondblclick 鼠标双击某个对象事件 on ...
- pandas dataframe 时间字段 diff 函数
pandas pandas 是数据处理的利器,非常方便进行表格数据处理,用过的人应该都很清楚,没接触的可以自行查阅pandas 官网. 需求介绍 最近在使用 pandas 的过程中碰到一个问题,需要计 ...
- 码农会锁,synchronized 对象头结构(mark-word、Klass Pointer)、指针压缩、锁竞争,源码解毒、深度分析!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 感觉什么都不会,从哪开始呀! 这是最近我总能被问到的问题,也确实是.一个初入编程职场 ...
- 【Flutter 混合开发】添加 Flutter 到 Android Fragment
Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...
- drf 路由生成
前言 在drf中,我们写接口可以通过继承modelViewSet从而达到非常快速的功能实现,这十分的方便,但是modelViewSet由于需要根据不同的参数来对应不同的处理,所以我们写的url最少都需 ...
- JWT安装配置
1.1 安装JWT pip install djangorestframework-jwt==1.11.0 1.2 syl/settings.py 配置jwt载荷中的有效期设置 import date ...