2025年12月21日 星期日

MQTTs, HTTPs,WevRTC

 開發者具備處理實時通訊(Real-time Communication)物聯網(IoT)以及資料傳輸安全的能力。這與傳統的 HTTP 請求不同,更強調長連接與雙向數據傳輸。

以下是這三項技術的詳細說明:


1. MQTT (Message Queuing Telemetry Transport)

MQTT 是一種輕量級的發布/訂閱(Publish/Subscribe)傳輸協定,專為低頻寬、不穩定網路環境下的遠端裝置設計。

  • 核心機制

    • Broker(代理伺服器):負責接收所有訊息並分發給訂閱者。

    • Topic(主題):訊息的標籤(例如:home/living-room/temperature)。

  • 應用場景

    • 物聯網 (IoT):感測器回傳數據、遠端控制智慧家電。

    • 即時推播:如手機 App 的通知推送。

  • 開發重點:需理解 QoS(服務質量)等級(0, 1, 2)的差異,以及如何處理斷線重連。


2. Certificates (數位證書與加密)

這涉及到網路傳輸的安全性,確保資料在傳輸過程中不被竊聽或竄改(如 HTTPS、MQTTS)。

  • 核心技術

    • SSL/TLS:用於建立加密連結。

    • Public/Private Key (公鑰與私鑰):非對稱加密的基礎。

    • CA (Certificate Authority):數位證書認證機構。

  • 在後端的角色

    • HTTPS 設置:在伺服器端配置證書。

    • 雙向認證 (mTLS):在高度安全的場景(如銀行或設備對設備通訊),伺服器與客戶端雙方都需要提供證書。

  • 維護重點:證書的更新機制(避免過期導致服務中斷)與密鑰的安全管理。


3. WebRTC (Web Real-Time Communication)

WebRTC 是一個支援網頁瀏覽器或行動 App 進行即時影音串流點對點 (P2P) 資料傳輸的技術。

  • 核心特點

    • 低延遲:直接在兩台裝置間傳輸,不經過中間伺服器轉發(除非遇到防火牆)。

    • 多媒體支持:內建影音編解碼功能。

  • 後端職責

    • Signaling Server (信令伺服器):交換通訊所需的連線資訊(SDP 與 ICE Candidates)。

    • STUN/TURN 伺服器:協助穿透 NAT 防火牆。

  • 應用場景:視訊會議(如 Google Meet)、網頁版即時通訊、串流遊戲。


技術對比總結

協議/技術傳輸特性主要用途核心關鍵字
MQTT非同步、發布/訂閱IoT、輕量訊息傳輸Broker, Topic, QoS
Certificates加密、驗證傳輸安全、身分認證TLS, OpenSSL, mTLS
WebRTC即時、點對點 (P2P)視訊語音、低延遲數據ICE, STUN, TURN

這三者通常會出現在**「智慧系統」「通訊平台」**的職缺中。例如:一個監控系統會使用 MQTT 傳送警報,使用 WebRTC 觀看即時影像,並全程透過 Certificates 確保傳輸安全。

您目前的專案是否有特定的通訊需求(例如要串接硬體設備,或是製作聊天系統)?我可以為您深入解說特定部分。

學習 GraphQL 語法

 學習 GraphQL 語法最好的方式是區分為三個部分:定義結構 (Schema)查詢資料 (Query) 以及 修改資料 (Mutation)

以下是一個以「部落格系統」為例的完整範例:


1. 定義結構 (Schema / SDL)

這是在後端定義的,決定了前端可以存取什麼樣的資料。

GraphQL
# 定義資料格式
type Post {
  id: ID!
  title: String!
  content: String
  author: User!  # 關聯到 User 型別
}

type User {
  id: ID!
  name: String!
  email: String!
}

# 定義「查詢」入口
type Query {
  allPosts: [Post]           # 取得所有文章
  post(id: ID!): Post        # 根據 ID 取得單一文章
}

# 定義「修改」入口
type Mutation {
  createPost(title: String!, content: String, authorId: ID!): Post
}

