2026年10月26日 星期一

從五篇文章認識網際網路技術:TCP、HTTP、MCP、Agent 與 AIoT

網際網路應用系列|從 TCP 到 AIoT

從五篇文章認識網際網路技術:TCP、HTTP、MCP、Agent 與 AIoT

五篇文章分別談 asyncio TCP、MCP Server/Client、Agent 呼叫 MCP、FastAPI REST API 與 MCP,以及 AIoT。把它們放在一起看,會發現它們不是五種互相取代的技術,而是網際網路應用中不同層次的工具:底層負責傳輸,應用協定定義訊息,框架提供服務入口,Agent 決定何時使用工具,AIoT 再把網路服務連到真實設備。

一、先從網際網路的分層觀念開始

當瀏覽器連上一個網站,或手機向感測器平台查資料,資料會經過多個層次。每一層只處理自己的一部分工作,並透過明確介面交給上一層。

層次/角色主要問題本系列的例子
應用程式使用者或系統要完成什麼任務?Agent 回答問題、儀表板顯示魚塭資料
應用層協定訊息有什麼格式、方法與語意?HTTP、MCP、MQTT
傳輸層兩個端點如何傳送資料?TCP;Python asyncio Streams 提供程式介面
網路層與名稱解析資料要送到哪台主機?IP 位址、路由、DNS 名稱
實體與鏈路如何經由乙太網路、Wi-Fi 或行動網路送出?校園網路、Wi-Fi、4G/5G、乙太網路

這是教學用的簡化分層圖。實際網路協定堆疊的分類方式不只一種;學習時重要的是辨認每個元件的責任。TCP 是傳輸協定;HTTP、MQTT 和 MCP 定義應用層互動;FastAPI 是 Python Web 框架;Agent 是使用模型和工具的應用程式模式;asyncio 是 Python 的非同步 I/O 函式庫。

二、TCP:可靠傳送位元組,但不認識你的資料格式

TCP 在兩個端點間建立連線,提供可靠、有順序的位元組串流。TCP 不知道一段 bytes 是一句話、一筆 JSON,還是多個應用訊息黏在一起。應用程式必須自行定義訊息邊界,例如每筆訊息以換行結尾、使用固定長度,或先傳送資料長度。

# asyncio TCP Server:以換行符號作為訊息邊界
import asyncio

async def handle_client(reader: asyncio.StreamReader,
                        writer: asyncio.StreamWriter) -> None:
    try:
        line = await reader.readline()
        message = line.decode("utf-8").rstrip("\n")
        writer.write(f"收到:{message}\n".encode("utf-8"))
        await writer.drain()
    finally:
        writer.close()
        await writer.wait_closed()

async def main() -> None:
    server = await asyncio.start_server(
        handle_client, "127.0.0.1", 8888
    )
    async with server:
        await server.serve_forever()

asyncio.run(main())

asyncio.start_server() 建立 TCP 服務;StreamReader 和 StreamWriter 提供收發資料的高階介面。await 表示程式在等網路資料或寫入完成時,事件迴圈可以去處理其他連線。這改善了 I/O 等待時的資源利用方式,但不會改變 TCP 本身,也不會讓 CPU 密集工作自動平行化。Python 文件將 asyncio 定位為以 async/await 撰寫並行程式的函式庫,常見用途包括網路和 Web 伺服器。

要記住:TCP 負責送達 bytes;換行符、JSON、指令名稱等內容格式是應用程式自己定義的。若需要一般 Web API 的請求方法、標頭、狀態碼和內容格式,通常會在 TCP 之上使用 HTTP。

三、HTTP 與 REST:讓一般程式用一致方式呼叫服務

HTTP 以 request/response 方式溝通。Client 傳送方法、路徑、標頭和可能的 body;Server 回傳狀態碼、標頭和回應內容。REST 是設計 HTTP API 的一種架構風格,常以資源路徑和 HTTP 方法表達操作,例如用 GET /api/sensors/pond-01 讀取設備資料。

FastAPI 是 Python Web 框架,可依函式參數、型別標註和資料模型建立 HTTP 路由與 API schema。它會依 OpenAPI 標準產生 API 描述和互動文件。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Reading(BaseModel):
    device_id: str
    temperature: float

@app.get("/api/sensors/{device_id}", response_model=Reading)
async def get_sensor(device_id: str):
    # 真正應用中,這裡呼叫共用 service 或資料庫
    return Reading(device_id=device_id, temperature=28.6)
  • @app.get(...) 把 Python 函式註冊成 HTTP GET 路由。
  • 路徑參數 device_id 對應 URL 中的設備名稱。
  • Pydantic model 描述 JSON 回應欄位,幫助驗證與產生文件。
  • 瀏覽器或手機 App 不必理解 TCP framing,只要依 HTTP 和 JSON 規則呼叫。

四、MCP:讓 AI host 探索和呼叫工具的協定

MCP(Model Context Protocol)處理的是 AI 應用如何連接外部資料與工具。MCP Server 可公布 tools、resources 或 prompts;MCP Client 代表 AI host 與 Server 溝通。以工具為例,Client 可以取得工具清單,再傳送工具名稱與參數要求 Server 執行。MCP 的訊息語意由協定定義,傳輸可以使用 stdio 或 Streamable HTTP 等方式。

from mcp.server import MCPServer

mcp = MCPServer("Pond Monitor")

@mcp.tool()
def get_latest_temperature(device_id: str) -> str:
    """讀取指定魚塭最新的水溫。"""
    reading = sensor_service.latest(device_id)
    return f"{device_id} 水溫:{reading.temperature}°C"

if __name__ == "__main__":
    mcp.run(transport="streamable-http")

@mcp.tool() 把一般 Python 函式註冊為工具;函式名稱、說明、參數型別會協助 Client 認識可用能力。Agent 並不是 MCP Server:Agent 通常住在 AI host 中,MCP Client 負責協定往返,MCP Server 負責提供實際工具。MCP 也不等於 REST API;雖然 MCP 可透過 HTTP 傳輸,MCP request 仍遵照 MCP 的方法、工具描述和回應格式。

五、Agent:應用程式中的任務規劃與工具選擇

Agent 是應用層的工作流程:接收使用者目標,利用模型理解語意,判斷是否需要資料或工具,接著透過 MCP Client 呼叫工具,最後把工具結果整理成回覆。Agent 不是新的底層網路協定;網路傳輸仍由 MCP Client/Server、HTTP、stdio 或其他 transport 處理。

  1. 使用者提出問題:「昨天晚上魚塭水溫有沒有異常?」
  2. Agent 根據任務及工具描述,選擇歷史讀值工具。
  3. MCP Client 把工具名稱和參數送給 MCP Server。
  4. MCP Server 呼叫後端 service 或資料庫取得讀值。
  5. Agent 依結果產生自然語言說明,並可在不確定時追問。

若工具會改變外部狀態,例如啟動抽水馬達,Agent 的「選擇呼叫」不能取代後端授權、操作限制、人工核准和設備端保護。工具定義只說明能力,不會自動替能力加上安全機制。

六、MQTT:IoT 設備的發布/訂閱通訊

MQTT 常用在設備遙測與控制。設備可以把讀值 publish 到 Topic,後端依 Topic subscribe;Broker 負責把訊息送給符合訂閱條件的 Client。這種發布/訂閱模式讓生產資料的設備不必知道每一個儀表板或分析程式的位址。MQTT 5.0 規格將其定義為 Client/Server 的發布/訂閱訊息傳輸協定。

# 概念示意:感測器發布一筆遙測資料
topic = "pond/pond-01/telemetry"
payload = {
    "temperature": 28.6,
    "dissolved_oxygen": 6.4
}

# 感測器 publish;後端訂閱 pond/+/telemetry
mqtt_client.publish(topic, json.dumps(payload), qos=1)

MQTT 專注在設備訊息流;FastAPI 適合被網站、App 或其他服務主動呼叫;MCP 適合將經過選擇的功能提供給 AI host。把三者放在一起,就能同時照顧設備資料流、一般軟體 API 和 Agent 工具呼叫。

七、循序圖一:AIoT 設備資料如何進入網路服務

感測器透過 MQTT 發布資料;Broker 轉交給已訂閱的 Python 後端;後端檢查並存入資料庫。一般應用程式之後使用 FastAPI 查詢,而不是直接連到感測器。

MQTT 遙測資料通常是設備主動上報;REST 查詢則由 Client 發出請求。兩種資料流可以同時存在,後端服務層負責把它們接到相同資料。

八、循序圖二:Agent 如何透過 MCP 工具完成查詢

使用者提出問題後,Agent 先取得工具描述並選擇工具;MCP Server 呼叫共用服務層取得資料,再把工具結果交回 Agent。這是 AI 應用的協定呼叫流程,並非模型直接連接 TCP socket 或感測器。

