teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

HTPのUUIDを変更 進展の表記

2021/12/01 00:20

投稿

dras
dras

スコア2

title CHANGED
@@ -1,1 +1,1 @@
1
- pythonでesp32をBLE通信 nRFToolBoxで表示されません
1
+ pythonでesp32をBLE通信 nRFToolBoxで体温計が表示されません
body CHANGED
@@ -1,14 +1,12 @@
1
1
  ###やりたいこと
2
2
  pythonでesp32を操作し、BLE通信を行いたいです。
3
+ nRFToolBoxでHealth Thermometer Moniterで体温を見れるようにしたいです。
3
4
 
4
5
  ###分からないところ
6
+ Temperature measurementでの温度の表し方。
5
- nRFToolBoxというアプリを用いてHealth Thermometerで温度を見れるようにしたいのですが、The device does not have required servicesと表示されます
7
+ Client Characteristic Configurationの使い方
6
- コードエラーは出いません。
8
+ それをどうやっgatts_writeに書き込むか
7
- アドバイスをお願いします。
8
9
 
9
- nRFConnectでは温度とデバイス情報を得ることができました。
10
- nRFToolBoxではデバイスが表示されるようになりました。
11
-
12
10
  ###コード
13
11
  ```Python
14
12
  import bluetooth
@@ -16,64 +14,71 @@
16
14
  import math
17
15
  import time
18
16
 
17
+
19
18
  from machine import *
20
19
  from micropython import const
21
20
 
21
+
22
22
  _IRQ_CENTRAL_CONNECT = const(1)
23
23
  _IRQ_CENTRAL_DISCONNECT = const(2)
24
24
  _IRQ_GATTC_NOTIFY = const(18)
25
25
 
26
+
26
27
  _HEALTH_THERM_UUID = bluetooth.UUID(0x1809)
27
28
  _DEVICE_INFO_UUID = bluetooth.UUID(0x180A)
28
29
 
29
- _TEMP_CHAR = (bluetooth.UUID(0x2A6E), bluetooth.FLAG_READ|bluetooth.FLAG_NOTIFY,)
30
- _MAN_CHAR = (bluetooth.UUID(0x2A29), bluetooth.FLAG_READ,)
31
- _MOD_CHAR = (bluetooth.UUID(0x2A24), bluetooth.FLAG_READ,)
32
- _SYS_CHAR = (bluetooth.UUID(0x2A23), bluetooth.FLAG_READ,)
33
30
 
34
- _HEALTH_THERM_SERVICE = (_HEALTH_THERM_UUID, (_TEMP_CHAR,),)
35
- _DEVICE_INFO_SERVICE = (_DEVICE_INFO_UUID, (_MAN_CHAR, _MOD_CHAR, _SYS_CHAR,),)
31
+ _TEM_CHAR = (bluetooth.UUID(0x2A1C), bluetooth.FLAG_INDICATE)
32
+ _CLI_CHAR = (bluetooth.UUID(0x2902), bluetooth.FLAG_READ|bluetooth.FLAG_WRITE)
36
33
 
34
+ _MAN_CHAR = (bluetooth.UUID(0x2A29), bluetooth.FLAG_READ)
35
+ _MOD_CHAR = (bluetooth.UUID(0x2A24), bluetooth.FLAG_READ)
37
- _SERVICES = (_HEALTH_THERM_SERVICE,_DEVICE_INFO_SERVICE,)
36
+ _SYS_CHAR = (bluetooth.UUID(0x2A23), bluetooth.FLAG_READ)
38
37
 
38
+
39
+ _HEALTH_THERM_SERVICE = (_HEALTH_THERM_UUID, (_TEMP_CHAR, _CLI_CHAR))
40
+ _DEVICE_INFO_SERVICE = (_DEVICE_INFO_UUID, (_MAN_CHAR, _MOD_CHAR, _SYS_CHAR))
41
+ _SERVICES = (_HEALTH_THERM_SERVICE,_DEVICE_INFO_SERVICE)
42
+
43
+
39
44
  _ADV_APPEARANCE_GENERIC_THERMOMETER = const(768)
40
45
 
41
46
 
42
47
  class BLETemperature:
43
48
  def __init__(self, ble, name="health-therm"):
44
- self._ble = ble
49
+ self._ble = ble
45
- self._ble.active(True)
50
+ self._ble.active(True)
46
- self._ble.irq(self._irq)
51
+ self._ble.irq(self._irq)
47
- self._connections = set()
52
+ self._connections = set()
48
- ((self._Temp,),(self._Man, self._Mod, self._Sys,),) = self._ble.gatts_register_services(_SERVICES,)
53
+ ((self._Temp, self._Cli),(self._Man, self._Mod, self._Sys)) = self._ble.gatts_register_services(_SERVICES)
49
- self._connections = set()
50
- self._payload = advertising_payload(name=name, services=[_HEALTH_THERM_UUID], appearance=_ADV_APPEARANCE_GENERIC_THERMOMETER)
54
+ self._payload = advertising_payload(name=name, services=[_HEALTH_THERM_UUID], appearance=_ADV_APPEARANCE_GENERIC_THERMOMETER)
51
- self._advertise()
55
+ self._advertise()
52
56
 
53
57
  def _irq(self, event, data):
54
- if event == _IRQ_CENTRAL_CONNECT:
58
+ if event == _IRQ_CENTRAL_CONNECT:
55
- conn_handle, addr_type, addr = data
59
+ conn_handle, addr_type, addr = data
56
- self._connections.add(conn_handle)
60
+ self._connections.add(conn_handle)
57
- elif event == _IRQ_CENTRAL_DISCONNECT:
61
+ elif event == _IRQ_CENTRAL_DISCONNECT:
58
- conn_handle, addr_type, addr = data
62
+ conn_handle, addr_type, addr = data
59
- self._connections.remove(conn_handle)
63
+ self._connections.remove(conn_handle)
60
- elif event == _IRQ_GATTC_NOTIFY:
61
- conn_handle, value_handle, notify_data = data
62
64
  self._advertise()
65
+ elif event == _IRQ_GATTC_NOTIFY:
66
+ conn_handle, value_handle, notify_data = data
63
67
 
64
68
  def set_temperature(self, temp_deg_c, notify=False, indicate=False):
65
- self._ble.gatts_write(self._Temp, struct.pack('<h', int(temp_deg_c * 100)))
69
+ self._ble.gatts_write(self._Temp, struct.pack('<h', int(temp_deg_c * 100)))
66
- if notify:
70
+ if notify:
67
- for conn_handle in self._connections:
71
+ for conn_handle in self._connections:
72
+ print("notify!")
68
- self._ble.gatts_notify(conn_handle, self._Temp)
73
+ self._ble.gatts_notify(conn_handle, self._Temp)
69
-
74
+
70
75
  def set_device(self):
71
- self._ble.gatts_write(self._Man, "TSMC", True)
76
+ self._ble.gatts_write(self._Man, "TSMC", True)
72
- self._ble.gatts_write(self._Mod, "ESP32-DOWDQ5 Rev 1", True)
77
+ self._ble.gatts_write(self._Mod, "ESP32-DOWDQ5 Rev 1", True)
73
- self._ble.gatts_write(self._Sys, struct.pack('l',14227020), True)
78
+ self._ble.gatts_write(self._Sys, struct.pack('l',14227020), True)
74
79
 
75
80
  def _advertise(self, interval_us=500000):
76
- self._ble.gap_advertise(interval_us, adv_data=self._payload)
81
+ self._ble.gap_advertise(interval_us, adv_data=self._payload)
77
82
 
78
83
  def demo():
79
84
  ble = bluetooth.BLE()
@@ -89,19 +94,32 @@
89
94
  val = adc.read_u16()
90
95
 
91
96
  while True:
92
- adc.atten(ADC.ATTN_11DB)
97
+ adc.atten(ADC.ATTN_11DB)
93
- val=adc.read_u16()
98
+ val=adc.read_u16()
94
- val=val/65535*3.6
99
+ val=val/65535*3.6
95
- val=((36000/val)-10000)/1000
100
+ val=((36000/val)-10000)/1000
96
- val=-30.24*math.log(val)+95.664
101
+ val=-30.24*math.log(val)+95.664
97
-
102
+
98
- print(val)
103
+ print(val)
99
-
104
+
100
- i = (i + 1) % 10
105
+ i = (i + 1) % 5
101
- temp.set_temperature(val, notify=i == 0, indicate=False)
106
+ temp.set_temperature(val, notify=i==0, indicate=False)
102
- time.sleep_ms(1000)
107
+ time.sleep_ms(1000)
103
108
 
104
109
  if __name__ == "__main__":
105
110
  demo()
111
+ ```
106
112
 
107
- ```
113
+ ###進展
114
+ Health thermometer Serviceを見直した結果、UUIDとCharacteristicが間違っていたので直した結果、
115
+ The device does not have required services.
116
+ という注意は出なくなりました。
117
+
118
+ ですがnRFToolBoxではまだ温度が表示されず、nRFConnectでの温度表示も正しい値が出なくなりました。
119
+
120
+ 怪しいと睨んでいるのは
121
+ __init__のadvertising_payloadのservicesの値
122
+ set_temperatureのgatts_writeの()の中身
123
+ の二つです。
124
+
125
+ どなたか使い方を教えてくれませんか?

2

import time や demo あたりを訂正しました。

2021/12/01 00:20

投稿

dras
dras

スコア2

title CHANGED
File without changes
body CHANGED
@@ -2,23 +2,26 @@
2
2
  pythonでesp32を操作し、BLE通信を行いたいです。
3
3
 
4
4
  ###分からないところ
5
- nRFToolBoxというアプリを用いてHealth Thermometerで温度を見れるようにしたいのですが、no device foundと表示されます。
5
+ nRFToolBoxというアプリを用いてHealth Thermometerで温度を見れるようにしたいのですが、The device does not have required servicesと表示されます。
6
6
  コードエラーは出ていません。
7
7
  アドバイスをお願いします。
8
8
 
9
9
  nRFConnectでは温度とデバイス情報を得ることができました。
10
+ nRFToolBoxではデバイスが表示されるようになりました。
10
11
 
11
12
  ###コード
12
13
  ```Python
