前提・実現したいこと
Raspberry Pi 3のオンボードBluetoothを使用して、ペアリング⇒シリアル通信を行う手順を知りたいです。
以下のようなことを行いたいです。
・C言語を使用
・SPPプロファイル(シリアル通信)
・Raspberry Piはマスタ側で、ターゲットデバイスを見つけてパスキー認証する。
・2度目以降は自動でペアリング
発生している問題・エラーメッセージ
情報が少なく、どのように実装すべきか不明です。
C言語で実装するためのサンプルコードや、APIリファレンスなどを入手したいです。
試したこと
C言語を使用したアプリケーションとして作成したいと思い、情報を探しましたが、
見当たりませんでした。
仕方ないので、とりあえず、コマンドラインで疎通を試みることにしました。
・必要なソフトをインストール
sudo apt-get install bluetooth bluez-utils blueman
・ターゲットを検索可能にし、接続対象を検索
hcitool scan
・bluez-simple-agentのパスキー認証操作を有効化するため、/usr/bin/bluez-simple-agentを編集
~~
capability = "DisplayYesNo"
~~
・検出されたターゲットとペアリングする。パスキーが表示されたら「yes」を入力し、ペアリング完了
sudo bluez-simple-agent hci0 YY:YY:YY:YY:YY:YY
・次回からターゲットと自動ペアリングするように設定
sudo bluez-test-device trusted YY:YY:YY:YY:YY:YY yes
・ペアリング済のターゲットに接続
sudo bluez-test-input connect YY:YY:YY:YY:YY:YY
↑この手順でエラーとなり、接続が確認できませんでした。
エラー内容は以下の通りです。
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.UnknownMethod: Method “Connect” with signature “” on interface “org.bluez.Input” doesn’t exist
これに関しては、/etc/bluetooth/main.confの設定を変えることで解決すると記載がありました。
しかし、この設定を書き換えても変化はありませんでした。
https://dustplanet.de/howto-connect-your-bluetooth-keyboard-to-raspbmc-logitech-ultrathin-keyboard/
It should not be listed under “DisabledPlugins” (either DisabledPlugins starts with a # or it’s not listed there)
補足情報(言語/FW/ツール等のバージョンなど)
Raspbian Wheezyを使用しました。
※Jessieではbluez-utilsが存在せず、bluez-simple-agentを使用できないため
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
では1つ目のソースです。こちらは動作しません。
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t cpid;
char buf[255];
int number;
FILE *outputfile;
cpid = fork();
if(cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if(cpid == 0) { // 子プロセス
sleep(1);
system("echo -e connect 00:19:5D:25:05:E5");
system("echo -e quit");
//_exit(EXIT_SUCCESS);
} else { // 親プロセス
system("bluetoothctl");
wait(NULL);
//exit(EXIT_SUCCESS);
}
errno = 0;
outputfile = fopen("text.txt", "a");
number = errno;
if(outputfile == NULL) {
printf("file open error\n");
printf("pirnt error string by strerror: %s\n",strerror(errno));
return 1;
} else {
fprintf(outputfile, "%s\n", buf);
fclose(outputfile);
}
return 0;
}
gcc でコンパイルし、実行しても、
❯ ./a.out
Agent registered
[bluetooth]# connect 00:19:5D:25:05:E5
quit
と表示されますが、connect MACアドレスの部分が認識されず、接続できません。
では、2つ目のソースです。これは動作します。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *fp, *outputfile;
char ret[40];
fp = popen("echo -e connect 00:19:5D:25:05:E5 | bluetoothctl", "r");
while(fgets(ret, sizeof ret, fp) != NULL) {
printf("%s", ret);
}
pclose(fp);
outputfile = fopen("text.txt", "a");
fprintf(outputfile, "%s\n", ret);
fclose(outputfile);
return 0;
}
以上です。よろしくお願い致します。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
PidoraでCLIからBluetooth SPP接続しようとしたらbluez-simple-agentがない件
ソースコードからビルドすればいけるのではないでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる