多個單片機簡單通訊框架

文章目錄

  • 一、場景描述
  • 二、框架搭建
      • 設計思路
      • 通信協議設計
      • 2號單片機通訊框架
      • 框架優化建議
  • 三、2號單片機的通訊框架如何處理消息丟失和重傳?
      • 消息丟失與重傳機制設計
      • 改進的通信協議
      • 重傳機制實現
      • 關鍵機制說明
      • 優化建議

一、場景描述

有3個單片機進行通訊,分別為1號,2號,3號。
1號與2號可以通訊,2號與3號可以通訊。

那么如果1號想通過2號,與3號進行通訊。

如何搭建2號的通訊框架,保證1號的通訊能夠及時給3號,同時3號也能及時應答給1號。使用串口通訊,協議自定

二、框架搭建

設計思路

為了實現三個單片機之間的可靠中繼通信,2號單片機需要設計一個高效的通訊框架。關鍵在于如何處理串口接收、消息轉發和應答機制,同時保證消息的實時性和可靠性。

通信協議設計

首先需要定義一個簡單但功能完整的通信協議:

消息格式: [SOF][源地址][目標地址][消息ID][長度][數據][CRC]- SOF: 起始字節 (0xAA)- 源地址: 發送方ID (1,2,3)- 目標地址: 接收方ID (1,2,3)- 消息ID: 標識消息類型 (0x01-命令, 0x02-數據, 0x03-應答)- 長度: 數據字段長度- 數據: 消息內容- CRC: 校驗字節

2號單片機通訊框架

