AT网络抽象层的实现
文章目录
- 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网络抽象层的实现相关推荐
- Android网络编程系列 一 Socket抽象层
在<Android网络编程>系列文章中,前面已经将Java的通信底层大致的描述了,在我们了解了TCP/IP通信族架构及其原理,接下来我们就开始来了解基于tcp/ip协议层的Socket抽象 ...
- 网络编程之网络架构及其演变过程、互联网与互联网的组成、OSI七层协议、socket抽象层...
目录 网络架构及其演变过程 单机架构 CS架构 BS架构 BS架构和CS架构的区别 C/S架构的优缺点: B/S架构的优缺点: 互联网与互联网的组成 互联网的组成(教科书版) 互联网的组成(科普版) ...
- 网络七层协议 五层模型 TCP连接 HTTP连接 socket套接字
socket(套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程 ...
- 网络通信原理与IP地址的分配原理,网络七层由下往上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层
互联网协议入门 介绍:https://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html 每一层要进行通信,每一层都 ...
- AutoSar之微控制器抽象层MCAL
微控制器抽象层位于AUTOSAR BSW的最底层,包含内部驱动,可直接访问微控制器和外设芯片.从具体应用来看,MCAL主要包括微控制器驱动.存储器驱动.通信驱动和输入输出驱动四个部分,各部分又由具体的 ...
- 深度解析dubbo网络传输层Transporter
本文基于dubbo v2.6.x 1.传输层 dubbo网络传输层的一个介绍(dubbo 官方文档:链接): 抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 Cha ...
- 网络基础(二)OSI 网络七层各层功能 --难理解
注:本文以书刊形式展示 Cisco七层协议,并不以知识点 经验为题,建议闲暇时间观看 OSI 网络七层协议(Open System Interconnection),简称OSI,是一个开放性的通行系统 ...
- 为第三方提供的功能做抽象层封装
对第三方提供的功能做抽象层封装,这样可以极大的降低项目和第三方之间的耦合,出问题的时候或者替换第三方的时候可以比较简单的切换,而不是对着项目中的上千个引用点做替换. 比如,电话会议,我们使用云视通.华 ...
- linux网络全局 之 含网络七层模型
原文链接:https://blog.csdn.net/qq_28090573/article/details/89351234 一.网络七层模型 1.OSI的来源 OSI(Open System In ...
最新文章
- 每日一皮:我以为的工作量 VS 实际上的工作量
- 分析模式:可复用的对象模型学习笔记
- 【学习笔记】高等数据基础
- 深度学习与TensorFlow:VGG论文复现
- java tcp发消息给硬件_服务器可以使用TCP向客户端发送消息吗?
- MySQL 字段内容区分大小写
- scikit-learn机器学习常用算法原理及编程实战(五)
- java基础:8.1 异常
- poj 1958 Strange Towers of Hanoi dp,需要仔细读题
- SoberGGG对针式PKM的初次测评
- 人脸识别数据集---CAS-PEAL-R1
- 使用机器学习构建简单金融风控反欺诈模型(一)EDA+XGBOOST
- 【SSD目标检测】3:训练自己的数据集
- 需求分析及技术方案设计
- mysql中的eeplace,mysql必知必会笔记
- 基于内容的垃圾邮件过滤
- Java——反射(reflection)详解
- 耶耶!我进了全国网络管理员前50了
- 360如何查看计算机配置文件,win7中怎么查看路由器配置文件config.bin
- iOS打包错误The operation couldn’t be completed. (AppThinning.StubError error 1.)
热门文章
- 计算机网络word文档,计算机网络word.doc
- c语言鼠标下棋,c语言写的鼠标操作的五子棋游戏,欢迎观赏!
- 几种替代MATLAB的工具,堪称完美!
- 嵌入式系统 Boot Loader 技术内幕-目前看到介绍Boot loader最通俗明了的文章
- 计算机中,文本文件和二进制文件的区别
- 慕课网_《RabbitMQ消息中间件极速入门与实战》学习总结
- scrapy proxy and user_agent
- js怎么获取访问页数记录(知道的能不能告诉我一下)
- python leetcode 1
- 马哥笔记-mysql