PIC32MXシリーズと、Bluetooth-USBドングルで動作する、Bluetooth4.0 LE(Low Energy)対応のソフトウエア・スタック・ライブラリです。ATT(Attribute protocol)と、RFCOMM(シリアル通信モデムエミュレーション)、SDP(Service Discovery Protocol)をサポートしています。Bluetoothではセントラル、ペリフェラル、オブザーバ、ブロードキャスターという立ち位置を定義していますが、これはペリフェラル(周辺機器)向けの機能で、お手軽に組込み用途に利用できます。
外部仕様
Bluetoothサポート概要
仕様準拠 :Bluetooth バージョン4.0のペリフェラル機能の一部(BR/EDR + LE)
デバイス検索機能 :検出可能なデバイスとなります、デバイスを探す事はできません(Scan enable、Advertise)
サービス情報照会機能 :SDP (Service Discovery Protocol) およびATT (Attribute protocol) の情報提供機能のみ
相手のサービスを検索する事はできません
認証・暗号化機能 :あり(V0.3fから)
設定の変更で、暗号化・認証を要求するようになります
認証機能はパスキー入力などのサブルーチンをアプリケーション側に用意する必要が有ります
LEのプライバシー機能は、ランダムデバイスアドレスの受け入れ(チェック)のみ可能
SecurityManager/ATTのデータ署名機能はありません
キーは電源が切れたら消失します
誤り検出、再送機能 :なし
仮想シリアル通信 :RFCOMMでコネクション待ち
アトリビュート照会機能:ATTで小物内データの検索および更新機能、通知機能あり(Notify,Indicate)
相手のATTデータにアクセスする機能はありません
音声系機能 :なし
動作条件
対応CPU:PIC32MX250F128以上
Bluetoothドングル:市販品はおおむね使用可能
多重動作:マルチタスク不可
複数インスタンス:複数のドングル接続は未対応
開発環境1:
OS: MacOS 10.10
IDE: MPLAB X IDE v2.26
Compiler: XC32-gcc(v1.33)
Library: Microchip Harmony V1.01
ROM Writer: PICkit3
開発環境2:
OS: MacOS 10.11
IDE: MPLAB X IDE v3.20
Compiler: XC32-gcc(v1.40)
Library: Microchip Harmony V1.06.02
ROM Writer: PICkit3
参考情報:
使用メモリ量:
プログラム領域:(USBスタック、Cライブラリ等全て含んだサイズ、コンパイラ最適化は-O1)
バージョン0.3b: 約68kB
バージョン0.3c: 約66kB
データ領域:(スタックを除く)
バージョン0.3b: 静的領域=7.2kB ヒープ領域=約8kB
バージョン0.3c: 静的領域=9.1kB ヒープ領域=約6kB
消費電流:
33mA前後(サンプル回路全体、ドングル7mA、その他26mA、 CPUコアクロック40MHz)
ダウンロード
MPLAB X プロジェクトファイル
スタック本体と、サンプルプログラムが含まれます。
バージョン0.3j
「Bluetooth4P_PIC32MX_Sample0.3j.zip」 (1.1MB) バージョン0.3j 2017.2.24
アドバタイズメッセージを自由に設定可能にした
環境設定ファイルbt_config.hを追加し、ユーザとスタックのソースファイルの分離を推進
サンプルファイルを心拍計/体温計(認証付)/独自サービスの3種類を用意
動的にアドバタイズをオン・オフ、強制的にディスコネクトできるAPIを追加
16ビットUUIDに対応(ATTとアドバタイズ)
LEの暗号化・認証機能を追加
BR/EDR(クラッシク機能)の暗号化・認証機能を再設計
BR/EDRのシグナリング状態遷移を真面目に実装
バージョン0.3c+
「Bluetooth4P_PIC32MX_Sample0.3c+.zip」 (1.7MB) バージョン0.3c+ 2016.2.28
Harmony v1.06対応、バグ対応、SecurityManager削除。
バージョン0.3b
「Bluetooth4P_PIC32MX_Sample0.3b.zip」 (2MB) バージョン0.3b 2015.5.3
Harmony v1.01対応、bt_init(),bt_process()を削除、bt_att_data.[ch]を追加
Eagle6.5 回路図データ
「PIC32MXtest.zip」 (147kB) 2015.2.26 VUSB間違っていましたので修正してあります。
サンプルの動かし方
部品を用意
実験回路を組む
普通はブレッドボードが良いでしょう。もちろん ユニバーサル基板だと、なお良いと思います。安定化したDC5V,100mA以上の電源を用意して下さい。
PCで開発環境を準備
以下のソフトウエアをセットアップしておいて下さい。
IDE: MPLAB X IDE v3.20
Compiler: XC32 v1.40
Library: Microchip Harmony v1.06.02
バージョンは、指定の物にするとトラブルなくビルドできます。新しいバージョンにした場合は、ディレクトリパスの変更など調整が必要ですが適応可能です。ただし、HarmonyのAPI変更など、アプリに影響されるような変更があれば、スタック側も変更が必要になってきます。(2024.5.29 バージョン値を追記)
プログラマ(書込み器)はPICkit3の前提での手順になります。
MPLAB Xでビルド
・ダウンロードしたプロジェクトファイルは、
$HOME/Documents/MPLABXProjects
のディレクトリを作って、そこに展開して下さい。デフォルトの$HOME/MPLABXProjectsとは違うので注意です。
・MPLABXでOpen Projectし、$HOME/Documents/MPLABXProjects/Bluetooth4P_PIC32MX_Sampleを開く
開いた時に、何もエラーメッセージが出なければ問題ありません。
・ビルドすると、いくつかメッセージが出ますが、「警告」レベルであれば正常です。こんなメッセージbuild log.txtです。
・バージョン条件の相違やプロジェクトディレクトリを変えたい場合は、MPLAB Xで開くとエラーメッセージがたくさん出ますので、一つ一つ潰して行く必要があります。プロジェクトのプロパティ内に設定されている、ファイルパス名等を修正すれば何とかなる物もありますが、ソースファイルの格納場所を再度設定し直す(削除して追加)事を行わないと修正出来ない場合もあり、かなり大変です。Bluetooth4P_PIC32MX_Sample.X/nbproject/configurations.xml と project.xmlのファイルを直に修正するのが近道です。ただ設定が、てんでおかしくなってしまう事もあるので、バックアップを取ってから修正した方が良いでしょう。
MPLAB Xからプログラムを書込み
・PICkit3を接続し、プロジェクトのプロパティで、Hardware ToolがPICkit3になっている事を確認。
・5Vの電源を接続、MPLAB Xで書込みボタンを押す。
・PICkit3の赤ランプが点滅して10秒程で書込み完了する。
・1回目は失敗する事があるので、エラー時はとりあえず再度書込んでみる。
実行
・書込み完了と同時に実行が始まります。
・USBスタックの初期化が済むとLED3が点灯します。(点灯しなければCPU自体が動いていない可能性大)
・USB-Bluetoothドングルを挿入すると、ドングルが正常に認識されればLED1が点灯します。
・Bluetoothドングルに通信ランプが付いている場合は、1秒間隔位で点滅していれば、ほぼOK。
詳しい事はSTM32版の「3. サンプルの動かし方」参照して下さい。
ユーザアプリケーションでの利用方法
ユーザアプリケーションへの導入
サンプルプログラムをベースにアプリ機能を追加
Harmony v1.01での利用の場合、この手順を使って下さい。
簡単に言うと、リネームして利用するやり方です。この方法だと、Microchip社が提供する最新のライブラリには対応できません。
プロジェクトのコピーとディレクトリ名の変更
cd $HOME/Documents/MPLABXProjects/
togashi-toyohiko-no-MacBook-Air:MPLABXProjects togashitoyohiko$ cp -Rp HA7_Logger_mini05 Bluetooth4P_PIC32MX_Sample
togashi-toyohiko-no-MacBook-Air:MPLABXProjects togashitoyohiko$ ls -l
total 28736
drwxrwxrwx 5 togashitoyohiko 502 170 2 15 10:23 Bluetooth4P_PIC32MX_Sample
drwxrwxrwx 5 togashitoyohiko 502 170 2 15 10:23 HA7_Logger_mini05
drwxr-xr-x 5 togashitoyohiko 502 170 2 15 12:03 demo
drwxr-xr-x 16 togashitoyohiko 502 544 5 3 09:26 test01.X
ディレクトリ名の変更
togashi-toyohiko-no-MacBook-Air:MPLABXProjects togashitoyohiko$ cd Bluetooth4P_PIC32MX_Sample
togashi-toyohiko-no-MacBook-Air:Bluetooth4P_PIC32MX_Sample togashitoyohiko$ ls -l
total 0
drwxrwxrwx 8 togashitoyohiko 502 272 2 15 10:43 HA7_Logger_mini05.X
drwxrwxrwx 15 togashitoyohiko 502 510 3 2 16:51 src
togashi-toyohiko-no-MacBook-Air:Bluetooth4P_PIC32MX_Sample togashitoyohiko$ mv HA7_Logger_mini05.X Bluetooth4P_PIC32MX_Sample.X
togashi-toyohiko-no-MacBook-Air:Bluetooth4P_PIC32MX_Sample togashitoyohiko$ ls -l
total 0
drwxrwxrwx 8 togashitoyohiko 502 272 2 15 10:43 Bluetooth4P_PIC32MX_Sample.X
drwxrwxrwx 15 togashitoyohiko 502 510 3 2 16:51 src
togashi-toyohiko-no-MacBook-Air:Bluetooth4P_PIC32MX_Sample togashitoyohiko$
定義を自分の環境用に変更
togashi-toyohiko-no-MacBook-Air:Bluetooth4P_PIC32MX_Sample togashitoyohiko$ cd Bluetooth4P_PIC32MX_Sample.X
togashi-toyohiko-no-MacBook-Air:Bluetooth4P_PIC32MX_Sample.X togashitoyohiko$ ls -l
total 8
-rwxrwxrwx 1 togashitoyohiko 502 3381 10 17 2014 Makefile
drwxr-xr-x 3 togashitoyohiko 502 102 3 2 16:15 build
drwxr-xr-x 4 togashitoyohiko 502 136 2 15 10:38 debug
drwxr-xr-x 3 togashitoyohiko 502 102 3 2 16:15 dist
drwxrwxrwx 14 togashitoyohiko 502 476 5 3 08:53 nbproject
togashi-toyohiko-no-MacBook-Air:Bluetooth4P_PIC32MX_Sample.X togashitoyohiko$ cd nbproject
togashi-toyohiko-no-MacBook-Air:nbproject togashitoyohiko$ ls -l
total 368
-rw-r--r-- 1 togashitoyohiko 502 410 5 3 08:53 Makefile-genesis.properties
-rw-r--r-- 1 togashitoyohiko 502 1983 5 3 08:53 Makefile-impl.mk
-rw-r--r-- 1 togashitoyohiko 502 2173 5 3 08:53 Makefile-local-pic32mx250f128b.mk
-rw-r--r-- 1 togashitoyohiko 502 94677 5 3 08:53 Makefile-pic32mx250f128b.mk
-rw-r--r-- 1 togashitoyohiko 502 547 5 3 08:53 Makefile-variables.mk
-rw-r--r-- 1 togashitoyohiko 502 1429 5 3 08:53 Package-pic32mx250f128b.bash
-rwxrwxrwx 1 togashitoyohiko 502 30453 5 3 08:53 configurations.xml
-rwxrwxrwx 1 togashitoyohiko 502 29982 2 18 13:58 configurations.xml.bak
drwxr-xr-x 4 togashitoyohiko 502 136 2 15 19:27 private
-rwxrwxrwx 1 togashitoyohiko 502 0 10 17 2014 project.properties
-rwxrwxrwx@ 1 togashitoyohiko 502 761 5 3 08:53 project.xml
togashi-toyohiko-no-MacBook-Air:nbproject togashitoyohiko$ vi project.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://www.netbeans.org/ns/project/1"> <type>com.microchip.mplab.nbide.embedded.makeproject</type> <configuration> <Harmony xmlns="Harmony" MHC="true"/> <data xmlns="http://www.netbeans.org/ns/make-project/1"> <name>Bluetooth4P_PIC32MX_Sample</name> ~~~~~~~~~~~~~~~~~~~~~~~~~~ <creation-uuid>e54023e9-3948-44ef-bf6f-29d8b223e558</creation-uuid> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <make-project-type>0</make-project-type> <c-extensions>c</c-extensions> <cpp-extensions/> <header-extensions>h</header-extensions> <asminc-extensions/> <sourceEncoding>ISO-8859-1</sourceEncoding> <make-dep-projects/> </data> </configuration> </project>
名前とuuidを修正します。UUIDはだぶらないように別の値にして下さい。(何でも良いです)
MPLABXで開く
警告メッセージが出ないはず。
動作確認
コピーしたプロジェクトで動く事を確認したら、ユーザのロジックを組込んで下さい。
既存アプリにBluetooth機能追加
Harmony v1.04以降での利用の場合、この手順を使って下さい。
本説明は、後からBluetooth機能を追加する手順です。Harmonyを利用したアプリケーション開発では、”Harmony configurater”を使用して、簡単にプログラムのひな形を生成して始められるので、通常はこの方法となります。
- Configuraterでアプリのひな形を自動生成
- それにアプリケーションロジックを組込み大体動くようにする
- 安定してきたらBluetooth機能を追加する
Configuraterでアプリのひな形を自動生成
プロジェクトを新規作成し、Harmony Configuraterを使って、ユーザアプリケーションで必要な機能を選択しソースコードを自動生成させます。
以下の点だけ注意して下さい。
・USBホスト機能を有効にします。
USB Libraly
Use USB Stack
USB Driver Implementation: DYNAMIC
Interrupt Mode
Select Host or Device stack
USB Host (Recommented)
使用するホストクラス(Host Client Driver)は任意です。全く選択しなくともOKです。
・USB-PLLクロックを有効にして下さい(UPLLEN=ON,UPLLIDIV=???)
説明するまでもありませんが、USB-PLLへ与えるクロックは4MHzにしなければならないので、
外部クリスタルとの分周比をUPLLDIVに指定します。逆に言うと4の倍数のクリスタルを用意しなければなりません。
内蔵オシレータ8MHzはUSB-PLLの入力には出来ませんので、必ずクリスタルを外付けする必要があります。
外部クリスタルは、プライマリオシレータという内蔵回路で駆動されますが、
10MHz以下のクリスタルの場合XTモード、それ以上はHSモードで区別が必要です。(消費電流が違う)
・ヒープサイズを指定しておいて下さい
Device & Project Configuration
Project Configuration
XC32
xc32-ld
General
Heap Size(Bytes): 6000
・USBホストの設定を変更
とりあえず、コンパイルだけしてみるとシンボル未解決のエラーが発生します。
BSP_USBVBUSSwitchOverCurrentDetect -> USBバスの電流不足検出関数
BSP_USBVBUSPowerEnable -> USBバスの電源オンオフ制御関数
以下のようにsystem_init.cファイルを修正して無効化するか、実際に機能する関数を定義して下さい。
DRV_USBFS_INIT drvUSBFSInit = { : .portOverCurrentDetect = BSP_USBVBUSSwitchOverCurrentDetect, .portPowerEnable = BSP_USBVBUSPowerEnable, : }; : const USB_HOST_INIT usbHostInitData = { .nTPLEntries = 1 , : };
DRV_USBFS_INIT drvUSBFSInit = { : .portOverCurrentDetect = NULL, .portPowerEnable = NULL, : }; : const USB_HOST_INIT usbHostInitData = { .nTPLEntries = 0 , : };
.nTPLEntriesの値を1から0に変更しておいて下さい。この修正を行わないと、ユーザアプリケーション実行時、system_init.cでエラーが発生します。
これで、コンパイルエラーが無くなり、ビルドが完了するようになります。
以下の警告メッセージは無視できます。
system_config.h:56:0: warning: "_PLIB_UNSUPPORTED" redefined [enabled by default] #define _PLIB_UNSUPPORTED peripheral_common.h:749:0: note: this is the location of the previous definition #define _PLIB_UNSUPPORTED attribute((unsupported("The microcontroller selected does not implement this feature.")))
それにアプリケーションロジックを組込み大体動くようにする
自動生成されたソースコードに、アプリケーションの処理を組み入れ、通常通りプログラム開発を行います。
Bluetooth以外の動作を確認できるレベルまで持っていって下さい。
なお、ConfiguraterでUSBホスト機能を取り入れただけではUSBは動作しませんので、アプリがうまく動かなくても、USB(Bluetooth)を疑う必要はありません。
安定してきたらBluetooth機能を追加する
bluetoothスタックのソースをコピーし、プロジェクトに登録
”src/bluetooth” と “src/usb” ディレクトリを作成し、本サイトからダウンロードしたソースファイルをそれぞれコピーして下さい。
usb_host_FIX.cは任意で、問題が出た時に後で追加するのがよろしいかと思います。
(その場合、ソースツリーからusb_host.cの登録を削除(無効化でも良い)して下さい)
コピーした.cファイルをプロジェクトソースツリーに登録
ソースツリー図を参照しながら、同じになるように、ロジカルディレクトリを作ってその配下に登録していきます。
全く同じにする必要はありませんが、分かり易くした方が良いというだけです。
プロジェクトプロパティのXC32(gcc)オプションを変更
preproccesssingのincludeに”./src/bluetooth”を追加
system_init.cファイルを修正
const USB_HOST_TPL_ENTRY USBTPList[ 1 ] = { }; const USB_HOST_INIT usbHostInitData = { .nTPLEntries = 0 , : };
const USB_HOST_TPL_ENTRY USBTPList[ 1 ] = { TPL_INTERFACE_CLASS_SUBCLASS_PROTOCOL(0xe0, 0x01, 0x01, NULL, USB_HOST_BLUETOOTH_INTERFACE), }; const USB_HOST_INIT usbHostInitData = { .nTPLEntries = 1 , : };
system_definitions.cファイルに追加記述
#include "usb/usb_host.h" #include "usb/usb_host_hub.h" #include "usb/usb_host_hub_interface.h" #include "usb/usb_host_bluetooth.h" // USB:Bluetooth stack interface // Bluetooth stack #include "bt_rfcomm_server.h" // Bluetooth RFCOMM API #include "bt_att_server.h" // Bluetooth ATT server API #include "bt_att_db.h" // Bluetooth ATT database API #include "app.h"
app.cに必要最低限のコードを追加
以下のソースコードをapp.cに追記。
//
// Bluetooth call back routines
//
void bt_rfcommServerDataRecived(unsigned char *inBuff, size_t inLen) {
return;
}
void bt_attDbNotification(unsigned short handle, void *value, size_t valueLen) {
// Essential action
bt_att_serverNotificationQueueAdd(handle);
// User action
//-------------------------------------------------------------
//-------------------------------------------------------------
return;
}
コンパイルしてみてエラーが無い事を確認
シンボル関係の未解決など
app.cにUSBを有効にするコードを追加
USB_HOST_BusEnable(0)をコールする事で、USBおよびBluetooth機能が動き出します。
デフォルトのサービス名、データ名等でBluetoothが動作しているはずです。
PCやスマートフォンなどを使って確認してみて下さい。
ソースコード “src/bluetooth” 内のデフォルト設定値を変更して、望みの名称等に変えて行って下さい。
デバイス名称などの設定変更
詳しい事はSTM32版の「4. アプリケーション適用」を参照して下さい。
ドングルが最初だけ認識できない場合
harmony v1.06では、ドングルによって認識できない場合があります。Harmonyのソースを修正すれば、回避出来ます。以下のソースファイルを入れ替えるか、プロジェクト内のソースとして取込んで下さい。
usb/src/usb_host.c <–> usb/src/usb_host_FIX.c
内部情報
基本事項
Bluetoothスタックの開発者向け参考情報です。このライブラリは、STM32版を移植したものです。細かい所は、そちらを参照して下さい。ここでは、PIC32固有の部分を説明します。
ソースファイル
HCIトランスポート層
USBワイヤレスコントローラ/Bluetoothクラス
Microchip社から提供されているUSBホスト用ライブラリは、CDCやマスストレージクラスのみのサポートで、Bluetoothドングルを使うための「Wireless Controller Class」は、当然の事ながらありません。
Microchipからは、USBライブラリが2種類提供されています。MLAと呼ばれるものと、Harmonyと呼ばれる物ですHarmonyの方が新しく、PIC32の場合の推奨フレームワークですので、こちら側の選択となります。Harmonyのヘルプファイルが唯一のドキュメントです。USBホストのクラス処理の説明を絵にしてみました。
USBホスト共通処理(usb_host.c)は、デバイスが挿入されたらエニュメレーション処理(デバイスディスクリプタ、コンフィギュレーションディスクリプタを読み込んで解析する)を行い、対応するクラスモジュールに制御を渡します。クラスと
モジュールとの結びつけはTPListテーブルに従います。
クラスモジュールは、そのクラス特有のUSB通信を行う処理を実装します。Bluetoothクラス(正確にはワイヤレスコントローラクラスの中のBluetooth-HCIサブクラス)では、コントロール転送、インタラプト転送、バルク転送入力、バルク転送出力の4本のパイプを開設し、それぞれ透過的にデータ転送を行うのが役割になります。
Bluetooth仕様書では、HCIトランスポート層の記述「 BLUETOOTH SPECIFICATION Version 4.0 Volume 4 Host Controller Interface [Transport Layer], Part B USB transport layer」にあります。
Harmony1.01から1.06は、usb_host.cのAPIが大きく変わりました。利用する時に注意すべき点をご紹介致します。
ドングルが認識されない場合がある(?)
本来ドングルから応答されるはずのメッセージが来ない事が、特定の個体の電源投入直後に発生する
usb_host.c内のリトライ機能が働かないようだ(バグ?仕様?ソースコードを読み切れないだけ?)
Harmonyのソースコードを改修して回避する(前述通り)
バッファ長は小さ過ぎてはいけない
USB_HOST_DeviceTransfer()で送受信をリクエストする時のバッファ長は、USB上のパケットサイズとは無関係に指定可能なので、USBパケットの分解/組立てを行ってくれるので楽。
ただしインタラプト転送では16バイト以下にすると正しく機能しなかった
バルク転送でも同じかもしれないが未確認
単純に大きくすれば回避出来る
受信時のメッセージダンプ例:バッファ長減らしたら初期化失敗するようになった.txt
1: 00000001 03-0C 00 HCI_Reset 2: 00000002 0E 0B 01 05-10 00 36 01 40 0A Command_Complete HCI_Read_Buffer_Size 3: 00000002 0E 04 01 03 0C 00 Command_Complete HCI_Reset 4: 00000001 01-0C 08 FF FF FF FF FF FF FF HCI_Set_Event_Mask 5: 00000002 0E 04 01 01 0C 00 Command_Complete 6: 00000001 01-10 00 HCI_Read_Local_Version_Information 7: 00000002 0E 0C 01 01 10 00 06 86 1D 06 Command_Complete 8: 00000001 02-10 00 HCI_Read_Local_Supported_Commands 9: 00000002 0E 44 01 02-10 00 FF FF FF 03 Command_Complete 10: 00000002 FF FF F3 0F E8 FE 3F F7 83 FF 11: 00000002 FF FF 7F 00 00 00 00 00 00 00 12: 00000002 00 00 00 00 00 00 00 00 00 00 13: 00000002 00 00 00 00 00 00 00 00 00 00 14: 00000001 03-10 00 HCI_Read_Local_Supported_Features 15: 00000002 0E 0C 01 03-10 00 FF FF 8F FE Command_Complete 16: 00000001 04-10 01 00 HCI_Read_Local_Extended_Features 17: 00000002 0E 0E 01 04-10 00 00 00 FF FF Command_Complete 18: 00000001 05-10 00 HCI_Read_Buffer_Size どうしてもここで応答がなくなる。 evtバッファ長が16バイトだと、この現象が出るようだ。 大きくすると現象が出なくなる。
正常受信OKのステータスでも実際はデータが格納されない事がある
.interfaceEventHandler(データ受信時のコールバック関数)で返される eventData->resultが
USB_HOST_RESULT_SUCCESSでも、ventData->length長分の受信データがバッファに入っていない事がある
Harmonyのソースコードを改修する必要があるが、解読し切れなかったので、アプリ側に回避コードを埋め込む
回避法は、受信前にバッファをゼロクリアし、ゼロのままなら受信リトライする
受信時のメッセージダンプ例:Lightblueで接続するだけでエラー.txt
1: 00000001 03 0C 00 00 00 00 00 00 00 00 2: 00000002 0E 04 01 03 0C 00 00 00 00 00 3: 00000001 01 0C 08 FF FF FF FF FF FF FF 4: 00000002 0E 04 01 01 0C 00 00 00 00 00 5: 00000001 01 10 00 FF FF FF FF FF FF FF 6: 00000002 0E 0C 01 01 10 00 06 86 1D 06 7: 00000001 02 10 00 FF FF FF FF FF FF FF 8: 00000002 0E 44 01 02 10 00 FF FF FF 03 9: 00000001 03 10 00 FF FF FF FF FF FF FF 10: 00000002 0E 0C 01 03 10 00 FF FF 8F FE 11: 00000001 04 10 01 00 FF FF FF FF FF FF 12: 00000002 0E 0E 01 04 10 00 00 00 FF FF 13: 00000001 05 10 00 00 FF FF FF FF FF FF 14: 00000002 0E 0B 01 05 10 00 36 01 40 0A 15: 00000001 09 10 00 00 FF FF FF FF FF FF 16: 00000002 0E 0A 01 09 10 00 B1 7B 40 DD 17: 00000001 33 0C 07 A4 02 00 01 00 00 00 18: 00000002 0E 04 01 33 0C 00 B1 7B 40 DD 19: 00000001 24 0C 03 10 05 08 01 00 00 00 20: 00000002 0E 04 01 24 0C 00 B1 7B 40 DD 21: 00000001 13 0C 0A 57 48 4D 20 30 2E 36 22: 00000002 0E 04 01 13 0C 00 B1 7B 40 DD 23: 00000001 56 0C 01 01 48 4D 20 30 2E 36 24: 00000002 0E 04 01 56 0C 00 B1 7B 40 DD 25: 00000001 1A 0C 01 03 48 4D 20 30 2E 36 26: 00000002 0E 04 01 1A 0C 00 B1 7B 40 DD 27: 00000001 03 10 00 03 48 4D 20 30 2E 36 28: 00000002 0E 0C 01 03 10 00 FF FF 8F FE 29: 00000001 01 0C 08 FF FF FF FF FF FF FF HCI_Set_Event_Mask 30: 00000002 0E 04 01 01 0C 00 Command_Complete len pkt opcode stat 31: 00000001 01 20 08 1F 00 00 00 00 00 00 HCI_LE_Set_Event_Mask 32: 00000002 0E 04 01 01 20 00 33: 00000001 02 20 00 1F 00 00 00 00 00 00 HCI_LE_Read_Buffer_Size 34: 00000002 0E 07 01 02 20 00 00 00 00 35: 00000001 03 20 00 1F 00 00 00 00 00 00 HCI_LE_Read_Local_Supported_Features 36: 00000002 0E 0C 01 03 20 00 01 00 00 00 ?? 37: 00000001 0F 20 00 1F 00 00 00 00 00 00 HCI_LE_Read_White_List_Size 38: 00000002 0E 05 01 0F 20 00 19 39: 00000001 10 20 00 1F 00 00 00 00 00 00 HCI_LE_Clear_White_List 40: 00000002 0E 04 01 10 20 00 41: 00000001 06 20 0F 00 08 00 08 00 00 00 HCI_LE_Set_Advertising_Parameters 42: 00000002 0E 04 01 06 20 00 43: 00000001 07 20 00 00 08 00 08 00 00 00 HCI_LE_Read_Advertising_Channel_TX_Power 44: 00000002 0E 05 01 07 20 00 04 45: 00000001 08 20 20 15 02 01 1A 11 07 00 HCI_LE_Set_Advertising_Data 46: 00000002 0E 04 01 08 20 00 47: 00000001 09 20 20 0A 08 08 57 48 4D 30 HCI_LE_Set_Scan_Response_Data 48: 00000002 0E 04 01 09 20 00 49: 00000001 0B 20 07 00 10 00 10 00 00 00 HCI_LE_Set_Scan_Parameters 50: 00000002 0E 04 01 0B 20 00 51: 00000001 6D 0C 02 01 00 00 10 00 00 00 HCI_Write_LE_Host_Supported 52: 00000002 0E 04 01 6D 0C 00 53: 00000001 0A 20 01 01 00 00 10 00 00 00 HCI_LE_Set_Advertise_Enable 54: 00000002 0E 04 01 0A 20 00 55: 00000002 3E 13 01 00 2C 00 01 01 3E FA LE_Meta_Event len subcode=Connection_Complete status handle(002c)… 56: 00000004 2C-20 07-00 03-00 04-00 02 9E ATT_Opcode_Exchange_MTU_Request 57: 00000003 2C-20 09-00 05-00 04-00 01 02 ATT_Opcode_Error_Response handle len len CID OP 58: 00000004 2C-20 1B-00 3B-00 3A-00 01 39 CID=3a? 59: 00000004 2C-10 1B-00 01 22 02 00 01 1D 61: 00000004 2C-10 09-00 63 6C 61 73 73 69 60: 00000002 13 05 01 2C 00 01 00 HCI_Event_Number_Of_Completed_Packets 62: 00000004 2C-20 0B-00 07-00 3A-00 09 05 CID=3A? 63: 00000004 2C-20 0B-00 07-00 04-00 10 01 ATT ATT_Opcode_Read_by_Group_Type_Request 64: 00000003 2C-20 0C-00 08-00 04-00 11 06 ATT ATT_Opcode_Read_by_Group_Type_Response 65: 00000002 13 05 01 2C 00 01 00 HCI_Event_Number_Of_Completed_Packets 66: 00000004 2C 20 0B 00 07 00 04-00 10 06 ATT ATT_Opcode_Read_by_Group_Type_Request 67: 00000003 2C 20 0C 00 08 00 04-00 11 06 ATT ATT_Opcode_Read_by_Group_Type_Response 68: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 69: 00000004 2C 20 0B 00 07 00 04-00 10 16 ATT ATT_Opcode_Read_by_Group_Type_Request 70: 00000003 2C 20 1A 00 16 00 04-00 11 14 ATT ATT_Opcode_Read_by_Group_Type_Response 71: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 72: 00000004 2C 20 0B 00 07 00 04-00 10 57 ATT ATT_Opcode_Read_by_Group_Type_Request 73: 00000003 2C 20 09 00 05 00 04-00 01 10 ATT ATT_Opcode_Error_Response 74: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 75: 00000004 2C 20 0B 00 07 00 04-00 08 11 ATT_Opcode_Read_By_Type_Request 76: 00000003 2C 20 0D 00 09 00 04-00 09 07 ATT_Opcode_Read_By_Type_Response 77: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 78: 00000004 2C 20 0B 00 07 00 04-00 08 14 ATT_Opcode_Read_By_Type_Request 79: 00000003 2C 20 09 00 05 00 04-00 01 08 ATT_Opcode_Error_Response 80: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 81: 00000004 2C 20 09 00 05 00 04-00 04 14 ATT_Opcode_Find_Information_Request 82: 00000003 2C 20 2A 00 26 00 04-00 05 02 ATT_Opcode_Find_Information_Response 83: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 84: 00000004 2C 20 09 00 05 00 04-00 12 15 ATT_Opcode_Write_Request 85: 00000003 2C 20 05 00 01 00 04-00 13 ATT_Opcode_Write_Response 86: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 87: 00000004 2C 20 0B 00 07 00 04-00 08 00 ATT_Opcode_Read_By_Type_Request 88: 00000003 2C 20 1B 00 17 00 04-00 09 15 ATT_Opcode_Read_By_Type_Response 89: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 90: 00000004 2C 20 0B 00 07 00 04-00 08 03 ATT_Opcode_Read_By_Type_Request 91: 00000003 2C 20 1B 00 17 00 04-00 09 15 ATT_Opcode_Read_By_Type_Response 92: 00000002 13 05 01 2C 00 01-00 01 3E FA HCI_Event_Number_Of_Completed_Packets 93: 00000004 2C 20 0B 00 07 00 04-00 08 13 ATT_Opcode_Read_By_Type_Request 94: 00000003 2C 20 1B 00 17 00 04-00 09 15 ATT_Opcode_Read_By_Type_Response 95: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 96: 00000004 2C 20 0B 00 07 00 04-00 08 23 ATT_Opcode_Read_By_Type_Request 97: 00000003 2C 20 1B 00 17 00 04-00 09 15 ATT_Opcode_Read_By_Type_Response 98: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 99: 00000004 2C 20 0B 00 07 00 04-00 08 33 ATT_Opcode_Read_By_Type_Request 100: 00000003 2C 20 1B 00 17 00 04-00 09 15 ATT_Opcode_Read_By_Type_Response 101: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 102: 00000004 2C 20 0B 00 07 00 04-00 08 43 ATT_Opcode_Read_By_Type_Request 103: 00000003 2C 20 1B 00 17 00 04-00 09 15 ATT_Opcode_Read_By_Type_Response 104: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 105: 00000004 2C 20 0B 00 07 00 04-00 08 03 ATT_Opcode_Read_By_Type_Request 106: 00000003 2C 20 1B 00 17 00 04-00 09 15 ATT_Opcode_Read_By_Type_Response 107: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 108: 00000004 2C 20 0B 00 07 00 04 00 08 13 ATT_Opcode_Read_By_Type_Request 109: 00000003 2C 20 1B 00 17 00 04 00 09 15 ATT_Opcode_Read_By_Type_Response 110: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 111: 00000004 2C 20 0B 00 07 00 04-00 08 23 ATT_Opcode_Read_By_Type_Request 112: 00000003 2C 20 1B 00 17 00 04-00 09 15 ATT_Opcode_Read_By_Type_Response 113: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 114: 00000004 2C 20 0B 00 07 00 04-00 08 33 ATT_Opcode_Read_By_Type_Request 115: 00000003 2C 20 1B 00 17 00 04-00 09 15 ATT_Opcode_Read_By_Type_Response 116: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 117: 00000004 2C 20 0B 00 07 00 04-00 08 43 ATT_Opcode_Read_By_Type_Request 118: 00000003 2C 20 1B 00 17 00 04-00 09 15 ATT_Opcode_Read_By_Type_Response 119: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 120: 00000004 2C 20 0B 00 07 00 04-00 08 53 ATT_Opcode_Read_By_Type_Request 121: 00000003 2C 20 09 00 05 00 04-00 01 08 ATT_Opcode_Error_Response 122: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 123: 00000004 2C 20 0F 00 0B 00 04-00 12 02 ATT_Opcode_Write_Request 124: 00000003 2C 20 05 00 01 00 04-00 13 ATT_Opcode_Write_Response 125: 00000002 13 05 01 2C 00 01 00 01 3E FA HCI_Event_Number_Of_Completed_Packets 126: 00000004 2C 20 0F 00 0B 00 04-00 12 02 ATT_Opcode_Write_Request !!!!!!!!!!!!!!!!!!!!!!!!!!! この電文は前回の値が残っていただけ。 実際は9バイト長受信した報告が来ただけで、電文は全く書き換えられていなかった。 USB_HOSTのバグ? とりあえず、回避コードを埋め込む必要あり。 127: 00000002 05 04 00 2C-00 13 HCI_Event_Disconnection_Complete LL st hands reason REMOTE USER TERMINATED CONNECTION 128: 00000001 0A 20 01 01 HCI_LE_Set_Advertise_Enable 129: 00000002 0E 04 01 0A 20 00 00 01 3E FA HCI_Error_Connection_Rejected_Security_Reasons 130: 00000002 3E 13 01 00 2D 00 01 01 3E FA HCI_Error_Connection_Failed_To_Be_Established 131: 00000004 2D-20 07-00 03-00 04-00 02 9E ATT_Opcode_Exchange_MTU_Request 132: 00000004 2D-20 1B-00 3B-00 3A-00 01 39 ? 133: 00000004 2D-10 1B-00 01 22 02 00 01 1D 134: 00000004 2D-10 09-00 63 6C 61 73 73 69 135: 00000004 2D-20 0B-00 07-00 3A-00 09 05 ? 136: 00000002 05 04 00 2D-00 13 HCI_Event_Disconnection_Complete 137: 00000001 0A 20 01 01 HCI_LE_Set_Advertise_Enable 138: 00000002 0E 04 01 0A 20 00 01 01 3E FA HCI_Error_Connection_Rejected_Security_Reasons
あとがき
300円のDIPパッケージのマイコンに、直接USB-Bluetoothドングルが挿せるんです。これでBluetoothを利用出来る幅が、かなり広がります。
Harmonyのベータ版の頃から移植作業を開始しましたが、エニュメレーションがどうしても通らず、Harmonyが悪いものだと判断して正式版(V1.0~)を待っていました。時間が出来たので集中して調べたら、結局使い方が悪かっただけという結果でした。(BTドングルのUSBディスクリプタがちょっと変わっているんですよ)その後は、Bluetoothクラスドライバ自体は単純・簡単、肝心なスタック本体は無改造で、さくっと動いてしまいました。あっけないという感動です。
Copyright©2015-2017 Toyohiko TOGASHI
コメントを残す