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

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

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

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

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

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

受付中

M5stickC→Pi3のBLEにおいて,Failed to execute management command 'pasvend'と出て終了してしまう

soohoo
soohoo

総合スコア20

Bluetooth

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

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

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

1回答

0リアクション

0クリップ

200閲覧

投稿2022/07/31 14:27

編集2022/07/31 14:34

前提

M5stickCに心拍センサを接続し,心拍数とM5の電源電圧をBLEでRaspberry Pi3に送信しています。

下記のソースコードで順調に動いているのですが,ラズパイのUSBポートに有線LANのUSB変換アダプタを接続してから以下のエラーが出て,プログラムが終了するようになりました。

bluepy.btle.BTLEManagementError: Failed to execute management command 'pasvend'

エラーが10分ほど動かすと出てしまい,一度出ると再起動しないと治らない場合もあります。

実現したいこと

bluepy.btle.BTLEManagementErrorの回避
今回のシステムはデモとして動けばいいので,数分ほど安定した動作ができれば目的を達成できます。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "/home/pi/Emulator/ble_test.py", line 50, in <module> scanner.scan(3.0, passive=True) # 3秒間スキャンする(この間他の処理は止まる) File "/usr/local/lib/python3.9/dist-packages/bluepy/btle.py", line 854, in scan self.stop() File "/usr/local/lib/python3.9/dist-packages/bluepy/btle.py", line 803, in stop self._mgmtCmd(self._cmd()+"end") File "/usr/local/lib/python3.9/dist-packages/bluepy/btle.py", line 312, in _mgmtCmd raise BTLEManagementError("Failed to execute management command '%s'" % (cmd), rsp) bluepy.btle.BTLEManagementError: Failed to execute management command 'pasvend'

該当のソースコード

python

# -*- coding: utf-8 -*- # 心拍数、電圧を取得してBLEでアドバタイズ(ブロードキャスト) # M5StickCは4秒:アドバタイズ、1秒:Deep Sleep # ラズパイ側は常時スキャンし、データーを取得したらprintする from bluepy.btle import DefaultDelegate, Scanner, BTLEException import sys import struct from datetime import datetime import subprocess class ScanDelegate(DefaultDelegate): def __init__(self): # コンストラクタ DefaultDelegate.__init__(self) self.lastseq = None self.lasttime = datetime.fromtimestamp(0) print("init") def handleDiscovery(self, dev, isNewDev, isNewData): if isNewDev or isNewData: # 新しいデバイスまたは新しいデータ for (adtype, desc, value) in dev.getScanData(): # データの数だけデータスキャンを繰り返す # 'ffff' = テスト用companyID # M5stickCからのデータを見つけたら if desc == 'Manufacturer' and value[0:4] == 'ffff': __delta = datetime.now() - self.lasttime # 前回取得時刻からの差分をとる # アドバタイズする間に複数回測定されseqが加算されたものは捨てる(最初に取得された1個のみを使用する) if value[4:6] != self.lastseq and __delta.total_seconds() > 5: self.lastseq = value[4:6] # Seqと時刻を保存 時刻はどこにあるんだ self.lasttime = datetime.now() (bpm, volt) = struct.unpack_from('<hh', bytes.fromhex(value[6:])) print('心拍数 = {0} bpm, 電圧 = {1} V' .format(bpm, volt/100)) if bpm > 80: loss_netem = (bpm - 80) * 2 if loss_netem > 70: loss_netem = 70 cmd_netem = "sudo tc qdisc change dev eth0 root netem loss " + str(loss_netem) + "%" subprocess.run( cmd_netem, shell=True) print("loss: " + str(loss_netem) + "%") else: subprocess.run(['sudo tc qdisc change dev eth0 root netem loss 0%'], shell=True) # 有線'eth0'から出ていくパケットにネットワークエミュレーションを追加 subprocess.run(["sudo tc qdisc add dev eth0 root netem"], shell=True) scanner = Scanner().withDelegate(ScanDelegate()) try: while True: # try: # スキャンする。デバイスを見つけた後の処理はScanDelegateに任せる print("scan") scanner.scan(5.0) # 5秒間スキャンする(この間他の処理は止まる) except KeyboardInterrupt as e: print("Aborted!") finally: # ネットワークエミュレータの削除 # ここで遅延を元に戻してから終了する subprocess.run(["sudo tc qdisc del dev eth0 root"], shell=True)

