2012年06月09日
pic+bluetoothでandroidにもPCにも接続できた~
先週よりちょこちょこpicを使ったbluetoothのお勉強をしていたのですが、
以前より課題だった、androidとPCと両方に接続できるようにすることに、
なんとか成功しました~(^^)/
オレが知っている範囲では、picで扱えるbluetoothのスタックは
いしかわきょーすけさん+辻見先生のスタック
http://phys.sci.hokudai.ac.jp/LABS/yts/pic/GB002/GB002.html
lwbt+hrdakinoriさんのスタック
https://github.com/hrdakinori/BT_DROID
の2つあるわけです。どちらも日本語です。すばらしい。
しかし、辻見先生のほうはPCには繋がるけどandroid端末には繋がらない。
hrdakinoriさんのスタックはその逆で、android端末には繋がるけど
PCには繋がらないわけです。
辻見先生のスタックは、いしかわきょーすけさんが、はるか昔に開発された
スタックをpicに移植しているんだけど、応答きめうちになっているので
改造しにくい。
hrdakinoriさんの方は、lwbtが元になっているので、改造しやすそうだけど
コードが大きいので、全体像がいまだにわからない。
lwbtのほうは、なんとなくsdpあたりの応答をいじってやると、うまくいきそうなんだけど
そもそも、sdpがよくわからない。辻見先生が懇切丁寧に解説してくださっているんだけど、
それでもよくわからない。
で、bluetoothのプロトコルの英文をひたすら読んだり、lwbtのコードを眺めたり、
picとandroidやPCとのやり取りを見て、辻見先生のページと見比べてとかやっているうち、
ようやくなんとなくわかってきたかも。
まず、lwbtでは、service_search_attrib_reqへのレスポンスで、DIDへの応答が変だったので
sdp.cの sdp_pattern_searchの最後の戻り値を1から0に戻しました。
return 0; //TODO change back to 0 って0に戻すことって書いてあるじゃないか~~~
これで、DIDへの返事が 00 00 00 となって、こんなんでいいのか!状態ですが、
とりあえずPCとのsdpも無事こなせたばかりでなく、androidへの接続が格段に早くなりました。
androidとの接続のときも、このDIDでなんどもリトライしてたのが無くなったようです。
次に引っかかったのは、l2capにはパケットがきているのにrfcommへパケットが送られない。
どうやら、パケット分割で送られてきていて、それを組み立てられないみたい。
パケットを連結するとき、前のパケットがなくなっているようです。
で、これを突き止めるのに結局、rfcomm→l2cap→pbufと一通り読んでいく羽目に。。。さらに、デバッグしようにも、単純にLWIP_DEBUGFをオンにするとメモリオーバーになってしまうので、別途デバッグ用出力をこさえたりとか。。。
オレは動いているし、辻見先生の解説もある状況でこれなのに、いしかわきょーすけさんの時代は、そもそもただプロトコルの資料のみだったはずで、それでスタック組んだってホントすげーと思う。
で、結局あーでもない、こーでもない下挙句
usbif.cの
err_t phybusif_input_aclの中の
// pbuf_free(cb->p);
オイ、たった一行コメントアウトするだけかよっ。というか、本家のlwbtでもこの行はあったのですが、処理先でpbuf_freeするので、不要なようです。というか、これで連結前のパケットがなくなっていたわけですね。
で、最後にRPN_CMDがきたときだんまりが続くわけで、
rfcomm.h の
void rfcomm_process_msg の中の
case RFCOMM_RPN_CMD:
if(cmdhdr->len == 17) { //8では無く17と思われ
cmdhdr->type = RFCOMM_RPN_RSP; //ここもマスクが変だったので定数で
とすることで、やった~。PCと繋がった~。
ちょっとすごいかも。
結局最終的なコーディングはたったの4行(笑)。しかし、かけた時間は計り知れず。動いたという達成感はプライスレス。
lwbtを作ってこられた方々、いしかわきょーすけさん、辻見先生、そしてhrdakinoriさん、感謝です。
追記:pic側のbluetoothドングルは、いまだ中華はもとより、メルコのやつも駄目で
プラネックスでしか繋がりません。HCIレベルでは通信できているような感じなんですが、なぜか繋がりません。PC側は中華でもおっけでした。
picプラネックス-中華ドングルPC なら繋がるけど
pic中華ドングル-プラネックスPC なら繋がらないわけです。
bluetooth奥が深いです。
追記 その2
忘れていました。 sdpの返事は、辻見先生のbluemeバージョンに変更してました。
こっちでやると、windows側のbluetoothのプロパティで、サービス名が出てくるのです。というわけで、lwbtで繋がっても、サービス名ではbluemeとなるのです。う~ん、巡り会わせというか、つながりというかを感じますね~。
static const u8_t spp_service_record[] =
{
SDP_DES_SIZE16, 0x0, 0x32,
SDP_DES_SIZE8, 0x30,
SDP_UINT16, 0x0, 0x0, /* Service record handle attribute */
SDP_UINT32, 0x00, 0x00, 0x00, 0x00, /*dummy vals, filled in on xmit*/
SDP_UINT16, 0x0, 0x1,
SDP_DES_SIZE8, 0x3,
SDP_UUID16, 0x11, 0x01,
SDP_UINT16, 0x0, 0x4, /* Protocol descriptor list attribute */
SDP_DES_SIZE8, 0xc,
SDP_DES_SIZE8, 0x3,
SDP_UUID16, 0x1, 0x0, /*L2CAP*/
SDP_DES_SIZE8, 0x5,
SDP_UUID16, 0x0, 0x3, /*RFCOMM*/
SDP_UINT8, 0x1, /*RFCOMM channel*/
SDP_UINT16, 0x1, 0x0,
0x25, 0x0a, 0x42, 0x4C, 0x55, 0x45, 0x4D, 0x45, 0x5F, 0x43, 0x4F, 0x4D,
}
ブログ一覧 |
電子工作 | 日記
Posted at
2012/06/09 12:26:53
今、あなたにおすすめ