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. spring cloud:搭建基于consul的服务提供者集群(spring cloud hoxton sr8 / spring boot 2.3.4)

    一,搭建基于consul的服务提供者集群 1,consul集群,共3个实例: 2, 服务提供者集群:共2个实例: 3,服务消费者:一个实例即可 4,consul集群的搭建,请参考: https://w ...

  2. spring boot:spring security用mysql数据库实现RBAC权限管理(spring boot 2.3.1)

    一,用数据库实现权限管理要注意哪些环节? 1,需要生成spring security中user类的派生类,用来保存用户id和昵称等信息, 避免页面上显示用户昵称时需要查数据库 2,如果需要在页面上显示 ...

  3. 第二十五章 ansible基础

    一.Ansible概述 1.什么是Ansible Ansible是一个自动化统一配置管理工具,自动化主要体现在Ansible集成了丰富模块以及功能组件,可以通过一个命令完成一系列的操作,进而能减少重复 ...

  4. Java 8新特性--Stream API

    Java 8 API添加了一个新的抽象称为流Stream,以一种声明的方式处理数据,可以极大提高程序员的生产力,写出高效.干净.简洁的代码.这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可 ...

  5. JS常用事件的总结

    JS常用事件的总结 outsbumit     表单提交事件 onload     页面加载事件 onclick     鼠标单击某个对象事件 ondblclick     鼠标双击某个对象事件 on ...

  6. pandas dataframe 时间字段 diff 函数

    pandas pandas 是数据处理的利器,非常方便进行表格数据处理,用过的人应该都很清楚,没接触的可以自行查阅pandas 官网. 需求介绍 最近在使用 pandas 的过程中碰到一个问题,需要计 ...

  7. 码农会锁,synchronized 对象头结构(mark-word、Klass Pointer)、指针压缩、锁竞争,源码解毒、深度分析!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 感觉什么都不会,从哪开始呀! 这是最近我总能被问到的问题,也确实是.一个初入编程职场 ...

  8. 【Flutter 混合开发】添加 Flutter 到 Android Fragment

    Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...

  9. drf 路由生成

    前言 在drf中,我们写接口可以通过继承modelViewSet从而达到非常快速的功能实现,这十分的方便,但是modelViewSet由于需要根据不同的参数来对应不同的处理,所以我们写的url最少都需 ...

  10. JWT安装配置

    1.1 安装JWT pip install djangorestframework-jwt==1.11.0 1.2 syl/settings.py 配置jwt载荷中的有效期设置 import date ...