質問編集履歴

3

質問を簡潔にしました

2021/05/07 00:04

投稿

raspypy
raspypy

スコア247

test CHANGED
@@ -1 +1 @@
1
- Python Bluetooth アドバタイジングデータ受信
1
+ Python データ受信
test CHANGED
@@ -55,199 +55,3 @@
55
55
  例) 0x0994 (2452)DEC = 24.52C
56
56
 
57
57
  というように,正しいデータが送信されていることを確認しています.
58
-
59
-
60
-
61
-
62
-
63
- ##Pythonプログラム(データ受信)
64
-
65
- ```python
66
-
67
- from bluepy.btle import DefaultDelegate, Scanner, BTLEException
68
-
69
- import sys
70
-
71
- import struct
72
-
73
- from datetime import datetime
74
-
75
-
76
-
77
- class ScanDelegate(DefaultDelegate):
78
-
79
- def __init__(self): # コンストラクタ
80
-
81
- DefaultDelegate.__init__(self)
82
-
83
- self.lastseq = None
84
-
85
- self.lasttime = datetime.fromtimestamp(0)
86
-
87
-
88
-
89
- def handleDiscovery(self, dev, isNewDev, isNewData):
90
-
91
- if isNewDev or isNewData: # 新しいデバイスまたは新しいデータ
92
-
93
- for (adtype, desc, value) in dev.getScanData(): # データの数だけ繰り返す
94
-
95
- if desc == 'Manufacturer' and value[0:4] == 'ffff': # テスト用companyID
96
-
97
- __delta = datetime.now() - self.lasttime
98
-
99
- # アドバタイズする10秒の間に複数回測定されseqが加算されたものは捨てる(最初に取得された1個のみを使用する)
100
-
101
- if value[4:6] != self.lastseq and __delta.total_seconds() > 11:
102
-
103
- self.lastseq = value[4:6] # Seqと時刻を保存
104
-
105
- self.lasttime = datetime.now()
106
-
107
- (temp, humid, press) = struct.unpack('<hhh', bytes.fromhex(value[6:])) # hは2Byte整数(3つ取り出す)
108
-
109
- print('温度= {0} 度、 湿度= {1} %、 気圧 = {2} hPa'.format( temp / 100, humid / 100, press))
110
-
111
-
112
-
113
- if __name__ == "__main__":
114
-
115
- scanner = Scanner().withDelegate(ScanDelegate())
116
-
117
- while True:
118
-
119
- scanner.scan(5.0) # スキャンする。デバイスを見つけた後の処理はScanDelegateに任せる
120
-
121
- ```
122
-
123
-
124
-
125
- ##Arduino プログラム(データ送信)
126
-
127
- ```c++
128
-
129
- BME280 bme280(BME280_I2C_ADDR_PRIM);
130
-
131
- struct bme280_data data;
132
-
133
-
134
-
135
- void setAdvData(BLEAdvertising *pAdvertising) {
136
-
137
- bme280.get_sensor_data(&data);
138
-
139
- Serial.printf("temp: %.1f, humid: %.1f, press: %.1f\r\n", data.temperature, data.humidity, data.pressure / 100);
140
-
141
- uint16_t temp = (uint16_t)(data.temperature * 100);
142
-
143
- uint16_t humid = (uint16_t)(data.humidity * 100);
144
-
145
- uint16_t press = (uint16_t)(data.pressure / 10);
146
-
147
-
148
-
149
- BLEAdvertisementData oAdvertisementData = BLEAdvertisementData();
150
-
151
-
152
-
153
- oAdvertisementData.setFlags(0x06); // BR_EDR_NOT_SUPPORTED | LE General Discoverable Mode
154
-
155
-
156
-
157
- std::string strServiceData = "";
158
-
159
- strServiceData += (char)0x0a; // 長さ
160
-
161
- strServiceData += (char)0xff; // AD Type 0xFF: Manufacturer specific data
162
-
163
- strServiceData += (char)0xff; // Test manufacture ID low byte
164
-
165
- strServiceData += (char)0xff; // Test manufacture ID high byte
166
-
167
- strServiceData += (char)seq; // シーケンス番号
168
-
169
- strServiceData += (char)(temp & 0xff); // 温度の下位バイト
170
-
171
- strServiceData += (char)((temp >> 8) & 0xff); // 温度の上位バイト
172
-
173
- strServiceData += (char)(humid & 0xff); // 湿度の下位バイト
174
-
175
- strServiceData += (char)((humid >> 8) & 0xff); // 湿度の上位バイト
176
-
177
- strServiceData += (char)(press & 0xff); // 気圧の下位バイト
178
-
179
- strServiceData += (char)((press >> 8) & 0xff); // 気圧の上位バイト
180
-
181
-
182
-
183
- oAdvertisementData.addData(strServiceData);
184
-
185
- pAdvertising->setAdvertisementData(oAdvertisementData);
186
-
187
- }
188
-
189
-
190
-
191
- void setup() {
192
-
193
- pinMode(SDA, INPUT_PULLUP); // SDAピンのプルアップの指定
194
-
195
- pinMode(SCL, INPUT_PULLUP); // SCLピンのプルアップの指定
196
-
197
- Wire.begin(SDA, SCL);
198
-
199
-
200
-
201
- Serial.begin(115200);
202
-
203
- Serial.printf("start ESP32 %d\n",seq);
204
-
205
-
206
-
207
- bme280.begin(); // BME280の初期化
208
-
209
-
210
-
211
- BLEDevice::init("ESP32 Transmitter"); // デバイスを初期化
212
-
213
- BLEServer *pServer = BLEDevice::createServer(); // サーバーを生成
214
-
215
-
216
-
217
- BLEAdvertising *pAdvertising = pServer->getAdvertising(); // アドバタイズオブジェクトを取得
218
-
219
- setAdvData(pAdvertising); // アドバタイジングデーターをセット
220
-
221
-
222
-
223
- pAdvertising->start(); // アドバタイズ起動
224
-
225
- Serial.println("Advertizing started...");
226
-
227
- delay(T_PERIOD * 1000); // T_PERIOD秒アドバタイズする
228
-
229
- pAdvertising->stop(); // アドバタイズ停止
230
-
231
-
232
-
233
- seq++; // シーケンス番号を更新
234
-
235
-
236
-
237
- Serial.printf("enter deep sleep\n");
238
-
239
- delay(10);
240
-
241
- esp_deep_sleep(1000000LL * S_PERIOD); // S_PERIOD秒Deep Sleepする
242
-
243
- Serial.printf("in deep sleep\n");
244
-
245
- }
246
-
247
-
248
-
249
- void loop() {
250
-
251
- }
252
-
253
- ```

