位置追跡に粒子アルゴンを使用する方法
プロジェクトにプレゼンスまたは位置追跡を追加したいと思ったことはありませんか?解決策 (またはその欠如) に不満を感じていますか?
心配しないでください。あなただけではありません!
この投稿では、非常に基本的な追跡および通知アプリケーションを実装する方法を学びます。 Particle Argon と Tile Mate を使用します。
最後に、タイルが存在するかどうかを判断できるようになります。さらに、Pushover を使用して、選択したデバイスにプッシュ通知を送信します。
始めましょう!
注意 始める前に、この投稿は長いです . PDF バージョンをダウンロードして、保存して後で表示することができます。
初期調査
Tile を使用するというアイデアは、一見しただけではわかりませんでした。理想的には、電話を使用する方が理にかなっているように思われました。残念ながら、これは実行可能なオプションではありませんでした。さらに調査を行い、Bluetooth iOS アプリを作成する必要があります。
そのため、電話を使用するというアイデアはありませんでした。
次に考えたのは「どのデバイスが何をするのか」 常に広告を出しているのですか?"
それが私を Tile のようなトラッカーへと導いたのです。
それが到着した後、いくつかの恒例のテストがありました。まず、Tile アプリケーションです。
デバイスを接続して使用することができました。キャッチーな曲まで作ってみました。 ?
次に、Bluetooth スキャナー アプリの 1 つを使用することにしました。すべての結果とビンゴをスクロールしました。タイルがありました!
数時間待って、もう一度確認しました。しばらくしてスリープ状態にならないようにしたかったのです。結局のところ、それは常に広告です。私が知る限り、約 8 秒ごとです。
このすべてのテストから 1 つの結論が導き出されます。それは、プレゼンス検出に簡単に使用できるということです。
プロセスの次のステップは、アルゴンで動作させる方法を見つけようとすることでした.
広告
前のステップで収集したように、タイルが約 8 秒ごとにアドバタイズしていることがわかります。つまり、Argon、Zenon、Boron などのデバイスを使用して簡単にスキャンできる必要があります。
この例では、アルゴンを使用することをお勧めします。これは、Bluetooth とメッシュが同じ無線を共有しているためです。タイルをスキャンするとき、メッシュに接続された Xenon はアドバタイジング パケットを見逃すことがよくありました。これは、偽陰性 (そしてフラストレーション!) につながります。
同様に、Argon がメッシュ ネットワークに接続されていないことを確認してください。 CLI を使用して削除できます。デバイスをコンピューターに接続し、次のコマンドを実行します:
particle mesh remove <device name/ID>
<デバイス名/ID> を必ず置き換えてください をデバイスの名前または ID に置き換えます。
よし、本題に戻ろう。
Bluetooth では、広告にはいくつかの異なる目的があります。ただし、通常は、ペアリング フェーズの開始を示します。そうすれば、広告デバイスが利用可能であることを他のデバイスが知ることができます。
さらに、広告デバイスは、提供しているサービスを示します。この知識を使用して、一致しないデバイスを除外できます。
たとえば、以下は Tile デバイスで利用可能なサービスのスクリーンショットです:
スキャン時に、接続しているデバイスのサービス UUID が 0xfeed
であることを再確認します。 .
ただし、Bluetooth の世界に深く入る前に、Logger を使用してデバッグ用にアプリをセットアップしましょう。
ロギング
このチュートリアルでは、Logger を使用します。 particle serial monitor
を使用して、アプリからのログ メッセージを表示できます。 .
ロガーの優れた機能の 1 つは、メッセージ階層の考え方です。これにより、デザイナーは不要なメッセージを選択的にミュートできます。
たとえば、デバッグに使用するメッセージがあるとします。それらを削除するか、コメントアウトすることができます。または、LOG_LEVEL
を増やすこともできます したがって、それらは事実上無視されます。
logging.h
で利用可能なロギング レベルは次のとおりです。 Particle の device-os リポジトリ内:
// Log level. Ensure log_level_name() is updated for newly added levels
typedef enum LogLevel {
LOG_LEVEL_ALL = 1, // Log all messages
LOG_LEVEL_TRACE = 1,
LOG_LEVEL_INFO = 30,
LOG_LEVEL_WARN = 40,
LOG_LEVEL_ERROR = 50,
LOG_LEVEL_PANIC = 60,
LOG_LEVEL_NONE = 70, // Do not log any messages
// Compatibility levels
DEFAULT_LEVEL = 0,
ALL_LEVEL = LOG_LEVEL_ALL,
TRACE_LEVEL = LOG_LEVEL_TRACE,
LOG_LEVEL = LOG_LEVEL_TRACE, // Deprecated
DEBUG_LEVEL = LOG_LEVEL_TRACE, // Deprecated
INFO_LEVEL = LOG_LEVEL_INFO,
WARN_LEVEL = LOG_LEVEL_WARN,
ERROR_LEVEL = LOG_LEVEL_ERROR,
PANIC_LEVEL = LOG_LEVEL_PANIC,
NO_LOG_LEVEL = LOG_LEVEL_NONE
} LogLevel;
クールなログレベル。しかし、それらをどのように使用するのでしょうか?
これらの関数のいずれかを呼び出して使用できます:
Log.trace
、 Log.info
、 Log.warn
、 Log.error
.
例:
Log.trace("This is a TRACE message.");
ログレベルを LOG_LEVEL_INFO
に設定すると Log.info
からのメッセージのみが表示されます 、 Log.warn
、および Log.error
. LOG_LEVEL_WARN
? Log.warn
のみ と Log.error
現れます。 (お分かりいただけたかと思います。)
設定するには、デフォルトのレベルを LOG_LEVEL_ERROR
に設定します .アプリ固有の LOG_LEVEL
も設定します LOG_LEVEL_TRACE
まで .最終結果は次のようになります
// For logging
SerialLogHandler logHandler(115200, LOG_LEVEL_ERROR, {
{ "app", LOG_LEVEL_TRACE }, // enable all app messages
});
こうすることで、DeviceOS のログ メッセージが大量に送信されることはありません。さらに、該当するすべてのメッセージをアプリ自体から取得します。
ちなみに、デバイスを単一の LOG_LEVEL
に設定したい場合は、 次のように設定できます:
SerialLogHandler logHandler(LOG_LEVEL_INFO);
Particle の DeviceOS を使用して旅を続けると、すぐにそれがいかに便利であるかに気付くでしょう。それでは、良いことに移りましょう!
セットアップ
まず、正しいバージョンの DeviceOS を使用していることを確認します。 1.3 以降のバージョンには Bluetooth が搭載されています。手順はこちらから入手できます。
次に、タイルのスキャンを開始します。 loop()
でこれを行います。 指定された間隔で機能します。 millis()
を使用します この場合のタイマー:
// Scan for devices
if( (millis() > lastSeen + TILE_RE_CHECK_MS) ){
BLE.scan(scanResultCallback, NULL);
}
lastSeen
を必ず定義してください 次のようにファイルの先頭に:
system_tick_t lastSeen = 0;
タイルが最後に「見られた」時間を追跡するために使用します。つまり、Argon がタイルからの広告パケットを最後に見たときです。
TILE_RE_CHECK_MS
として定義できます
#define TILE_RE_CHECK_MS 7500
このようにして、アドバタイジング パケットを少なくとも 7.5 秒ごとにチェックしています。
Tile デバイスを見つけるために BLE.scan
を使用します .呼び出すと、スキャンプロセスが開始されます。デバイスが見つかったとき scanResultCallback
今のところ、scanResultCallback
を定義できます。 ファイルの先頭:
void scanResultCallback(const BleScanResult *scanResult, void *context) {
}
BleScanResult
が含まれていることに気付きました .これには、アドレス、RSSI、デバイス名 (利用可能な場合)、および利用可能なサービス情報が含まれます。これは後で Tile デバイスを探すときに役立ちます!
その BLE.scan
を覚えておいてください スキャンが完了するまで戻りません。スキャンのデフォルトのタイムアウトは 5 秒です。 BLE.setScanTimeout()
を使用してその値を変更できます . setScanTimeout
10ms単位で単位を取ります。したがって、500 ミリ秒のタイムアウトには 50 の値が必要です。
このアプリの場合、8 秒 (8000 ミリ秒) の値を使用することをお勧めします。次のように設定できます:
BLE.setScanTimeout(800);
この場合、タイルがアドバタイズするのにかかる限り、デバイスはスキャンを続けます。そうすれば、広告パケットを見逃す可能性が低くなります。
スキャン結果の処理
これで scanResultCallback
ができました 内部で何が起こっているかを定義しましょう。
まず、広告データ内のサービス情報を取得します。最善の方法は scanResult->advertisingData.serviceUUID
を使用することです .使用するためにコピーされる UUID の配列を渡します。
BleUuid uuids[4];
int uuidsAvail = scanResult->advertisingData.serviceUUID(uuids,sizeof(uuids)/sizeof(BleUuid));
これにより、uuids
が入力されます そうすれば、それらを反復できます。 uuidsAvail
利用可能な UUID の量に等しくなります。
この例では、特定の UUID を探しています。ファイルの先頭で定義します:
#define TILE_UUID 0xfeed
通常、UUID は 多く より長いです。このような短い UUID は、予約されているか、Bluetooth 仕様の一部であることを意味します。いずれの場合も、32 ビットまたは 128 ビット バージョンをチェックするのと同じ方法でチェックします。
診断上の理由から、デバイス情報を出力することもできます。この場合、RSSI とデバイスの MAC アドレスが役に立ちます:
// Print out mac info
BleAddress addr = scanResult->address;
Log.trace("MAC: %02X:%02X:%02X:%02X:%02X:%02X", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
Log.trace("RSSI: %dBm", scanResult->rssi);
最後に、見つかったデバイスに UUID があるかどうかを確認するループを設定しましょう:
// Loop over all available UUIDs
// For tile devices there should only be one
for(int i = 0; i < uuidsAvail; i++){
// Print out the UUID we're looking for
if( uuids[i].shorted() == TILE_UUID ) {
Log.trace("UUID: %x", uuids[i].shorted());
// Stop scanning
BLE.stopScanning();
return;
}
}
UUID の「短縮された」バージョンと TILE_UUID
を簡単に比較できます。 .これは単純な整数であるため、複雑なメモリ比較操作は必要ありません。したがって、 if( uuids[i].shorted() == TILE_UUID )
を使用して
Log.trace
も使用できます 診断情報を印刷します。この場合、shorted()
を出力するために使用しています。 UUID のバージョン。
テストしてみましょう!
これまでの内容をテストしてみましょう!
アプリを Argon にプログラムします。ターミナルを開いて particle serial monitor
を実行します デバッグ メッセージを表示します。表示される例を次に示します:
0000005825 [app] TRACE: MAC: 65:C7:B3:AF:73:5C
0000005827 [app] TRACE: RSSI: -37Bm
0000005954 [app] TRACE: MAC: B3:D9:F1:F0:5D:7E
0000005955 [app] TRACE: RSSI: -62Bm
0000006069 [app] TRACE: MAC: C5:F0:74:3D:13:77
0000006071 [app] TRACE: RSSI: -62Bm
0000006217 [app] TRACE: MAC: 65:C7:B3:AF:73:5C
0000006219 [app] TRACE: RSSI: -39Bm
0000006224 [app] TRACE: MAC: B3:D9:F1:F0:5D:7E
0000006225 [app] TRACE: RSSI: -62Bm
0000006296 [app] TRACE: MAC: D7:E7:FE:0C:A5:C0
0000006298 [app] TRACE: RSSI: -60Bm
0000006299 [app] TRACE: UUID: feed
メッセージに TRACE
が含まれていることに注意してください そして [app]
?これは、アプリケーション コードから発信されたトレース メッセージであることを意味します。便利ですよね?
このコードは、特に Bluetooth デバイスの広告がたくさんある環境にいる場合は、すぐにスパムになります。 Tile がオンで実行中の場合、メッセージ UUID: feed
が表示されます。 .これは、Argon がタイルを見つけたことを意味します!
次に、オンボードのモード ボタンを使用して、タイルのアドレスをメモリに「プログラム」します。そうすれば、気にしないすべてのデバイスを除外できます。
ボタンを押してデバイスを追加
まず、モード ボタンを監視する方法を理解する必要があります。ドキュメントによると、最善の策は System.on
を使用することです .
System.on(button_click, eventHandler);
最初の引数は、システム イベントの名前です。私たちの場合は button_click
です . 2 番目の引数は、イベント ハンドラー関数です。 eventHandler
とします
eventHandler
を作成しましょう
void eventHandler(system_event_t event, int duration, void* )
{
}
重要: Log
は使用できません eventHandler
内の関数 .これをテストする簡単な方法は、D7 の LED を切り替えることです。設定しましょう!
setup()
で LED を初期化します
// Set LED pin
pinMode(D7,OUTPUT);
次に、これを eventHandler
内に追加できます
if( event == button_click ) {
if( digitalRead(D7) ) {
digitalWrite(D7,LOW);
} else {
digitalWrite(D7,HIGH);
}
}
次に、D7 (オンボードの青色 LED) に書き込むことができます。 digitalRead
も使用できます LED の状態を読み取ります。 HIGH
で応答します または LOW
状況によります。
ファームウェアをデバイスにロードすると、青色の LED を適切に制御できるようになります!
次のセクションでは、モード ボタンを使用して、デバイスを「学習」モードにします。これにより、対象のタイル デバイスでワンタッチ セットアップを行うことができます。
アドレスを EEPROM に保存
この次のステップでは、タイルのアドレスを EEPROM に保存します。こうすることで、デバイスが再起動したり電源が落ちたりしても、後でタイルを識別できます。
ただし、1 つの長引く質問があります。そもそも住所を保存するにはどうすればよいでしょうか?
ボタンの押下を監視することで、デバイスを「学習」モードにすることができます。デバイスはタイルをスキャンし、見つかった場合はアドレスを保存します。
まず if( uuids[i].shorted() == TILE_UUID )
内に条件を追加しましょう :
// If we're in learning mode. Save to EEPROM
if( isLearningModeOn() ) {
searchAddress = scanResult->address;
EEPROM.put(TILE_EEPROM_ADDRESS, searchAddress);
setLearningModeOff();
}
「学習モード」にあることを知る方法として、D7 のステータスを使用します。 digitalRead(D7)
を使用して D7 を読み取ることでこれを行います .これをより明確にする関数を作成しましょう:
bool isLearningModeOn() {
return (digitalRead(D7) == HIGH);
}
digitalWrite(D7,LOW);
を置き換えることもできます および digitalWrite(D7,HIGH);
同様の機能を備えています。そうすれば、私たちがやっていることはより単純になります。
// Set "Learning mode" on
void setLearningModeOn() {
digitalWrite(D7,HIGH);
}
// Set "Learning mode" off
void setLearningModeOff() {
digitalWrite(D7,LOW);
}
次に、グローバル変数 searchAddress
を割り当てます スキャン結果として。 searchAddress
をセットアップします ファイルの先頭にこのように:
BleAddress searchAddress;
次に、EEPROM.put
を使用して不揮発性メモリに保存します。 . TILE_EEPROM_ADDRESS
0xa
と定義されています . TILE_EEPROM_ADDRESS
を定義できます あなたの空想をくすぐるどんなメモリアドレスでも使用できます。ファイルの先頭にある完全な定義は次のとおりです。
#define TILE_EEPROM_ADDRESS 0xa
最後に、setLearningModeOff()
を使用して LED と「学習モード」をオフにします。
デバイスが見つかるたびに millis()
を使用します lastSeen
を設定する .さらに、lastRSSI
を使用して最後の RSSI を追跡できます。 .これは、デバイスがどれだけ近いかを知る安価な方法です。 scanResult->rssi
を使用します この情報を取得して lastRSSI
に設定するには
全体として、変更は次のようになります。
...
// Print out the UUID we're looking for
if( uuids[i].shorted() == TILE_UUID ) {
Log.trace("UUID: %x", uuids[i].shorted());
// If we're in learning mode. Save to EEprom
if( isLearningModeOn() ) {
searchAddress = scanResult->address;
EEPROM.put(TILE_EEPROM_ADDRESS, searchAddress);
setLearningModeOff();
}
// Save info
lastSeen = millis();
lastRSSI = scanResult->rssi;
// Stop scanning
BLE.stopScanning();
return;
}
この関数の前に、searchAddress
に一致しないデバイスを除外できます。 . if( uuids[i].shorted() == TILE_UUID )
の前に以下を追加 :
// If device address doesn't match or we're not in "learning mode"
if( !(searchAddress == scanResult->address) && !isLearningModeOn() ) {
return;
}
これにより、一致しないデバイスがスキップされます。アドレスが一致するか、「学習モード」にある場合にのみ続行されます。
searchAddress
をロードするために 起動時に、フラッシュからロードする必要があります。この行を setup():
に追加します
EEPROM.get(TILE_EEPROM_ADDRESS, searchAddress);
次に、アドレスが有効であることを確認します。すべてのバイトが 0xFF
の場合は無効です :
// Warning about address
if( searchAddress == BleAddress("ff:ff:ff:ff:ff:ff") ) {
Log.warn("Place this board into learning mode");
Log.warn("and keep your Tile near by.");
}
Argon にタイルのアドレスを「教える」ことができるはずです。テストしてみましょう!
テストしてください。
アプリをコンパイルして実行すると、ログ出力がなくなったことに気付きますか?パーティクル デバイスにタイル アドレスを「教える」必要があります。では、モードボタンを押してみましょう。青色の LED が点灯します。
タイルが検出されると、LED がオフになり、コマンド ラインに出力が表示されます。以前に見たものと同様:
0000006296 [app] TRACE: MAC: D7:E7:FE:0C:A5:C0
0000006298 [app] TRACE: RSSI: -60Bm
0000006299 [app] TRACE: UUID: feed
デバイスがメモリにコミットされました!
リセット後も保存されているかどうかを確認することもできます。 リセットをクリックします ボタンをクリックして、上記と同じ出力を確認します。表示されていれば問題ありません!
クラウドを更新
最後に checkTileStateChanged
という関数を設定しましょう .これを使用して、定期的にタイルの状態の変化を確認します。
bool checkTileStateChanged( TilePresenceType *presence ) {
}
この関数の主な目的は、lastSeen
を比較することです。 「タイムアウト」期間を持つ変数。この場合、タイムアウト時間は TILE_NOT_HERE_MS
です に設定する必要があります
#define TILE_NOT_HERE_MS 30000
プログラムの上部近く。さらに 2 つの条件があります。 lastSeen
の場所 は 0 です。これは通常、アプリが起動後にまだタイルを見つけていないためです。
最後のケースは、デバイスが検出され、lastSeen
が検出された場合です。 は 0 ではありません。つまり、checkTileStateChanged
以内です。 すべてをまとめましょう。
// Check to see if it's here.
if( millis() > lastSeen+TILE_NOT_HERE_MS ) {
} else if ( lastSeen == 0 ) {
} else {
}
return false;
状態が変化した場合にのみ、この関数が true を返すようにします。 .したがって、TilePresenceType
を利用する必要があります。
TilePresenceType
可能なすべての状態の単なる列挙です。ファイルの先頭に貼り付けることもできます。ここにあります:
typedef enum {
PresenceUnknown,
Here,
NotHere
} TilePresenceType;
関数に渡すことができるグローバル変数も必要です。これもファイルの先頭に設定します:
// Default status
TilePresenceType present = PresenceUnknown;
これで、各段階で比較できます。基準を満たしていますか?状態は前回とは異なりますか?そうであれば、true を返します。
presence
を設定することを忘れないでください 新しい更新された値に。したがって、各条件は存在値を更新する必要があります。例:
*presence = NotHere;
完全にフラッシュされた関数は次のようになります:
bool checkTileStateChanged( TilePresenceType *presence ) {
// Check to see if it's here.
if( millis() > lastSeen+TILE_NOT_HERE_MS ) {
if( *presence != NotHere ) {
*presence = NotHere;
Log.trace("not here!");
return true;
}
// Case if we've just started up
} else if ( lastSeen == 0 ) {
if( *presence != PresenceUnknown ) {
*presence = PresenceUnknown;
Log.trace("unknown!");
return true;
}
// Case if lastSeen is < TILE_NOT_HERE_MS
} else {
if( *presence != Here ) {
*presence = Here;
Log.trace("here!");
return true;
}
}
return false;
}
この関数をタイマーの下のメイン ループで使用して、Ble.scan()
を開始できます。 .これを使用して、JSON ペイロードを送信できます。この場合、Bluetooth アドレス lastSeen
などの重要な情報が含まれます。 データ、lastRSSI
データとメッセージ。
// If we have a change
if( checkTileStateChanged(&present) ) {
}
char
の配列を使用します アドレスを文字列形式で取得します。 toString()
を連鎖させることができます toCharArray
で 必要なものを手に入れるために。
// Get the address string
char address[18];
searchAddress.toString().toCharArray(address,sizeof(address));
ペイロード文字列の例は次のようになります:
// Create payload
status = String::format("{\"address\":\"%s\",\"lastSeen\":%d,\"lastRSSI\":%i,\"status\":\"%s\"}",
address, lastSeen, lastRSSI, messages[present]);
status
ファイルの先頭で定義された単純な文字列です:
// The payload going to the cloud
String status;
messages
という変数もあります。 .これは文字列の静的 const 配列です。 TilePresenceType
の値にマッピングされます .外観は次のとおりです
const char * messages[] {
"unknown",
"here",
"not here"
};
その道 PresenceUnknown
"unknown"
に一致 、 Here
"here"
に一致 など。文字列を列挙型に関連付ける安価で簡単な方法です。
最後に、公開して処理します。これにより、更新をすぐに送信できます。
// Publish the RSSI and Device Info
Particle.publish("status", status, PRIVATE, WITH_ACK);
// Process the publish event immediately
Particle.process();
全体的な関数は最終的に次のようになります:
// If we have a change
if( checkTileStateChanged(&present) ) {
// Get the address string
char address[18];
searchAddress.toString().toCharArray(address,sizeof(address));
// Create payload
status = String::format("{\"address\":\"%s\",\"lastSeen\":%d,\"lastRSSI\":%i,\"status\":\"%s\"}",
address, lastSeen, lastRSSI, messages[present]);
// Publish the RSSI and Device Info
Particle.publish("status", status, PRIVATE, WITH_ACK);
// Process the publish event immediately
Particle.process();
}
それでは、テストしてみましょう!
テスト中!
イベントが Particle Workbench を離れることなく、パブリッシュ イベントが発生していることをテストできます。 [表示] → [ターミナル] に移動して、新しいターミナルを開きます。 次に、次のコマンドを使用します:
particle subscribe --device <device_name> <event_name>
<device_name>
を置き換えます デバイスの名前または ID と一緒に。
<event_name>
を置き換えます イベントの名前で。私たちの場合は status
です .
次に、バッテリーを取り外して「ここにありません」というアラートを待つことで、すべてをテストできます。バッテリーを再び差し込むと、「here」アラートが表示されます。
これが出力の例です
> particle subscribe --device hamster_turkey status
Subscribing to "status" from hamster_turkey's stream
Listening to: /v1/devices/hamster_turkey/events/status
{"name":"status","data":"{\"address\":\"C0:A5:0C:FE:E7:D7\",\"lastSeen\":40154002,\"lastRSSI\":-82,\"status\":\"not here\"}","ttl":60,"published_at":"2019-09-07T02:29:42.232Z","coreid":"e00fce68d36c42ef433428eb"}
{"name":"status","data":"{\"address\":\"C0:A5:0C:FE:E7:D7\",\"lastSeen\":40193547,\"lastRSSI\":-83,\"status\":\"here\"}","ttl":60,"published_at":"2019-09-07T02:29:50.352Z","coreid":"e00fce68d36c42ef433428eb"}
Webhook の設定
このチュートリアルの最後の部分では、Webhook を使用してプッシュ通知をセットアップします。前述のように、Pushover とその便利な API を使用して、選択したデバイスにプッシュ通知を送信します。
Pushover には非常に使いやすい API があります。彼らのアプリケーションは、プッシュ通知を送信するアプリをコーディングしたくない場合に最適です。
最初にメモする必要があるのは、ユーザー キーです。 Pushoverにログインすることで取得できます。注:まだアカウントを設定していない場合は、最初にアカウントを設定する必要があります。
次のようになります:
ログインしてもこのページが表示されない場合は、Pushover のロゴをクリックしてください
次に、アプリケーションを作成します。 アプリとプラグインをクリックします 画面の上部にあります。
次に、[Create a New Application] をクリックします。 これにより、API トークンを取得できます これは Particle Webhook のセットアップで必要になります。
適切と思われる名前を設定します。リマインダーが必要な場合は、説明を入力してください。 ボックスをクリック [アプリケーションの作成] をクリックします。
次のページに移動する必要があります。 API トークン/キー をコピーして保存します これもいくつかの手順で必要になります。
では、Webhook を設定してみましょう。 https://console.particle.io にジャンプして、新しい統合を作成します。
イベント名を設定します ステータスへ .
URL https://api.pushover.net/1/messages.json へ
また、特定のデバイスでフィルタリングする場合は、デバイス ドロップダウンで選択してください。
詳細設定の下 いくつかのフィールドを設定して終了します。
次のフィールドを作成します:token, ユーザー 、タイトル 、メッセージ .次に、トークンを API トークン に設定します 私たちは先に行きました。 ユーザー キーについても同じことを行います。
タイトル メッセージのタイトルとして表示されます。あなたにとって意味のあるものにしてください。
メッセージを設定できます The Tile is currently {{{status}}}. RSSI: {{{lastRSSI}}}
として .
ここでは口ひげのテンプレートを使用しています。公開されたペイロードのデータを使用して、好みに合わせて再フォーマットできます。私たちの場合、「空白を埋める」ためにそれらを使用しています。 メッセージ 処理されると、次のようになります:
The Tile is currently here. RSSI: -77
補足として、これらのテンプレートについてはガイドで詳しく説明します。どうぞお楽しみに!
テスト
統合が整ったら、前のステップで行ったことをテストできます。バッテリーを取り外し、「ここにありません」というメッセージが表示されるのを待ちます。元に戻して、"here" メッセージを待ちます。
iPhone では次のように表示されます:
ご覧のとおり、私はそれをたくさんテストしました! ?
ここまで来て、すべてがうまくいっているなら、すばらしい仕事です。これで、自宅、オフィス、またはどこでもタイル トラッカーを使用できます。
コード
この例の完成したコードをお探しですか?私もそうです!これは Github でホストされており、ここから入手できます。
結論
ご想像のとおり、この記事で使用されている手法とテクノロジはさまざまな方法で使用できます。重要なポイントのいくつかを要約しましょう:
<オール>Particle.publish
を使用する アップデートをクラウドにプッシュするすべてが機能するようになったので、それを拡張し、ハックして自分のものにします。ああ、共有することを忘れないでください!ご連絡をお待ちしております。 [email protected]
この投稿が好きですか?以下の共有リンクのいずれかをクリックして、世界中のユーザーと共有してください。 :)
これは私のブログからのクロス ポストです。オリジナルはこちらでチェックできます。
もっと学びたいですか? Particle Platform を最大限に活用するためのガイドを書いています。詳しくはこちらをご覧ください。
-
テレビを Windows 11 PC のモニターとして使用する方法
Netflix で映画を見たり、友達とゲームをしたりしているときに、コンピューターの画面が小さすぎると感じることはありませんか? さて、あなたの問題の解決策はあなたの居間にあります。テレビはコンピューターのディスプレイとして機能し、最近スマートテレビを使用する人が非常に多いことを考えると、それは非常に簡単な作業です.この記事を最後まで読んで、TV を Windows 11 PC のモニターとして使用する方法と、Windows 11 を TV に接続する方法を学ぶだけです。 テレビを Windows 11 PC のモニターとして使用する方法 テレビを Windows 11 PC のモニタ
-
Windows 10 で位置追跡を無効にする方法
Windows 10 では位置情報の追跡が既定で有効になっており、地図や Web で正確な結果が得られます。ただし、場所を追跡するという考えが気に入らない場合は、Windows 10 の設定から簡単にオフにすることができます。システム全体または特定のアプリに対してのみ無効にすることができます。 また、追跡情報はすべてデータベースに保存されますが、これもかなりのスペースを占有します。したがって、この情報を削除することで、システムに余分なスペースを作成することができます。 このチュートリアルでは、Windows 10 で位置追跡をオン/オフし、位置履歴を消去する方法について説明します。 Windo