スキータイム計測機 開発日誌

とある大学生の競技スキー用タイム計測機の開発日誌です。とかいいつつ関係ないことも書きます。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

トラ技9月号のBT_IOのペアリングを自動化する

2月に自転車旅に出て以来の記事です。
旅は楽しかったです。千葉から屋久島まで走って来ました。34日間、2800km。
来年は北にも行きたいですね。


大分間が開きました、これまでもちょくちょく色々やっていたのですが、どうにも書く時間がなかったので書いてませんでした。
今回はトランジスタ技術9月号のbluetoothとマイコンをbtstackを使ってSPP通信し、androidと通信する記事についてです。
このトラ技の記事のプログラムを使えばPIC→Android、Android→PIC通信が簡単にできるようになります。非常に便利でありがたいです。
ただ、相性の問題かわかりませんが、いくつかうまくいかなかった点とその解決法、そしてBT_IOでは組み込まれていなかったペアリングの自動化について書きたいと思います。
今回使ったドングルはプラネックスのBT-MicroEDR2Xです。


・うまくいかなかった点

・btstackがどこにあるかわからない
まずbtstackのソースを探すのに手間取りました。
本来はsvnを使って取得するらしいのですが、使ったことないし使い方がよくわからなかったので、こちらからダウンロードできます。
https://github.com/egradman/btstack
ダウンロードすると色々入っていますが、必要なファイルが同名で含まれているので、必要なファイルをコピーできます。


・コンパイルできない
記憶が曖昧ですが、たしか<debug.h>が見つからない、とかそんなことを言われた気がします。
これはマイクロチップソリューションのフォルダ
C:\Microchip Solutions v2012-07-18\Microchip\Include
に含まれるdebug.hをプロジェクトフォルダのusb_host.cと同じフォルダにコピーし、
ファイル名を"debug.h"とすることで解決しました。

あとUSBスタック関係は、mplabc30のフォルダの中の
Microchip\mplabc30\v3.25\support\peripheral_24F
に全部あります。コピーしてプロジェクトフォルダに持ってきます。
これで確かコンパイルできたと思います。


・androidからサーチしても見つからない。
↑までで電源を入れるとドングル内のLEDが1秒間隔くらいでチカチカしててなんか通信はしてるのですが、
どれだけサーチしてもandroidアプリ上のリストに出ませんでした。
解決法は2種類あります。
・MCLRピンを使って途中でPICをリセットする
・プログラムの途中でソフトウェアリセットをかける
どっちにしろ、途中でPICをリセットすればペアリングがうまくいきました。不思議。
私は結局後者にしました。方法は以下のとおり。
usb_bt_driver.cの201行目から、


UART2PrintString( "Int " );
for(i = 0; i < dataCount;i++)
{
UART2PutHex(userData[i]);
}
// ここで最初のuserDataが0xFFだったらソフトウェアリセットをかけてみる
if(userData[0] == 0xFF) asm("reset");
UART2PrintString( "\r\n" );
// bt event
usb_bt_call_handler(USB_BT_EVENT_INTERRUPT_READ,userData,dataCount);


とすればOKです。


・ペアリングを自動化する
BT_IOには、雑誌にもあるようにペアリング情報の保存は行なっていません。
そのため毎回PIN入力をする必要があり、段々面倒になってきます。
以下の方法で通常のbluetooth機器のように最初に1回ペアリングを行なってしまえばあとはPIN入力の必要がなくなります。
ただ試行錯誤の結果できたことなので、必要ないこともしてるかもしれないです。

①main.cの207行目

remote_device_db_t * remote_db = (remote_device_db_t *) &remote_device_db_memory; //NULL;

とする。

②hci_cmds.cの278行目から

const hci_cmd_t hci_write_stored_link_key = {
OPCODE(OGF_CONTROLLER_BASEBAND, 0x11), "1BP"
// Num_Keys_To_Write, BD_ADDR, Link_key
};

を追加する。

③bt_spp.cの147行目あたりから

case HCI_EVENT_LINK_KEY_NOTIFICATION:
// indicate to create new link key
bt_flip_addr(event_addr, &packet[2]);
link_key =(link_key_t *)&packet[8];
hci_send_cmd(&hci_write_stored_link_key, 1, event_addr,link_key );
break;

を追加する。

④hci_cmds.hの278行目

extern const hci_cmd_t hci_write_stored_link_key;

を追加する。

この4点を追加することで2回目以降のペアリングを自動で行うことができました。
この追加ではドングルに対し生成したリンクキーを保存するようにコマンドを送っています。
スポンサーサイト

コメント

承認待ちコメント

このコメントは管理者の承認待ちです

  • 2012/11/13(火) 12:12:36 |
  • |
  • #
  • [ 編集 ]

承認待ちコメント

このコメントは管理者の承認待ちです

  • 2012/11/29(木) 15:48:06 |
  • |
  • #
  • [ 編集 ]

link_keyが未定義なのですが

小さな間違いを見つけました。
③の部分は
link_key =(link_key_t *)&packet[8];
となっていますが、link_keyが定義されていませんので
link_key_t * link_key =(link_key_t *)&packet[8];
ではないですか?

Re: link_keyが未定義なのですが

> 小さな間違いを見つけました。
> ③の部分は
> link_key =(link_key_t *)&packet[8];
> となっていますが、link_keyが定義されていませんので
> link_key_t * link_key =(link_key_t *)&packet[8];
> ではないですか?

返事が遅れました。
ご指摘ありがとうございます。
今確認してみたのですが、私が持っているソースではbt_spp.cの206行目、bt_packet_handlerの変数宣言でlink_key の宣言が行われています。
link_key_t * link_key;
自分で書き加えた痕跡がないのでもともと書いてあったのだと思うのですが、いかがでしょうか。

  • 2013/01/19(土) 22:51:45 |
  • URL |
  • 水田かなめ #1tF0Ygio
  • [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://elecski.blog106.fc2.com/tb.php/44-01c152f6
この記事にトラックバックする(FC2ブログユーザー)

まとめ【トラ技9月号のBT_IOの】

2月に自転車旅に出て以来の記事です。旅は楽しかったです。千葉から屋久島まで走って来ました。34日間、28

  • 2012/11/14(水) 08:02:54 |
  • まっとめBLOG速報

FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。