2. 查詢資料 (Query)

這是前端發出的請求。GraphQL 的精髓在於:你要什麼,就寫什麼

請求範例: 我們只想取得文章的「標題」以及作者的「名字」。

GraphQL
query GetPosts {
  allPosts {
    title
    author {
      name
    }
  }
}

回傳結果 (JSON):

JSON
{
  "data": {
    "allPosts": [
      {
        "title": "Hello GraphQL",
        "author": { "name": "Gemini" }
      }
    ]
  }
}

3. 修改資料 (Mutation)

當你需要新增、刪除或更新資料時使用。

請求範例: 新增一篇文章,並要求回傳新文章的 id

GraphQL
mutation NewPost {
  createPost(
    title: "GraphQL 是什麼?", 
    content: "這是一篇介紹文...", 
    authorId: "user-123"
  ) {
    id
    title
  }
}

4. 進階:使用變數 (Variables)

在實際開發中,我們不會把參數寫死在字串裡,而是使用變數。

GraphQL
query GetSinglePost($postId: ID!) {
  post(id: $postId) {
    title
    content
  }
}

在發送請求時,會額外帶入一個 JSON 變數包:{ "postId": "101" }


關鍵語法符號說明

  • ! (驚嘆號):代表該欄位是 Non-Nullable(必填/不可為空)。

  • [] (中括號):代表這是一個 List(陣列)。

  • #:註解符號。

  • Fragment (片段):如果多個查詢使用重複的欄位,可以用 fragment 來封裝。

您想試試看在特定的程式語言(如 JavaScript/TypeScript)中,如何撰寫解析這些語法的 Resolver 邏輯嗎?

Backen Server for API (GraphQL & RESTful ) and (Cron Jobs & Background Services)

後端工程師,\扮演「資料橋樑」與「自動化引擎」的角色。

以下是這些任務的具體內容、核心技術與實作重點:

1. API 設計與整合 (GraphQL & RESTful)

這項工作核心在於如何有效地將後端資料提供給前端(Web)或移動端(iOS/Android)。

  • RESTful API:

    • 特性:基於標準的 HTTP 方法(GET, POST, PUT, DELETE),資源導向。

    • 重點:定義清晰的 URL 路徑、狀態碼(如 200, 404, 500)以及版本控制(Versioning)。

  • GraphQL:

    • 特性:由客戶端決定需要什麼資料,減少過度擷取(Over-fetching)的問題。

    • 重點:設計強型別的 Schema、編寫高效的 Resolvers,並解決 N+1 查詢效能問題。

  • 協作 (Collaboration)

    • 與前端工程師討論資料結構,確保 API 滿足 UI 需求。

    • 撰寫 API 文件(如 Swagger/OpenAPI 或 Apollo Studio)。


2. 定時任務與非同步工作流 (Cron Jobs & Background Services)

這部分負責處理那些「不需要立即回傳結果」或「需要定期執行」的任務,以確保系統反應快速。

定時任務 (Cron Jobs)

  • 定義:在特定時間點自動執行的任務。

  • 應用場景

    • 每天凌晨 3 點備份資料庫。

    • 每個月 1 號寄送電子帳單。

    • 清理系統暫存檔或過期 session。

非同步服務 (Background Services)

  • 定義:將耗時的操作移出主要的請求路徑(Request-Response Cycle)。

  • 運作方式:通常搭配 Message Queue (訊息佇列),如 Redis, RabbitMQ 或 Kafka。

  • 應用場景

    • 使用者註冊後,背景發送驗證信。

    • 使用者上傳照片後,背景進行圖片壓縮或裁切。

    • 大型資料處理或報表生成。


技術工具示例

類別常見工具/框架
APINode.js (Express/NestJS), Go, Python (FastAPI), Apollo Server
Cron JobsLinux Crontab, Kubernetes CronJobs, Node-cron
Background WorkersBullMQ (Redis), Sidekiq (Ruby), Celery (Python)

您是否希望針對特定的程式語言(如 Node.js 或 Python)來深入了解如何實作這些功能?


實作 GraphQL 是一項涉及前端與後端的完整技術棧。要完成一個 GraphQL 服務,通常需要從語法定義、伺服器實作、資料獲取優化以及前端整合四個層面來配置技術。

以下是完成 GraphQL 必備的核心技術與工具:

1. 核心語法與定義 (核心基石)

這是 GraphQL 的靈魂,獨立於程式語言之外。

  • SDL (Schema Definition Language): 用來定義資料結構(Type)、查詢(Query)、修改(Mutation)與訂閱(Subscription)。

  • 強型別系統: 包括純量類型(String, Int, Boolean, ID)與自定義物件類型(Object Types)。

2. 後端伺服器技術 (Server-side)

你需要一個環境來解析前端傳來的 GraphQL 語法,並將其轉換為實際的資料。

  • 熱門框架:

    • Node.js: Apollo Server (最流行)、Yoga GraphqlNestJS

    • Python: GrapheneStrawberry

    • Go: gqlgen (自動生成程式碼)、graphql-go

    • Java: GraphQL-JavaSpring for GraphQL

  • Resolvers (解析器): 這是後端最關鍵的技術,負責撰寫邏輯去資料庫(SQL/NoSQL)或第三方 API 抓取資料。

3. 資料獲取優化 (Data Fetching)

GraphQL 最怕發生 N+1 查詢問題(即抓取一個清單時,系統針對每個項目都發出一次資料庫請求),因此需要:

  • DataLoader: 由 Facebook 開發的一種公用程式,透過 Batching (批次處理)Caching (快取) 來大幅減少資料庫查詢次數。

  • ORM / Query Builder: 如 PrismaTypeORMDrizzle,這些工具能幫助你更輕鬆地將 GraphQL 欄位對應到資料庫。


4. 前端整合工具 (Client-side)

前端需要特定的套件來發送 GraphQL 請求,並管理本地端的狀態快取。

  • Apollo Client: 功能最齊全,支援自動化快取管理、Loading 狀態追蹤,適用於 React, Vue, iOS, Android。

  • Relay: Facebook 官方開發,強調高效能與大型專案架構,但學習曲線較陡。

  • React Query / urql: 輕量級的選擇,適合不想使用 Apollo 那麼重型框架的開發者。

5. 周邊開發生態 (Developer Tools)

  • GraphiQL / Apollo Sandbox: 在瀏覽器中直接測試 API 的互動式 IDE。

  • GraphQL Code Generator: 自動根據 Schema 生成 TypeScript 型別定義,確保前後端型別一致。

  • Apollo Router / Federation: 當系統變大時,用來將多個微服務的 GraphQL 整合在一起的技術。


技術組合建議 (Stack Example)

如果你是剛開始學習,最推薦的黃金組合是:

Node.js + Apollo Server + Prisma (資料庫) + Apollo Client (前端)


2025年12月14日 星期日

install ros2 humble

 

ROS2 humble

install ros2 humble

建議使用 Debian 方式安裝[1],請參考官方安裝指南進行

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
echo "export ROS_DISTRO=humble" >> ~/.bashrc

rosdep 安裝與更新

sudo apt install python3-rosdep2
rosdep update

機電系統 Packages

urg_node2

git clone https://github.com/Hokuyo-aut/urg_node2.git
cd urg_node2
rm -r urg_library/
git clone https://github.com/UrgNetwork/urg_library.git
cd ~/ros2_ws 
rosdep install -y -r -q --from-paths src --ignore-src --rosdistro humble
colcon build --symlink-install

velodyne

cd ~/ros2_ws/src
git clone https://github.com/ros-drivers/velodyne.git -b humble-devel
cd ..
rosdep install -y -r -q --from-paths src --ignore-src --rosdistro humble
colcon build --symlink-install

ira_laser_tools

將兩個光達的 Laser Scan 資訊合併為一個

cd ~/ros2_ws/src
git clone https://github.com/nakai-omer/ira_laser_tools.git -b humble
cd ..
rosdep install -y -r -q --from-paths src --ignore-src --rosdistro humble
colcon build --symlink-install

