LineBot控制Tello
最近買了一台Tello,玩具等級的東西,但操控起來卻很穩定。除了遙控模式外,它還提供了文字命令模式,讓我們可以用phthon、node.js以及Scratch來控制它。之前,我用LineBot控制了很多東西,Tello怎麼能放過。Tello本身是利用WIFI連線,讓手機、電腦、平板等連上它並進而控制它,但這就代表和它連線的手機、平板,連上它之後便會喪失了連上Internet的能力,而LineBot卻是必須透過Internet來傳送訊息。為了解決這個問題,要把LineBot程式放在同時連接著有線網路以及WIFI的電腦上,才能讓Line傳送訊息到封閉的Tello網路裡。
用Line的文字介面就可以控制Tello
用Line控制Tello
用Line控制Tello
利用LineBot控制Tello的步驟:
一、準備一台電腦,使用網路線連接上網路。
二、在電腦上準備好LineBot程式,在d:建立tello資料夾,資料夾裡面建立Line_Tello.py這個檔案,檔案內容如下:
# coding=utf-8
from flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
import threading, socket, sys, time
#這邊的port是和Line伺服器溝通的port,可以修改成你要想run的port
myPort=8090
app = Flask(__name__)
#請修改以下的程式,加入自己Line的channelAccessToken以及channelSecret
line_bot_api = LineBotApi('這裡改成自己Line的channelAccessToken')
handler = WebhookHandler('這裡改成自己Line的channelSecret')
host = ''
port = 9000
locaddr = (host,port)
# Create a UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#192.168.10.1是Tello的IP
tello_address = ('192.168.10.1', 8889)
sock.bind(locaddr)
myId=''
getId=False
def recv():
count = 0
while True:
try:
data, server = sock.recvfrom(1518)
data=data.decode(encoding="utf-8")
data=data.replace('\r\n','')
print(data)
line_bot_api.push_message(myId, TextSendMessage(text=data))
except Exception:
print ('\nExit . . .\n')
break
#recvThread create
recvThread = threading.Thread(target=recv)
recvThread.start()
@app.route("/", methods=['POST'])
def index():
# get X-Line-Signature header value
signature = request.headers['X-Line-Signature']
# get request body as text
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
# handle webhook body
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)
return 'OK'
#以下從Line伺服器收到Tello控制命令後,用sock.sendto()傳送命令給Tello
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
global myId
global getId
if not getId:
myId=event.source.user_id
getId=True
if event.message.text=="end":
sock.close()
else:
sock.sendto(event.message.text.encode(encoding="utf-8"), tello_address)
#line_bot_api.reply_message(event.reply_token,TextSendMessage(text=event.message.text))
if __name__ == "__main__":
app.run(host='0.0.0.0', port= myPort)
三、下載ngrok程式,ngrok的下載位置,https://ngrok.com/download,這個程式會幫我們在Line伺服器以及自己的電腦建立虛擬通道,並產生一個https的專用網址,複製這個網址,並在Line伺服器設定這個網址。點選下載下來的ngrok,執行如下的指令:
ngrok http 8090
以上的8090必須和程式碼當中所設定的Line Bot的port一致
ngrok會取得一個https的網址(如下圖圖片所示),將自己取得的https網址填入Line的Message API的Webhook URL,讓Line的伺服器可以識別得到您的電腦。這個ngrok程式不要關掉,如果關掉再重新啟動ngrok,又會重新取得一個不一樣的https網址。
四、將以上ngrok所取得的https網址,填到Message API裡的Webhook URL欄位裡
五、python要執行Line Bot程式,必須安裝以下的套件,進入MS-DOS模式,執行
pip install Flask
pip install line-bot-sdk
六、將Tello電源打開,電腦的無線訊號連線Tello的WIFI的SSID
七、在電腦的MS-DOS模式下開始執行以下的Line Bot程式
d:
cd \tello
py Line_Tello.py
八、接下來便可以在Line上面下指令,控制Tello了,控制Tello的指令,請參考以下大疆提供的PDF檔
https://dl-cdn.ryzerobotics.com/downloads/tello/0228/Tello+SDK+Readme.pdf
比較重要的是,要能夠利用文字模式控制Tello,第一個要下的指令是:command,才能夠下其他的指令。
也可以將常用的指令,做成Line的圖文選單,方便遙控Tello,Line圖文選單的製作請參考我之前的文章:
利用Line的文字介面輸入Tello的控制指令
也可以將常用的指令,做成Line的圖文選單,方便遙控Tello
也可以將常用的指令,做成Line的圖文選單,方便遙控Tello