G919-GAS軟件 JSON格式數據通訊協議-陣列數據解析

G919-GAS軟件 JSON格式數據通訊協議-陣列數據解析

版本記錄

DateAuthorVersionNote
2024.04.07Dog TaoV1.0發布通訊協議。
2025.05.06Dog TaoV1.11. 增加了【高速采樣】模式下的通訊協議。2. 增加了“軟件開發建議”小節。

文章目錄

  • G919-GAS軟件 JSON格式數據通訊協議-陣列數據解析
    • 普通采樣模式
      • 精確行列更新
      • 批量行列更新
    • 高速采樣模式
    • 軟件開發建議
      • 采集板固件
      • 上位機軟件

本協議遵從 《G919-GAS軟件 JSON格式數據通訊協議》所制定的規范。以下針對陣列結構化數據進行通訊協議制定。

普通采樣模式

普通采樣模式適合數據采樣頻率不高(≤2Hz)、數據傳輸速率較慢(例如藍牙BLE傳輸)的場景。一般具備較低響應速度的氣體傳感器、電化學傳感器、阻敏型壓力傳感器等構成的陣列適合采用此模式進行數據傳輸。

精確行列更新

精確行列更新的上報格式適用于在一個大型陣列中僅更新單個單元的值。

設備(下位機)的JSON鍵值定義參考("ID""NT"的鍵值必須實現,其他可根據需要增刪改):

