Title: S4 + esp32 (Micropython) - не получается выполнить pair · Issue #42 · TionAPI/tion_python · GitHub
Open Graph Title: S4 + esp32 (Micropython) - не получается выполнить pair · Issue #42 · TionAPI/tion_python
X Title: S4 + esp32 (Micropython) - не получается выполнить pair · Issue #42 · TionAPI/tion_python
Description: Версия модуля: 3.3.5 Модель бризера: S4 Версия прошивки (если известна): 02D2 Описание проблемы Пишу модуль на микропитоне для esp32, планирую использовать ваши наработки по протоколу для формирования сообщений для бризера S4. Начал с со...
Open Graph Description: Версия модуля: 3.3.5 Модель бризера: S4 Версия прошивки (если известна): 02D2 Описание проблемы Пишу модуль на микропитоне для esp32, планирую использовать ваши наработки по протоколу для формирова...
X Description: Версия модуля: 3.3.5 Модель бризера: S4 Версия прошивки (если известна): 02D2 Описание проблемы Пишу модуль на микропитоне для esp32, планирую использовать ваши наработки по протоколу для формирова...
Opengraph URL: https://github.com/TionAPI/tion_python/issues/42
X: @github
Domain: patch-diff.githubusercontent.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"S4 + esp32 (Micropython) - не получается выполнить pair","articleBody":"**Версия модуля**: 3.3.5\r\n**Модель бризера**: S4\r\n**Версия прошивки (если известна)**: 02D2\r\n## Описание проблемы\r\nПишу модуль на микропитоне для esp32, планирую использовать ваши наработки по протоколу для формирования сообщений для бризера S4. Начал с сопряжения и не получается его выполнить. Помогите пожалуйста разобраться с логикой обмена сообщениями с бризером.\r\n\r\n\r\n## Порядок действий, которые приводят к проявлению проблемы\r\n1. Использую модуль bluetooth (пробовал и с ubluetooth) микропитона https://docs.micropython.org/en/latest/library/bluetooth.html.\r\n2. Перевожу бризер в режим сопряжения (светодиод на бризере мигает синим цветом).\r\n3. На esp32 (скетч в конце тикета) отправляю команду `ble.connect(1, ubinascii.unhexlify(b'f022a36c3a55'))`. \r\n4. Получаю событие об успешном подключении к бризеру.\r\n```\r\n# _IRQ_PERIPHERAL_CONNECT:\r\n# A successful gap_connect().\r\n\r\nConnection_handle:0 addr_type:1 addr:b'f022a36c3a55'\r\n```\r\n5. Отправляю команду запроса статуса `ble.send(ubinascii.unhexlify(b'8010003aa13232b788d5da1ec11843bbaa'))`.\r\n6. Ответа на нее не вижу. Пока представляю себе этот процесс так, что бризер должен уведомить esp32, что положил в ее UUID сообщение и возникнет событие, которое успешно обрабатывается, когда проверял обмен сообщениями с телефоном:\r\n```\r\n# _IRQ_GATTS_WRITE:\r\n# A client has written to this characteristic or descriptor.\r\nbuffer = self.ble.gatts_read(self.rx)\r\nble_msg = buffer.decode('UTF-8').strip()\r\n```\r\n7. Далее пробовал и делать дисконект, и не делать его `ble.disconnect()`. Пробовал отправлять как одну команду запроса статуса за один сеанс привязки, так и несколько команд за один сеанс. Для отладки пока команды формирую в отдельном файле кодом из вашего модуля с 8 рандомными байтами.\r\n8. Бризер выходит из режима сопряжения.\r\n9. Получаю событие о дисконнекте (либо получаю его, когда сам сделал дисконнект)\r\n```\r\n# _IRQ_PERIPHERAL_DISCONNECT:\r\n# Connected peripheral has disconnected.\r\n```\r\n10. На esp32 отправляю команду `ble.connect(1, ubinascii.unhexlify(b'f022a36c3a55'))` и сразу же получаю событие о дисконнекте.\r\n11. Делаю вывод, что сопряжение не удалось.\r\n\r\n## Вопросы:\r\n1. Нужно ли во время сопряжения перед командой запроса состояния бризера отправлять отдельную команду сопряжения ble.pair()? Посмотрел ваш модуль и не увидел, что она отправляется.\r\n\r\nЯ ее пробовал отправлять, но модуль на микропитоне ее похоже не поддерживает, т.к. получаю в терминале:\r\n```\r\nPairing...\r\nTraceback (most recent call last):\r\n File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\r\n File \"main.py\", line 168, in con2br\r\n File \"main.py\", line 150, in pair\r\nAttributeError: 'BLE' object has no attribute 'gap_pair'\r\n```\r\nИ в описании модуля написано, что на esp32 она не поддерживается, или же pair поддерживается, но не поддерживается bonding...\r\n\r\n2. Корректную ли команду запроса состояния бризера я отправляю?\r\n3. Как вы предполагаете, почему не получается сделать сопряжение?\r\n\r\n## Логи\r\n```\r\nВставьте сюда debug-log, в момент проявления проблемы\r\n```\r\nСкетч для esp32:\r\n\r\n```\r\nfrom machine import Pin\r\nfrom machine import Timer\r\nfrom machine import soft_reset\r\nfrom time import sleep_ms, sleep\r\n# import ubluetooth\r\nimport bluetooth\r\nimport ubinascii\r\n\r\nble_msg = \"\"\r\n\r\n\r\nclass ESP32_BLE():\r\n def __init__(self, name):\r\n # Create internal objects for the onboard LED\r\n # blinking when no BLE device is connected\r\n # stable ON when connected\r\n self.led = Pin(2, Pin.OUT)\r\n self.timer1 = Timer(0)\r\n\r\n self.name = name\r\n # self.ble = ubluetooth.BLE()\r\n self.ble = bluetooth.BLE()\r\n self.ble.active(True)\r\n self.disconnected()\r\n self.ble.irq(self.ble_irq)\r\n self.register()\r\n self.advertiser()\r\n\r\n def connected(self):\r\n self.led.value(1)\r\n self.timer1.deinit()\r\n\r\n def disconnected(self):\r\n self.timer1.init(period=100, mode=Timer.PERIODIC, callback=lambda t: self.led.value(not self.led.value()))\r\n\r\n def ble_irq(self, event, data):\r\n global ble_msg\r\n\r\n if event == 1: # _IRQ_CENTRAL_CONNECT:\r\n # A central has connected to this peripheral\r\n self.connected()\r\n\r\n elif event == 2: # _IRQ_CENTRAL_DISCONNECT:\r\n # A central has disconnected from this peripheral.\r\n self.advertiser()\r\n self.disconnected()\r\n\r\n elif event == 3: # _IRQ_GATTS_WRITE:\r\n # A client has written to this characteristic or descriptor.\r\n buffer = self.ble.gatts_read(self.rx)\r\n ble_msg = buffer.decode('UTF-8').strip()\r\n\r\n elif event == 5: # _IRQ_SCAN_RESULT:\r\n # A single scan result.\r\n addr_type, addr, adv_type, rssi, adv_data = data\r\n print(\r\n 'Addr_type:{} addr:{} adv_type:{} rssi:{} adv_data:{}'.format(addr_type, ubinascii.hexlify(addr),\r\n adv_type, rssi,\r\n ubinascii.hexlify(adv_data)))\r\n\r\n elif event == 6: # _IRQ_SCAN_DONE:\r\n # Scan duration finished or manually stopped.\r\n print('Scan stopped (duration finished or manually)')\r\n\r\n elif event == 7: # _IRQ_PERIPHERAL_CONNECT:\r\n # A successful gap_connect().\r\n print('Connected')\r\n conn_handle, addr_type, addr = data\r\n print('Connection_handle:{} addr_type:{} addr:{}'.format(conn_handle, addr_type, ubinascii.hexlify(addr)))\r\n\r\n elif event == 8: # _IRQ_PERIPHERAL_DISCONNECT:\r\n # Connected peripheral has disconnected.\r\n conn_handle, addr_type, addr = data\r\n print('Disconnected')\r\n\r\n elif event == 28: # _IRQ_ENCRYPTION_UPDATE:\r\n # The encryption state has changed (likely as a result of pairing or bonding).\r\n conn_handle, encrypted, authenticated, bonded, key_size = data\r\n print('After pairing: ', conn_handle, encrypted, authenticated, bonded, key_size)\r\n\r\n def register(self):\r\n # Nordic UART Service (NUS)\r\n NUS_UUID = '6E400001-B5A3-F393-E0A9-E50E24DCCA9E'\r\n RX_UUID = '6E400002-B5A3-F393-E0A9-E50E24DCCA9E'\r\n TX_UUID = '6E400003-B5A3-F393-E0A9-E50E24DCCA9E'\r\n\r\n # BLE_NUS = ubluetooth.UUID(NUS_UUID)\r\n # BLE_RX = (ubluetooth.UUID(RX_UUID), ubluetooth.FLAG_WRITE)\r\n # BLE_TX = (ubluetooth.UUID(TX_UUID), ubluetooth.FLAG_NOTIFY)\r\n\r\n BLE_NUS = bluetooth.UUID(NUS_UUID)\r\n BLE_RX = (bluetooth.UUID(RX_UUID), bluetooth.FLAG_WRITE)\r\n BLE_TX = (bluetooth.UUID(TX_UUID), bluetooth.FLAG_NOTIFY)\r\n\r\n BLE_UART = (BLE_NUS, (BLE_TX, BLE_RX,))\r\n SERVICES = (BLE_UART,)\r\n ((self.tx, self.rx,),) = self.ble.gatts_register_services(SERVICES)\r\n\r\n def send(self, data):\r\n self.ble.gatts_notify(0, self.tx, data + '\\n')\r\n\r\n def advertiser(self):\r\n name = bytes(self.name, 'UTF-8')\r\n adv_data = bytearray('\\x02\\x01\\x02') + bytearray((len(name) + 1, 0x09)) + name\r\n self.ble.gap_advertise(100, adv_data)\r\n print(adv_data)\r\n print(\"\\r\\n\")\r\n # adv_data\r\n # raw: 0x02010209094553503332424C45\r\n # b'\\x02\\x01\\x02\\t\\tESP32BLE'\r\n #\r\n # 0x02 - General discoverable mode\r\n # 0x01 - AD Type = 0x01\r\n # 0x02 - value = 0x02\r\n\r\n # https://jimmywongiot.com/2019/08/13/advertising-payload-format-on-ble/\r\n # https://docs.silabs.com/bluetooth/latest/general/adv-and-scanning/bluetooth-adv-data-basics\r\n\r\n def scan(self, duration):\r\n print('Started scanning')\r\n self.ble.gap_scan(duration)\r\n\r\n def connect(self, addr_type, mac, scan_duration=2000):\r\n # addr_type values indicate public or random addresses:\r\n # 0x00 - PUBLIC\r\n # 0x01 - RANDOM(either static, RPA, or NRPA, the type is encoded in the address itself)\r\n print('Connecting')\r\n x = 0\r\n while x \u003c 1:\r\n try:\r\n self.ble.gap_connect(addr_type, mac, scan_duration)\r\n # ble.connect(1, ubinascii.unhexlify(b'f022a36c3a55')) breezer\r\n # ble.connect(1, ubinascii.unhexlify(b'a4c337077418')) iphone\r\n ble.send(ubinascii.unhexlify(b'8010003aa13232b788d5da1ec11843bbaa'))\r\n # ble.send(b'\\x80\\x10\\x00:\\xa122(?\\xfc\\xe7\\xb9\\x16\\xd3\\x9d\\xbb\\xaa')\r\n break\r\n except Exception:\r\n pass\r\n sleep(2)\r\n x += 1\r\n print('Failed to connect')\r\n\r\n def disconnect(self, conn_handle=0):\r\n self.ble.gap_disconnect(conn_handle)\r\n\r\n def pair(self):\r\n print('Pairing...')\r\n self.ble.gap_pair(0)\r\n\r\n\r\nled = Pin(2, Pin.OUT)\r\nbut = Pin(0, Pin.IN)\r\nble = ESP32_BLE(\"ESP32BLE_2\")\r\n\r\n\r\ndef buttons_irq(pin):\r\n led.value(not led.value())\r\n ble.send('LED state will be toggled.')\r\n print('LED state will be toggled.')\r\n\r\n\r\nbut.irq(trigger=Pin.IRQ_FALLING, handler=buttons_irq)\r\n\r\ndef con2br():\r\n ble.connect(1, ubinascii.unhexlify(b'f022a36c3a55'))\r\n # ble.pair()\r\n ble.send(ubinascii.unhexlify(b'8010003aa132325b1033dcac14955bbbaa'))\r\n ble.send(ubinascii.unhexlify(b'8010003aa13232810bd0980babd51abbaa'))\r\n # ble.send(ubinascii.unhexlify(b'8010003aa132325b1033dcac14955bbbaa'))\r\n # ble.disconnect()\r\n\r\n# con2br()\r\n\r\nwhile True:\r\n if ble_msg.lower() == 'read_led':\r\n print(ble_msg)\r\n ble_msg = \"\"\r\n print('LED is ON.' if led.value() else 'LED is OFF')\r\n sleep(10)\r\n ble.send('LED is ON.' if led.value() else 'LED is OFF')\r\n elif ble_msg.lower() == 'scan':\r\n print(ble_msg)\r\n ble_msg = \"\"\r\n ble.scan(30000) # 10K ms == 10 s\r\n elif ble_msg.lower() == 'connect':\r\n print(ble_msg)\r\n ble_msg = \"\"\r\n # print(ubinascii.unhexlify('f022a36c3a55'))\r\n ble.connect(1, ubinascii.unhexlify(b'f022a36c3a55'))\r\n elif ble_msg.lower() == 'dis':\r\n print(ble_msg)\r\n ble_msg = \"\"\r\n #if ble.disconnect():\r\n # print('Disconnected')\r\n #else:\r\n # print('Failed to disconnect')\r\n elif ble_msg.lower() == 'req':\r\n print(ble_msg)\r\n ble_msg = \"\"\r\n ble.send(b'\\x80\\x10\\x00:\\xa122(?\\xfc\\xe7\\xb9\\x16\\xd3\\x9d\\xbb\\xaa')\r\n elif ble_msg != '':\r\n print(ble_msg)\r\n sleep_ms(100)\r\n\r\n```","author":{"url":"https://github.com/aalexey07","@type":"Person","name":"aalexey07"},"datePublished":"2022-10-07T21:19:43.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2},"url":"https://github.com/42/tion_python/issues/42"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:2c2cc740-6a01-4a3a-e2d2-e8b8f62c94e2 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | EA0C:A9CCE:4433B4:5893DD:698D3D4A |
| html-safe-nonce | 7005c81f80243d15632c572314ad58dfc663c408b475153862aa594070e5932e |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFQTBDOkE5Q0NFOjQ0MzNCNDo1ODkzREQ6Njk4RDNENEEiLCJ2aXNpdG9yX2lkIjoiMTMxMjM0MjM2MDE2ODY3NjY4MiIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 79d9a3989de9c2cf108d99ed6a92f959811be825d071ff308850344be57fc8f8 |
| hovercard-subject-tag | issue:1401675064 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/TionAPI/tion_python/42/issue_layout |
| twitter:image | https://opengraph.githubassets.com/ffa1f232ce0a8935a5e9e660f470e428e5454472f73fd5e6f19adcedacd87e57/TionAPI/tion_python/issues/42 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/ffa1f232ce0a8935a5e9e660f470e428e5454472f73fd5e6f19adcedacd87e57/TionAPI/tion_python/issues/42 |
| og:image:alt | Версия модуля: 3.3.5 Модель бризера: S4 Версия прошивки (если известна): 02D2 Описание проблемы Пишу модуль на микропитоне для esp32, планирую использовать ваши наработки по протоколу для формирова... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | aalexey07 |
| hostname | github.com |
| expected-hostname | github.com |
| None | c0818105fa276287e9369cfdefa0a0fa7953719791ceff9b94d69623c0a4fe8a |
| turbo-cache-control | no-preview |
| go-import | github.com/TionAPI/tion_python git https://github.com/TionAPI/tion_python.git |
| octolytics-dimension-user_id | 51779585 |
| octolytics-dimension-user_login | TionAPI |
| octolytics-dimension-repository_id | 192981243 |
| octolytics-dimension-repository_nwo | TionAPI/tion_python |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 192981243 |
| octolytics-dimension-repository_network_root_nwo | TionAPI/tion_python |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | bc912d4349851e5f32c76bbb213754e40947d7a6 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width