でばいすの山小屋

デバイスとかクラウドを実験中。IoTのふもとあたりをうろうろ。

PSoC 4 BLE を、BLE Broadcaster にしてみる

PSoC 4 BLE を、BLE Broadcaster にして、値を変えつつ発信させて、それを PC で受信します。
PC は、Windows10 になって、BLE のアドバタイズパケットを、アプリ側で見ることが出来るようになったので、それも一緒に試します。
なので、機材的にちょっとハードルが高いです。

用意するもの

・Cypress Bluetooth Low Energy Pioneer Kit
・PC (Windows10 / Bluetooth 4.0 LE対応)
PSoC Creator
Visual Studio 2015 (無償のCommunity版でも可)

1. UWP アプリケーションサンプルを準備する

1-1. サンプルのダウンロード

Windows10 の新しいアプリケーションプラットフォーム Universal Windows Platform (UWP)のサンプル集が Github にあります。
https://github.com/Microsoft/Windows-universal-samples から
Windows-universal-samples-master.zip をダウンロード。

1-2. サンプルのビルド

c:\Projects\ に解凍
※この時、すべての sample を解凍してください。BluetoothAdvertisement のみ解凍しても動作しません。
C:\Projects\Windows-universal-samples-master\Samples\BluetoothAdvertisement\cs\BluetoothAdvertisement.sln
Visual Studio 2015 で開く
※UWP 開発に必要なパッケージがインストールされていない場合は、インストールするように言ってくれます。
ソリューションを開く時に、「セキュリティ警告」が表示されますが、「OK」を押します。

f:id:blgkns:20150818111859p:plain:w320
ソリューションプラットフォームを「x64」もしくは「x86」にします。
ソリューションエクスプローラーから、Scenario1_Watcher.xaml.cs を開く
f:id:blgkns:20150818111903p:plain:w320
※ここで、やたら赤線だらけになってしまう場合は、Visual Studio を再起動するとなぜかなおる....

下記のようにコンストラクタの真ん中あたりの6行をコメントアウトします。

public Scenario1_Watcher()
{
    // <snip>

    //var manufacturerData = new BluetoothLEManufacturerData();

    //manufacturerData.CompanyId = 0xFFFE;

    //var writer = new DataWriter();
    //writer.WriteUInt16(0x1234);

    //manufacturerData.Data = writer.DetachBuffer();

    //watcher.AdvertisementFilter.Advertisement.ManufacturerData.Add(manufacturerData);

    // <snip>
}

該当部分は、BLE デバイスのフィルタ指定です。これを切らないと、PSoC 4 BLE が見えません。
※見やすいようにコメント行を削っています。

「ビルド」メニューから「bluetoothadvertisement のリビルド」を実行します。

2. PSoC 4 BLE のサンプルを準備する

2-1. サンプルのダウンロード

https://github.com/cypresssemiconductorco/PSoC-4-BLE から
PSoC-4-BLE-master.zip をダウンロード

2-2. サンプルのビルド/実行

c:\Projects\ に解凍
C:\Projects\PSoC-4-BLE-master\100_Projects_in_100_Days\Day009_Dynamic_Broadcaster\Dynamic Broadcaster\Dynamic Broadcaster.cywrk
PSoC Creatorで開く

f:id:blgkns:20150818111858p:plain:w320
PSoC Creator のメニューから、「Build」「Clean and Build Dynamic Broadcaster」を実行し、Build します。
Program ボタンで、実行します。
無事に実行されると、定期的に、アドバタイズパケットを発信している状態(ブロードキャスト)で動き始めます。

3. スマホで確認(任意)

CySmart で、PSoC 4 BLE が、発信しているか確認します。

f:id:blgkns:20150818111904p:plain:w240

発信していれば、このように表示されます。発信しかしていないためタッチしても、接続は出来ません。

4. UWP アプリケーションサンプルを実行する

Visual Studio に戻り、「 ローカル コンピューター」を押して、アプリケーションを実行します。
f:id:blgkns:20150818111901p:plain:w320
アプリケーションが起動したら、「Run」を押します。
f:id:blgkns:20150818111900p:plain:w320
アドバタイズパケットが観測でき、デバイス名や受信したデータ(Manufacturer Specific Data)が表示されています。

5. 動作の説明(ざっくり)

PSoC 4 BLE は、定期的に、ひたすらアドバタイズパケットを発信します。PC側では、アドバタイズパケットを受信するだけです。1対多 の一方向通信です。BLE的には、発信する側を Broadcaster、受信する側を Observer といいます。
PSoC 4 BLE側(Broadcaster)のこのサンプルでは、送信する値を定期的に変更しています。(main.c:219あたりから)
f:id:blgkns:20150818111902p:plain:w320
また、送信しているアドバタイズパケットは、BLE コンポーネントの「GAP Settings」「Advertisement packet」に、定義されています。
Manufacturer Specific Data の Data を、「00 00 00」にするとどうなるか、PC側でどうなるかやってみてください。
ちなみに、このアドバタイズパケットの Local Name を削って、Manufacturer Specific Data を最大にとったものが、iBeacon です(ざっくり)。

6. 参考:CyBle_GapUpdateAdvData()

PSoC 4 BLE でアドバタイズパケットを CyBle_GapUpdateAdvData() で、更新していますが、サンプルを使わずに、書くとなぜか動きませんでした。
調べてみると、BLE コンポーネントのバージョンに依存しているようで、新しいコンポーネントでは、CyBle_GapUpdateAdvData() は、CyBle_GetBleSsState() が、CYBLE_BLESS_STATE_ACTIVE の時は、使えないようです。
※たしかに STATE_ACTIVE の時にアップデートしたら、問題が起こりそうですよね....

if( CyBle_GetBleSsState() == CYBLE_BLESS_STATE_ACTIVE )
{
    ....
}
else if(( CyBle_GetBleSsState() == CYBLE_BLESS_STATE_EVENT_CLOSE )&&(updated == 1))
{
    CyBle_GapUpdateAdvData(...);
    updated = 0;
}

こんな感じの対応が必要でした。