MAC
 Computer >> コンピューター >  >> システム >> MAC

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 という名前を付けました

    Particles の強力な Bluetooth API の使用方法

  • /src/ に移動します direcory を開いて <your project name>.ino を開きます ファイル

  • 次に、deviceOS のバージョンを> 1.3.0 に変更してください。

    Particles の強力な Bluetooth API の使用方法

  • コードを書く

    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 サイトにアクセスすることもできます。

    Particles の強力な Bluetooth API の使用方法

    上記の設定を使用して、独自の 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 の場合、xenon-system-part1@1.3.0-rc.1.bin. が必要です。 その他については、boron-system-part1@1.3.0-rc.1.bin を探してください および argon-system-part1@1.3.0-rc.1.bin. ファイルはページ下部の Assets の下にあります

    Particles の強力な Bluetooth API の使用方法

  • デバイスを DFU モードにします。 モード ボタンを長押しします リセット ボタン。 モード ボタンを押し続けます LED が黄色に点滅するまで。

  • コマンド ライン ウィンドウで、ダウンロードしたファイルを保存した場所にディレクトリを変更します。私の場合、コマンドは cd ~/Downloads/ です

  • 次に実行します:

     particle flash --usb xenon-system-part1@1.3.0-rc.1.bin
    

    これにより、最新の OS が Xenon にインストールされます。完了すると、黄色ですばやく点滅し続けます。別のパーティクル メッシュ デバイスを使用している場合は、ファイル名を一致するように変更してください。

  • Visual Code では、Command + Shift + P を使用します コマンドメニューをポップアップするためのキーの組み合わせ。 Particle:Compile application (local) を選択します

    Particles の強力な Bluetooth API の使用方法

  • ポップアップする可能性のあるエラーを修正してください。

  • 次に、同じメニューを開き、Flash アプリケーション (ローカル) を選択します

    Particles の強力な Bluetooth API の使用方法

  • プログラミングが完了したら、スマートフォンを取り出します。次に、お気に入りの Bluetooth Low Energy アプリを開きます。最良のものは NRF Connect です そして水色の探索者。 この例では、Light Blue Explorer を使用します。

  • "Xenon-" という名前のデバイスかどうかを確認します 広告しています。 を挿入 デバイスの一意の ID を使用します。

    Particles の強力な Bluetooth API の使用方法

  • デバイスを見つけて名前をクリックします。

  • サービスと特徴のリストを見てください。これまでに設定したサービスと固有の UUID は含まれていますか?たとえば、サービス UUID は 6E400001-B5A3-F393-E0A9-E50E24DCCA9E として表示されますか? ?

    Particles の強力な Bluetooth API の使用方法

    すべてが期待どおりに表示される場合は、良い場所にいます。そうでない場合は、前の手順を実行して、すべてが一致していることを確認してください。

  • ステージ 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 アプリケーション (ローカル) を選択します

    Particles の強力な Bluetooth API の使用方法

  • プログラミングが完了したら、Light Blue Explorer を使用してデバイスに接続します .

  • 赤色 LED に当てはまる特徴をタップしてください。

  • FF を書く .赤い LED が点灯します。

    Particles の強力な Bluetooth API の使用方法

    Particles の強力な Bluetooth API の使用方法

  • 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 をセットアップしましょう。 青色に点滅していない場合は、青色に点滅するまでモード ボタンを押し続けます。

    Particles の強力な Bluetooth API の使用方法

    注:アプリを既にプログラムしている場合、LED はデフォルトでオフになります。 モード ボタンを 5 秒間押し続けてから続行してください。

  • ペアリングプロセスを実行します。アプリがすべての手順を案内します。 メッシュ ネットワークの管理者パスワードを忘れないようにしてください。

    Particles の強力な Bluetooth API の使用方法

    Particles の強力な Bluetooth API の使用方法

    Particles の強力な Bluetooth API の使用方法

    Particles の強力な Bluetooth API の使用方法

  • Argon を最新のファームウェア (1.3.0) でプログラムします (ステージ 1 - テストの時間 - ステップ 2 を参照)。 これを行う方法のリマインダー)

  • 黄色にすばやく点滅したら、Tinker アプリで Argon をプログラムします。リリースページからダウンロードできます。

  • きれいに点灯したシアン LED (パーティクル クラウドに接続) ができたら、アプリをプログラムします。 クラウド フラッシュを使用する ドロップダウン メニューのオプション。

    Particles の強力な Bluetooth API の使用方法

    私が知る限り、Particle は、クラウドに接続するときに、ローカルにフラッシュされたすべてのデバイスを強制的にセーフ モードにします。私の設定かもしれません。走行距離はここで異なる場合があります。 Cloud Flash の使用が最適 .

    正しい deviceOS バージョン (1.3.0-rc1) を選択していることを確認してください )、デバイスの種類 (アルゴン ) とデバイス名 (セットアップ中に付けた名前 )

  • 電話アプリを使用して Xenon に接続します

  • 電話アプリを使用して Xenon をメッシュ ネットワークに接続します

  • Cloud Flash を使用して Xenon をフラッシュします .電話アプリのセットアップ中に付けた名前を使用します。デバイスがパーティクル クラウドに接続されているか、セーフ モード (紫色の LED) である限り、プログラムする必要があります。

    Particles の強力な Bluetooth API の使用方法

    Particles の強力な Bluetooth API の使用方法

  • 接続したら、楽しい部分に進みましょう。 水色のエクスプローラーを開きます。 アルゴンのいずれかに接続します またはキセノン .

    Particles の強力な Bluetooth API の使用方法

  • LED 特性の 1 つを選択し、値を変更します。

    Particles の強力な Bluetooth API の使用方法

    すべてのデバイスで 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 を追加する方法を学習しました。ご想像のとおり、可能性は無限大です。たとえば、ユーザー/管理アプリをエクスペリエンスに追加できます。 それは素晴らしいですね。 ?

    次の本では、このようなコンテンツをさらに期待できます:パーティクル メッシュの究極のガイド .最新情報やインサイダー コンテンツについては、マイ リストを購読してください。さらに、すべての早期購読者は、リリース時に割引を受けられます!ここをクリックしてサインアップしてください。


    1. iPadまたはiPhoneでマウスを使用する方法は?

      iPadOSのリリースに伴い & iOS 13 2019年9月、iPadとiPhoneでマウスと外部トラックパッドを使用できるようになりました(ユーザーエクスペリエンスはデスクトップとは異なります)。この機能は、デバイスに完全なマウスサポートを追加せず、MacBookの代替品にはなりません。これは、かなり長い間求められていたユーザー補助機能であり、 AssistiveTouchの既存の機能を拡張したものです。 Appleデバイスとの対話が非常に簡単になります。ただし、モバイルデバイスをラップトップとして機能させることはできません。 iPadとiPhoneでのマウスのサポートはまだ初期

    2. Windows 10 で Bluetooth を使用する方法

      このテクノロジーの時代では、すべてのデバイスに Bluetooth 機能が搭載されています。この機能は、あるデバイスから別のデバイスにファイルを転送する場合に非常に便利です。さらに、データケーブルがない場合でもファイルを送受信できる便利な機能です。 Windows 10 で Bluetooth を有効にして、別のデバイスに接続できます。 この投稿では、Windows 10 で Bluetooth を使用し、Bluetooth を介して iPhone から Windows 10 にファイルを簡単に送受信する方法を共有します。 Windows 10 で Bluetooth を有効にする方法