|
|
|
Delphi 10.2, BluetoothLE, не работает SubscribeToCharacteristic
|
|||
|---|---|---|---|
|
#18+
Имеется BluetoothLE устройство с сервисом UsrUartSvcUUID:TBluetoothUUID= '{0003cdd0-0000-1000-8000-00805f9b0131}'; и характеристиками UsrUartNotifyChrUUID:TBluetoothUUID='{0003cdd1-0000-1000-8000-00805f9b0131}'; // Получение данных из UART BluetoothLE модуля UsrUartWriteChrUUID:TBluetoothUUID= '{0003cdd2-0000-1000-8000-00805f9b0131}'; // Запись данных в UART BluetoothLE модуля У характеристики UsrUartNotifyChrUUID есть еще дескриптор UsrDesc: TBluetoothUUID = '{20003D9C-0000-0000-0000-000020002902}'; Нужно читать и писать данные из/в UART(а) BluetoothLE модуля. Взял пример BLEScanner и немного модифицировал его. С записью в UART BluetoothLE модуля проблем не возникло, а вот с чтением данных почему-то не получилось. Проблема еще осложняется тем, что у меня нет исходников модулей System.Bluetooth, System.Bluetooth.Components, а функции типа SubscribeToCharacteristic не возвращают код ошибки, чтобы можно было понять что пошло не так и почему событие BLECharacteristicRead не происходит. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. Варианты которые пробовал делать для подписки: 1) Код: pascal 1. 2) Код: pascal 1. 3) Код: pascal 1. 2. 3. 4) Код: pascal 1. 2. 3. 4. Приложение запускал как под windows 10, так и на телефоне с android 5.0. В обоих случаях запись в UART BluetoothLE модуля работает, а чтение нет. Если в GooglePlay взять BLEScaner, то он спокойно работает с этим модулем, т.е. пишет и читает из него данные и подписка у него работает нормально. Также, если взять Android studio и в нем воспользоваться стандартным примером для работы с ble модулями, то он тоже прекрасно читает данные из этого модуля, но я не знаток Java). Как в Delphi реализовать подписку на получение событий? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2017, 14:38:58 |
|
||
|
Delphi 10.2, BluetoothLE, не работает SubscribeToCharacteristic
|
|||
|---|---|---|---|
|
#18+
Добавлю, что приведенные выше варианты для подписки вызывались внутри метода procedure TFormMaim.BLEServicesDiscovered(const Sender: TObject; const AServiceList: TBluetoothGattServiceList); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2017, 15:01:45 |
|
||
|
Delphi 10.2, BluetoothLE, не работает SubscribeToCharacteristic
|
|||
|---|---|---|---|
|
#18+
BLE-юниты очень забагованы. Там есть все: от непоправленной кривой копи-пасты до дедлоков. Могу дать результаты своих правок (D10.2), с которыми оно хоть как-то работает, в т.ч. и подписка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2017, 13:03:31 |
|
||
|
Delphi 10.2, BluetoothLE, не работает SubscribeToCharacteristic
|
|||
|---|---|---|---|
|
#18+
misha mike, То, что они забагованы - я понял, и похоже не только они. Интересно взглянуть на результаты правок (e-mail в профиле) А пока склоняюсь в сторону android studio. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2017, 16:29:37 |
|
||
|
Delphi 10.2, BluetoothLE, не работает SubscribeToCharacteristic
|
|||
|---|---|---|---|
|
#18+
Там далеко не все косяки исправлены, но у меня работало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2017, 20:10:26 |
|
||
|
Delphi 10.2, BluetoothLE, не работает SubscribeToCharacteristic
|
|||
|---|---|---|---|
|
#18+
misha mike, Благодарю за исходники bluetooth модулей! С ними проблема решилась за пару минут) Проблема была в модуле System.Bluetooth в методе function TBluetoothLEDevice.SetCharacteristicNotification(const ACharacteristic: TBluetoothGattCharacteristic; Enable: Boolean): Boolean; Там был жестко задан дескриптор '{00002902-0000-1000-8000-00805F9B34FB}', т.е. если у устройства есть характеристики, для которых предусмотрена подписка, и у данной характеристики есть указанный дескриптор, то все будет работать. А если производитель устройства применил другой дескриптор, то подписка работать не будет! В моем случае я поступил просто: оставил проверку, что на характеристику можно подписаться т.е. у нее есть свойства Notify и(или) Indicate, а проверку соответствия дескриптора заменил проверкой того, что у характеристики есть хотя бы один дескриптор, причем не важно какой. После этого все заработало как надо. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ps Для подписки достаточно просто вызвать метод SubscribeToCharacteristic, дополнительно вызывать SetCharacteristicNotification не нужно, а то в некоторых источниках указывалось на необходимость дополнительных танцев с бубнами, но похоже в версии 10.2 они не актуальны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2017, 22:05:19 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39470531&tid=2042160]: |
0ms |
get settings: |
14ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
221ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 551ms |

| 0 / 0 |
