RN4020のBLEモジュールをいじってみます(ペリフェラル編)

[基本編]   [セントラル編] [スクリプト編] 〔マイコンのトップに戻る〕


 前ページでRN4020の基本情報と、主なコマンド一覧にPCと接続してシリアル端末("TeraTerm")で、
動作させる方法を記述していますので基本の話は前ページを見ましょう。
このページでは、RN4020をペリフェラル(サーバ)デバイスとして動作させてみます。
尚、セントラル(クライアント)デバイス機器はPCのツールで"skBLEtool.py"を利用します。
(PCでなく、セントラルをESP32とした記事はこちらを参照しましょう)

《バッテリ サービス》

 バッテリ サービスは、BLE機器の電池の残量を確認する為のサービスです、
下記の様にコマンドを入力します。

TeraTerm(BatteryService操作)
黄色い網掛け部分が入力ヶ所で、他はデバイスの応答です。
"ERR"が返されたら入力間違いでしょう、入力にはスペースは入れません
この設定は、モジュール内蔵の不揮発性メモリ(NVM)に保存されます。
なのでぇ、次回モジュールを起動させる場合はこの入力は必要なく立ち上がります。

'SR’コマンド
RN4020モジュールでサポートされる機能を設定するコマンドです。
SR,00000000  // ペリフェラルの設定
SR,20000000  // 再起動後や電源入り後に接続切断後、自動でアドバタイズを開始します
この設定を"OR"して設定するので、"SR,20000000"となります。

skBLEtool操作

 PC側のツールは"skBLEtool.py(自作)"を使います、ダウンロードと使い方はこちらをご覧ください。
この"skBLEtool.py"では、pythonのbleakモジュールを使い"BLE通信"を行っています。

@ ツールを起動させます。(方法はこちら)
A デバイスを検出します。
B デバイスの全サービスを調べます。
C 操作できる属性(キャラクタリスティック)を調べます。

skBLEtool.py(検出画面1)
こんな感じで表示されるでしょう。
以下の操作を行う為に、上記の様に青い部分のキャラクタリスティックを選択して置きましょう。

read操作

 キャラクタリスティックの内容は現在0のセットなので電池残量50%を書き込んで見ます。

'SUW’コマンド
このコマンドは、UUIDでアドレス指定してサーバのキャラクタリスティックに内容を書き込みます。
(ペリフェラル側write)、セントラル側(PC)で"read"と"notify"読み出し可能です。
 SUW,xxxx,yyyy
  xxxx:UUIDで16ビット16進数値(パブリック)又は128 ビット16進数値(プライベート)
  yyyy:キャラクタリスティックに書き込む内容(16進数値)
  例)SUW,2A19,32  // 50%=0x32

'SHW’コマンド
このコマンドは、ハンドルでアドレス指定してサーバのキャラクタリスティックに内容を書き込みます。

TeraTerm(SHWコマンド操作1)
ハンドル番号を知る為に、'LS’コマンドで
サーバサービスとそのキャラクタリスティックをリスト表示します。

D "TeraTerm"で"SUW,2A19,32"を入力します。

TeraTerm(SUWコマンド操作1)
"TeraTerm"側の操作結果表示です。
接続されると"Connected"が表示され、切断されると"Connection End"が出ています。
尚、図の"ツールからreadした結果"のカ所は下のEを操作した時表示されます。

E ツールのメニューバーより[表示]->[コンソール]を表示させます。
  次に、[デバイス]->[接続]->[read]と順にクリックします。

skBLEtool.py(コンソール:read)
こんな感じで50%が表示されました。

notify(通知)操作

 今度は、電池残量99%を書き込んで見ます。


F [デバイス]->[接続]->[通知]と順にクリックします。
  10秒間の通知待ちを行います、10秒間は設定変更可能です。
G "TeraTerm"で"SUW,2A19,63"を2回入力しました。

TeraTerm(SUWコマンド操作2)
ツールがノーティフィケーション通知待ちを行っているので、
"TeraTerm"から10秒の間に2回入力を実行しました。

skBLEtool.py(コンソール:通知)1
ツール側の実行された表示内容です。


