文章目录

  • 1 AT网络抽象层的实现

1 AT网络抽象层的实现

首先看一下代码架构:

为了使代码可以复用,我们可以将AT网络层进行抽象,头文件如下:
at_net.h:

#ifndef __AT_NET_H
#define __AT_NET_H#include <stdbool.h>typedef void (*mqtt_recv_callback)(char *topic,char *pdata,uint16_t data_len);typedef struct
{bool (*init)(void);bool (*deinit)(void);bool (*mqtt_connect)(char *server,uint16_t port,char *prokey,char *devname,char *devsecret);bool (*mqtt_disconnect)(void);bool (*mqtt_pub)(char *topic,char *mes,uint16_t mes_len);bool (*mqtt_sub)(char *topic);bool (*mqtt_unsub)(char *topic);bool (*mqtt_recv_register)(mqtt_recv_callback cb);
}at_net_dev_t;bool at_net_dev_register(at_net_dev_t *dev);
bool at_net_dev_unregister(void);bool at_net_init(void);
bool at_net_deinit(void);
bool at_net_mqtt_connect(char *server,uint16_t port,char *prokey,char *devname,char *devsecret);
bool at_net_mqtt_disconnect(void);
bool at_net_mqtt_pub(char *topic,char *mes,uint16_t mes_len);
bool at_net_mqtt_sub(char *topic);
bool at_net_mqtt_unsub(char *topic);
bool at_net_mqtt_recv_register(mqtt_recv_callback cb);#endif

at_net.c:

#include "main.h"
#include "at_net.h"static at_net_dev_t *m_dev=NULL;bool at_net_dev_register(at_net_dev_t *dev)
{if(m_dev!=NULL)return false;m_dev=dev;return true;
}
bool at_net_dev_unregister(void)
{if(m_dev==NULL)return true;m_dev->deinit();m_dev=NULL;return true;
}
bool at_net_init(void)
{if(m_dev==NULL)return false;if(m_dev->init==NULL)return false;return m_dev->init();
}
bool at_net_deinit(void)
{if(m_dev==NULL)return false;if(m_dev->deinit==NULL)return false;return m_dev->deinit();
}
bool at_net_mqtt_connect(char *server,uint16_t port,char *prokey,char *devname,char *devsecret)
{if(m_dev==NULL)return false;if(m_dev->mqtt_connect==NULL)return false;return m_dev->mqtt_connect(server,port,prokey,devname,devsecret);
}
bool at_net_mqtt_disconnect(void)
{if(m_dev==NULL)return false;if(m_dev->mqtt_disconnect==NULL)return false;return m_dev->mqtt_disconnect();
}
bool at_net_mqtt_pub(char *topic,char *mes,uint16_t mes_len)
{if(m_dev==NULL)return false;if(m_dev->mqtt_pub==NULL)return false;return m_dev->mqtt_pub(topic,mes,mes_len);
}
bool at_net_mqtt_sub(char *topic)
{if(m_dev==NULL)return false;if(m_dev->mqtt_sub==NULL)return false;return m_dev->mqtt_sub(topic);
}
bool at_net_mqtt_unsub(char *topic)
{if(m_dev==NULL)return false;if(m_dev->mqtt_unsub==NULL)return false;return m_dev->mqtt_unsub(topic);
}
bool at_net_mqtt_recv_register(mqtt_recv_callback cb)
{if(m_dev==NULL)return false;if(m_dev->mqtt_recv_register==NULL)return false;return m_dev->mqtt_recv_register(cb);
}

我们需要在dev_sim7020.c中添加如下结构体:

at_net_dev_t dev_sim7020={.init=sim7020_init,.deinit=sim7020_deinit,.mqtt_connect=sim7020_mqtt_connect,.mqtt_disconnect=sim7020_mqtt_disconnect,
};

测试代码如下:

/* USER CODE BEGIN Header_StartDefaultTask */
/*** @brief  Function implementing the defaultTask thread.* @param  argument: Not used* @retval None*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */float temp,humi;uint8_t write_buf[]="1234567890";uint8_t read_buf[20];uint16_t read_len;#define TEST_NAME 0X0001uint8_t buf[5];char reply_buf[30];uint16_t reply_len;debug_init();led_init();key_init();led_blink(2,5);sht30_init();//at_parse_init();//at_register_callback("+MQTT",test_callback,NULL);#define SERVER     "a1gPAyS0jai.iot-as-mqtt.cn-shanghai.aliyuncs.com"#define PRO_KEY     "a1gPAyS0jai"#define  DEV_NAME    "s0001"#define DEV_SECRET "abd7aff3aa5dd6a44d85ec03561c733c"at_net_dev_register(&dev_sim7020);at_net_init();at_net_mqtt_connect(SERVER,1883,PRO_KEY,DEV_NAME,DEV_SECRET);vTaskDelay(10000);at_net_mqtt_disconnect();for(;;){  // memset(reply_buf,0,30);// reply_len=30;// if(at_send_wait_reply("AT+CSQ",true,"+CSQ","ERROR",reply_buf,&reply_len,1000))// {//   DEBUG("-----recv %d,%s------",reply_len,reply_buf);// }//at_send_no_reply("AT",2,true,1000);//at_uart_send("12345\r\n",7,1000);// storage_write(TEST_NAME,sizeof(write_buf),write_buf);// memset(read_buf,0,20);// read_len=20;// if(storage_read(TEST_NAME,&read_len,read_buf))// {//   DEBUG("------%s-----",read_buf);// }// if(sht30_get_temp_humi(&temp,&humi))// {//   DEBUG("temp=%f,humi=%f",temp,humi);// }osDelay(1000);}/* USER CODE END StartDefaultTask */
}