試したこと

python

scanner.scan(5.0, passive = True)

パッシブスキャンをTrueにしたのですが,却ってエラーの頻度が増えました。。

また,エラーで強制終了したタイミングでbluetoothctlを開いて確認したところ,

[bluetooth]# scan on Failed to start discovery: org.bluez.Error.InProgress

と出ています。参考にしたページのコードよりもアドバタイズやスキャンの秒数を短くしているので、個人的にはスキャン中に追いスキャンしてしまってる(?)のかなと思ってます。。

補足情報(FW/ツールのバージョンなど)

M5stickCのソースコード(送信部分のみ抜粋)
心拍数を扱うにあたって、連続的に値を測定・送信したいと考え,deep sleepはさせずにloop()内でアドバタイズさせています。

C++

#define T_PERIOD 4 // アドバタイジングパケットを送る秒数 #define S_PERIOD 1 // Sleepする秒数 T+S秒ごとに送ることになる void setAdvData(BLEAdvertising *pAdvertising) { // アドバタイジングパケットを整形する BLEAdvertisementData oAdvertisementData = BLEAdvertisementData(); oAdvertisementData.setFlags(0x06); // BR_EDR_NOT_SUPPORTED | General Discoverable Mode // oAdvertisementData.setFlags(0x05); // BR_EDR_NOT_SUPPORTED | Limited Discoverable Mode std::string strServiceData = ""; strServiceData += (char)0x08; // 長さ(12Byte → 7Byte 0x07の方がいいかも): 0 strServiceData += (char)0xff; // AD Type 0xFF: Manufacturer specific data : 1 strServiceData += (char)0xff; // Test manufacture ID low byte : 2 strServiceData += (char)0xff; // Test manufacture ID high byte : 3 strServiceData += (char)seq; // シーケンス番号 : 4 strServiceData += (char)(myBPM & 0xff); // 心拍数の下位バイト(下位を前にして保存するリトルエンディアン形式) : 5 strServiceData += (char)((myBPM >> 8) & 0xff); // 心拍数の上位バイト : 6 strServiceData += (char)(vbat & 0xff); // 電池電圧の下位バイト strServiceData += (char)((vbat >> 8) & 0xff); // 電池電圧の上位バイト oAdvertisementData.addData(strServiceData); pAdvertising->setAdvertisementData(oAdvertisementData); } void setup(){ // M5と心拍センサの初期化等 // ここからBLE通信 BLEDevice::init("blepub-01"); // デバイスを初期化 BLEServer *pServer = BLEDevice::createServer(); // サーバーを生成 BLEAdvertising *pAdvertising = pServer->getAdvertising(); // アドバタイズオブジェクトを取得 } void loop(){ // センサ値測定後 BLEServer *pServer = BLEDevice::createServer(); // サーバーを生成 BLEAdvertising *pAdvertising = pServer->getAdvertising(); // アドバタイズオブジェクトを取得 setAdvData(pAdvertising); // アドバタイジングデーターをセット pAdvertising->start(); // アドバタイズ起動 delay(T_PERIOD * 1000); // T_PERIOD秒アドバタイズする // delay(20); // considered best practice in a simple sketch. pAdvertising->stop(); // アドバタイズ停止 seq++; // シーケンス番号を更新 // delay(10); delay(S_PERIOD * 1000); // considered best practice in a simple sketch. }

参考文献

M5StickCとラズパイ4とのBLE(Bluetooth Low Energy)通信を試してみた。 | そう備忘録

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Bluetooth

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

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

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