【網絡編程】廣播和組播

數據包發送方式只有一個接受方,稱為單播。如果同時發給局域網中的所有主機,稱為廣播。只有用戶數據報(使用UDP協議)套接字才能廣播:

廣播地址以192.168.1.0 (255.255.255.0) 網段為例,最大的主機地址192.168.1.255代表該網段的廣播地址,發到該地址的數據包被所有的主機接收。255.255.255.255在所有網段中都代表廣播地址。廣播發送創建用戶數據報套接字缺省創建的套接字不允許廣播數據包,需要設置屬性。(setsockopt可以設置套接字屬性)接收方地址指定為廣播地址指定端口信息發送數據包setsockoptint  setsockopt(int  s,  int level,  int  optname, const void *optval, socklen_t  optlen);頭文件:<sys/socket.h>level : 選項級別(例如SOL_SOCKET)optname : 選項名(例如SO_BROADCAST)optval : 存放選項值的緩沖區的地址optlen : 緩沖區長度返回值:成功返回0   失敗返回-1并設置errno廣播發送示例sockfd = socket(,,);……int on = 1;setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));……sendto(;;;;;);廣播接收創建用戶數據報套接字綁定IP地址(廣播IP或0.0.0.0)和端口(綁定的端口必須和發送方指定的端口相同)等待接收數據

UDP 廣播服務器與客戶端(C 語言實現)

  • 廣播(Broadcast):將數據發送到 整個局域網,所有主機都能接收。
  • UDP 支持廣播,但 TCP 不支持 廣播。
  • 廣播地址示例
    • 192.168.1.255(局域網廣播,子網掩碼 255.255.255.0)。
    • 255.255.255.255(全網廣播)。
      在這里插入圖片描述
關鍵 API
函數功能
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));允許 UDP 廣播
sendto(sockfd, message, len, 0, (struct sockaddr*)&addr, addr_len);發送廣播消息
recvfrom(sockfd, buffer, len, 0, (struct sockaddr*)&addr, &addr_len);接收廣播消息
UDP 廣播服務器完整實現代碼

服務端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BROADCAST_PORT 8080  // 廣播端口
#define BROADCAST_ADDR "255.255.255.255" // 廣播地址
#define BUFFER_SIZE 1024int main() {int sockfd;struct sockaddr_in broadcast_addr;char message[BUFFER_SIZE] = "這是來自服務器的廣播消息!";int broadcast_permit = 1;// 1?? 創建 UDP 套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("? 創建套接字失敗");exit(EXIT_FAILURE);}// 2?? 允許發送廣播setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast_permit, sizeof(broadcast_permit));// 3?? 設置廣播地址memset(&broadcast_addr, 0, sizeof(broadcast_addr));broadcast_addr.sin_family = AF_INET;broadcast_addr.sin_port = htons(BROADCAST_PORT);broadcast_addr.sin_addr.s_addr = inet_addr(BROADCAST_ADDR);printf("服務器開始廣播消息...\n");while (1) {// 4?? 發送廣播消息sendto(sockfd, message, strlen(message), 0,(struct sockaddr*)&broadcast_addr, sizeof(broadcast_addr));printf("發送廣播消息: %s\n", message);sleep(3); // 每 3 秒廣播一次}close(sockfd);return 0;
}

客戶端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BROADCAST_PORT 8080  // 監聽廣播端口
#define BUFFER_SIZE 1024int main() {int sockfd;struct sockaddr_in listen_addr;char buffer[BUFFER_SIZE];socklen_t addr_len = sizeof(listen_addr);// 1?? 創建 UDP 套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("? 創建套接字失敗");exit(EXIT_FAILURE);}// 2?? 允許端口重用(多個客戶端可綁定相同端口)int reuse = 1;setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));// 3?? 綁定監聽端口memset(&listen_addr, 0, sizeof(listen_addr));listen_addr.sin_family = AF_INET;listen_addr.sin_port = htons(BROADCAST_PORT);listen_addr.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(sockfd, (struct sockaddr*)&listen_addr, sizeof(listen_addr)) < 0) {perror("? 綁定失敗");close(sockfd);exit(EXIT_FAILURE);}printf("客戶端正在監聽廣播消息...\n");while (1) {// 4?? 接收廣播消息memset(buffer, 0, BUFFER_SIZE);recvfrom(sockfd, buffer, BUFFER_SIZE, 0,(struct sockaddr*)&listen_addr, &addr_len);printf("📩 收到廣播消息: %s\n", buffer);}close(sockfd);return 0;
}