AT网络抽象层的实现相关推荐

  1. Android网络编程系列 一 Socket抽象层

    在<Android网络编程>系列文章中,前面已经将Java的通信底层大致的描述了,在我们了解了TCP/IP通信族架构及其原理,接下来我们就开始来了解基于tcp/ip协议层的Socket抽象 ...

  2. 网络编程之网络架构及其演变过程、互联网与互联网的组成、OSI七层协议、socket抽象层...

    目录 网络架构及其演变过程 单机架构 CS架构 BS架构 BS架构和CS架构的区别 C/S架构的优缺点: B/S架构的优缺点: 互联网与互联网的组成 互联网的组成(教科书版) 互联网的组成(科普版) ...

  3. 网络七层协议 五层模型 TCP连接 HTTP连接 socket套接字

    socket(套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程 ...

  4. 网络通信原理与IP地址的分配原理,网络七层由下往上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层

    互联网协议入门 介绍:https://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html 每一层要进行通信,每一层都 ...

  5. AutoSar之微控制器抽象层MCAL

    微控制器抽象层位于AUTOSAR BSW的最底层,包含内部驱动,可直接访问微控制器和外设芯片.从具体应用来看,MCAL主要包括微控制器驱动.存储器驱动.通信驱动和输入输出驱动四个部分,各部分又由具体的 ...

  6. 深度解析dubbo网络传输层Transporter

    本文基于dubbo v2.6.x 1.传输层 dubbo网络传输层的一个介绍(dubbo 官方文档:链接): 抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 Cha ...

  7. 网络基础(二)OSI 网络七层各层功能 --难理解

    注:本文以书刊形式展示 Cisco七层协议,并不以知识点 经验为题,建议闲暇时间观看 OSI 网络七层协议(Open System Interconnection),简称OSI,是一个开放性的通行系统 ...

  8. 为第三方提供的功能做抽象层封装

    对第三方提供的功能做抽象层封装,这样可以极大的降低项目和第三方之间的耦合,出问题的时候或者替换第三方的时候可以比较简单的切换,而不是对着项目中的上千个引用点做替换. 比如,电话会议,我们使用云视通.华 ...

  9. linux网络全局 之 含网络七层模型

    原文链接:https://blog.csdn.net/qq_28090573/article/details/89351234 一.网络七层模型 1.OSI的来源 OSI(Open System In ...

最新文章

  1. 每日一皮:我以为的工作量 VS 实际上的工作量
  2. 分析模式:可复用的对象模型学习笔记
  3. 【学习笔记】高等数据基础
  4. 深度学习与TensorFlow:VGG论文复现
  5. java tcp发消息给硬件_服务器可以使用TCP向客户端发送消息吗?
  6. MySQL 字段内容区分大小写
  7. scikit-learn机器学习常用算法原理及编程实战(五)
  8. java基础:8.1 异常
  9. poj 1958 Strange Towers of Hanoi dp,需要仔细读题
  10. SoberGGG对针式PKM的初次测评
  11. 人脸识别数据集---CAS-PEAL-R1
  12. 使用机器学习构建简单金融风控反欺诈模型(一)EDA+XGBOOST
  13. 【SSD目标检测】3:训练自己的数据集
  14. 需求分析及技术方案设计
  15. mysql中的eeplace,mysql必知必会笔记
  16. 基于内容的垃圾邮件过滤
  17. Java——反射(reflection)详解
  18. 耶耶!我进了全国网络管理员前50了
  19. 360如何查看计算机配置文件,win7中怎么查看路由器配置文件config.bin
  20. iOS打包错误The operation couldn’t be completed. (AppThinning.StubError error 1.)

热门文章

  1. 计算机网络word文档,计算机网络word.doc
  2. c语言鼠标下棋,c语言写的鼠标操作的五子棋游戏,欢迎观赏!
  3. 几种替代MATLAB的工具,堪称完美!
  4. 嵌入式系统 Boot Loader 技术内幕-目前看到介绍Boot loader最通俗明了的文章
  5. 计算机中,文本文件和二进制文件的区别
  6. 慕课网_《RabbitMQ消息中间件极速入门与实战》学习总结
  7. scrapy proxy and user_agent
  8. js怎么获取访问页数记录(知道的能不能告诉我一下)
  9. python leetcode 1
  10. 马哥笔记-mysql