2

スマホアプリのデータを添付

2021/05/07 00:04

投稿

raspypy
raspypy

スコア247

test CHANGED
File without changes
test CHANGED
@@ -48,6 +48,16 @@
48
48
 
49
49
 
50
50
 
51
+ ##スマホアプリで受信したデータ
52
+
53
+ **ffff3f94 09e30964 26**
54
+
55
+ 例) 0x0994 (2452)DEC = 24.52C
56
+
57
+ というように,正しいデータが送信されていることを確認しています.
58
+
59
+
60
+
51
61
 
52
62
 
53
63
  ##Pythonプログラム(データ受信)
@@ -94,9 +104,9 @@
94
104
 
95
105
  self.lasttime = datetime.now()
96
106
 
97
- (temp, humid, press, volt) = struct.unpack('<hhhh', bytes.fromhex(value[6:])) # hは2Byte整数(つ取り出す)
107
+ (temp, humid, press) = struct.unpack('<hhh', bytes.fromhex(value[6:])) # hは2Byte整数(3つ取り出す)
98
-
108
+
99
- print('温度= {0} 度、 湿度= {1} %、 気圧 = {2} hPa、 電圧 = {3} V'.format( temp / 100, humid / 100, press, volt/100))
109
+ print('温度= {0} 度、 湿度= {1} %、 気圧 = {2} hPa'.format( temp / 100, humid / 100, press))
100
110
 
101
111
 
102
112
 

1

try~exceptは使用せずにプログラムを実行したときのエラーを記載しました.

2021/04/07 00:43

投稿

raspypy
raspypy

スコア247

test CHANGED
File without changes
test CHANGED
@@ -24,7 +24,25 @@
24
24
 
25
25
  ```text
26
26
 
27
+ Traceback (most recent call last):
28
+
27
- BLE exception <class 'bluepy.btle.BTLEManagementError'> at <module>
29
+ File "./43_BLE.py", line 30, in <module>
30
+
31
+ scanner.scan(5.0) # スキャンする。デバイスを見つけた後の処理はScanDelegateに任せる
32
+
33
+ File "/home/pi/.local/lib/python3.7/site-packages/bluepy/btle.py", line 852, in scan
34
+
35
+ self.start(passive=passive)
36
+
37
+ File "/home/pi/.local/lib/python3.7/site-packages/bluepy/btle.py", line 790, in start
38
+
39
+ self._mgmtCmd("le on")
40
+
41
+ File "/home/pi/.local/lib/python3.7/site-packages/bluepy/btle.py", line 312, in _mgmtCmd
42
+
43
+ raise BTLEManagementError("Failed to execute management command '%s'" % (cmd), rsp)
44
+
45
+ bluepy.btle.BTLEManagementError: Failed to execute management command 'le on' (code: 20, error: Permission Denied)
28
46
 
29
47
  ```
30
48
 
@@ -88,16 +106,8 @@
88
106
 
89
107
  while True:
90
108
 
91
- try:
92
-
93
109
  scanner.scan(5.0) # スキャンする。デバイスを見つけた後の処理はScanDelegateに任せる
94
110
 
95
- except BTLEException:
96
-
97
- ex, ms, tb = sys.exc_info()
98
-
99
- print('BLE exception '+str(type(ms)) + ' at ' + sys._getframe().f_code.co_name)
100
-
101
111
  ```
102
112
 
103
113