運行步驟:

  1. 編譯
gcc udp_broadcast_server.c -o udp_broadcast_server
gcc udp_broadcast_client.c -o udp_broadcast_client
  1. 運行服務器(廣播消息)
./udp_broadcast_server

輸出示例:

? 服務器開始廣播消息...
📡 發送廣播消息: 這是來自服務器的廣播消息!
📡 發送廣播消息: 這是來自服務器的廣播消息!
  1. 運行客戶端(監聽廣播)
./udp_broadcast_client

輸出示例:

客戶端正在監聽廣播消息...
📩 收到廣播消息: 這是來自服務器的廣播消息!
📩 收到廣播消息: 這是來自服務器的廣播消息!
廣播流程思路解析(逐幀解釋)流程上面的注釋已經寫了,但是這里是配合完整的代碼實現和業務流程再過一遍

🔹 服務器

  1. 創建 UDP 套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  1. 允許廣播
int broadcast_permit = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast_permit, sizeof(broadcast_permit));
  1. 設置廣播地址
broadcast_addr.sin_addr.s_addr = inet_addr("255.255.255.255");
  1. 發送廣播消息
sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&broadcast_addr, sizeof(broadcast_addr));

🔹 客戶端

  1. 創建 UDP 套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  1. 允許端口重用
int reuse = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
  1. 綁定監聽端口
listen_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sockfd, (struct sockaddr*)&listen_addr, sizeof(listen_addr));
  1. 接收廣播消息
recvfrom(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr*)&listen_addr, &addr_len);
廣播代碼優化:
  1. 使用 SO_REUSEADDR
    • 允許多個客戶端監聽相同端口,防止端口占用問題:
int reuse = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
  1. 限制廣播頻率:
sleep(3); // 控制廣播間隔,避免網絡擁塞。
  1. 支持多播:監聽 指定的多播組,而不是整個局域網:
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("224.0.0.1");
mreq.imr_interface.s_addr = INADDR_ANY;
setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

UDP 廣播通信,適用于 局域網設備發現日志廣播狀態同步等應用。相比 TCP,UDP 廣播更加輕量級,可用于 IoT、在線游戲等場景。

在編譯過程中可能遇到的問題

🚨 1. Permission denied(權限錯誤)
如果 sendto() 失敗,檢查 SO_BROADCAST 是否設置:

int broadcast_permit = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast_permit, sizeof(broadcast_permit));

若仍然失敗,可以嘗試 sudo 運行:

sudo ./udp_broadcast_server

🚨 2. Address already in use(端口占用)
如果 bind() 失敗,嘗試釋放端口:

sudo fuser -k 8080/udp

然后重新運行程序。

🚨 3. recvfrom() 接收不到消息

  • 確保服務器和客戶端在 同一局域網
  • 使用 ifconfig / ip a 檢查本機 IP 地址并使用正確的廣播地址:
ifconfig | grep "inet "
  • 確保防火墻沒有阻止 UDP 廣播:
sudo iptables -I INPUT -p udp --dport 8080 -j ACCEPT
sudo iptables -I OUTPUT -p udp --dport 8080 -j ACCEPT

組播(Multicast)編程指南(C 語言)

單播(Unicast):數據僅發送給一個特定的主機。
廣播(Broadcast):廣播方式發給所有的主機。過多的廣播會大量占用網絡帶寬,造成廣播風暴,影響正常的通信。
組播(Multicast):組播(又稱為多播)是一種折中的方式。只有加入某個多播組的主機才能收到數據。多播方式既可以發給多個主機又能避免象廣播那樣帶來過多的負載(每臺主機要到傳輸層才能判斷廣播包是否要處理)

  • 僅發送給加入 特定組播組 的主機。
  • 減少網絡負載,避免廣播風暴。
  • 適用于 IPTV、視頻流、在線游戲、股票行情推送等場景
    組播
📌 組播地址

組播范圍:224.0.0.0 ~ 239.255.255.255
特殊組播地址:

  • 224.0.0.1:所有支持 IP 組播的主機。
  • 224.0.0.2:所有路由器。
