• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+
イイね!
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

イイね!0件



今、あなたにおすすめ

ブログ人気記事

令和7年8月の関西舞子 ・・・ プ ...
P.N.「32乗り」さん

空調服マキタファンジャケットの修理
TWIZYコムス にゃんこRさん

ピカピカランド綱島にたくさんイイね ...
morrisgreen55さん

塩元帥 カップ麺
RS_梅千代さん

佐渡ヶ島に向かいます♪
紅の狐さん

本日のプチキリ番&ミラー番♬
ブクチャンさん

この記事へのコメント

2012年9月5日 19:43
細々と解析されていてすごいですね!

で、底を見込んで教えてください頂けませんか

プログラム上で、エコーバック処理に対しメッセージを付け加えたいのですが
どの流れ(関数)で行っているか追い切れません

アンドロイド来たコマンドに、PICからアンドロイドへメッセージを返したいのですが
どうしたらいいのか教えて頂けませんか?
コメントへの返答
2012年9月10日 21:53
こんばんは、

まさか、みんカラでpic関連のコメントもらうとは、思ってもいませんでした(^^;;;

ところで、お尋ねの件、
bt_spp.cのspp_recv内で処理すると良いのでは、と思います。
2012年9月11日 11:09
私も車が好きでみんカラをよく見ています。
みんカラに登録されている方で、PICでこのようなことをされている人がいることに、私も驚いています。

で、アドバイスありがとうございます。
>bt_spp.cのspp_recv内で処理すると~
ここまでは、解っています。

ここから、どうやって送信(クレジット?、イベント?を作って)を行うのか、電文をどう作るのかがわからないのです
おそらく rfcomm_uih_credits()でエコーバック(レスポンス応答)しているのですが
その後に、メッセージなりデータなりを送る際にどの関数を使うのかなどが
具体的なところで解りかねています。
fcomm_~~()関数をコールするのか、それだけで送信が行われるのか理解できていません。

すみませんが、その辺をご教示頂きたくお願いします
コメントへの返答
2012年9月15日 18:46
こんにちは、お返事遅くなりました。

どっちの関数使っているのかわからないので、次のようにしてます。
これをタイマで回して毎秒寝てますって(^^;picから送信してるのですが、実際動いてます。
参考にしてください。


struct pbuf *q = NULL;
char sendbuf[12];

sendbuf[0] = 'Z';
sendbuf[1] = 'Z';
sendbuf[2] = 'Z';
sendbuf[3] = '\n';

q = pbuf_alloc(PBUF_RAW, 4, PBUF_RAM);

memcpy(q->payload, sendbuf, 4);

if (rfcomm_cl(mainpcb)) {
rfcomm_uih_credits(mainpcb, PBUF_POOL_SIZE - rfcomm_remote_credits(mainpcb), q);
} else {
rfcomm_uih(mainpcb, rfcomm_cn(mainpcb), q);
}
pbuf_free(q);
2012年9月23日 1:57
こんばんわ。かなり解析されていて感動します。
私もBluetoothとPCの接続に調整しています!

参考にさせていただいていて、4行の修正を行ったのですがPCとの接続がうまくいきません^^;
使用しているBluetoothは、プラネックスの『BT-MicroEDR1X』なのですが、何か考えられることはあるでしょうか?

ご教授いただければ、幸いです。
コメントへの返答
2012年9月23日 6:38
思いつく原因はいろいろありすぎます(^^;

見つけ出すには、やはりドングルとpicの間のやり取りを丹念に見ていくのが、一番早いと思います。

ペアリング時のsdpのやり取りが、オレの場合は一番のネックでした。

プログラムを公開できればいいのですが、元になっているlwbtの原田さんのいじった部分の著作権がちょっとあいまいなので、その辺をクリアにすべく自分でlwbtの改造に挑戦中なのですが、まだもう少しかかりそうです。

その原田さんは、btstackに移行されてるんですが、そちらは試されましたか?そちらもpic24fで原田さんが動かしているので、もしかしたらそっちのほうではpcに繋がるかもしれません。
2012年9月23日 12:47
早速のコメント、ありがとうございます。

>ペアリング時のsdpのやり取りが、オレの場合は一番のネックでした。
私もここでハマっています^^;

PICを少しづつデバッグ(ステップ実行)していきます~!
コメントへの返答
2012年9月25日 17:20
ええと、なかなかブログを更新できていないのですが、もう少ししたら、またbluetoothネタ増やせるかと思います。時間があったらまた覗いてみてください。
2012年9月25日 8:55
marumonさま
問い合わせコメントへの返答(2012/09/15 18:46:20)
への返答ありがとうございます。

私も、その後細々と、関係web読みあさり、何とか動くところまで出来ました。
アンドロイドからコマンドを発行し、コマンドに対して個別にレスポンスを返す処理です。
単純に、メモリ確保が、下記で済むとは思わなかったので
>q = pbuf_alloc(PBUF_RAW, 4, PBUF_RAM)

何とか現状を崩さないようにして、対応しました。
同じように、別メモリをアロケートし同じ内容をメモリへコピー
その際返信バッファが伸びた時はその分バッファ長を足し込んだりと
ちょっと、こそくな方法ですがそれで対応しました。
そして
結果的には、
if (rfcomm_cl(mainpcb)) {
  ~
  ~
  ~
}
処理で、クレジットが立っていたら送信で対応可能でした。

助言他ありがとうございました。
なかなか深いです。
また宜しくお願いします。
コメントへの返答
2012年9月25日 17:24
なんかお役に立つまでも無く、解決されているようで何よりです。

pbuf_allocですが、最終的にmallocを使っていて、そのmallocがとんでもなく低機能というのが判明したので、オレは固定バッファに変更しようとしています。まあ、完成がいつになるかは、、、ですが(^^;


プロフィール

「[車中泊6泊目]今日は寒かったー http://cvw.jp/b/1110950/39009397/
何シテル?   12/15 18:05
marumonです。よろしくお願いします。
みんカラ新規会員登録

ユーザー内検索

<< 2025/8 >>

     12
3456789
10111213141516
17181920212223
24252627282930
31      

リンク・クリップ

友情パワーよ、ありがとう(^^) 
カテゴリ:その他(カテゴリ未設定)
2012/11/08 22:46:45
自作ハザードイルミ点滅 
カテゴリ:その他(カテゴリ未設定)
2012/04/17 19:25:27

愛車一覧

ホンダ フリードスパイク ホンダ フリードスパイク
主にスキー用。たまに、自転車運びます。

過去のブログ

2025年
01月02月03月04月05月06月
07月08月09月10月11月12月
2024年
01月02月03月04月05月06月
07月08月09月10月11月12月
2023年
01月02月03月04月05月06月
07月08月09月10月11月12月
2022年
01月02月03月04月05月06月
07月08月09月10月11月12月
2021年
01月02月03月04月05月06月
07月08月09月10月11月12月
2020年
01月02月03月04月05月06月
07月08月09月10月11月12月
2019年
01月02月03月04月05月06月
07月08月09月10月11月12月
2018年
01月02月03月04月05月06月
07月08月09月10月11月12月
2017年
01月02月03月04月05月06月
07月08月09月10月11月12月
2016年
01月02月03月04月05月06月
07月08月09月10月11月12月
2015年
01月02月03月04月05月06月
07月08月09月10月11月12月
2014年
01月02月03月04月05月06月
07月08月09月10月11月12月
2013年
01月02月03月04月05月06月
07月08月09月10月11月12月
2012年
01月02月03月04月05月06月
07月08月09月10月11月12月
2011年
01月02月03月04月05月06月
07月08月09月10月11月12月
ヘルプ利用規約サイトマップ

あなたの愛車、今いくら?

複数社の査定額を比較して愛車の最高額を調べよう!

あなたの愛車、今いくら?
メーカー
モデル
年式
走行距離(km)
© LY Corporation