Beebotteを使ってLINEメッセージでLEDをON/OFFする(その1)Beebotteの設定

スマホのLINEからRaspberryPi又はESP32上のLEDをコントロールしてみます。💪

今回はBeebotteを使っての通信をやってみたいと思います。

1、最終的なシステムのイメージ

スクリーンショット 2021-01-24 16.06.23

前回作った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接続もできるようですが、今回はパスします。

スクリーンショット 2021-01-24 16.24.58

Connectすると接続できますね!これで接続に必要なパラメータが分かりました。

ちなみにRetainにも対応しているようです。

スクリーンショット 2021-01-24 16.36.51

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に組み込んでみたいと思います。

では🤚









この記事が気に入ったらサポートをしてみませんか?