日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AT网络抽象层的实现

發布時間:2025/4/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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网络抽象层的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。