- 安裝Python
- 從github上下載mavlink repository
git clone https://github.com/mavlink/mavlink.git --recursive
cd mavlink
- 把自定義的dialect放入mavlink/message_definitions/v1.0資料夾內
- 進入mavlink資料夾輸入以下command,打開mavlink產生器的UI介面:
- 選擇輸入檔案和輸出檔案位置(注意:輸出檔案位置要加入檔案名稱,如mavlink/include/custom.py)
- 選擇語言(python3, c, ...)
- 選擇mavlink版本(mavlink2)
- 點選generate
python3 -m mavgenerate
pip uninstall pymavlink
python3 -m pip install -r pymavlink/requirements.txt
- 進入pymavlink資料夾,執行setup.py
python setup.py install --user
- 測試
- 可以用sender.py和receiver.py來測試
- sender.py
import os
import sys
# 強制使用 MAVLink 2.0
os.environ['MAVLINK20'] = '1'
# 設定你的 Dialect 名稱
os.environ['MAVLINK_DIALECT'] = 'hex'
import time
from pymavlink import mavutil
master = mavutil.mavlink_connection('udpout:127.0.0.1:14550', source_system=1)
def send_legacy_data(original_data):
"""
original_data: bytes 格式,例如 b'\xaa\xbb\xcc'
"""
data_len = len(original_data)
if data_len > 254:
raise ValueError("資料太長了,最大只能 254 bytes")
# 3. 準備 Payload
# 第一個 byte 是長度,後面接原始資料
# Python 技巧:直接用相加的方式組成 list
full_payload = [data_len] + list(original_data)
# 補足到 255 bytes (為了讓 MAVLink 2.0 正確運作,剩下的補 0)
full_payload = full_payload + [0] * (255 - len(full_payload))
# 4. 發送訊息
# 函式名稱通常是: [message_name_lower]_send
master.mav.custom_legacy_wrapper_send(
1,
2,
full_payload
)
print(f"已發送 {data_len} bytes 的原始資料")
# 測試發送
send_legacy_data(b'\x01\x02\x03\x04\x05')
import os
import sys
# 強制使用 MAVLink 2.0
os.environ['MAVLINK20'] = '1'
# 設定你的 Dialect 名稱
os.environ['MAVLINK_DIALECT'] = 'hex'
from pymavlink import mavutil
# 建立監聽連線 (例如監聽 UDP 14550)
master = mavutil.mavlink_connection('udpin:0.0.0.0:14550')
print("等待自定義封包...")
while True:
# 接收封包
msg = master.recv_match(type='CUSTOM_LEGACY_WRAPPER', blocking=True)
if msg:
# 1. 取得第一個 Byte (長度)
inner_len = msg.payload[0]
# 2. 根據長度還原原始資料
# payload[1] 開始才是真正的 legacy packet
original_data = bytes(msg.payload[1 : 1 + inner_len])
print(f"收到封包!來自 SysID: {msg.get_srcSystem()}")
print(f"原始長度標記: {inner_len}")
print(f"原始資料內容 (HEX): {original_data.hex().upper()}")