《プライベート サービス》

 ここでは[UART通信サービス]のプライベートサービスを行ってみます。

プライベート サービスの作成関連コマンド一覧

コマンド パラメータ 内 容
プライベート サービス
PZ   プライベート サービスとプライベート キャラクタリスティックの全設定を
クリアします。この変更を有効にするには、パワーサイクル('R,1')が必要です。
PS xxxxxxxx プライベート サービスのUUID を設定します。
xxxxxxxx:プライベート サービスの128 ビットUUID を指定します。
例) PS,010203040506070809000A0B0C0D0E0F
PC xxxx,yyy,zzz プライベート キャラクタリスティックを設定します。
作成したい個数だけ指定可能、最大10個のキャラクタリスティックをサポート。
xxxx:プライベート キャラクタリスティック128 ビットUUID を指定します。
yyy:8 ビットのキャラクタリスティック プロパティ ビットパターンです。
   '00100000':インディケーション
          サーバからクライアントへ値を通知(ACK あり)
   '00010000':ノーティフィケーション
          サーバからクライアントへ値を通知(ACK なし)
   '00001000':書き込み(write)
          クライアントからサーバへ値を書き込み(ACK あり)
   '00000100':応答なし書き込み
          クライアントからサーバへ値を書き込み(ACK なし)
   '00000010':読み出し(read)
          値を読み出し、値はサーバからクライアントへ送信
   '00000001':ブロードキャスト
          キャラクタリスティック値をブロードキャスト
zzz:プライベートキャラクタリスティックが保持するデータサイズ
   (単位:バイト)を示す8ビット値を指定します。
   キャラクタリスティックの最大データサイズは20 バイトです。
例) PC,11223344556677889900AABBCCDDEEFF,12,05

第4パラメータも有効で内容は、
キャラクタリスティックの8 ビットセキュリティフラグ ビットパターンです。
(セキュリティフラグ ビットパターンの内容は、ユーザガイドを参照しましょう)
 
S- xxxx このコマンドは、Bluetooth 用にシリアル化したデバイスの名称を設定します。
このコマンドは、指定した名前の最後にBluetooth MAC アドレスの最後の
2バイトを自動的に付加します。
xxxx:最大15 文字の英数字です。
例) S-,MyDevice   // MyDevice????となる、????がMAC アドレス
”SN”コマンドならMAC アドレスは付きません。
     

プライベートのUUID作成方法

@ UUIDを作成してくれるウェブサイト「UUIDGenerator.net」にアクセスします。

UUIDを作成してくれるウェブサイト
"How Many?"に作成するUUIDの個数を入力し、[Generate]をクリックします。
"Version1"は、タイムスタンプと、そのバージョンが生成されたコンピュータの
MACアドレスを使用して生成されます。
、 "Version4"は、乱数を使用して生成される汎用的に一意の識別子です。

A 今回は、プライベートサービスUUIDを1個とキャラクタリスティックUUIDを2個作成するので
  計3個(Version4で作成)とします。
   ・4e234e52-5309-435b-a3fe-e6da3c1379ee (サービスUUID)
   ・bc381540-e3e9-4026-b900-c2194bb6a17e (キャラクタリスティックUUID:TX,read,notify)
   ・39fb2309-6640-4dc5-a2cf-4b5c25b7ac35  (キャラクタリスティックUUID:RX,write)
  注意)UUID指定時は、"4e234e525309435ba3fee6da3c1379ee"と'-'を取ります

ペリフェラルデバイスの設定

@ プライベート UARTサービスの設定を行います、下記の様にコマンドを入力します。

TeraTerm(プライベートService操作)
黄色い網掛け部分が入力ヶ所で、他はデバイスの応答です。
次回モジュールを起動させる場合はこの入力は必要なく立ち上がります。

skBLEtool操作

@ ツールを起動させます。(方法はこちら)
A デバイスを検出します。
B デバイスの全サービスを調べます。
C 操作できる属性(キャラクタリスティック)を調べます。

skBLEtool.py(検出画面2)
こんな感じで表示されるでしょう。
図の"説明"項で"Unknown"になっているのでコメントを追加したいが設定は出来ない様です。

