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」を押します。
ソリューションプラットフォームを「x64」もしくは「x86」にします。
ソリューションエクスプローラーから、Scenario1_Watcher.xaml.cs を開く
※ここで、やたら赤線だらけになってしまう場合は、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で開く
PSoC Creator のメニューから、「Build」「Clean and Build Dynamic Broadcaster」を実行し、Build します。
Program ボタンで、実行します。
無事に実行されると、定期的に、アドバタイズパケットを発信している状態(ブロードキャスト)で動き始めます。
3. スマホで確認(任意)
CySmart で、PSoC 4 BLE が、発信しているか確認します。
発信していれば、このように表示されます。発信しかしていないためタッチしても、接続は出来ません。
4. UWP アプリケーションサンプルを実行する
Visual Studio に戻り、「 ▶ ローカル コンピューター」を押して、アプリケーションを実行します。
アプリケーションが起動したら、「Run」を押します。
アドバタイズパケットが観測でき、デバイス名や受信したデータ(Manufacturer Specific Data)が表示されています。
5. 動作の説明(ざっくり)
PSoC 4 BLE は、定期的に、ひたすらアドバタイズパケットを発信します。PC側では、アドバタイズパケットを受信するだけです。1対多 の一方向通信です。BLE的には、発信する側を Broadcaster、受信する側を Observer といいます。
PSoC 4 BLE側(Broadcaster)のこのサンプルでは、送信する値を定期的に変更しています。(main.c:219あたりから)
また、送信しているアドバタイズパケットは、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; }
こんな感じの対応が必要でした。