關鍵 API
函數/結構體作用
setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));加入組播組
setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq));退出組播組
sendto(sockfd, message, len, 0, (struct sockaddr*)&addr, addr_len);發送組播
recvfrom(sockfd, buffer, len, 0, (struct sockaddr*)&addr, &addr_len);接收組播
struct ip_mreq組播配置結構體
組播發送端(C 語言實現)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define MULTICAST_GROUP "239.0.0.1"  // 組播地址
#define MULTICAST_PORT 8080          // 組播端口
#define MESSAGE "🌍 這是組播消息!"int main() {int sockfd;struct sockaddr_in multicast_addr;int ttl = 64;  // 組播生存時間(TTL)// 1?? 創建 UDP 套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("? 創建套接字失敗");exit(EXIT_FAILURE);}// 2?? 設置組播 TTLsetsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));// 3?? 設置組播地址memset(&multicast_addr, 0, sizeof(multicast_addr));multicast_addr.sin_family = AF_INET;multicast_addr.sin_port = htons(MULTICAST_PORT);multicast_addr.sin_addr.s_addr = inet_addr(MULTICAST_GROUP);printf("發送組播消息到 %s:%d\n", MULTICAST_GROUP, MULTICAST_PORT);while (1) {// 4?? 發送組播消息sendto(sockfd, MESSAGE, strlen(MESSAGE), 0,(struct sockaddr*)&multicast_addr, sizeof(multicast_addr));printf("? 發送消息: %s\n", MESSAGE);sleep(3);  // 每 3 秒發送一次}close(sockfd);return 0;
}
組播接收端(C 語言實現)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define MULTICAST_GROUP "239.0.0.1"  // 組播地址
#define MULTICAST_PORT 8080          // 組播端口
#define BUFFER_SIZE 1024int main() {int sockfd;struct sockaddr_in local_addr;struct ip_mreq mreq;char buffer[BUFFER_SIZE];socklen_t addr_len = sizeof(local_addr);// 1?? 創建 UDP 套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("? 創建套接字失敗");exit(EXIT_FAILURE);}// 2?? 允許端口復用(多個進程/設備可接收同一組播)int reuse = 1;setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));// 3?? 綁定本地地址memset(&local_addr, 0, sizeof(local_addr));local_addr.sin_family = AF_INET;local_addr.sin_port = htons(MULTICAST_PORT);local_addr.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr)) < 0) {perror("? 綁定失敗");close(sockfd);exit(EXIT_FAILURE);}// 4?? 加入組播組mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_GROUP);mreq.imr_interface.s_addr = htonl(INADDR_ANY);setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));printf("監聽組播消息 (%s:%d)...\n", MULTICAST_GROUP, MULTICAST_PORT);while (1) {// 5?? 接收組播消息memset(buffer, 0, BUFFER_SIZE);recvfrom(sockfd, buffer, BUFFER_SIZE, 0,(struct sockaddr*)&local_addr, &addr_len);printf("📩 收到消息: %s\n", buffer);}// 6?? 退出組播setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq));close(sockfd);return 0;
}

運行步驟:

  1. 編譯
gcc multicast_sender.c -o multicast_sender
gcc multicast_receiver.c -o multicast_receiver
  1. 運行組播接收端
./multicast_receiver

示例輸出:

監聽組播消息 (239.0.0.1:8080)...
收到消息: 🌍 這是組播消息!
收到消息: 🌍 這是組播消息!
  1. 運行組播發送端
./multicast_sender

示例輸出:

發送組播消息到 239.0.0.1:8080
? 發送消息: 🌍 這是組播消息!
? 發送消息: 🌍 這是組播消息!

編譯中可能遇到的問題:
🚨 1. recvfrom() 接收不到數據
? 解決方案

  • 確保接收端 加入了相同的組播地址(239.0.0.1)。
  • 使用 netstat -g 命令檢查當前加入的組播組:
netstat -g
  • 確保 Linux 防火墻未阻止 UDP 組播:
sudo iptables -I INPUT -p udp --dport 8080 -j ACCEPT
sudo iptables -I OUTPUT -p udp --dport 8080 -j ACCEPT

組播是一種高效的網絡通信方式,可用于 IPTV、在線游戲、股票行情推送等應用場景。以上 C 代碼實現了 UDP 組播的發送和接收,支持多個設備同時接收組播消息。 相比廣播,組播能夠減少網絡負載,提高數據傳輸效率

以上。僅供學習與分享交流,請勿用于商業用途!轉載需提前說明。

