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. centos8使用hostnamectl管理主机名称

    一,查看hostnamectl所属的包: [root@yjweb ~]# whereis hostnamectl hostnamectl: /usr/bin/hostnamectl /usr/shar ...

  2. nginx配置laravel lumen重写

    location / { try_files $uri $uri/ /index.php?$query_string;}

  3. 正则匹配img标签 蜘蛛 爬取分析 新闻采集

    string ostr = "aaaaaa<img asddsa src=\"\" asddsasd />aaaaaaa<img src=\" ...

  4. 优化Mysql数据库的8个方法

    通过8个方法优化Mysql数据库:创建索引.复核索引.索引不会包含含有NULL值的列.使用短索引.排序的索引问题.like语句操作.不要在列上进行运算.不使用NOT  IN 和<>操作 1 ...

  5. python web自动化上传文件工具

    工具下载地址:链接:https://pan.baidu.com/s/1cHdNHW 密码:56bp说明:1.WinSpy-1.0.2.7z解压即可.2.pywin32的exe程序,根据自己安装的pyt ...

  6. 全网通4G工业路由器模块和串口转网口/4G/有线/WiFi/LTE模块的实现原理

    随着现在信息化的高速发展,网络信息的需求量大增,在移动的4G流量的场合比如汽车上实现WiFi网络覆盖,户外wifi网络覆盖需求下,4G流量已经明显不够用,而网线到达的成本比较大,难以管控.在这市场痛点 ...

  7. mybatis 架构及基础模块

    1. mybatis整体架构 基础支撑层详解 1.日志模块 mybatis日志模块没有实现类,需要接入第三方的组件,问题是第三方的组件有各自的log级别,为了能接入第三方组件,mybati日志模块定义 ...

  8. c#用于时间日期的类型:DateTime

    https://blog.csdn.net/qq_42675313/article/details/82155446 写的简洁易懂了

  9. mysql幻读、MVCC、间隙锁、意向锁(IX\IS)

    IO即性能 顺序主键写性能很高,由于B+树的结构,主键如果是顺序的,则磁盘页的数据会按顺序填充,减少数据移动,随机主键则可能由于记录移动产生很多io 查询二级索引时,会再根据主键id获取数据页,产生一 ...

  10. 利用数据库拿shell的一些姿势

    0x01.利用MySQL命令导出getshell 利用条件: 1.拥有网站的写入权限 2.Secure_file_priv参数为空或者为指定路径 3.知道网站的绝对路径 方法: 通过into outf ...