
シェア:
Maria is a passionate maker currently working as IoT Developer focused on System Integration & Hardware Development. Also, she is an organizer of IoT Medellin - a tech community that brings together IoT enthusiasts to share knowledge in LATAM.
Vonage Messages APIとUbidotsでデバイスデータをリアルタイム追跡
所要時間:1 分
私は モノのインターネット(IoT)ほとんど目に見えないが、仕事、社会的、個人的に私たちの生活をより良いものにしてくれる。スーパーヒーローは、都市、病院、教育機関、製造工場、農場、あるいはあなたが思い浮かべることができるどんな場所であろうと、あなたが必要とするところならどこにでも、あなたのそばにいてくれる途方もない力を持っている。モノのインターネットに似ていると思いませんか?
ナタリアの立場になって考えてみよう。ナタリアは農業部門で ピッグ・ビジョン人工知能とニューラルネットワークを統合したインテリジェント・カメラだ。このデバイスを使えば、彼女は豚にストレスを与えることなく、農場での計量プロセスに関するリアルタイムの指標を得ることができる。もしナタリアがデータにアクセスする必要があるにもかかわらず、その瞬間にインターネットにアクセスできないとしたら?ここで メッセージAPIの出番です。ナタリアがSMSで必要なデータを要求したらどうなるでしょうか?
現在では、テクノロジーを誰でも利用できるようにするメッセージング・サービスや視覚化プラットフォームが数多く存在し、革新的なソリューションを生み出すために専門的なエンジニアである必要はありません。さらに、これらのサービスを利用すれば、完全なソリューションを数時間で展開することができる。ナタリアのユースケースを参考にし、また業界を問わず存在しうるあらゆるデータ・ベースのニーズを考慮して、インターネット・アクセスに依存せずにデバイス・データをリアルタイムで監視できるシステムがあれば素晴らしいと思いました。
このチュートリアルでは、このシステムを構築するための詳細なステップを共有します。 Vonage Messages APIをメッセージングサービスとして使用し UbidotsをIoTプラットフォームとして使用したシステム構築の詳細な手順を紹介する。手始めに、実装するアーキテクチャを理解しよう:
illustration of architecture
これらのサービスの統合は ユビファンクションというサーバーレスコンピューティング環境を使って、HTTPリクエストでバーチャルナンバーに送られたメッセージを受け取ることができる。そして、リクエストされた各変数の最後に受信した値をリプライとして送信するために、デバイスとリクエストされた変数を特定するために、それを分析することができる。
間違いなく、このシステムはさまざまなユースケースで役に立つだろう。あなたが取り組んでいるプロジェクトで、このシステムがどこで役立つかを見極めるために、少し創造的になればいいのだ。では、さっそく始めよう!
前提条件
インターネットにアクセスできるあらゆるデバイス
Vonage API Account
To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.
This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.
IoTプラットフォームのセットアップ
Ubidotsを使えば、何行もコードを書くことなく、IoTアプリケーションを素早く組み立て、立ち上げることができる。使い始めるために必要なのは アカウントにデータを送信するためのインターネット接続が可能なデバイスが必要だ。 Ubidots API.
デバイス設定
このプロジェクトでは パイコンSiPyと PySense 1温度、湿度、照度、圧力などの環境変数をモニターすることができる。しかし、もし他のハードウェアで HTTP, MQTTまたは TCP/UDPを通信プロトコルとして統合することもできる。ユビドッツのヘルプセンター ユビドッツ・ヘルプセンターをご覧ください。IoTデバイスを使ってプラットフォームとデータを送受信する方法についてのチュートリアルがあります。
Pycomチームは毎週、製品に追加機能を追加しているため、開発を始める前に、ボードが最新のファームウェア・アップデートで動作していることを確認してください。 最後のファームウェア・アップデート.また、OSとしてWindowsを使用している場合は、次のことを行う必要があります。 必要なドライバーをインストールしてください。.
*注:初めてPycomボードを開発される場合は、以下のスタートアップガイドをご覧になることを強くお勧めします。 スタートガイドを参照することを強くお勧めします。
Pymakrをインストールする。 アトムおよび Visual Studio Codeをインストールする。Pymakrはまた、ボードに接続するターミナルにREPLコンソールを追加する。
次に、Pymakrとボードの通信をシリアルまたはTelnetで確立します。お使いのコードエディタに応じたセットアップガイドを参照してください:
コード
このプロジェクトでは、いくつかの外部ライブラリーが必要で、それをダウンロードして一箇所に集めなければ、本来の動作ができません。もしメイン・コードと一緒にそれらをすべて入手したい場合は ダウンロードはこちら.
ゼロから始めたい場合は、好きな名前で新しいプロジェクトを作成してください。私は **_pysense-ubidots-mqtt_**.
プロジェクトでは **_pysense-ubidots-mqtt_**プロジェクトでは、必要なライブラリーを管理し、メインコードを追加していきます。これを管理するために、新しいフォルダ **_lib_**という名前の新しいファイルを作成します。 **_main.py_**
pycomライブラリリポジトリから pycomライブラリリポジトリから、以下のライブラリをダウンロードし、先ほど作成した **_lib_**フォルダに入れてください:
これらのライブラリをダウンロードした後、プロジェクト・フォルダ内は以下のような構造になっているはずです:
- lib
- LTR329ALS01.py
- MPL3115A2.py
- pycoproc.py
- pysense.py
- SI7006A20.py
- umqtt
- robust.py
- simple.py
- main.pyこれらのライブラリによって、メインボード(私の場合はSiPy)やPySenseと通信したり、MQTTを介してUbidotsでデータを管理したりすることができる。
以下のコードを main.pyファイルにコピーする。このコードは、温度、湿度、気圧、高度の値を常にユビドットに公開する:
#!/usr/bin/python
# Include Libraries
from umqtt.robust import MQTTClient
import machine
import time
import pycom
import json
import ubinascii
from network import WLAN
from pysense import Pysense
from LIS2HH12 import LIS2HH12
from SI7006A20 import SI7006A20
from LTR329ALS01 import LTR329ALS01
from MPL3115A2 import MPL3115A2,ALTITUDE,PRESSURE
import gc
gc.collect()
# Define network constants
wifi_ssid = "xxxx" # Set Network's SSID
wifi_password = "xxxx" # Set Network password
# Define Ubidots constants
mqtt_server = "industrial.api.ubidots.com" # 169.55.61.243
mqtt_clientID = ubinascii.hexlify(machine.unique_id(),'').decode()
mqtt_username = "BBFF-xxxx" # Set your Ubidots TOKEN
ubidots_dev_label = "weather-station" # ubinascii.hexlify(machine.unique_id(),':').decode() # Set a device labe
# Constants to manage data rate
last_message = 0
message_interval = 5
'''
Establishes connection with the MQTT server defined
'''
def connect_mqtt():
global mqtt_clientID, mqtt_server
client = MQTTClient(mqtt_clientID, mqtt_server, user=mqtt_username, password=mqtt_username)
client.connect()
print("\nConnected to {} MQTT broker".format(mqtt_server))
return client
'''
Reset the device to restore the connection with the MQTT Server
'''
def restart_and_reconnect():
print("\nFailed to connect to MQTT broker. Reconnecting...")
time.sleep(10)
machine.reset()
'''
Establish network connection
@arg ssid [Mandatory] Network SSID
@arg psw [Mandatory] Network Password
'''
def wifi_connect(ssid, psw):
attempts = 0
print("Starting attempt to connect to WiFi.", end="")
wlan.connect(ssid, auth=(WLAN.WPA2, psw), timeout=5000) # Connect to the WiFi AP provided
# Check network status
while not wlan.isconnected():
time.sleep(0.5)
print(".", end="")
attempts += 1
machine.idle() # Safe power while waiting
if attempts >= 10:
print("\nssid: {}, psw: {}".format(wifi_ssid, wifi_password))
print("\nCould not establish connection with the network provided. Please check the network crendentials or status, and try again.");
time.sleep(0.5)
attempts = 0
machine.reset()
# Network interface parameteres logs
network_settings = wlan.ifconfig()
print("\nWLAN connection succeeded!")
print("IP address: {}".format(network_settings[0]))
print("Subnet: {}".format(network_settings[1]))
print("Gateway: {}".format(network_settings[2]))
print("DNS: {}".format(network_settings[3]))
return True
'''
Reads temperature, humidity, pressure, altitude, and light sensors
@return data, JSON object with sensors readings
'''
def read_sensors():
# Barometric sensor constructor (Pressure (Pascals), Altitud (meters), Temperature (celsius ))
mpl_pressure = MPL3115A2(py, mode=PRESSURE)
mpl_altitude = MPL3115A2(py,mode=ALTITUDE)
# Humidity & Temperature sensor constructor (Humidity (relative humidity), Temperature (celsius))
si = SI7006A20(py)
# Ambient light sensor consturctor (Light levels(luxes))
ltr = LTR329ALS01(py)
# Sensors readings
pressure = mpl_pressure.pressure()
altitude = mpl_altitude.altitude()
temperature_mpl = mpl_altitude.temperature()
temperature_si = si.temperature()
relative_humidity = si.humidity()
ambient_humidty = si.humid_ambient(temperature_si)
dewpoint = si.dew_point()
light = ltr.light()
# Readings logs
print("\nMPL3115A2 | Pressure: {} Pa, Altitude: {} m, Temperature: {} ºC".format(pressure, altitude, temperature_mpl))
print("SI7006A20 | Temperature: {} ºC, Relative Humidity: {} %RH, Ambient Humidity: {} %RH, Dew point: {}".format(temperature_si, relative_humidity, ambient_humidty, dewpoint))
print("LTR329ALS01 | Light (channel Blue lux, channel Red lux): {}\n".format(light))
# JSON build
data = b'{ "pressure" : %s,"altitude" : %s, "temp_mpl" : %s, "temp_si" : %s, "rel_hum" : %s, "amb_hum" : %s, "dew_point" : %s, "lux_blue" : %s, "lux_red" : %s }' % (pressure, altitude, temperature_mpl, temperature_si, relative_humidity, ambient_humidty, dewpoint, light[0], light[1])
return data
# Network's inizalitation
wlan = WLAN(mode=WLAN.STA) # Set STA (Station Aka Client, connects to an AP) as WLAN network interface 'STA_IF' (Station aka client, connects to upstream WiFi Access points)
wlan.antenna(WLAN.EXT_ANT) # Set antenna type (INT_ANT: Internal, EXT_ANT: External)
wifi_connect(wifi_ssid, wifi_password)
# Sensors' inizalitation
py = Pysense()
# Establishes connection with the MQTT server
try:
client = connect_mqtt()
except OSError as e:
restart_and_reconnect()
# Main function
while True:
try:
# Network reconnection
if wlan.isconnected() != True:
wifi_connect(wifi_ssid, wifi_password)
# Publish sensor data every 5 seconds
if (time.time() - last_message) > message_interval:
data = read_sensors()
client.publish(b"/v1.6/devices/%s" % (ubidots_dev_label), data)
last_message = time.time()
except OSError as e:
restart_and_reconnect()
単にコピー&ペーストするだけでなく、コードがどのように動くのかを見てみよう。まず、必要なライブラリをインポートしなければならない:
from umqtt.robust import MQTTClient
import machine
import time
import pycom
import json
import ubinascii
from network import WLAN
from pysense import Pysense
from LIS2HH12 import LIS2HH12
from SI7006A20 import SI7006A20
from LTR329ALS01 import LTR329ALS01
from MPL3115A2 import MPL3115A2,ALTITUDE,PRESSURE
import gcそして次の変数で、接続を確立するためのネットワーク認証情報を代入する:
wifi_ssid = "xxxx"
wifi_password = "xxxx"MQTTでUbidotsアカウントとの通信を確立するには、ブローカアドレス、クライアント、通信認証用のユーザ名を定義する必要がある:
MQTTブローカー:
industrial.api.ubidots.comまたは169.55.61.243.MQTTクライアントクライアントとサーバーの通信に使用する一意の識別子。デバイスごとに一意な値であるため、デバイスのMACアドレスをクライアントの識別子として使用することを推奨する。
MQTTユーザー名:ブローカーとの通信を認証する。ユビドットの場合は アカウント・トークンをユーザー名として割り当てる必要がある。
mqtt_server = "industrial.api.ubidots.com" # 169.55.61.243
mqtt_clientID = ubinascii.hexlify(machine.unique_id(),'').decode()
mqtt_username = "BBFF-xxxx" # Set your Ubidots TOKEN次に デバイスラベル.このラベルは、Ubidotsと通信するための一意の識別子で、トピックにデータを公開したり、トピックからデータを購読したりするためのものです。一意な文字列か、デバイスのMACアドレスである。私の場合は weather-stationをデバイス・ラベルとして割り当てた:
ubidots_dev_label = "weather-station"宣言の最後に、希望するデータレートを次のように割り当てる。 message_interval.この変数はデフォルトで5秒に設定されている。この last_message変数は最後にメッセージが送信された時刻を保持する。
last_message = 0
message_interval = 5さて、いよいよボードをローカルネットワークに接続しよう。まず WLANオブジェクトを作成します。下にあるように、オブジェクトは wlan変数の下に作成され、外部アンテナを使うように設定されています。内部アンテナを使いたい場合は wlan.antenna(WLAN.INT_ANT).
wlan = WLAN(mode=WLAN.STA)
wlan.antenna(WLAN.EXT_ANT)次に、関数 wifi_connect()は指定されたネットワークとの通信を確立する:
wifi_connect(wifi_ssid, wifi_password)しかし wifi_connect関数は何をしているのだろうか?下にあるように、この関数はネットワーク接続の確立を引き受け、接続が成功した場合のみネットワーク・パラメータを返します。問題が発生した場合はその旨が報告され、接続を再試行するためにデバイスが再起動されます。
def wifi_connect(ssid, psw):
attempts = 0
print("Starting attempt to connect to WiFi.", end="")
wlan.connect(ssid, auth=(WLAN.WPA2, psw), timeout=5000)
while not wlan.isconnected():
time.sleep(0.5)
print(".", end="")
attempts += 1
machine.idle()
if attempts >= 10:
print("\nssid: {}, psw: {}".format(wifi_ssid, wifi_password))
print("\nCould not establish connection with the network provided. Please check the network crendentials or status, and try again.");
time.sleep(0.5)
attempts = 0
machine.reset()
network_settings = wlan.ifconfig()
print("\nWLAN connection succeeded!")
print("IP address: {}".format(network_settings[0]))
print("Subnet: {}".format(network_settings[1]))
print("Gateway: {}".format(network_settings[2]))
print("DNS: {}".format(network_settings[3]))
return True
次に、PySenseボードを次のように初期化します。 py
py = Pysense()ブローカーとの通信の問題を防ぐため、接続を確立してから while.ただし、通信に問題が発生した場合は umqttライブラリが自動再接続を管理します。ブローカーがダウンしているなど、別の理由で接続が確立できない場合は、ボードを再起動して接続の再確立を試みます。
try:
client = connect_mqtt()
except OSError as e:
restart_and_reconnect()関数 connect_mqtt()は、指定されたブローカへの新しい MQTT 接続をオープンします:
def connect_mqtt():
global mqtt_clientID, mqtt_server
client = MQTTClient(mqtt_clientID, mqtt_server, user=mqtt_username, password=mqtt_username)
client.connect()
print("\nConnected to {} MQTT broker".format(mqtt_server))
return client最後に、以下のように、メインコードは実際には3つのプロセスを担当している。
まず、ネットワーク接続を確認する:
if wlan.isconnected() != True:
wifi_connect(wifi_ssid, wifi_password)そして、5秒ごとにセンサーデータをユビドットに公開する:
if (time.time() - last_message) > message_interval:
data = read_sensors()
client.publish(b"/v1.6/devices/%s" % (ubidots_dev_label), data)
last_message = time.time()
ここで、関数 read_sensors()は、すべてのセンサーから測定値を取得し、Ubidotsに送信するJSONペイロードを構築する役割を担っている:
def read_sensors():
mpl_pressure = MPL3115A2(py, mode=PRESSURE)
mpl_altitude = MPL3115A2(py,mode=ALTITUDE)
si = SI7006A20(py)
ltr = LTR329ALS01(py)
pressure = mpl_pressure.pressure()
altitude = mpl_altitude.altitude()
temperature_mpl = mpl_altitude.temperature()
temperature_si = si.temperature()
relative_humidity = si.humidity()
ambient_humidty = si.humid_ambient(temperature_si)
dewpoint = si.dew_point()
light = ltr.light()
print("\nMPL3115A2 | Pressure: {} Pa, Altitude: {} m, Temperature: {} ºC".format(pressure, altitude, temperature_mpl))
print("SI7006A20 | Temperature: {} ºC, Relative Humidity: {} %RH, Ambient Humidity: {} %RH, Dew point: {}".format(temperature_si, relative_humidity, ambient_humidty, dewpoint))
print("LTR329ALS01 | Light (channel Blue lux, channel Red lux): {}\n".format(light))
# JSON build
data = b'{ "pressure" : %s,"altitude" : %s, "temp_mpl" : %s, "temp_si" : %s, "rel_hum" : %s, "amb_hum" : %s, "dew_point" : %s, "lux_blue" : %s, "lux_red" : %s }' % (pressure, altitude, temperature_mpl, temperature_si, relative_humidity, ambient_humidty, dewpoint, light[0], light[1])
return data最後に、ブローカーでエラーが発生した場合は、ボードを再起動してください:
except OSError as e:
restart_and_reconnect()機能 restart_and_reconnect()は、ブローカーとの接続を再接続するためにボードを再起動する。
def restart_and_reconnect():
print("\nFailed to connect to MQTT broker. Reconnecting...")
time.sleep(10)
machine.reset()Pymakrでコードを作成したら、そのコードをボードにアップロードすることができます。 アップロードボタンを押します。デバイスのコンパイルが終わるまで数秒待ちます。
ユビドットのアカウントから、次のページに進みます。 デバイス > デバイスセクションを開き weather-stationセンサーデータが受信されると、デバイスが自動的に作成された:
Ubidots New Device
オプションUbidotsでは、デバイスや変数をフレンドリーな名前、色、アイコン、説明でカスタマイズすることができます。ラベルはデバイスとプラットフォーム間の通信を処理するものなので、デバイスと変数のラベルは変更できないことに注意してください。
カスタマイズ前:
Ubidots Generic Device
カスタマイズ後
Ubidots Custom Device
ダッシュボードの設定
ユビドットで仕事をする上で私が気に入っていることのひとつは、彼らが提供するキャッチーなビジュアライゼーションだ。また、ダッシュボードをどのように見せたいかを完全にカスタマイズできるウィジェットの種類も豊富です。ダッシュボードは、IoTソリューションの非常に重要な部分です。なぜなら、世界中のどこからでもデバイスのすべてのデータにアクセスできるからです。
ダッシュボードを作成するには セクションに移動します。次に、_新規ダッシュボードをクリックし、必要な名前を割り当てます。
新しいウィジェットを追加するには、青いプラスアイコンをクリックして、ウィジェットの種類を選択し、いくつかの視覚化のカスタマイズを設定するだけです。この時点で、創造力を発揮してユビドットが提供する様々なウィジェットを探索し始める時です。
私のダッシュボードはこんな感じだ!
Ubidots Dashboard
ダッシュボードとウィジェット設定の詳細については、以下のガイドをチェックすることを強くお勧めします:
Vonageセットアップ
おかげで メッセージ APIのおかげで、簡単な方法でさまざまなメッセージング戦略を有効にすることができます。送信できるだけでなく SMSだけでなく MMS, Whatsapp, フェイスブックメッセンジャーそして バイバー.このプロジェクトでは、SMSチャンネルを使用する。
Vonageアカウントをセットアップするための以下のステップを見てみましょう:
Vonageアカウントにアクセスします。まだお持ちでない場合は サインアップを登録し、今日から構築を開始します。
サインインしたら APIキーとAPIシークレットを見つける。 Vonage APIダッシュボード.これらの認証情報は、ユビドットなどの外部サービスから通信を確立する際に必要となります。これらの認証情報は常に安全に保管し、決して共有しないようご注意ください。
新規アプリケーションの作成 新規アプリケーション.Vonage APIダッシュボードを使用してこれを行うことができます。 アプリケーション > + 新しいアプリケーションの作成で名前を割り当てるか HTTPリクエストを送る.このガイドを使いやすくするために、ダッシュボードから直接行うことにしました。数回クリックして、名前を割り当てるだけだ!
インバウンドメッセージを受信するには、以下のバーチャル番号をレンタルする必要がある。 バーチャル番号.この番号は 開発者ダッシュボード, Nexmo CLIまたは API.
リンクをクリックすることで、借りた番号を以前に作成したアプリケーションにリンクさせることができます。 リンクボタンをクリックします。
Vonage Virtual Number
VonageとUbidotsの統合
ユビドットのアカウントで デバイス > 機能セクションに移動し、サイトの右上にあるプラスアイコンをクリックして新しい関数を作成します。ファンクションを作成するには、以下のパラメータを割り当てる必要があります:
名称:
Vonage Messages APIHTTPメソッド:
POSTランタイム:
NodeJs 10
*注:UbiFunctionはPythonでもプログラムできますが、このガイドで提供するコードはNodeJSです。
設定したら ライブにするボタンを押します。この時点で HTTPS Endpoint URLフィールドにVonageからのメッセージを受信するエンドポイントがオートコンプリートされます。
私の場合、生成されたURLは https://parse.ubidots.com/prv/{ubidots_username}/vonage-messages-api.
次に、Vonage Developer Portalで、次の場所に移動します。 設定セクションに移動し、ユーザー名をクリックします。 デフォルトSMS設定オプションで以下のパラメータを割り当てます。最後に、変更を保存します。
領収書:HTTPSエンドポイントURL生成
/webhooks/delivery-receipts:
https://parse.ubidots.com/prv/{ubidots_username}/vonage-messages-api/webhooks/delivery-receipts
インバウンドメッセージ:生成されたHTTPSエンドポイントURL
/webhooks/inbound-message:
https://parse.ubidots.com/prv/{ubidots_username}/vonage-messages-api/webhooks/inbound-message
HTTPメソッド:
POST
バーチャル・ナンバーにメッセージが送られると、このエンドポイントに情報が転送される。
作成したUbiFunctionに戻って、デフォルトのコードを以下のコードに置き換えてください:
// Import the 'request-promise' library to handle HTTP requests
var request = require("request-promise");
// Ubidots constants
const UBIDOTS_TOKEN = "BBFF-xxxx";
// Vonage constants
const VONAGE_API_SECRET = "xxxxxx";
/*
* Main function - runs every time the UbiFunction is executed
*
* @arg args, dictionary containing Vonage request data
*/
async function main(args) {
// When sending SMS, delivery receipts will be returned
// status: submitted, delivered,
if (args["status"]) {
return args;
}
// Parses incoming values
var api_key = args["api-key"];
var keyword = args["keyword"];
var msisdn = args["msisdn"];
var text = args["text"];
var to = args["to"];
var msg_type = args["type"];
//var message_timestamp = args['message-timestamp'];
//var messageId = args['messageId'];
// Verify the keyword received to request the data
if (keyword == "UBIDOTS") {
text = text.toLowerCase(); // Converts the text received to lowercase letters
// Filter the requested devices
const devices = /Devices:(.*)/i.exec(text);
const deviceList = devices[1].split(",").map((device) => device.trim());
// Filter the requested variables
const variables = /Variables:(.*)/i.exec(text);
const variableList = variables[1]
.split(",")
.map((variable) => variable.trim());
// "msg" stores the response to be sent
var msg = "Data requested:\n";
// Iterates the deviceList previously filtered
for (const device of deviceList) {
msg = msg.concat("\nDevice: ", device);
// Iterates the variableList previously filtered
for (const variable of variableList) {
// Handle GET request to Ubidots
try {
var response = await ubidots_get_request(
UBIDOTS_TOKEN,
device,
variable
);
msg = msg.concat("\nVariable: ", variable, " = ", response);
} catch (error) {
// Send a reply back in case any error is presented
var vonage_response = await vonage_messages(
api_key,
msg_type,
msisdn,
to,
"The requested data cannot be found. Please verify it and try again."
);
// Pass the error message caught as the function's response
return { message: error.message };
}
}
msg = msg.concat("\n");
}
}
// Send a reply back with the requested data
/* Reply example for multiple devices and variables:
Data requested:
Device: balcony
Variable: humidity = 50.87
Variable: temperature = 36.39
Device: kitchen
Variable: humidity = 55.72
Variable: temperature = 29.45
*/
//var vonage_response = await vonage_messages(api_key, msg_type, msisdn, to, msg);
var vonage_response = await vonage_messages(
api_key,
msg_type,
msisdn,
to,
msg
);
// Pass Vonage's API Response as the function's reponse
return vonage_response;
}
/*
* Handle an HTTP POST request to Vonage Messaging API
* API Documentation: https://developer.nexmo.com/api/messages-olympus#overview
*
* @arg api_key [Mandatory], Nexmo account's API Key
* @arg msg_channel [Mandatory], type of message that you want to send.
* @arg recipient [Mandatory], phone number of the message recipient
* @arg sender [Mandatory], phone number of the message sender
* @arg msg [Mandatory], text of the message
*
* @return message_uuid, UUID of the message
*/
async function vonage_messages(api_key, msg_type, recipient, sender, msg) {
// Base64 encoded API key and secret joined by a colon
var auth =
"Basic " +
Buffer.from(api_key + ":" + VONAGE_API_SECRET).toString("base64");
var options = {
method: "POST",
url: "https://api.nexmo.com/v0.1/messages",
headers: {
Authorization: auth,
"Content-Type": "application/json",
Accept: "application/json",
},
json: {
from: {
type: "sms",
number: sender,
},
to: {
type: "sms",
number: recipient,
},
message: {
content: {
type: msg_type,
text: msg,
},
},
},
};
// Pass UUID of the message sent
return await request.post(options);
}
/*
* Handle an GET request to Ubidots API
* API Documentation: https://ubidots.com/docs/sw/
*
* @arg token [Mandatory], Ubidots account's Token
* @arg device_label [Mandatory], single and unique label of device
* @arg variable_label [Mandatory], single and unique label of variable
*
* @return last_value, variable last value
*/
async function ubidots_get_request(token, device_label, variable_label) {
var options = {
method: "GET",
url:
"https://industrial.api.ubidots.com/api/v1.6/devices/" +
device_label +
"/" +
variable_label +
"/lv",
json: true,
headers: {
"Content-Type": "application/json",
"X-Auth-Token": token,
},
};
var last_value = await request.get(options);
return last_value;
}
/*
* Handle an POST request to Ubidots API
* API Documentation: https://ubidots.com/docs/sw/
*
* @arg token [Mandatory], Ubidots account's Token
* @arg device_label [Mandatory], single and unique label of device
* @arg variable_label [Mandatory], single and unique label of variable
*
* @return last_value, variable last value
*/
async function ubidots_post_request(token, label, body) {
var options = {
method: "POST",
url: "https://industrial.api.ubidots.com/api/v1.6/devices/" + label,
body: body,
json: true,
headers: {
"Content-Type": "application/json",
"X-Auth-Token": token,
},
};
var response = await request.post(options);
return response;
}
定数を UBIDOTS_TOKEN定数を ユビドット・トーケンに、そして VONAGE_API_SECRETを Vonage API シークレットを使って、UbiFunctionと両方のサービス間の通信を許可します。
// Ubidots constants
const UBIDOTS_TOKEN = "BBFF-xxxx";
// Vonage constants
const VONAGE_API_SECRET = "xxxxxx";を押すのをお忘れなく。 ライブにするボタンを押して変更を保存します!
提供されているコードは、各プロセスと関数について詳細にコメントされているので、理解するのはそれほど難しくないはずだ。しかし、どのように機能するのかを強調してみよう:
UbiFunctionのメインコードは、新しいSMSが送信された時や、別のSMSステータスが報告された時に、Vonageから送信されるペイロードを受け取る役割を担っています。
そして、受信したSMSを分析し、APIキー、キーワード、受信したSMS、送信者を特定する。
受信したキーワードがUbidotsと等しい場合、受信したテキストは、要求するデバイスと変数のリストを作成するためにフィルタリングされます。
作成されたリストは、各変数の最後の値をユビドットに要求するために反復される。
要求されたデータは文字列に連結され、すべてのデータが正しく要求されると、送信者に返信として送られる。
SMSによるデータ要求が満足のいくものであるためには、以下のテンプレートを使用する必要があります:
単一デバイスの場合:
SMSリクエスト:
Ubidots request data
Devices: {device_label}
Variables: {variable_label_1}, {variable_label_2}, {variable_label_n}SMS 返信:
Data requested:
Device: {device_label}
Variable: {variable_label_1} = 23
Variable: {variable_label_2} = 246
Variable: {variable_label_n} = 85複数デバイスの場合:
SMSリクエスト:
Ubidots request data
Devices: {device_label_1}, {device_label_2}, {device_label_n}
Variables: {variable_label_1}, {variable_label_2}, {variable_label_n}SMS 返信:
Data requested:
Device: {device_label_1}
Variable: {variable_label_1} = 23
Variable: {variable_label_2} = 246
Variable: {variable_label_n} = 85
Device: {device_label_2}
Variable: {variable_label_1} = 23
Variable: {variable_label_2} = 246
Variable: {variable_label_n} = 85
Device: {device_label_n}
Variable: {variable_label_1} = 23
Variable: {variable_label_2} = 246
Variable: {variable_label_n} = 85*重要なお知らせ:複数のデバイス要求は、同じ変数を含むデバイスに対してのみサポートされます。
すべてが思い通りに動いていることを確認するために、レンタルした番号に2つのメッセージを送ってみよう。weather-station)を作成したものと、返信を区別するために存在しないデバイスを作成したものである:
リクエスト#1:
Ubidots request data
Devices: weather-station
Variables: dew_point, lux_blue, amb_hum, temp_mplリクエスト #2:
Ubidots request data
Devices: ws
Variables: dew_point, lux_blue, amb_hum, temp_mpl寄せられた返事は以下の通り:
Satisfactory reply
Device not found
予想通り、正しく動作している!受信した値をダッシュボードの値と比較すると、同じ値であることがわかります:
Ubidots Final Dashboard
総括と次のステップ
モノのインターネットといえば、まず頭に浮かぶのは「インターネット」だが、現実には、インターネットにアクセスできなくても、そのデータにアクセスできる他の選択肢がある。
このガイドでは、Vonage Messages APIとUbidotsと通信し、SMS経由でデータを要求するために必要なすべてをカバーしました。しかし、この開発を拡張し、ホームライト制御アプリケーション、センサー用コミュニティネットワーク、カスタムチャットボットなど、あなたが思いつくあらゆるIoTアプリケーションにカスタマイズすることができます。
さらに、次のチャネルが提供する他のチャネルを探索することができます。 メッセージ APIこれを使えば、次のスーパーヒーローに取りかかることができると確信しています。)