MCP 連線管理和握手步驟會依協定版本、SDK 與傳輸模式而異;圖中聚焦在工具清單、工具呼叫和結果回傳等主要應用語意。

九、五個主題各自扮演什麼角色?

技術它是什麼最適合負責
TCP傳輸層協定,提供可靠、有順序的 byte stream。兩個程式間的底層資料通道;應用程式要另定訊息邊界。
asyncioPython 非同步 I/O 函式庫與程式寫法。在網路等待期間處理其他 coroutine;不是新的網路協定。
HTTP/RESTHTTP 是應用協定;REST 是 API 設計風格。網站、手機 App、一般程式明確呼叫服務。
FastAPIPython Web 框架。建立 HTTP 路由、驗證請求資料及產生 OpenAPI 文件。
MCPAI 應用探索工具、資源和提示的協定。讓支援 MCP 的 host/Agent 用共同格式使用外部能力。
Agent使用模型理解任務並選擇工具的應用程式。依上下文決定何時查詢或呼叫工具,組織回覆。
MQTT發布/訂閱訊息協定。設備遙測上報、狀態通知和命令傳遞。

十、把五篇文章整合成 AIoT 網際網路應用

以智慧魚塭為例,完整資料和控制路徑可以這樣設計:

水質感測器→MQTT Broker→Python service/資料庫←FastAPI REST Client
使用者問題→Agent→MCP Client→MCP Server→共用 service

感測資料透過 MQTT 進入平台;管理儀表板經 FastAPI 查詢歷史趨勢;Agent 經 MCP 查詢某個魚塭的讀值,或根據使用者授權提出開啟增氧設備的要求。REST endpoint 與 MCP tool 都呼叫同一服務層,讓權限、數值檢查和操作紀錄集中管理。

實作順序

  1. 先做單一 TCP Server/Client,理解主機、埠號、連線和訊息邊界。
  2. 再用 asyncio Streams 改寫網路 I/O,認識 coroutine、await 和事件迴圈。
  3. 使用 FastAPI 建立 REST endpoint,確認 HTTP 方法、狀態碼、JSON 和 OpenAPI 文件。
  4. 將已存在的服務功能註冊成 MCP tool,讓 MCP Inspector 或 AI host 探索並呼叫。
  5. 加入 Agent 作為任務編排者,並把需要模型 API 的部分與一般 API/設備通訊分開管理。
  6. 最後接 MQTT 感測設備,再把控制命令設計成受限制、可稽核、可人工核准的工具。

十一、部署時別忽略網路與安全

  • 確認連線位置:127.0.0.1 只能讓本機連線;區網或雲端服務要設定可達的網卡位址、DNS、路由和防火牆。
  • 分清通訊埠:TCP 範例、FastAPI、MCP Streamable HTTP 和 MQTT Broker 可使用不同 port;開放 port 前先確認網路範圍和必要性。
  • 使用 TLS 與身份驗證:正式環境避免明文傳送密碼、Token 或感測資料;設備、REST API、MCP endpoint 都應依角色限制權限。
  • 保護 API 金鑰:金鑰應放在伺服器環境變數或秘密管理服務,不要寫進前端 JavaScript、公開原始碼或部落格。401 常代表認證資料錯誤;429 可能是速率或額度限制,需查看服務端回應與帳務設定。
  • 控制工具要守規則:Agent 可建議或請求動作;設備服務必須再次檢查範圍、權限、互鎖和核准,不要讓模型直接控制任意命令。
  • 設計失聯策略:網路、Broker 或模型 API 中斷時,設備端仍需有本地保護和安全預設狀態。
關鍵原則:AIoT 的安全和可靠性必須由整條路徑共同負責:設備韌體、網路與 Broker、後端 service、API/MCP 權限,以及 Agent host 的核准流程。

十二、結語:不要只記名詞,要看清楚資料怎麼走

TCP 解決可靠的位元組傳輸;asyncio 讓 Python 在 I/O 等待期間更有效率地安排工作;HTTP/REST 提供一般軟體熟悉的請求與回應方式;FastAPI 幫助 Python 開發 HTTP 服務;MCP 讓 AI host 能探索並呼叫工具;Agent 根據任務選用工具;MQTT 則把設備訊息送到後端。把每一層的責任分清楚,再用共用服務層連接它們,就能從簡單的 TCP 範例逐步發展到 REST API、Agent 工具和 AIoT 應用。

沒有留言:

張貼留言