13
14
  import bluetooth
14
15
  import struct
15
16
  import math
17
+ import time
16
18
 
17
19
  from machine import *
18
20
  from micropython import const
19
21
 
20
22
  _IRQ_CENTRAL_CONNECT = const(1)
21
23
  _IRQ_CENTRAL_DISCONNECT = const(2)
24
+ _IRQ_GATTC_NOTIFY = const(18)
22
25
 
23
26
  _HEALTH_THERM_UUID = bluetooth.UUID(0x1809)
24
27
  _DEVICE_INFO_UUID = bluetooth.UUID(0x180A)
@@ -54,6 +57,9 @@
54
57
  elif event == _IRQ_CENTRAL_DISCONNECT:
55
58
  conn_handle, addr_type, addr = data
56
59
  self._connections.remove(conn_handle)
60
+ elif event == _IRQ_GATTC_NOTIFY:
61
+ conn_handle, value_handle, notify_data = data
62
+ self._advertise()
57
63
 
58
64
  def set_temperature(self, temp_deg_c, notify=False, indicate=False):
59
65
  self._ble.gatts_write(self._Temp, struct.pack('<h', int(temp_deg_c * 100)))
@@ -68,7 +74,8 @@
68
74
 
69
75
  def _advertise(self, interval_us=500000):
70
76
  self._ble.gap_advertise(interval_us, adv_data=self._payload)
77
+
71
-
78
+ def demo():
72
79
  ble = bluetooth.BLE()
73
80
  temp = BLETemperature(ble)
74
81
 
@@ -93,4 +100,8 @@
93
100
  i = (i + 1) % 10
94
101
  temp.set_temperature(val, notify=i == 0, indicate=False)
95
102
  time.sleep_ms(1000)
103
+
104
+ if __name__ == "__main__":
105
+ demo()
106
+
96
107
  ```

1

2021/11/30 00:46

投稿

dras
dras

スコア2

title CHANGED
File without changes
body CHANGED
@@ -9,6 +9,7 @@
9
9
  nRFConnectでは温度とデバイス情報を得ることができました。
10
10
 
11
11
  ###コード
12
+ ```Python
12
13
  import bluetooth
13
14
  import struct
14
15
  import math
@@ -91,4 +92,5 @@
91
92
 
92
93
  i = (i + 1) % 10
93
94
  temp.set_temperature(val, notify=i == 0, indicate=False)
94
- time.sleep_ms(1000)
95
+ time.sleep_ms(1000)
96
+ ```