我是一個十分熱愛技術的程序員,希望這篇文章能夠對您有幫助,也希望認識更多熱愛程序開發的小伙伴。
感謝!

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

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

相關文章

小程序如何實現跨頁面通信

前言 最近有很多同學問&#xff0c;小程序里面如何進行跨頁面通信。看了下之前的老代碼&#xff0c;基本都是基于onShow或者localStorage。雖然可以實現&#xff0c;但是并不怎么優雅。 今天就來聊一聊&#xff0c;小程序的跨頁面通信的幾種實現方案。或許會有你想要的方案&a…

【工具】win-畫圖 保留圖片信息并僅改變圖片比例的工具

Windows 系統自帶的“畫圖”工具 Windows 系統自帶的“畫圖”&#xff08;Paint&#xff09;工具可以進行簡單的圖片編輯&#xff0c;包括調整圖片大小和比例。 使用方法&#xff1a; 打開“畫圖”工具&#xff08;可以通過在開始菜單中搜索“畫圖”或“Paint”&#xff09;。…

如何編輯autodl中以.bashrc結尾的隱藏文件

在nnunet的運行過程中遇到了設置環境變量的問題。之前沒有接觸過linux系統&#xff0c;但是autodl里面默認是linux系統。.bashrc 是一個在 Bash shell 啟動時執行的腳本文件&#xff0c;常用于設置環境變量、定義別名、加載函數等&#xff0c;用戶可以通過編輯這個文件來定制自…

實驗3 知識表示與推理

實驗3 知識表示與推理 一、實驗目的 &#xff08;1&#xff09;掌握知識和知識表示的基本概念&#xff0c;理解其在AI中的深刻含義與意義&#xff1b; &#xff08;2&#xff09;熟悉AI中常用的知識表示方法的優缺點及其應用場景&#xff1b; &#xff08;3&#xff09;掌握產…

在 M1 Mac 上解鎖 TensorFlow GPU 加速:從環境搭建到實戰驗證

在 M1 Mac 上解鎖 TensorFlow GPU 加速&#xff1a;從環境搭建到實戰驗證 前言&#xff1a;蘋果芯片的深度學習新紀元 隨著 Apple Silicon 芯片的普及&#xff0c;M1/M2/M3 系列 Mac 已成為移動端深度學習開發的新選擇。本文將以 TensorFlow 2.x 為例&#xff0c;手把手教你如…

Python 數據分析概述 ①

一文讀懂Python數據分析&#xff1a;從基礎到實踐全攻略 在當今數字化浪潮中&#xff0c;數據分析已然成為解鎖海量數據價值的關鍵鑰匙&#xff0c;而Python憑借其獨特優勢&#xff0c;在數據分析領域大放異彩。今天&#xff0c;咱們就結合教學PPT內容&#xff0c;深入探索Pyt…

【Gin-Web】Bluebell社區項目梳理6:限流策略-漏桶與令牌桶

本文目錄 一、限流二、漏桶三、令牌桶算法四、Gin框架中實現令牌桶限流 一、限流 限流又稱為流量控制&#xff0c;也就是流控&#xff0c;通常是指限制到達系統的并發請求數。 限流雖然會影響部分用戶的使用體驗&#xff0c;但是能一定程度上保證系統的穩定性&#xff0c;不至…

Linux高并發服務器開發 第十九天(線程 進程)

目錄 1.進程組和會話 2.守護進程 2.1守護進程daemon概念 2.2創建守護進程 3.線程 3.1線程的概念 3.2線程內核三級映射 3.3線程共享 3.4線程優缺點 4.線程控制原語 4.1獲取線程id 4.2創建線程 4.3循環創建N個子線 4.4子線程傳參地址&#xff0c;錯誤示例 4.5線程…

軟件工程和系統分析與設計

軟件工程 1、軟件危機 2、軟件過程模型 2.1 瀑布模型 2.2原型模型 2.3螺旋模型 2.4敏捷模型 2.5軟件統一過程 3、軟件能力成熟度模型 CMM 4、軟件能力成熟度模型集成 CMMI 系統分析與設計 1、結構化方法SASD 1.1結構化分析 DFD 1.2結構化設計 SD-是一種面向數據流的設計…

Qt/C++面試【速通筆記一】

