質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

1回答

1711閲覧

raspberryPiからbluetooth端末のRSSIだけを読み出す方法(python)

sandalwalk

総合スコア77

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

2クリップ

投稿2018/04/25 01:47

編集2018/04/25 04:43

RaspberryPiを使い、アドバタイズ信号を送信している特定のBluetooth端末のRSSIだけを読み出す以下のプログラムをpythonで書こうとしていますが、上手く動作しません。

*RaspberryPiから直接sudo btmonを実行した状態で、sudo hcitool lescanを実行すると、周辺のBLEの情報は見つけることができています。
*プログラム中のMACアドレスの部分には実際には目的のアドレスを記述しています

python

1import subprocess, time, os, sys 2 3MAC_ADDR = "XX:XX:XX:XX:XX:XX" 4 5thecommand = "sudo btmon" 6thecommand2 = "sudo hcitool lescan" 7last_seen = 0 8last_rssi = 0 9lastn = 0 10 11cmd = thecommand.split(" ") 12cmd2 = thecommand2.split(" ") 13 14p = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE) 15 16p2 = subprocess.Popen(cmd2,stdout=subprocess.PIPE,stderr=subprocess.PIPE) 17 18n = 0 19for line in iter(p.stdout.readline, ''): 20 n = n + 1 21 g = 0 22 23 if(MAC_ADDR in line.rstrip()): 24 last_seen = time.time() 25 lastn = n 26 if("RSSI:" in line.rstrip() and (n-lastn)<20): 27 a = line.rstrip() 28 last_rssi = int(a.split("RSSI: ")[1].split("dBm")[0]) 29 g = 1 30 31 if(g==1): 32 print last_rssi

症状
* 上記プログラムを実行すると、btmonの結果が画面に流れた状態でストップする
* プログラムを停止すると、以下のメッセージが出ます
Traceback (most recent call last):
File "testRSSI.py", line 25, in <module>
for line in iter(p.stdout.readline,''):

サブプロセスの扱い方や、出力の取扱の経験が浅いのでご教示よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

とりあえずデバッグとして、printしてみては。私ならこんな感じで入れてみます。

python

1print("hoge1") # ループの前まで行っていることの確認 2for line in iter(p.stdout.readline, ''): 3 print("hoge2") # ループの中に行っていることの確認 4 print(line) # lineの中身を確認 5 n = n + 1

この結果を見て対策を考えましょう。

投稿2018/04/25 02:45

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sandalwalk

2018/04/25 04:49

ループ前のprint(p)は<subprocess.Popen object at 0xb6a919d0>と出力されます。その次にbtmonの結果が出力され、何も起こらない状態となります。プログラムを停止されると、^CTraceback (most recent call last): File "testRSSI.py", line 21, in <module>等のメッセージが出ますが、ループ以下に書かれたprintは動作しません。このメッセージの意味が分かりませんが、ループが動作していないのかと疑っているのですが不明です。
hayataka2049

2018/04/25 07:16

その次にbtmonの結果が出力され・・・って、それどこに入れたprintから出てるかわかります? 私が書いた方法だと、for以下のlineをprintしているところから出ている以外ない訳ですが・・・
sandalwalk

2018/04/26 02:56

p=,,,, と p2=,,,の2行以下を全て無くしても、btmonからの出力結果はモニターに流れ続ける状態です。btmonからのモニターへの出力を停止させ、結果はプログラム内で利用する方法を知りたいです
hayataka2049

2018/04/26 20:56 編集

「2行以下を全て無くしても」の場合、プログラムを停止するとどうなりますか?  停止するまでもなくターミナルに返るとかならある程度は正常に動作しているのでしょうが、もし Traceback (most recent call last): File "testRSSI.py", line 25, in <module> for line in iter(p.stdout.readline,''): のままであれば変更が反映されていませんから、その線で疑う必要が出てきます(違うファイルをずっといじっていた、pycのキャッシュが残っていてそっちが読まれていた等)。 上の問題がなければ、コマンドをecho hogeとsudo echo hogeに変えてみてください。これがモニターからもれないようなら問題ありませんが・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問