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

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

ただいまの
回答率

90.52%

  • Python 2.7

    1259questions

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

  • Raspberry Pi

    797questions

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

  • Bluetooth

    233questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 426

sandalwalk

score 36

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

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

import subprocess, time, os, sys

MAC_ADDR = "XX:XX:XX:XX:XX:XX"

thecommand = "sudo btmon"
thecommand2 = "sudo hcitool lescan"
last_seen = 0
last_rssi = 0
lastn = 0

cmd = thecommand.split(" ")
cmd2 = thecommand2.split(" ")

p = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

p2 = subprocess.Popen(cmd2,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

n = 0
for line in iter(p.stdout.readline, ''):
    n = n + 1
    g = 0

    if(MAC_ADDR in line.rstrip()):
        last_seen = time.time()
        lastn = n
    if("RSSI:" in line.rstrip() and (n-lastn)<20):
        a =  line.rstrip()
        last_rssi = int(a.split("RSSI: ")[1].split("dBm")[0])
        g = 1

    if(g==1):
        print last_rssi


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/25 13:49

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

    キャンセル

  • 2018/04/25 16:16

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

    キャンセル

  • 2018/04/26 11:56

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

    キャンセル

  • 2018/04/27 05:52 編集

    「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に変えてみてください。これがモニターからもれないようなら問題ありませんが・・・

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 2.7

    1259questions

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

  • Raspberry Pi

    797questions

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

  • Bluetooth

    233questions

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