下面是2號單片機的通訊框架實現,使用狀態機處理消息接收,使用雙緩沖區實現消息轉發:

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>// 定義系統常量
#define SOF             0xAA
#define DEVICE_ID_1     0x01
#define DEVICE_ID_2     0x02
#define DEVICE_ID_3     0x03// 消息類型定義
#define MSG_CMD         0x01
#define MSG_DATA        0x02
#define MSG_ACK         0x03// 消息緩沖區大小
#define MAX_MSG_LENGTH  64
#define BUFFER_SIZE     5// 消息結構體
typedef struct {uint8_t src_addr;uint8_t dst_addr;uint8_t msg_id;uint8_t length;uint8_t data[MAX_MSG_LENGTH];uint8_t crc;
} Message;// 接收狀態機枚舉
typedef enum {RX_STATE_IDLE,RX_STATE_SOF,RX_STATE_SRC,RX_STATE_DST,RX_STATE_MSGID,RX_STATE_LENGTH,RX_STATE_DATA,RX_STATE_CRC
} RxState;// 全局變量
static Message rx_buffer[BUFFER_SIZE];
static Message tx_buffer[BUFFER_SIZE];
static uint8_t rx_head = 0;
static uint8_t rx_tail = 0;
static uint8_t tx_head = 0;
static uint8_t tx_tail = 0;
static RxState rx_state = RX_STATE_IDLE;
static uint8_t rx_index = 0;
static uint8_t crc_calculated = 0;// 串口初始化函數
void UART1_Init(void) {// 配置1號串口(與1號單片機通信)// 波特率、中斷等配置
}void UART2_Init(void) {// 配置2號串口(與3號單片機通信)// 波特率、中斷等配置
}// CRC校驗計算
uint8_t calculate_crc(uint8_t *data, uint8_t length) {uint8_t crc = 0;for (uint8_t i = 0; i < length; i++) {crc ^= data[i];}return crc;
}// 發送消息函數
void send_message(Message *msg, uint8_t uart_id) {uint8_t buffer[MAX_MSG_LENGTH + 6];uint8_t index = 0;buffer[index++] = SOF;buffer[index++] = msg->src_addr;buffer[index++] = msg->dst_addr;buffer[index++] = msg->msg_id;buffer[index++] = msg->length;for (uint8_t i = 0; i < msg->length; i++) {buffer[index++] = msg->data[i];}buffer[index++] = calculate_crc(buffer, index);// 根據uart_id選擇發送串口if (uart_id == 1) {// 通過UART1發送buffer} else {// 通過UART2發送buffer}
}// 1號串口接收中斷處理函數
void UART1_RX_IRQHandler(void) {uint8_t data = UART1_ReadByte();switch (rx_state) {case RX_STATE_IDLE:if (data == SOF) {rx_state = RX_STATE_SOF;crc_calculated = data;}break;case RX_STATE_SOF:rx_buffer[rx_head].src_addr = data;rx_state = RX_STATE_SRC;crc_calculated ^= data;break;case RX_STATE_SRC:rx_buffer[rx_head].dst_addr = data;rx_state = RX_STATE_DST;crc_calculated ^= data;break;case RX_STATE_DST:rx_buffer[rx_head].msg_id = data;rx_state = RX_STATE_MSGID;crc_calculated ^= data;break;case RX_STATE_MSGID:rx_buffer[rx_head].length = data;rx_state = RX_STATE_LENGTH;crc_calculated ^= data;rx_index = 0;break;case RX_STATE_LENGTH:rx_buffer[rx_head].data[rx_index++] = data;crc_calculated ^= data;if (rx_index >= rx_buffer[rx_head].length) {rx_state = RX_STATE_CRC;}break;case RX_STATE_CRC:if (data == crc_calculated) {// 消息接收成功,加入接收緩沖區rx_head = (rx_head + 1) % BUFFER_SIZE;}rx_state = RX_STATE_IDLE;break;}
}// 3號串口接收中斷處理函數(與UART1_RX_IRQHandler類似)
void UART2_RX_IRQHandler(void) {// 實現類似UART1_RX_IRQHandler的邏輯// 將接收到的消息存入rx_buffer
}// 主循環中的消息處理函數
void process_messages(void) {Message msg;// 處理從1號單片機接收的消息while (rx_tail != rx_head) {msg = rx_buffer[rx_tail];// 如果消息是給3號的,轉發到3號if (msg.dst_addr == DEVICE_ID_3) {// 修改源地址為2號msg.src_addr = DEVICE_ID_2;send_message(&msg, 2);  // 通過UART2發送到3號}// 如果消息是給1號的(來自3號的應答),轉發到1號else if (msg.dst_addr == DEVICE_ID_1) {// 修改源地址為2號msg.src_addr = DEVICE_ID_2;send_message(&msg, 1);  // 通過UART1發送到1號}rx_tail = (rx_tail + 1) % BUFFER_SIZE;}
}// 主函數
int main(void) {UART1_Init();UART2_Init();// 啟用中斷UART1_EnableIRQ();UART2_EnableIRQ();while (1) {// 處理消息轉發process_messages();// 其他任務// ...}
}

框架優化建議

  1. 優先級機制:為緊急消息設置高優先級,優先處理和轉發。

  2. 流量控制:當緩沖區滿時,發送忙信號給發送方,防止消息丟失。

  3. 超時重傳:對重要消息實現超時重傳機制,確保消息可靠傳輸。

  4. 狀態監控:添加通信狀態監控,統計消息收發成功率,便于故障排查。

  5. 中斷處理優化:盡量減少中斷處理時間,關鍵數據復制到緩沖區后盡快退出中斷。

通過以上設計,2號單片機可以高效地實現1號和3號之間的消息中繼,同時保證通信的實時性和可靠性。

三、2號單片機的通訊框架如何處理消息丟失和重傳?

消息丟失與重傳機制設計

為了處理消息丟失和實現可靠重傳,2號單片機的通訊框架需要增加確認機制、超時處理和消息緩存功能。以下是具體實現方案:

改進的通信協議

在原有協議基礎上增加序列號和確認應答:

消息格式: [SOF][源地址][目標地址][消息ID][序列號][長度][數據][CRC]- 序列號: 8位遞增數字(0-255),用于標識消息- 確認應答(ACK)格式: [SOF][源地址][目標地址][MSG_ACK][序列號][0][CRC]

重傳機制實現

以下是改進后的2號單片機通訊框架代碼,增加了消息緩存和重傳機制:

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>// 定義系統常量
#define SOF             0xAA
#define DEVICE_ID_1     0x01
#define DEVICE_ID_2     0x02
#define DEVICE_ID_3     0x03// 消息類型定義
#define MSG_CMD         0x01
#define MSG_DATA        0x02
#define MSG_ACK         0x03// 消息緩沖區大小
#define MAX_MSG_LENGTH  64
#define TX_BUFFER_SIZE  10
#define RX_BUFFER_SIZE  10
#define MAX_RETRIES     3
#define RETRY_TIMEOUT   100  // 毫秒// 消息結構體
typedef struct {uint8_t src_addr;uint8_t dst_addr;uint8_t msg_id;uint8_t seq_num;uint8_t length;uint8_t data[MAX_MSG_LENGTH];uint8_t crc;uint32_t timestamp;  // 發送時間戳uint8_t retries;     // 重試次數bool awaiting_ack;   // 是否等待確認
} Message;// 接收狀態機枚舉
typedef enum {RX_STATE_IDLE,RX_STATE_SOF,RX_STATE_SRC,RX_STATE_DST,RX_STATE_MSGID,RX_STATE_SEQ,RX_STATE_LENGTH,RX_STATE_DATA,RX_STATE_CRC
} RxState;// 全局變量
static Message tx_buffer[TX_BUFFER_SIZE];  // 發送緩沖區(用于重傳)
static Message rx_buffer[RX_BUFFER_SIZE];  // 接收緩沖區
static uint8_t tx_head = 0;
static uint8_t tx_tail = 0;
static uint8_t rx_head = 0;
static uint8_t rx_tail = 0;
static RxState rx_state = RX_STATE_IDLE;
static uint8_t rx_index = 0;
static uint8_t crc_calculated = 0;
static uint8_t next_seq_num = 0;  // 下一個發送的序列號// 串口初始化函數
void UART1_Init(void) {// 配置1號串口(與1號單片機通信)// 波特率、中斷等配置
}void UART2_Init(void) {// 配置2號串口(與3號單片機通信)// 波特率、中斷等配置
}// CRC校驗計算
uint8_t calculate_crc(uint8_t *data, uint8_t length) {uint8_t crc = 0;for (uint8_t i = 0; i < length; i++) {crc ^= data[i];}return crc;
}// 發送消息函數
void send_message(Message *msg, uint8_t uart_id, bool store_for_retry) {uint8_t buffer[MAX_MSG_LENGTH + 7];uint8_t index = 0;buffer[index++] = SOF;buffer[index++] = msg->src_addr;buffer[index++] = msg->dst_addr;buffer[index++] = msg->msg_id;buffer[index++] = msg->seq_num;buffer[index++] = msg->length;for (uint8_t i = 0; i < msg->length; i++) {buffer[index++] = msg->data[i];}buffer[index++] = calculate_crc(buffer, index);// 根據uart_id選擇發送串口if (uart_id == 1) {// 通過UART1發送buffer} else {// 通過UART2發送buffer}// 如果需要存儲用于重傳if (store_for_retry && msg->msg_id != MSG_ACK) {// 復制消息到發送緩沖區memcpy(&tx_buffer[tx_head], msg, sizeof(Message));tx_buffer[tx_head].timestamp = get_current_time();  // 獲取當前時間tx_buffer[tx_head].retries = 0;tx_buffer[tx_head].awaiting_ack = true;tx_head = (tx_head + 1) % TX_BUFFER_SIZE;}
}// 1號串口接收中斷處理函數
void UART1_RX_IRQHandler(void) {uint8_t data = UART1_ReadByte();switch (rx_state) {case RX_STATE_IDLE:if (data == SOF) {rx_state = RX_STATE_SOF;crc_calculated = data;}break;// 其他狀態處理...(與之前類似)case RX_STATE_CRC:if (data == crc_calculated) {// 消息接收成功,加入接收緩沖區if (rx_buffer[rx_head].msg_id == MSG_ACK) {// 處理確認應答,標記對應消息已確認process_ack(&rx_buffer[rx_head]);} else {// 普通消息,轉發并發送本地ACKforward_message(&rx_buffer[rx_head]);send_ack(rx_buffer[rx_head].src_addr, rx_buffer[rx_head].seq_num);}rx_head = (rx_head + 1) % RX_BUFFER_SIZE;}rx_state = RX_STATE_IDLE;break;}
}// 3號串口接收中斷處理函數
void UART2_RX_IRQHandler(void) {// 與UART1_RX_IRQHandler類似,處理來自3號的消息
}// 處理確認應答
void process_ack(Message *ack) {uint8_t index = tx_tail;while (index != tx_head) {if (tx_buffer[index].awaiting_ack && tx_buffer[index].seq_num == ack->seq_num &&tx_buffer[index].dst_addr == ack->src_addr) {// 標記消息已確認tx_buffer[index].awaiting_ack = false;break;}index = (index + 1) % TX_BUFFER_SIZE;}
}// 轉發消息
void forward_message(Message *msg) {Message forward_msg;memcpy(&forward_msg, msg, sizeof(Message));if (msg->dst_addr == DEVICE_ID_3) {// 轉發到3號forward_msg.src_addr = DEVICE_ID_2;send_message(&forward_msg, 2, true);} else if (msg->dst_addr == DEVICE_ID_1) {// 轉發到1號forward_msg.src_addr = DEVICE_ID_2;send_message(&forward_msg, 1, true);}
}// 發送確認應答
void send_ack(uint8_t dst_addr, uint8_t seq_num) {Message ack_msg;ack_msg.src_addr = DEVICE_ID_2;ack_msg.dst_addr = dst_addr;ack_msg.msg_id = MSG_ACK;ack_msg.seq_num = seq_num;ack_msg.length = 0;if (dst_addr == DEVICE_ID_1) {send_message(&ack_msg, 1, false);} else {send_message(&ack_msg, 2, false);}
}// 檢查并重傳超時消息
void check_and_retransmit(void) {uint32_t current_time = get_current_time();uint8_t index = tx_tail;while (index != tx_head) {if (tx_buffer[index].awaiting_ack && (current_time - tx_buffer[index].timestamp > RETRY_TIMEOUT)) {// 檢查重試次數if (tx_buffer[index].retries >= MAX_RETRIES) {// 達到最大重試次數,處理失敗handle_transmission_failure(&tx_buffer[index]);tx_buffer[index].awaiting_ack = false;} else {// 重傳消息tx_buffer[index].retries++;tx_buffer[index].timestamp = current_time;if (tx_buffer[index].dst_addr == DEVICE_ID_1) {send_message(&tx_buffer[index], 1, false);} else {send_message(&tx_buffer[index], 2, false);}}}index = (index + 1) % TX_BUFFER_SIZE;}// 清理已確認的消息while (tx_tail != tx_head && !tx_buffer[tx_tail].awaiting_ack) {tx_tail = (tx_tail + 1) % TX_BUFFER_SIZE;}
}// 處理傳輸失敗
void handle_transmission_failure(Message *msg) {// 可以實現錯誤日志記錄或通知上層應用
}// 獲取當前時間(偽代碼,需根據實際硬件實現)
uint32_t get_current_time(void) {// 返回系統時間(毫秒)return 0;
}// 主循環中的消息處理函數
void process_messages(void) {// 檢查并重傳超時消息check_and_retransmit();// 處理接收緩沖區中的消息while (rx_tail != rx_head) {// 處理消息...rx_tail = (rx_tail + 1) % RX_BUFFER_SIZE;}
}// 主函數
int main(void) {UART1_Init();UART2_Init();// 啟用中斷UART1_EnableIRQ();UART2_EnableIRQ();while (1) {// 處理消息轉發和重傳process_messages();// 其他任務// ...}
}

關鍵機制說明

  1. 序列號管理

    • 每個消息分配唯一序列號(0-255循環)
    • 用于識別重復消息和匹配ACK應答
  2. 確認應答機制

    • 接收方收到消息后發送ACK應答
    • ACK包含原始消息的序列號
    • 發送方維護待確認消息列表
  3. 超時重傳

    • 設置合理的超時時間(RETRY_TIMEOUT)
    • 超過時間未收到ACK則重傳
    • 限制最大重試次數(MAX_RETRIES)
  4. 消息緩存

    • 使用環形緩沖區存儲待確認消息
    • 消息包含發送時間戳和重試次數

優化建議

  1. 滑動窗口協議

    • 擴展當前實現,支持多消息并發發送
    • 增加窗口大小參數,提高吞吐量
  2. 動態超時調整

    • 根據網絡狀況動態調整超時時間
    • 實現往返時間(RTT)測量
  3. 流量控制

    • 當發送緩沖區滿時拒絕接收新消息
    • 實現基于窗口的流量控制機制
  4. 錯誤恢復

    • 實現序列號回滾機制
    • 處理序列號溢出情況

通過以上機制,2號單片機可以有效處理消息丟失問題,確保1號和3號之間的通信可靠性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87219.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87219.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87219.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在服務區已有預裝鏡像的情況下管理自己的包

你的需求非常明確&#xff1a;希望利用 NGC 鏡像預裝的主環境包&#xff08;如 PyTorch、CUDA&#xff09;&#xff0c;同時能獨立管理自己額外安裝的包&#xff0c;避免直接污染主環境。以下是幾種解決方案&#xff0c;按推薦度排序&#xff1a; 方案 1&#xff1a;虛擬環境復…

JavaWeb之Servlet(2)RequestResponse..

文章目錄 1 Request和Response的概述2 Request對象2.1 Request繼承體系2.2 Request獲取請求數據2.2.1 獲取請求行數據2.2.2 獲取請求頭數據2.2.3 獲取請求體數據1-3小結2.2.4 獲取請求參數的通用方式請求參數和請求數據的區別問題案例分析問題解決 2.3 IDEA快速創建Servlet2.4 …

將 h264+g711a存為 mp4文件,記錄

將 h264g711a存為 mp4文件&#xff0c;記錄 &#x1f4cc; 關鍵問題&#xff1a;MP4 不原生支持 G.711A MP4 容器格式 不原生支持 G.711&#xff08;包括 A-law&#xff0c;也就是 G.711A&#xff09;音頻&#xff0c;所以不能直接將 G.711A 音頻封裝進 MP4 文件中。常見的做法…

【Elasticsearch】全文檢索 組合檢索

全文檢索 1.全文檢索1.1 準備測試數據1.2 案例分析1.2.1 match&#xff08;分詞檢索&#xff09;1.2.2 match_phrase&#xff08;短語檢索&#xff09;1.2.3 match_phrase_prefix&#xff08;短語前綴匹配&#xff09;1.2.4 multi_match&#xff08;多字段匹配&#xff09;1.2.…

信號處理學習——文獻精讀與code復現之TFN——嵌入時頻變換的可解釋神經網絡(上)

??????????????TFN: An interpretable neural network with time-frequency transform embedded for intelligent fault diagnosis - ScienceDirecthttps://www.sciencedirect.com/science/article/abs/pii/S0888327023008609?via%3Dihub &#xff08;看看玲娜貝…

Panda3D實戰:從入門到精通

Panda3D基礎實例 創建一個簡單的Panda3D場景,加載一個模型并顯示: from direct.showbase.ShowBase import ShowBaseclass MyApp(ShowBase):def __init__(self):ShowBase.__init__(self)self.scene = self.loader.loadModel("models/environment")self.scene.repa…

Galera集群:高可用MySQL同步復制方案

目錄 Galera Cluster 概述 核心架構與組件 WSREP API Group Communication System (GCP) 同步復制機制 復制流程詳解 沖突檢測算法 關鍵特性 多主架構實現 強一致性保障 自動成員管理 性能優化策略 并行復制實現 流控機制詳解 批處理與壓縮 部署與監控 詳細配…

MybatisPlus-03.快速入門-常用注解

一.MP的原理 mp究竟是如何知道我們需要對哪個表進行操作&#xff0c;并且又是如何知道要操作哪些字段的呢&#xff1f;這是因為mp使用到了反射機制&#xff0c;我們在定義mapper接口時使其繼承了BaseMapper接口&#xff0c;并指定了BaseMapper接口泛型為User&#xff0c;因此m…

ABAP+記錄一個BDC的BUG修改過程

問題背景&#xff1a; 業務顧問反饋在使用BDC 進行MEQ1進行供應商配額時&#xff0c;由于以前錄屏時用例只有3行數據&#xff0c;導致現在有5行數據的時候&#xff0c;代碼仍然只獲取了3行數據進行錄入&#xff0c;現在需要更改代碼&#xff0c;使其按照實際情況自動調整行數。…

github上傳代碼步驟(http)

github上傳步驟&#xff08;http&#xff09; 之前github上傳不了代碼&#xff0c;總是報錯。后面發現自己用的ssh上傳需要秘鑰&#xff0c;現在我介紹一個最簡單的http上傳方法&#xff08;雖然沒有ssh安全。。。但簡單嘛~&#xff09;&#xff0c;現在我做個例子&#xff0c…

深入理解Nginx-以實際http通信例子改造帶ssl配Nginx的實戰-優雅草卓伊凡|麻子

深入理解Nginx-以實際http通信例子改造帶ssl配Nginx的實戰-優雅草卓伊凡|麻子 SSL/TLS在Nginx中的底層實現原理 Nginx的SSL模塊架構 Nginx通過ngx_http_ssl_module模塊實現SSL/TLS功能&#xff0c;該模塊基于OpenSSL庫構建。根據Nginx官方文檔&#xff0c;SSL模塊在Nginx架構…

AT6558R-5N32介紹

作為單芯片SOC方案&#xff0c;AT6558R在片上整合了射頻前端、數字基帶處理器與32位RISC CPU&#xff0c;并具備電源管理能力。該芯片兼容北斗、GPS、GLONASS三大衛星導航系統&#xff0c;可實現多模協同定位?。 主要特征 支持 BDS/GPS/GLONASS 多系統聯合定位 和單系統獨立定…

“對象創建”模式之原型模式

目錄 Prototype 原型模式動機 Motivation引例模式定義結構 Structure要點總結 Prototype 原型模式 動機 Motivation 在軟件系統中&#xff0c;經常面臨著“某些結構復雜的對象”的創建工作&#xff1b;由于需求的變化&#xff0c;這些對象經常面臨著劇烈的變化&#xff0c;但…

Tomcat服務概述

前言&#xff1a; 作為Apache軟件基金會Jakarta項目的核心成果&#xff0c;Tomcat憑借其輕量級、開源免費的特性&#xff0c;已成為Java Web應用服務的行業基準。它實現了完整的Servlet與JSP規范&#xff0c;通過模塊化架構&#xff08;Connector請求處理層與Container業務邏輯…

HarmonyOS應用開發高級認證知識點梳理 (一) 布局與樣式

以下是 HarmonyOS 應用開發中 ?布局與樣式? 的核心知識點梳理&#xff08;針對高級認證備考&#xff09;&#xff0c;結合官方文檔與高頻考點&#xff1a; 一、布局系統核心知識點 布局容器類型? 線性布局?&#xff1a;Column&#xff08;縱向&#xff09;、Row&#xf…

【Ragflow】30.離線環境遷移方案

前言 之前的 Ragflow-Plus 在服務器上穩定運行一段時間后&#xff0c;接到任務&#xff0c;要把服務遷移到一臺古老的&#xff0c;離線的windows臺式機上。 起初認為&#xff0c;下載離線安裝包&#xff0c;加載離線鏡像&#xff0c;遷移下數據就可以了。 結果坑多得意想不到…

nrf52840藍牙學習(定時器的應用)

和其他 MCU 處理器一樣&#xff0c;在 nrf52840 中定時器的功能是十分強大的。其內部包含了 5 個定時 器 TIMER 模塊 :TIMER0 、 TIMER1 、 TIMER2 、 TIMER3 、 TIMER4 &#xff0c;如下表 10.1 所示。 1. 時鐘源 首先定時器 TIMER 工作在高頻時鐘源&#xff08…

【Bluedroid】藍牙啟動之BTM_reset_complete源碼解析

當藍牙控制器完成硬件重置后,協議棧需通過一系列初始化操作恢復各模塊狀態。本文深入分析BTM_reset_complete核心函數及其調用鏈,詳解 L2CAP 連接清理、安全模塊重置、掃描參數恢復、BLE 隱私功能初始化等關鍵流程,揭示藍牙設備在重置后如何通過標準化狀態恢復確保互操作性、…

containerd 項目主要目錄簡要說明

containerd 項目結構清晰&#xff0c;核心代碼分布在若干主目錄下。以下是 client、cmd、core、internal、pkg、plugins 這六個主要包/目錄的簡要作用說明&#xff1a; 1. client 作用&#xff1a;封裝與 containerd 守護進程通信的 Go 客戶端 API&#xff0c;主要基于 gRPC。…

有線轉無線工具,輕松創建WiFi熱點

軟件介紹 今天為大家推薦一款實用的無線網絡共享工具——MyPublicWiFi。這款軟件能夠將電腦的有線網絡轉換為無線WiFi&#xff0c;方便其他設備連接使用。 安裝與設置 該軟件為安裝版程序&#xff0c;安裝完成后會自動識別當前電腦的IP地址。用戶可在軟件界面中自定義設…