Particles の強力な Bluetooth API の使用方法
この投稿は www.jaredwolff.com からのものです
私は敗北しました。
Bluetooth Low Energy プロジェクトを機能させるために一晩中費やしました。痛かったです。イライラしました。私はあきらめる準備ができていました.
それは Bluetooth Low Energy の初期の頃でした。それ以来、開発はますます簡単になりました。 Particle Mesh Bluetooth ライブラリも例外ではありません。
このウォークスルーでは、Particle の Bluetooth API の使用方法を紹介します。いくつかの LED を構成し、メッシュ ネットワーク内のすべてのデバイスで LED が変化するのを確認します。アルゴンとキセノンのボードを使用します。
準備?始めましょう!
追記この投稿は長いです。何かをダウンロードしたい場合は、ここをクリックして美しい形式の PDF を入手してください。
ステージ 1:Bluetooth の設定
<オール>Particle Workbench のダウンロード/インストール
新しいプロジェクトを作成します。適切な場所を選び、ble_mesh
という名前を付けました
/src/
に移動します direcory を開いて <your project name>.ino
を開きます ファイル
次に、deviceOS のバージョンを> 1.3.0 に変更してください。
コードを書く
3つの特徴を持ったサービスを構築したい。特性は、それぞれ RGB LED の強度に関連しています。 Bluetooth をセットアップする方法は次のとおりです:
<オール>
あなたの Setup()
で LED のアプリ制御を有効にする機能
RGB.control(true);
.ino
の先頭に UUID を設定します ファイル
const char* serviceUuid = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E";
const char* red = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E";
const char* green = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E";
const char* blue = "6E400004-B5A3-F393-E0A9-E50E24DCCA9E";
UUID は一意の識別子またはアドレスです。それらは、デバイス上のさまざまなサービスと特性を区別するために使用されます。
上記の UUID は、前の Particle の例で使用されています。独自のものを作成したい場合は、 uuidgen
を使用できます OSXコマンドラインで。 オンライン GUID ジェネレーター などの Web サイトにアクセスすることもできます。
上記の設定を使用して、独自の UUID を取得します。次に、この生成されたものからサービスと特性の UUIDS を作成できます。
const char* serviceUuid = "b425040**0**-fb4b-4746-b2b0-93f0e61122c6"; //service
const char* red = "b4250401-fb4b-4746-b2b0-93f0e61122c6"; //red char
const char* green = "b4250402-fb4b-4746-b2b0-93f0e61122c6"; //green char
const char* blue = "b4250403-fb4b-4746-b2b0-93f0e61122c6"; //blue char
これを行う正しい方法も間違った方法もありません。ただし、Bluetooth SIG によって予約されている UUID を使用していないことに注意する必要があります。これはほとんどありません。再確認したい場合は、こことここにアクセスしてください。
今のところ、UUID の最初のセットに固執します。
Setup()
で 、サービスを初期化します。
// Set the RGB BLE service
BleUuid rgbService(serviceUuid);
これは、サービスを「登録」するための最初のステップです。詳細については以下をご覧ください。
Setup()
で各特性を初期化する
BleCharacteristic redCharacteristic("red", BleCharacteristicProperty::WRITE_WO_RSP, red, serviceUuid, onDataReceived, (void*)red);
BleCharacteristic greenCharacteristic("green", BleCharacteristicProperty::WRITE_WO_RSP, green, serviceUuid, onDataReceived, (void*)green);
BleCharacteristic blueCharacteristic("blue", BleCharacteristicProperty::WRITE_WO_RSP, blue, serviceUuid, onDataReceived, (void*)blue);
この設定では、WRITE_WO_RSP
を使用します 財産。これにより、データを書き込んで応答がないことを期待できます。
次の 2 つのパラメーターとして UUID を参照しました。 1 つ目は、固有の UUID です。 2 番目はサービス UUID です。
次のパラメータはコールバック関数です。このコールバックにデータが書き込まれると、この関数が起動します。
最後に、最後のパラメーターはコンテキストです。これは正確にはどういう意味ですか? 3 つの特性すべてに同じコールバックを使用しています。どの特性が (少なくとも deviceOS で) 書き込まれたかを知る唯一の方法は、コンテキストを設定することです。この場合、すでに利用可能な UUID を使用します。
特性を定義した直後に、それらが表示されるように追加しましょう:
// Add the characteristics
BLE.addCharacteristic(redCharacteristic);
BLE.addCharacteristic(greenCharacteristic);
BLE.addCharacteristic(blueCharacteristic);
コールバック関数を設定します。
// Static function for handling Bluetooth Low Energy callbacks
static void onDataReceived(const uint8_t* data, size_t len, const BlePeerDevice& peer, void* context) {
}
これは、ファイルの先頭 (Setup()
の上) で行うことができます。 ) これは後で定義します。
最後に、デバイスを接続可能にするために、広告を設定する必要があります。このコードを Setup()
の最後に配置します 関数
// Advertising data
BleAdvertisingData advData;
// Add the RGB LED service
advData.appendServiceUUID(rgbService);
// Start advertising!
BLE.advertise(&advData);
最初に BleAdvertisingData
を作成します 物体。 rgbService
を追加します ステップ 3 から。最後に、広告を開始して、当社のサービスと特徴を見つけてもらいます!
テストする時間
この時点で、実行可能な最小限のプログラムができました。それをコンパイルして、Particle ハードウェアにプログラムしましょう。これは、メッシュ対応デバイスで動作するはずです。 (キセノン、アルゴン、ボロン)
<オール>
テストを開始する前に、一時的に SYSTEM_MODE(MANUAL);
を追加します ファイルの先頭に。これにより、デバイスがメッシュ ネットワークに接続できなくなります。起動時にデバイスが青色に点滅している場合は、続行する前にパーティクル アプリでセットアップする必要があります。
ここから 1.3.0-rc.1 イメージをダウンロードします。 Xenon の場合、[email protected]. が必要です。 その他については、[email protected] を探してください および [email protected]. ファイルはページ下部の Assets の下にあります
デバイスを DFU モードにします。 モード ボタンを長押しします リセット ボタン。 モード ボタンを押し続けます LED が黄色に点滅するまで。
コマンド ライン ウィンドウで、ダウンロードしたファイルを保存した場所にディレクトリを変更します。私の場合、コマンドは cd ~/Downloads/
です
次に実行します:
particle flash --usb [email protected]
これにより、最新の OS が Xenon にインストールされます。完了すると、黄色ですばやく点滅し続けます。別のパーティクル メッシュ デバイスを使用している場合は、ファイル名を一致するように変更してください。
Visual Code では、Command + Shift + P を使用します コマンドメニューをポップアップするためのキーの組み合わせ。 Particle:Compile application (local) を選択します
ポップアップする可能性のあるエラーを修正してください。
次に、同じメニューを開き、Flash アプリケーション (ローカル) を選択します
プログラミングが完了したら、スマートフォンを取り出します。次に、お気に入りの Bluetooth Low Energy アプリを開きます。最良のものは NRF Connect です そして水色の探索者。 この例では、Light Blue Explorer を使用します。
"Xenon-
デバイスを見つけて名前をクリックします。
サービスと特徴のリストを見てください。これまでに設定したサービスと固有の UUID は含まれていますか?たとえば、サービス UUID は 6E400001-B5A3-F393-E0A9-E50E24DCCA9E として表示されますか? ?
すべてが期待どおりに表示される場合は、良い場所にいます。そうでない場合は、前の手順を実行して、すべてが一致していることを確認してください。
ステージ 2:データの処理
プロジェクトの次の段階は、書き込みイベントを処理することです。 onDataReceived
を更新します 関数。
コードを書く
<オール>まず、LED の状態を保持する構造体を作成しましょう。これは、ファイルの先頭で行うことができます。
// Variables for keeping state
typedef struct {
uint8_t red;
uint8_t green;
uint8_t blue;
} led_level_t;
その後半は、このデータ型を使用して静的変数を作成することです
// Static level tracking
static led_level_t m_led_level;
最初の 2 つのステップにより、1 つの変数を使用して RGB LED の 3 つの値を表すことができます。
次に、onDataReceive
内の基本的なエラーをチェックしましょう。 function たとえば、1 バイトしか受信していないことを確認したいとします。
// We're only looking for one byte
if( len != 1 ) {
return;
}
次に、このイベントがどの特性から発生したかを確認します。 context
を使用できます これを決定する変数。
// Sets the global level
if( context == red ) {
m_led_level.red = data[0];
} else if ( context == green ) {
m_led_level.green = data[0];
} else if ( context == blue ) {
m_led_level.blue = data[0];
}
この場合、context は、赤、緑、または青の UUID 文字列のいずれかのポインターと同じになることに注意してください。 m_led_level
を設定していることにも気付くでしょう。 .そうすれば、値が 1 つだけ変更された場合でも、RGB LED を更新できます。
最後に、設定したら、RGB
に書き込むことができます。 オブジェクト
// Set RGB color
RGB.color(m_led_level.red, m_led_level.green, m_led_level.blue);
コードをテストする
前と同じ手順でデバイスをフラッシュしましょう。
<オール>デバイスを DFU モードにします。 モード ボタンを長押しします [リセット] をクリックします。 ボタン。 モード ボタンを押し続けます LED が黄色に点滅するまで。
次に、同じメニューを開き、Flash アプリケーション (ローカル) を選択します
プログラミングが完了したら、Light Blue Explorer を使用してデバイスに接続します .
赤色 LED に当てはまる特徴をタップしてください。
FF を書く .赤い LED が点灯します。
00 を書く .赤い LED がオフになります。
他の 2 つの特性についても同じことを行います。これで、Bluetooth Low Energy 経由で RGB LED を完全に制御できるようになりました!
ステージ 3:メッシュ経由で共有
最後に、BLE メッセージを正常に受信したので、メッシュ ネットワークに転送します。
コードを書く
<オール>
まずMANUALモードを解除しましょう。 SYSTEM_MODE(MANUAL);
をコメントアウトします
ファイルの先頭に、公開する必要があるかどうかを追跡するために使用する変数を追加しましょう
// Tracks when to publish to Mesh
static bool m_publish;
次に、Setup()
で初期化します
// Set to false at first
m_publish = false;
次に、RGB LED を onDataReceived
に設定した後、 コールバック、true に設定しましょう:
// Set RGB color
RGB.color(m_led_level.red, m_led_level.green, m_led_level.blue);
// Set to publish
m_publish = true;
loop()
に条件を追加しましょう 関数。これにより、LED ステータスがメッシュ ネットワークに公開されます:
if( m_publish ) {
// Reset flag
m_publish = false;
// Publish to Mesh
Mesh.publish("red", String::format("%d", m_led_level.red));
Mesh.publish("green", String::format("%d", m_led_level.green));
Mesh.publish("blue", String::format("%d", m_led_level.blue));
}
Mesh.publish
両方の入力に文字列が必要です。したがって、 String::format
を使用しています 赤、緑、青の値で文字列を作成します。
次に、Setup()
で同じ変数をサブスクライブしましょう。 .そうすれば、別のデバイスがこのデバイスの LED を更新することもできます。
Mesh.subscribe("red", meshHandler);
Mesh.subscribe("green", meshHandler);
Mesh.subscribe("blue", meshHandler);
meshHandler
を作成するファイルの先頭に向かって
// Mesh event handler
static void meshHandler(const char *event, const char *data)
{
}
このアプリケーションでは、event
が必要です パラメータと data
パラメータ。それらを使用するには、それらを String
に変更する必要があります タイプ。そうすれば、組み込みの変換関数と比較関数を使用できます。だから、 meshHandler
の中 関数の追加:
// Convert to String for useful conversion and comparison functions
String eventString = String(event);
String dataString = String(data);
最後に、いくつかの比較を行います。まず、イベント名が一致するかどうかを確認します。次に、dataString
の値を設定します 対応する LED レベルに。
// Determine which event we recieved
if( eventString.equals("red") ) {
m_led_level.red = dataString.toInt();
} else if ( eventString.equals("green") ) {
m_led_level.green = dataString.toInt();
} else if ( eventString.equals("blue") ) {
m_led_level.blue = dataString.toInt();
} else {
return;
}
// Set RGB color
RGB.color(m_led_level.red, m_led_level.green, m_led_level.blue);
最後に、新しい RGB カラーを設定します。 return
を追加して未知の状態を処理する方法に注意してください else
のステートメント セクション。大混乱を招く前に、エラー状態を除外することは常に良いことです!
コードをテストする
<オール>スマートフォンで Particle アプリを開きます
最初に Argon をセットアップしましょう。 青色に点滅していない場合は、青色に点滅するまでモード ボタンを押し続けます。
注:アプリを既にプログラムしている場合、LED はデフォルトでオフになります。 モード ボタンを 5 秒間押し続けてから続行してください。
ペアリングプロセスを実行します。アプリがすべての手順を案内します。 メッシュ ネットワークの管理者パスワードを忘れないようにしてください。
Argon を最新のファームウェア (1.3.0) でプログラムします (ステージ 1 - テストの時間 - ステップ 2 を参照)。 これを行う方法のリマインダー)
黄色にすばやく点滅したら、Tinker アプリで Argon をプログラムします。リリースページからダウンロードできます。
きれいに点灯したシアン LED (パーティクル クラウドに接続) ができたら、アプリをプログラムします。 クラウド フラッシュを使用する ドロップダウン メニューのオプション。
私が知る限り、Particle は、クラウドに接続するときに、ローカルにフラッシュされたすべてのデバイスを強制的にセーフ モードにします。私の設定かもしれません。走行距離はここで異なる場合があります。 Cloud Flash の使用が最適 .
正しい deviceOS バージョン (1.3.0-rc1) を選択していることを確認してください )、デバイスの種類 (アルゴン ) とデバイス名 (セットアップ中に付けた名前 )
電話アプリを使用して Xenon に接続します
電話アプリを使用して Xenon をメッシュ ネットワークに接続します
Cloud Flash を使用して Xenon をフラッシュします .電話アプリのセットアップ中に付けた名前を使用します。デバイスがパーティクル クラウドに接続されているか、セーフ モード (紫色の LED) である限り、プログラムする必要があります。
接続したら、楽しい部分に進みましょう。 水色のエクスプローラーを開きます。 アルゴンのいずれかに接続します またはキセノン .
LED 特性の 1 つを選択し、値を変更します。
すべてのデバイスで LED が変化するはずです!
最終コード
すべてのピースをまとめた最終的なコードを次に示します。これを使用して、それらを適切な場所に配置することができます!!
/*
* Project ble_mesh
* Description: Bluetooth Low Energy + Mesh Example
* Author: Jared Wolff
* Date: 7/13/2019
*/
//SYSTEM_MODE(MANUAL);
// UUIDs for service + characteristics
const char* serviceUuid = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E";
const char* red = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E";
const char* green = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E";
const char* blue = "6E400004-B5A3-F393-E0A9-E50E24DCCA9E";
// Set the RGB BLE service
BleUuid rgbService(serviceUuid);
// Variables for keeping state
typedef struct {
uint8_t red;
uint8_t green;
uint8_t blue;
} led_level_t;
// Static level tracking
static led_level_t m_led_level;
// Tracks when to publish to Mesh
static bool m_publish;
// Mesh event handler
static void meshHandler(const char *event, const char *data)
{
// Convert to String for useful conversion and comparison functions
String eventString = String(event);
String dataString = String(data);
// Determine which event we recieved
if( eventString.equals("red") ) {
m_led_level.red = dataString.toInt();
} else if ( eventString.equals("green") ) {
m_led_level.green = dataString.toInt();
} else if ( eventString.equals("blue") ) {
m_led_level.blue = dataString.toInt();
} else {
return;
}
// Set RGB color
RGB.color(m_led_level.red, m_led_level.green, m_led_level.blue);
}
// Static function for handling Bluetooth Low Energy callbacks
static void onDataReceived(const uint8_t* data, size_t len, const BlePeerDevice& peer, void* context) {
// We're only looking for one byte
if( len != 1 ) {
return;
}
// Sets the global level
if( context == red ) {
m_led_level.red = data[0];
} else if ( context == green ) {
m_led_level.green = data[0];
} else if ( context == blue ) {
m_led_level.blue = data[0];
}
// Set RGB color
RGB.color(m_led_level.red, m_led_level.green, m_led_level.blue);
// Set to publish
m_publish = true;
}
// setup() runs once, when the device is first turned on.
void setup() {
// Enable app control of LED
RGB.control(true);
// Init default level
m_led_level.red = 0;
m_led_level.green = 0;
m_led_level.blue = 0;
// Set to false at first
m_publish = false;
// Set the subscription for Mesh updates
Mesh.subscribe("red",meshHandler);
Mesh.subscribe("green",meshHandler);
Mesh.subscribe("blue",meshHandler);
// Set up characteristics
BleCharacteristic redCharacteristic("red", BleCharacteristicProperty::WRITE_WO_RSP, red, serviceUuid, onDataReceived, (void*)red);
BleCharacteristic greenCharacteristic("green", BleCharacteristicProperty::WRITE_WO_RSP, green, serviceUuid, onDataReceived, (void*)green);
BleCharacteristic blueCharacteristic("blue", BleCharacteristicProperty::WRITE_WO_RSP, blue, serviceUuid, onDataReceived, (void*)blue);
// Add the characteristics
BLE.addCharacteristic(redCharacteristic);
BLE.addCharacteristic(greenCharacteristic);
BLE.addCharacteristic(blueCharacteristic);
// Advertising data
BleAdvertisingData advData;
// Add the RGB LED service
advData.appendServiceUUID(rgbService);
// Start advertising!
BLE.advertise(&advData);
}
// loop() runs over and over again, as quickly as it can execute.
void loop() {
// Checks the publish flag,
// Publishes to a variable called "red" "green" and "blue"
if( m_publish ) {
// Reset flag
m_publish = false;
// Publish to Mesh
Mesh.publish("red", String::format("%d", m_led_level.red));
Mesh.publish("green", String::format("%d", m_led_level.green));
Mesh.publish("blue", String::format("%d", m_led_level.blue));
}
}
結論
このチュートリアルでは、パーティクル メッシュ プロジェクトに Bluetooth を追加する方法を学習しました。ご想像のとおり、可能性は無限大です。たとえば、ユーザー/管理アプリをエクスペリエンスに追加できます。 それは素晴らしいですね。 ?
次の本では、このようなコンテンツをさらに期待できます:パーティクル メッシュの究極のガイド .最新情報やインサイダー コンテンツについては、マイ リストを購読してください。さらに、すべての早期購読者は、リリース時に割引を受けられます!ここをクリックしてサインアップしてください。
-
iPadまたはiPhoneでマウスを使用する方法は?
iPadOSのリリースに伴い & iOS 13 2019年9月、iPadとiPhoneでマウスと外部トラックパッドを使用できるようになりました(ユーザーエクスペリエンスはデスクトップとは異なります)。この機能は、デバイスに完全なマウスサポートを追加せず、MacBookの代替品にはなりません。これは、かなり長い間求められていたユーザー補助機能であり、 AssistiveTouchの既存の機能を拡張したものです。 Appleデバイスとの対話が非常に簡単になります。ただし、モバイルデバイスをラップトップとして機能させることはできません。 iPadとiPhoneでのマウスのサポートはまだ初期
-
Windows 10 で Bluetooth を使用する方法
このテクノロジーの時代では、すべてのデバイスに Bluetooth 機能が搭載されています。この機能は、あるデバイスから別のデバイスにファイルを転送する場合に非常に便利です。さらに、データケーブルがない場合でもファイルを送受信できる便利な機能です。 Windows 10 で Bluetooth を有効にして、別のデバイスに接続できます。 この投稿では、Windows 10 で Bluetooth を使用し、Bluetooth を介して iPhone から Windows 10 にファイルを簡単に送受信する方法を共有します。 Windows 10 で Bluetooth を有効にする方法