Beebotteを使ってLINEメッセージでLEDをON/OFFする(その1)Beebotteの設定
スマホのLINEからRaspberryPi又はESP32上のLEDをコントロールしてみます。💪
今回はBeebotteを使っての通信をやってみたいと思います。
1、最終的なシステムのイメージ
前回作ったLINE→GASにBeebotteをMQTTbrokerとして設定しRaspberryPiやESP32を接続してLINEのメッセージでLEDをコントロールします。
LINE→GASまでの設定は下記を参考にしてください。
2、Beebotteの設定
Beebotteは無料で使えるMQTTサーバです。使用するには登録&設定が必要になります。
設定については『beebotteの使い方』に詳しく書かれているのでこちらを参考にして下さい!
まずはMQTTXを使って、設定データの確認を行います。
MQTTXの使い方は下記を参考にしてください。
設定したのがこちらです。接続に必要なパラメーターは接続のURLとUsernameになります。UsernameにはChannel tokenを使うようです。Passwordはありません。Portを8883にしてSSL/TSLをture、CAsigned severをONするとhttps接続もできるようですが、今回はパスします。
Connectすると接続できますね!これで接続に必要なパラメータが分かりました。
ちなみにRetainにも対応しているようです。
Retainとは何者?って思ってる人は試してみて下さい。Retainで書き込んだデータはサーバー内にずっと残って接続のたびにそのデータがsubscribeされるのが分かると思います。
ちなみにRetainで書き込んでしまったデータを消したい時は下記を実行して下さいね。そうしないと消えません。
$ mosquitto_pub -h mqtt.beebotte.com -p 1883 -u チャンネルトークン -P "" -t "<channel>/<resource>" -r -n
$ mosquitto_sub -v -h mqtt.beebotte.com -p 1883 -u チャンネルトークン -P "" -t "<channel>/#" -v
3、pythonでPUB、SUBしてみる
過去に作ったソフトのパラメータ変えて動かしてみます。
⭐️publisher
SSL/TSL通信の設定がコメントアウトされています。このコメントを削除しても、まだSSL/TSL通信は通信はできません。SSL/TSLについては現在調査中なので分かったら紹介しますね!
from time import sleep
import paho.mqtt.client as mqtt
#import ssl
host = 'mqtt.beebotte.com'
username = "token_xxxxxxxxxxxxx"
password = ""
clientID = "Raspberry123"
name ="raspberry"
port = 1883
topic = 'lineChatBot/message'
qos = 0
#cacert = './cert/ca.crt'
#clientCert = './cert/client.crt'
#clientKey = './cert/client_nopass.key'
# ブローカーに接続できたときの処理
def on_connect(client, userdata, flag, rc):
print("Connected with result code " + str(rc))
# publishが完了したときの処理
def on_publish(client, userdata, mid):
print("publish: {0},{1}".format(userdata,mid))
# インスタンス作成時に protocol v3.1.1 を指定します
#client = mqtt.Client(client_id = clientID,clean_session=True,userdata=name,protocol=mqtt.MQTTv311,transport="tcp")
client = mqtt.Client(client_id = clientID,clean_session=True,protocol=mqtt.MQTTv311,transport="tcp")
client.username_pw_set(username, password=password)
### SSL
#client.tls_set(cacert,
# certfile = clientCert,
# keyfile = clientKey,
# tls_version = ssl.PROTOCOL_TLSv1_2)
#client.tls_insecure_set(True)
client.on_connect = on_connect # 接続時のコールバック関数を登録
client.on_publish = on_publish # メッセージ送信時のコールバック
#client.tls_set()
client.connect(host, port=port, keepalive=60)
client.loop_start()
sleep(1)
res = client.publish(topic, 'testmessage',qos = qos)
print(res)
sleep(2)
client.disconnect()
⭐️Subscribe
こちらもパラメータ変えで動きます!
import paho.mqtt.client as mqtt
host = 'mqtt.beebotte.com'
username = "token_xxxxxxxxxxx"
password = ""
clientID = "Raspberry456"
name ="raspberry"
port = 1883
topic = 'lineChatBot/message'
def on_connect(client, userdata, flags, respons_code):
print('status {0},{1}'.format(respons_code,userdata))
client.subscribe(topic)
def on_message(client, userdata, msg):
#topic QOS payloadを取得
print(msg.topic + " " + str(msg.qos) + " " + str(msg.payload))
if __name__ == '__main__':
# Publisherと同様に v3.1.1を利用
#client = mqtt.Client(client_id = clientID,clean_session=True,userdata=name,protocol=mqtt.MQTTv311,transport="tcp")
client = mqtt.Client(client_id = clientID,clean_session=True,protocol=mqtt.MQTTv311,transport="tcp")
client.username_pw_set(username, password=password)
client.on_connect = on_connect
client.on_message = on_message
client.connect(host, port=port, keepalive=60)
# 待ち受け状態にする
client.loop_forever()
これで準備完了と思いきや、これはBeebotteとRaspberryPiとの通信にしか使えません。今回はGASとBeebotteの通信もある訳で、GASだとpaho_mqttのライブラリーが使えないので別の方法を考える必要がありますね💦
4、BeebotteにAPIを使って書き込んでみる
Beebotteの説明を読んでみるとhttp POSTで書き込み、http GETで読み込みができるようです。
requestsのhttp.POSTを使って書き込んでみました。下記を実行するとSubscribeにメッセージ送信されます。http.POSTならGASから実行できそうですね。
import requests
import pprint
import json
# -*- coding: utf-8 -*-
#curl -i -H "Content-Type: application/json" -H "X-Auth-Token: チャンネルトークン"
# -X POST -d '{"data":"データ"}' http://api.beebotte.com/v1/data/publish/チャンネル名/リソース名
def main():
send_Beebotte_API()
def send_Beebotte_API():
beebotteUrl = "https://api.beebotte.com/v1/data/write/lineChatBot/message"
headers= {
"Accept": "application/json",
"Content-Type": "application/json",
"X-Auth-Token": "token_xxxxxxxxx"
}
obj = {
'data': 'hello mac book write'
}
json_data = json.dumps(obj).encode("utf-8")
response = requests.post(beebotteUrl,headers=headers, data = json_data)
print(response)
if __name__ == "__main__":
main()
Subscribeですが、GASのスプリクトでは常時Subscribeを動かしておけないので、データの受信はhttp.GETでやることにします。timeRangeの設定で過去に書き込まれたデータの時間範囲などの設定もできるようです。
下記では過去1時間以内のデータを1つ取得するように設定してます。
import requests
import pprint
import json
# -*- coding: utf-8 -*-
def main():
send_Beebotte_API()
def send_Beebotte_API():
limit = '1'
source = 'raw'
timeRange = '1hour'
beebotteUrl = "https://api.beebotte.com/v1/data/read/lineChatBot/message?limit={0}&source={1}&time-range={2}".format(limit,source,timeRange)
headers ={
"X-Auth-Token": "token_xxxxxxxxxxx"
}
response = requests.get(beebotteUrl,headers=headers)
td = response.json()[0]['data']
print(type(td))
print(td)
if __name__ == "__main__":
main()
設定については下記のAPI Documentationで自動作成してくれるようなのですが、自動作成した設定をコピペしても何故か動きません。😅
でも、参考にはなるので紹介しておきます。
今回の記事でGASからBeebotteへの書き込み、BeebotteとRaspberryPiの通信ができそうな確認ができました。
次回は実際にGASに組み込んでみたいと思います。
では🤚
この記事が気に入ったらサポートをしてみませんか?