rf2o_laser_odometry

使用連續兩幀 LiDAR 資訊生成 /odom 資訊

cd ~/ros2_ws/src
git clone https://github.com/Adlink-ROS/rf2o_laser_odometry.git -b humble-devel
cd ..
rosdep install -y -r -q --from-paths src --ignore-src --rosdistro humble
colcon build --symlink-install

laser_filter

cd ~/ros2_ws/src
git clone https://github.com/ros-perception/laser_filters.git -b ros2
cd ..
rosdep install -y -r -q --from-paths src --ignore-src --rosdistro humble
colcon build --symlink-install

robot_localization

發布 /odom 位移資料

cd ~/ros2_ws/src
git clone https://github.com/cra-ros-pkg/robot_localization.git -b  humble-devel
cd ..
rosdep install -y -r -q --from-paths src --ignore-src --rosdistro humble
colcon build --symlink-install

IMU Ch110

由原廠資料下載 package

micro_ros_agent

cd ~/ros2_ws/src
git clone https://github.com/micro-ROS/micro-ROS-Agent.git -b humble
git clone https://github.com/micro-ROS/micro_ros_msgs.git -b humble
cd ..
rosdep install -y -r -q --from-paths src --ignore-src --rosdistro humble
colcon build --symlink-install

建圖 Packages

cartographer

  • cartographer:核心演算法
  • cartographer_ros:將 cartographer 整合至 ROS
mkdir -p ~/carto_ws/src 
cd ~/carto_ws/src 
git clone https://github.com/ros2/cartographer.git -b ros2
git clone https://github.com/ros2/cartographer_ros.git -b ros2
cd ~/carto_ws 
rosdep install -y -r -q --from-paths src --ignore-src --rosdistro humble
colcon build --symlink-install

導航 Packages

mkdir -p ~/nav2_ws/src 
cd ~/nav2_ws/src 
git clone https://github.com/ros-navigation/navigation2.git -b humble
cd ~/nav2_ws 
rosdep install -y -r -q --from-paths src --ignore-src --rosdistro humble
colcon build --symlink-install
  • 若記憶體不足,可能在 costmap queue 到 54% 時出現錯誤。

    • 解決方案:等待一分鐘讓系統自動關閉終端機,再重新打開終端機編譯。
  • 重新編譯時,可能會在 nav2_waypoint_follower 出現錯誤,這通常是因為中途失敗導致的

    • 解決方案:刪除 build、install、log 資料夾再重新編譯,船到橋頭自然直XD
  • 若編譯失敗時添加以下依賴:

    sudo apt install ros-humble-bondcpp
    sudo apt install ros-humble-test-msgs
    sudo apt install ros-humble-behaviortree-cpp-v3
    sudo apt install ros-humble-diagnostic-updater
    sudo apt install ros-humble-tf2-sensor-msgs
    sudo apt install ros-humble-ompl
    sudo apt install ros-humble-nav2-map-server
    sudo apt install ros-humble-gazebo-*
    sudo apt install ros-humble-joint-state-publisher
    
  • 若遇到錯誤 nav2_msgs/nav2_msgs

    rm -rf /home/scl/nav2_ws/build/nav2_msgs/ament_cmake_python/nav2_msgs/nav2_msgs
    
  • 下面待確認

    sudo apt install libboost-all-dev
    

建圖、導航 launch 參照

Turtlebot3 Cartographer & Navigation2

cd
git clone https://github.com/ROBOTIS-GIT/turtlebot3.git -b humble-devel
cd turtlebot3/
mv turtlebot3_cartographer/ ~/carto_ws/src/
mv turtlebot3_navigation2/ ~/nav2_ws/src/
cd ..
rm -r turtlebot3/

小型 Packages

rqt-tf-tree

sudo apt-get install ros-humble-rqt-tf-tree

ESP32 連接

pip install pyserial

鍵盤控制

sudo apt-get install ros-humble-teleop-twist-keyboard

Plot 工具

sudo apt install ros-humble-plotjuggler-ros