名稱IDNTCTROWCOLVAL
功能設備標識符設備網絡地址計數行號列號單值
MAC地址(后32位)網絡地址(16位)時間戳或數據序號(uint行(uint列(uint對應行列的讀出(float
JSON數據類型字符串字符串數字數字數字數字

設備(下位機)的串口(含藍牙等透傳)發送的數據示例:

// Set new value of coordinate (0, 0) to 28.3
{"ID":"25382B57","NT":"785F","ROW":0,"COL":0,"VAL":28.3}
// Set new value of coordinate (0, 1) to 29.9
{"ID":"25382B57","NT":"785F","ROW":0,"COL":1,"VAL":29.9}
// Set new value of coordinate (0, 2) to 32.5
{"ID":"25382B57","NT":"785F","ROW":0,"COL":2,"VAL":32.5}

批量行列更新

批量行列更新的上報格式適用于在一個小型陣列中實時刷新全部或部分單元值。

設備(下位機)的JSON鍵值定義參考("ID""NT"的鍵值必須實現,其他可根據需要增刪改):

名稱IDNTCTROWCOLVAL
功能設備標識符設備網絡地址計數行號列號多值
MAC地址(后32位)網絡地址(16位)時間戳或數據序號(uint起始行(uint起始列(uint指定行列作為起點的批量讀出(float數組)
JSON數據類型字符串字符串數字數字數字數組

設備(下位機)的串口發送的數據示例:

// Set the continuous values starting from coordinate (0, 0)
// e.g., for a 4x4 array, the values are updated in the whole row 0 and row 1, respectively.
{"ID":"25382B57","NT":"785F","ROW":0,"COL":0,"VALS":[28.3, 29.9, 82.1, 46.8, 45.2, 54.6, 31.8, 25.6]}

注意,批量行列更新的順序是默認按行更新,即沿當前坐標所在的行開始更新到當前行末,隨后在下一行從頭開始繼續更新數據。

高速采樣模式

高速采樣模式適合數據采樣頻率高(≥5Hz)、數據傳輸速率較快(例如串口直連、WiFi傳輸)的場景。一般具備較高響應速度的壓電、熱電、光電傳感器等構成的陣列適合采用此模式進行數據傳輸。

高速采樣模式采用類似普通采樣模式下的“批量行列更新”,直接刷新一個陣列中全部或部分單元值。

設備(下位機)的JSON鍵值定義參考("ID""NT"的鍵值必須實現,其他可根據需要增刪改):

名稱IDNTCTROWCOLVALS1-0VALS1-1VALS1-NVALS2-0VALS2-1VALS2-N
功能設備標識符設備網絡地址計數行號列號陣列1第0個時間步的值陣列1第1個時間步的值陣列1第N個時間步的值陣列2第0個時間步的值陣列2第1個時間步的值陣列2第N個時間步的值
MAC地址(后32位)網絡地址(16位)時間戳或數據序號(uint起始行(uint起始列(uint指定行列作為起點的批量讀出(float數組)同前同前同前同前同前
JSON數據類型字符串字符串數字數字數字數組數組數組數組數組數組

需要特別說明的是,高速采樣模式采用多個時間步數據累積同時發送的形式,減少了數據傳輸的頻率、增大了單次數據傳輸的量。這樣可以保證高速采樣數據在上位機軟件的高效記錄與繪制(每次繪制多個數據點)。例如,在10 Hz采樣速率下,可以將每秒10個時間步采樣的數據累積同時發送,上位機軟件每秒繪圖1次,每次繪制10個數據點。

設備(下位機)的串口發送的數據示例:

// Set the continuous values starting from coordinate (0, 0){  "ID":  "ESP32_402FA8","CT":  101,"ROW":  0,"COL":  0,"VALS1-0":  [2010.0, 1995.8, 2009.4, 2009.9, 2012.3, 2012.0, 2012.4, 2012.6, 1998.8, 1998.4, 1998.8, 1998.6, 2000.6, 2000.6, 2001.0, 2000.6],"VALS1-1":  [2009.6, 1995.9, 2009.5, 2009.5, 2012.6, 2012.4, 2012.1, 2012.4, 1998.9, 1999.0, 1998.6, 1999.0, 2000.9, 2000.6, 2001.0, 2001.1],"VALS1-2":  [2009.9, 1993.4, 2009.5, 2007.9, 2012.8, 2013.9, 2012.3, 2012.6, 1998.9, 1998.6, 1998.6, 1998.5, 2000.8, 2001.0, 2000.9, 1971.3],"VALS1-3":  [1999.1, 1999.3, 1999.5, 2013.5, 2001.8, 2003.3, 2015.9, 2016.0, 1987.1, 1987.6, 2002.6, 2003.0, 1989.6, 1987.6, 2004.4, 2005.3],"VALS1-4":  [2013.6, 2013.4, 1999.5, 1999.1, 2016.1, 2002.1, 2001.6, 1998.1, 2002.6, 1981.5, 1987.3, 1987.4, 2005.0, 1989.8, 1989.0, 1989.5],"VALS1-5":  [1999.3, 1997.3, 1999.4, 1993.4, 2002.3, 2001.6, 2001.9, 2018.9, 1987.6, 1986.6, 1987.6, 2002.6, 1989.9, 1989.8, 1989.5, 2005.1],"VALS1-6":  [2013.4, 2013.3, 2013.4, 2013.8, 2016.1, 2016.1, 2016.4, 2016.5, 2002.9, 1996.3, 2003.0, 2002.9, 2005.1, 2004.5, 2005.3, 2004.9],"VALS1-7":  [2013.5, 2013.4, 2013.0, 2013.0, 2016.4, 2016.4, 2015.4, 2016.3, 2002.6, 1987.5, 2003.0, 2002.6, 2004.9, 2004.6, 2005.3, 2005.0],"VALS1-8":  [2013.8, 2013.6, 2013.5, 2013.5, 2016.5, 2016.0, 2016.1, 2016.1, 2002.8, 1987.4, 2002.9, 2002.6, 2004.9, 2008.6, 2004.5, 2005.0],"VALS1-9":  [2013.8, 2013.9, 2013.3, 2013.4, 2016.6, 2016.1, 2016.3, 2016.3, 2002.8, 2002.8, 2002.6, 2002.4, 2005.1, 1991.1, 2005.1, 2004.4],"VALS2-0":  [754.5, 750.2, 774.0, 785.4, 767.0, 761.5, 773.9, 756, 772.5, 761.0, 755.5, 759.9, 776, 745.7, 760.5, 782.9],"VALS2-1":  [763.9, 789.4, 774.2, 777.0, 755.7, 767.5, 772.7, 752.4, 776.5, 765.2, 754.7, 753.5, 764.5, 747.0, 759.5, 777.5],"VALS2-2":  [756.4, 783, 770.9, 771.4, 751.9, 763.5, 767.5, 750.5, 771.5, 763.7, 752.5, 754.0, 753.5, 745.4, 756, 798.5],"VALS2-3":  [800.7, 817.7, 814.5, 754.5, 834.7, 825, 790.0, 682.5, 803.4, 806.5, 762.0, 737, 791.0, 791.0, 758.5, 753.7],"VALS2-4":  [723.7, 693, 807, 839.7, 701.9, 754.5, 806.2, 836.7, 749.5, 761.7, 783, 807.5, 732.7, 754.2, 785.5, 816.5],"VALS2-5":  [810.5, 831.9, 845.4, 818.7, 806.2, 824.9, 820.5, 649.2, 806.4, 802.5, 790.9, 757.7, 777.0, 784.9, 803.0, 755.7],"VALS2-6":  [713.5, 697.9, 698.9, 688.5, 679.4, 752.0, 693.0, 697.5, 740.2, 725.5, 703.7, 715.7, 709, 711.5, 722.4, 731.2],"VALS2-7":  [693, 678.7, 706.2, 720.2, 715.2, 712.4, 703.5, 722.7, 738.5, 729.4, 712.9, 738.5, 712.9, 713.7, 730.0, 753.2],"VALS2-8":  [717.9, 699.4, 733.2, 751.5, 734, 721.5, 729.9, 736.9, 761.7, 752.4, 731.5, 765.5, 738.5, 731.0, 753.0, 776.4],"VALS2-9":  [734.0, 715, 734.9, 745.5, 743.2, 728.9, 725.0, 745.5, 767.5, 747.5, 722.2, 744.5, 729.7, 723.5, 737.5, 753.0]
}

軟件開發建議

采集板固件

在【普通采樣】模式下,數據的采樣頻率與傳輸頻率不高且一致,因為可以遵循簡單的“通道切換->ADC采樣->JSON封裝->數據傳輸”的單任務執行序列。

FreeRTOS系統中的任務執行時序圖如下所示:

Data Acqu.&Trans. Task ADC Hardware Transmission Hardware 開始一次采樣與傳輸 切換到通道 n 通道 n 就緒 讀取通道 n 電壓值 返回采樣值 loop [通道 0 到 15] 封裝 JSON 消息 cJSON_Print() 發送 JSON 數據 發送 JSON 字符串 loop [每次采樣周期(如 1 秒)] Data Acqu.&Trans. Task ADC Hardware Transmission Hardware

在【高速采樣】模式下,數據的采樣頻率較高,數據傳輸頻率較低,需要采用隊列(FreeRTOS Queue)用于“生產-消費”緩沖。例如,設置兩個任務,一個任務用來做數據采集,每0.1秒采集一次數據送到隊列中,另外一個任務用來做數據傳輸,每1秒鐘把隊列中的10個數據全部發出去。

FreeRTOS系統中的任務執行時序圖如下所示:

Data Acquisition Task ADC Hardware FreeRTOS Queue Data Transmission Task Transmission Hardware 開始一次 16 通道數據采集 切換到通道 n 通道 n 準備就緒 讀取通道 n 電壓值 返回采樣值 loop [channels 0 to 15] 將 16 通道采樣結果封裝至 sample 結構 xQueueSend(sample) loop [every 100 ms (10 Hz)] 開始組裝 10 條樣本 xQueueReceive(sample[0]) xQueueReceive(sample[1]) xQueueReceive(sample[2]) xQueueReceive(sample[3]) xQueueReceive(sample[4]) xQueueReceive(sample[5]) xQueueReceive(sample[6]) xQueueReceive(sample[7]) xQueueReceive(sample[8]) xQueueReceive(sample[9]) 封裝 JSON 消息 cJSON_Print() 發送 JSON 數據 發送 JSON 字符串 loop [every 1 s (1 Hz)] Data Acquisition Task ADC Hardware FreeRTOS Queue Data Transmission Task Transmission Hardware

以下是ESP32平臺基于FreeRTOS系統開發的代碼示例:

  • Data Acquisition Task(Task1) 以 100 ms 間隔讀取 16 通道 ADC 并調用xQueueSendadc_data_t推入隊列。
  • FreeRTOS Queue(Queue) 用于在兩任務之間做生產-消費緩沖
  • Data Transmission Task(Task2) 每秒取出 10 次xQueueReceive拉取一秒鐘的數據樣本,隨后使用cJSON等庫將其封裝成含有 “VALS1-0” 到 “VALS1-9” 的JSON,并通過串口或網絡接口發送出去。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/adc.h"
#include "esp_log.h"
#include "cJSON.h"        // Include a JSON library (e.g., cJSON)#define ADC_CHANNEL_NUM    16         // Number of ADC channels
#define DATA_QUEUE_LENGTH  10         // 10 samples per second (from 10 Hz)
#define TASK1_DELAY_MS     100        // Task1 delay: 100 ms (10 Hz)
#define TASK2_DELAY_MS     1000       // Task2 delay: 1000 ms (1 Hz)typedef struct {float adc_values[ADC_CHANNEL_NUM]; // Array holds one sample (16 ADC values)
} adc_data_t;static QueueHandle_t adcQueue = NULL;
static const char *TAG = "ESP32_APP";/** Task1: Data Acquisition** - Reads 16 channels using ADC (here simulated by random data).* - Pushes the resulting adc_data_t structure into the queue.* - Runs every 100 ms (10 Hz).*/
void adc_task(void *pvParameters)
{adc_data_t sample;TickType_t ticks = xTaskGetTickCount();while (1) {// Acquire ADC data for 16 channels.// Replace the following loop with real ADC API calls, e.g., adc1_get_raw() if needed.for (int i = 0; i < ADC_CHANNEL_NUM; i++) {// For demonstration, generate a pseudo ADC reading.sample.adc_values[i] = (float)(rand() % 4096) * (3.3f / 4096);}// Push the sample into the queue (non-blocking).if (xQueueSend(adcQueue, &sample, 0) != pdPASS) {ESP_LOGW(TAG, "Queue full! Data sample dropped.");}// Wait 100 ms to maintain a 10 Hz sampling rate.vTaskDelayUntil(&ticks, pdMS_TO_TICKS(TASK1_DELAY_MS));}
}/** Task2: Data Transmission** - Runs at 1 Hz (every second).* - Retrieves 10 samples (one second’s worth of ADC data) from the queue.* - Encapsulates the 10 samples into a JSON object with keys "VALS1-0" to "VALS1-9".* - The JSON object also includes a device ID.* - After building the JSON string, the data is logged (or could be sent over a network interface).*/
void tx_task(void *pvParameters)
{adc_data_t samples[DATA_QUEUE_LENGTH];  // Buffer to hold one-second of datachar keyStr[16];                        // Buffer to format key names (e.g., "VALS1-0")TickType_t ticks = xTaskGetTickCount();while (1) {// Retrieve 10 samples from the queue.for (int i = 0; i < DATA_QUEUE_LENGTH; i++) {if (xQueueReceive(adcQueue, &samples[i], pdMS_TO_TICKS(TASK2_DELAY_MS)) != pdPASS) {ESP_LOGW(TAG, "Failed to retrieve sample %d from queue.", i);// Optionally, you might zero-fill or skip this sample.memset(&samples[i], 0, sizeof(adc_data_t));}}// Create a JSON object.cJSON *root = cJSON_CreateObject();cJSON_AddStringToObject(root, "ID", "ESP32_402FA8");// For each sample, add a key (e.g., "VALS1-0") with its corresponding ADC data array.for (int i = 0; i < DATA_QUEUE_LENGTH; i++) {sprintf(keyStr, "VALS1-%d", i);cJSON *arr = cJSON_CreateArray();for (int j = 0; j < ADC_CHANNEL_NUM; j++) {cJSON_AddItemToArray(arr, cJSON_CreateNumber(samples[i].adc_values[j]));}cJSON_AddItemToObject(root, keyStr, arr);}// Generate the JSON string.char *jsonStr = cJSON_Print(root);ESP_LOGI(TAG, "Transmitted JSON Message:\n%s", jsonStr);// Here you can add code to send the JSON message over a network interface, UART, etc.// Free allocated memory and delete the JSON object.free(jsonStr);cJSON_Delete(root);// Wait 1 second (transmission period).vTaskDelayUntil(&ticks, pdMS_TO_TICKS(TASK2_DELAY_MS));}
}/** app_main: Entry point of the ESP32 application.** - Creates a queue for the ADC data.* - Launches both the ADC acquisition and the transmission tasks.*/
void app_main(void)
{// Create a queue to hold ADC data samples (each sample is adc_data_t).adcQueue = xQueueCreate(DATA_QUEUE_LENGTH, sizeof(adc_data_t));if (adcQueue == NULL) {ESP_LOGE(TAG, "Failed to create ADC data queue");return;}// Create and start the ADC acquisition task.xTaskCreate(adc_task, "adc_task", 2048, NULL, 5, NULL);// Create and start the transmission task.xTaskCreate(tx_task, "tx_task", 4096, NULL, 5, NULL);
}

注意,需要修改"cJSON.c"文件(print_number),使打印JSON字符串(cJSON_Print)的浮點數類型(float)保留一位小數。

/* Render the number nicely from the given item into a string. */
static cJSON_bool print_number(const cJSON *const item, printbuffer *const output_buffer)
{// 省略無關內容/* copy the printed number to the output and replace locale* dependent decimal point with '.' */for (i = 0; i < ((size_t)length); i++){if (number_buffer[i] == decimal_point){output_pointer[i] = '.';i++;output_pointer[i] = number_buffer[i];i++;break;}else{output_pointer[i] = number_buffer[i];}}output_pointer[i] = '\0';output_buffer->offset += (size_t)(i);return true;
}

上位機軟件

上位機軟件根據應用目標,應當分別實現或者同時實現對普通采樣模式、高速采樣模式的協議解析支持。同時實現對兩種采樣模式的協議解析支持時,應當設定一個協議切換功能(普通/高速采樣模式選擇)。

在【普通采樣】模式下,上位機每次接收的是單次刷新數據,考慮到較低的采樣頻率和對時間同步的較低敏感度,可以直接設置一個中間緩存數據,每次接收到數據后就刷新中間緩存數據。同時,直接采用定時器定時讀取中間緩存數據,刷新曲線繪制與數據保存。

在【高速采樣】模式下,上位機每次接收到的是上一個時間段中的一批數據,應當將它們依次在歷史曲線中繪制和保存。考慮到一些數據傳輸方式受環境的影響可能存在一定的延時(例如網絡傳輸),可以通過"CT"鍵的值(時間戳)在上位機軟件中進行時間的同步與對齊,即上位機軟件在此模式下不應采用定時器刷新的方式繪圖和保存數據,而是應該采用“數據驅動”的方式:收到數據后,根據時間戳計算每個時間步的精確時間(X軸值),然后將這些數據點依次繪制和保存。

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

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

相關文章

TCGA數據庫臨床亞型可用!貝葉斯聚類+特征網絡分析,這篇 NC 提供的方法可以快速用起來了!

生信堿移 貝葉斯網絡聚類 CANclust是一種基于貝葉斯的聚類方法&#xff0c;系統性地對基因突變、細胞遺傳學信息和臨床指標進行聯合建模&#xff0c;用于多種模態數據的聯合聚類分析&#xff0c;并識別在患者群體中反復出現的特征模式。 個體的遺傳與環境背景決定其應對疾病的…

【算法】隨機快速排序和隨機選擇算法

文章目錄 1、隨機快速排序1.1 什么是隨機快排1.2 隨機快排的好處 2、隨機選擇算法 前言&#xff1a; 快速排序就是每次劃分前&#xff0c;通過一種方法將一個基準值的位置確定好&#xff0c;再進入不同的部分重復相同的工作以此確定好每個值的位置以達到有序。如果你之前并不了…

網絡技術基礎,NAT,橋接,交換機,路由器

什么是NAT Network Address Translation&#xff08;網絡地址轉換&#xff09;&#xff0c;它負責將目標IP或源IP進行了改變&#xff0c;相當于一個中間代理&#xff0c;我們家庭常用的路由器就是一個NAT設備&#xff0c;NAT是為了解決IPv4的IP地址快要耗盡的問題&#xff0c;…

DVWA靶場保姆級通關教程--03CSRF跨站請求偽造

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 目錄 文章目錄 前言 一、low級別的源碼分析 二、medium級別源碼分析 安全性分析 增加了一層 Referer 驗證&#xff1a; 關鍵點是&#xff1a;在真實的網絡環境中&a…

【Ansible自動化運維實戰:從Playbook到負載均衡指南】

本文是「VagrantVirtualBox虛擬化環境搭建」的續篇&#xff0c;深入探索Ansible在自動化運維中的核心應用&#xff1a; ? Ansible核心技能&#xff1a;Playbook編寫、角色&#xff08;Roles&#xff09;模塊化、標簽&#xff08;Tags&#xff09;精準控制 ? 實戰場景覆蓋&a…

基于STM32、HAL庫的STC31-C-R3氣體傳感器驅動程序設計

一、簡介: STC31-C-R3是Sensirion公司推出的一款基于CMOSens技術的CO2傳感器,具有以下特點: 測量范圍:0-100%體積濃度 I2C數字接口 低功耗設計 高精度和長期穩定性 小尺寸封裝(5mm x 5mm) 二、硬件接口: STC31-C-R3 STM32L4xx ---------------------------- VDD (P…

Nginx篇之限制公網IP訪問特定接口url實操

一、nginx配置限制IP訪問 要在 Nginx 配置中添加 IP 限制&#xff0c;阻止來自指定公網 IP 地址段的訪問&#xff0c;并且只對特定路徑進行限制&#xff0c;可以在 location 配置中使用 deny 和 allow 指令來控制訪問。 二、案例 1. 需求 對來自特定公網的地址段&#xff0…

算法研習:無重復字符的最長子串問題剖析

算法研習:無重復字符的最長子串問題剖析 一、引言 在算法的廣袤天地中,字符串相關問題一直是備受關注的焦點。“無重復字符的最長子串”這一問題,不僅在面試中頻繁出現,更是對算法思維和編程技巧的一次深度考驗。它要求我們從給定字符串中找出不含有重復字符的最長子串的長…

Spring Cloud Gateway路由+斷言+過濾

目錄 介紹核心功能三大核心Route以服務名動態獲取URLPredicate常用斷言Path Route PredicateAfter Route PredicateBefore Route PredicateBetween Route PredicateCookie Route PredicateHeader Route PredicateHost Route PredicateQuery Route PredicateRemoteAddr Route Pr…

springboot集成langchain4j記憶對話

流式輸出 LLM 一次生成一個標記&#xff08;token&#xff09;&#xff0c;因此許多 LLM 提供商提供了一種方式&#xff0c;可以逐個標記地流式傳輸響應&#xff0c;而不是等待整個文本生成完畢。 這顯著改善了用戶體驗&#xff0c;因為用戶不需要等待未知的時間&#xff0c;幾…

【SpringCloud GateWay】Connection prematurely closed BEFORE response 報錯分析與解決方案

一、背景 今天業務方調用我們的網關服務報錯: Connection prematurely closed BEFORE response二、原因分析 三、解決方案 第一步: 增加 SCG 服務的JVM啟動參數,調整連接獲取策略。 將連接池獲取策略由默認的 FIFO&#xff08;先進先出&#xff09;變更為 LIFO&#xff08…

使用ZYNQ芯片和LVGL框架實現用戶高刷新UI設計系列教程(第十一講)

這一期講解lvgl中下拉框的基礎使用&#xff0c;下拉列表允許用戶從選項列表中選擇一個值&#xff0c;下拉列表的選項表默認是關閉的&#xff0c;其中的選項可以是單個值或預定義文本。 當單擊下拉列表后&#xff0c;其將創建一個列表&#xff0c;用戶可以從中選擇一個選項。 當…

【神經網絡與深度學習】VAE 在解碼前進行重參數化

在 VAE 中&#xff0c;解碼之前進行重參數化主要有以下幾個重要原因&#xff1a; 可微分性 在深度學習里&#xff0c;模型是通過反向傳播算法來學習的&#xff0c;而這需要計算梯度。若直接從潛在變量的分布 (q_{\theta}(z|x))&#xff08;由編碼器輸出的均值 (\mu) 和方差 (…

BBDM學習筆記

1. configs 1.1 LBBDM: Latent BBDM [readme]

mysql主從復制搭建,并基于?Keepalived + VIP實現高可用

以下是基于 ?Keepalived VIP? 實現 MySQL 主從復制高可用的詳細步驟&#xff0c;涵蓋主從復制搭建與故障自動切換&#xff1a; 一、MySQL 主從復制搭建&#xff08;基礎步驟回顧&#xff09; 1. ?主庫&#xff08;Master&#xff09;配置? 修改配置文件? /etc/my.cnf&…

CD36.【C++ Dev】STL庫的string的使用 (下)

目錄 1.reserve函數(不是reverse) 代碼示例 2.resize 代碼示例 3.reserve和resize的區別 4.shrink_to_fit 代碼示例 5.與C語言的配合的接口函數: c_str 代碼示例 6.rfind 知識回顧:find函數 rfind 代碼示例 練習題: 字符串最后一個單詞的長度 代碼 提交結果 ?…

STM32的網絡天氣時鐘項目

一、項目概述與硬件架構 1.1 核心功能 本智能天氣時鐘系統集成了實時天氣獲取、網絡時間同步、環境監測和低功耗管理四大核心功能&#xff1a; 網絡數據獲取&#xff1a; 通過ESP8266 WiFi模塊連接心知天氣API&#xff08;每小時更新&#xff09;獲取北京標準時間服務器的時…

FPGA DDR4多通道管理控制器設計

DDR4控制器一般采用自帶的MIG控制器&#xff0c;用戶控制主要是基于MIG IP核進行設計 實際工程項目中可能只掛載了一組DDR&#xff0c;但是用戶數據可能有很多種&#xff0c;用戶通過給每種數據劃分特定地址進行存儲&#xff0c;如何實現靈活管理成為設計的關鍵 為了方便后端數…

低代碼 x AI,解鎖數智化應用的創新引擎

AI 智能體開發指南 隨著全球信息化浪潮的持續推進&#xff0c;數字化、智能化轉型已成為企業發展的必經之路。在這個變革的時代&#xff0c;企業面臨著前所未有的挑戰與機遇。一方面&#xff0c;市場環境瞬息萬變&#xff0c;企業需要快速響應并調整業務模式&#xff1b;另一方…

【Spring Boot 注解】@Configuration與@AutoConfiguration

文章目錄 Configuration與AutoConfiguration一、Configuration二、AutoConfiguration Configuration與AutoConfiguration 一、Configuration 這是最常用的 Spring 注解之一&#xff0c;表示當前類是一個 配置類&#xff0c;可以定義 Bean 方法&#xff0c;等效于傳統的 XML 配…