read操作

 上記と同じ操作ですが、UUIDが長いので'SHW'のハンドル指示コマンドで書き込みます。
尚、"notify"も上記やここのreadと同じ様な操作なのでここは割愛します。
又、送受信データの長さは5バイト(最大20バイト)で設定していますが、16進数(HEX)で送受信を
しないとダメ
なので少しめんどくさいですぅ。

D "TeraTerm"で"LS"と入力し、リストを表示させTXのハンドル番号を得ます。
  次に"SHW,000E,48657921"を入力します。

TeraTerm(SHWコマンド操作2)
'LS’コマンドでサーバサービスとそのキャラクタリスティックをリスト表示します。
尚、図の"ツールからreadした結果"のカ所は下のEを操作した時表示されます。

E ツールのキャラクタリスティックリストから、"Unknown(read,notify)"の項目を選択して置きます。
  そして、ツールのメニューバーより[表示]->[コンソール]を表示させます。
  次に、[デバイス]->[接続]->[read]と順にクリックします。

skBLEtool.py(コンソール:read)2
この様に"Hey!"が表示されます。
5バイトを超えた値は捨てられます。

write操作

 ツールから送られたデータは、UUIDが長いので'SHR'のハンドル指示コマンドで読み込みます。

F ツールのキャラクタリスティックリストから、"Unknown(write-...-res)"の項目を選択して置きます。
  そして、ツールのコンソールから"What?"+[ENTER]を入力します。

skBLEtool.py(コンソール:write)
この様に送信されます。

G "TeraTerm"で"LS"と入力し、リストを表示させRXのハンドル番号を得ます。
  そして、"SHR,0011"と入力します。

TeraTerm(SHRコマンド操作1)
"576861743F(What?)"と表示されます。
5バイトを超えた場合は、"WV,0011,xxxx"の所は超えた分も表示していますが、
"SHR"の所は5バイトまでしか表示されません。

※ 16進数でやり取りするのは面倒なので、マイコンを繋ぐと良いと思います。

《ブロードキャスタ》

@ ブロードキャスタ ロールの設定を行います、下記の様にコマンドを入力します。

TeraTerm(ブロードキャスタ操作)
黄色い網掛け部分が入力ヶ所で、他はデバイスの応答です。
注意は、ブロードキャスタの場合は、'A’コマンドで手動アドバタイズを行う事です。
次回モジュールを起動させた場合は、'N’コマンドから始めます。
あ、ペリフェラルなら"SR,00000000"ですね、上図間違ってますが、これで動作しました。
'N’コマンドだけでぇ、ブロードキャスタになれるのかも...

'N’コマンド
このコマンドはブロードキャスタとして、アドバタイズの内容を設定する為に使います。
 N,xxxx
  xxxx:25バイト以下の16 進数値(内の先頭2バイトはベンダーIDです)
 例)N,FFFF41424344 // FFFFがベンダーID、41424344('ABCD')は通知するデータ

A ツールのメニューバーより[デバイス]->[検出]と順にクリックします。

skBLEtool.py(検出画面3)
こんな感じで検出されるでしょう。
検出のリストから検出した項目を選択して置きます。

B ツールのメニューバーより[表示]->[コンソール]を表示させます。
  そして、[デバイス]->[オブザーバー]と順にクリックします。

skBLEtool.py(コンソール:オブザーバー)
この様に"ABCD"が表示されます。

C "ABCD"と異なる内容をアドバタイズしたい場合(例えば"0123")は下記の様に操作します。
  ア) "TeraTerm"から、'Y’コマンドを入力しアドバタイズを一旦止めます。
  イ) "N,FFFF30313233"と新たなデータ("0123")を入力します。
  ウ) 'A’コマンドで再度アドバタイズを再開します。
  エ) ツールから、[デバイス]->[オブザーバー]と順にクリックします。

ブロードキャスタとオブザーバー画面
コンソール画面に、この様に"0123"が表示されます。




[基本編へ] [ページ上へ] [セントラル編へ]


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2021 Shigehiro Kimura All Rights Reserved.