Bluetoothスタック/ペリフェラル向け/PIC32版

 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


投稿日

カテゴリー:

投稿者:

タグ:

コメント

“Bluetoothスタック/ペリフェラル向け/PIC32版” への2件のフィードバック

  1. 酒井和明のアバター
    酒井和明

    ヘッダファイルがみつかりません。
    Bluetooth4P_PIC32MX_Sample0.3j.zipをダウンロードして、解凍したあと
    MPLABでコンパイルをしようとしたところ、ヘッダファイルが見つからず
    エラーになります。ヘッダファイルの提供はないのでしょうか?
    以下は、エラーの一部です。
    In file included from ../src/system_config/default/system_init.c:51:
    ../src/system_config/default/system_definitions.h:53:10: fatal error: system/common/sys_common.h: No such file or directory
    #include “system/common/sys_common.h”
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

    1. 富樫 豊彦のアバター

      このファイル”system/common/sys_common.h”は、Harmonyで提供されるものです。
      結局のところ、そのままビルドするには “Harmony V1.6.2” が必要でした。
      バージョンの説明をしていなかった事は申し訳ありません。
      お使いのHarmonyのバージョンでビルドするには、configurations.xml と project.xmlを修正する必要があります。
      詳しくは、本記事内の「MPLAB Xでビルド」の後半をご覧ください。
      バージョン要件については、追記させていただきます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です