Qt 信號與槽機制 什么是信號&#xff08;Signal&#xff09;和槽&#xff08;Slot&#xff09;&#xff1f; 在Qt中&#xff0c;信號&#xff08;Signal&#xff09;和槽&#xff08;Slot&#xff09;是實現對象之間通信的一種機制。信號是對象在某些事件發生時發出的通知&…

LangChain大模型應用開發:構建Agent智能體

介紹 大家好&#xff0c;博主又來給大家分享知識了。今天要給大家分享的內容是使用LangChain進行大模型應用開發中的構建Agent智能體。 在LangChain中&#xff0c;Agent智能體是一種能夠根據輸入的任務或問題&#xff0c;動態地決定使用哪些工具(如搜索引擎、數據庫查詢等)來…

微服務架構概述及創建父子項目

目錄 一&#xff0c;什么是單體架構 二&#xff0c;什么是集群和分布式架構 三&#xff0c;什么是微服務架構 四&#xff0c;解決微服務難題的方案Spring-cloud Spring Cloud Alibaba是阿里巴實現的方案&#xff0c;基于SpringCloud的規范。如果說Spring Cloud Netflix 是…

C/C++跳動的愛心

系列文章 序號直達鏈接1C/C李峋同款跳動的愛心2C/C跳動的愛心3C/C經典愛心4C/C滿屏飄字5C/C大雪紛飛6C/C炫酷煙花7C/C黑客帝國同款字母雨8C/C櫻花樹9C/C奧特曼10C/C精美圣誕樹11C/C俄羅斯方塊小游戲12C/C貪吃蛇小游戲13C/C孤單又燦爛的神14C/C閃爍的愛心15C/C哆啦A夢16C/C簡單…

量子計算的威脅,以及企業可以采取的措施

當谷歌、IBM、Honeywell和微軟等科技巨頭紛紛投身量子計算領域時&#xff0c;一場技術軍備競賽已然拉開帷幕。 量子計算雖能為全球數字經濟帶來巨大價值&#xff0c;但也有可能對相互關聯的系統、設備和數據造成損害。這一潛在影響在全球網絡安全領域引起了強烈關注。也正因如…

Unity制作游戲——前期準備:Unity2023和VS2022下載和安裝配置——附安裝包

1.Unity2023的下載和安裝配置 &#xff08;1&#xff09;Unity官網下載地址&#xff08;國際如果進不去&#xff0c;進國內的官網&#xff0c;下面以國內官網流程為例子&#xff09; unity中國官網&#xff1a;Unity中國官網 - 實時內容開發平臺 | 3D、2D、VR & AR可視化 …

23貪心算法

分發餅干 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {int i0,j0;int count0;sort(s.begin(),s.end());sort(g.begin(),g.end());while(i<g.size()&&j<s.size()){if(g[i]<s[j]){i;j;count;}else…

Spark 和 Flink

Spark 和 Flink 都是目前流行的大數據處理引擎&#xff0c;但它們在架構設計、應用場景、性能和生態方面有較大區別。以下是詳細對比&#xff1a; 1. 架構與核心概念 方面Apache SparkApache Flink計算模型微批&#xff08;Micro-Batch&#xff09;為主&#xff0c;但支持結構…

Android 串口通信

引言 在iot項目中&#xff0c;Android 端總會有和硬件通信。 通信這里&#xff1a;串口通信&#xff0c;藍牙通信或者局域網通信。 這里講一下串口通信。 什么是串口&#xff1f; “串口”&#xff08;Serial Port&#xff09;通常是指一種用于與外部設備進行串行通信的接口。…

【計算機網絡】OSI模型、TCP/IP模型、路由器、集線器、交換機

一、計算機網絡分層結構 計算機網絡分層結構 指將計算機網絡的功能劃分為多個層次&#xff0c;每個層次都有其特定的功能和協議&#xff0c;并且層次之間通過接口進行通信。 分層設計的優勢&#xff1a; 模塊化&#xff1a;各層獨立發展&#xff08;如IPv4→IPv6&#xff0c…

從人機環境系統智能角度看傳統IP的全球化二次創作法則

從人機環境系統智能的視角看&#xff0c;傳統IP的全球化二次創作法則需結合技術、文化、倫理與環境的復雜協同。這一過程不僅是內容的本土化改編&#xff0c;更是人、機器與環境在動態交互中實現價值共創的體現。 一、人機環境系統智能的底層邏輯與IP二次創作的融合 1、感知層&…