個人適用的單片機長距離通訊方法(PC-20230910-Wingman)
方法由四大部份構(gòu)成: 上位單片機
Air780E
frp
Godot服務(wù)器
Air780E可以事先刷入AT固件,只作為聯(lián)網(wǎng)和通訊之用。其默認(rèn)開啟聯(lián)網(wǎng)功能,常用的聯(lián)網(wǎng)指令如下: AT+CIPSTART=TCP,domain.name,port
AT+CIPSEND
> XX XX XX XX XX XX XX XX XX 1A
上述3條指令由單片機通過串口向Air780E發(fā)送,分別意為: 建立TCP連接
準(zhǔn)備傳送一段數(shù)據(jù)
在串口返回 “>” 符號后,以 十六進(jìn)制 開始像串口輸入數(shù)據(jù),最后以十六進(jìn)制 1A 結(jié)尾表示數(shù)據(jù)傳輸完畢
frp用于獲取在公網(wǎng)上的域名并將本地服務(wù)器端口映射到該公網(wǎng)域名上 Godot可以用于搭建一個簡易的服務(wù)器和圖形界面,其啟用TCP服務(wù)的腳本可參照如下:
extends Node
const HOST := "127.0.0.1"
const PORT := 114
var server := TCPServer.new()
var clientSet:Dictionary
func _ready():
if server.listen(PORT, HOST) == OK:
print("地面站網(wǎng)絡(luò)服務(wù)啟動")
else:
print_debug("地面站網(wǎng)絡(luò)服務(wù)",HOST,PORT,"啟動失敗")
func _process(delta):
for client in clientSet.keys():
client.poll()
# 處理數(shù)據(jù)
var dataLength:int = client.get_available_bytes()
if dataLength:
match client.get_data(dataLength):
[var err, var data]:
if err == OK and dataLength:
handle_data(client, data)
# 清理無效連接
if client.get_status() == StreamPeerTCP.STATUS_NONE:
clientSet.erase(client)
print("TCP連接數(shù):", clientSet.size())
continue
# 處理新增連接
if server.is_connection_available():
var client := server.take_connection()
clientSet[client] = client
print("TCP連接數(shù):", clientSet.size())
func handle_data(client:StreamPeerTCP, data:PackedByteArray):
print("<",data)
func put_data(client:StreamPeerTCP, data:PackedByteArray):
client.put_data(data)
print(">",data)
效果如下圖所示: