René's URL Explorer Experiment


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

direct link

Domain: github.com


Hey, it has json ld scripts:
{"@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-controllervoltron_issues_fragments
route-actionissue_layout
fetch-noncev2:b651f1e6-bec3-c590-7662-947d8faecc0c
current-catalog-service-hash81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114
request-idE58E:8B475:234694:312A69:698DEF0A
html-safe-nonce67964d4cc057cbe0fd808526a414f18c8ce29aa65173b14b94e6a4ab826fe076
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFNThFOjhCNDc1OjIzNDY5NDozMTJBNjk6Njk4REVGMEEiLCJ2aXNpdG9yX2lkIjoiNzI0MDU4NDUyOTQwODAyODQyNiIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmac5cc01be6c22d70e59c3c3b94aeabdfb5c4935aeb36821a8f2590dd4ca02a637a
hovercard-subject-tagissue:1401675064
github-keyboard-shortcutsrepository,issues,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///voltron/issues_fragments/issue_layout
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/TionAPI/tion_python/42/issue_layout
twitter:imagehttps://opengraph.githubassets.com/ffa1f232ce0a8935a5e9e660f470e428e5454472f73fd5e6f19adcedacd87e57/TionAPI/tion_python/issues/42
twitter:cardsummary_large_image
og:imagehttps://opengraph.githubassets.com/ffa1f232ce0a8935a5e9e660f470e428e5454472f73fd5e6f19adcedacd87e57/TionAPI/tion_python/issues/42
og:image:altВерсия модуля: 3.3.5 Модель бризера: S4 Версия прошивки (если известна): 02D2 Описание проблемы Пишу модуль на микропитоне для esp32, планирую использовать ваши наработки по протоколу для формирова...
og:image:width1200
og:image:height600
og:site_nameGitHub
og:typeobject
og:author:usernameaalexey07
hostnamegithub.com
expected-hostnamegithub.com
None929d0ce8b653d60df0698366d7e9012f9423ea1bace40816e16e5b007242aae4
turbo-cache-controlno-preview
go-importgithub.com/TionAPI/tion_python git https://github.com/TionAPI/tion_python.git
octolytics-dimension-user_id51779585
octolytics-dimension-user_loginTionAPI
octolytics-dimension-repository_id192981243
octolytics-dimension-repository_nwoTionAPI/tion_python
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id192981243
octolytics-dimension-repository_network_root_nwoTionAPI/tion_python
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release143e58641f5eb460a02eda3a18cc1ef28e8c5188
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/TionAPI/tion_python/issues/42#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2FTionAPI%2Ftion_python%2Fissues%2F42
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub SparkBuild and deploy intelligent appshttps://github.com/features/spark
GitHub ModelsManage and compare promptshttps://github.com/features/models
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
GitHub SponsorsFund open source developershttps://github.com/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/accelerator
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2FTionAPI%2Ftion_python%2Fissues%2F42
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fissues_fragments%2Fissue_layout&source=header-repo&source_repo=TionAPI%2Ftion_python
Reloadhttps://github.com/TionAPI/tion_python/issues/42
Reloadhttps://github.com/TionAPI/tion_python/issues/42
Reloadhttps://github.com/TionAPI/tion_python/issues/42
TionAPI https://github.com/TionAPI
tion_pythonhttps://github.com/TionAPI/tion_python
Notifications https://github.com/login?return_to=%2FTionAPI%2Ftion_python
Fork 12 https://github.com/login?return_to=%2FTionAPI%2Ftion_python
Star 64 https://github.com/login?return_to=%2FTionAPI%2Ftion_python
Code https://github.com/TionAPI/tion_python
Issues 0 https://github.com/TionAPI/tion_python/issues
Pull requests 0 https://github.com/TionAPI/tion_python/pulls
Discussions https://github.com/TionAPI/tion_python/discussions
Actions https://github.com/TionAPI/tion_python/actions
Projects 0 https://github.com/TionAPI/tion_python/projects
Security 0 https://github.com/TionAPI/tion_python/security
Insights https://github.com/TionAPI/tion_python/pulse
Code https://github.com/TionAPI/tion_python
Issues https://github.com/TionAPI/tion_python/issues
Pull requests https://github.com/TionAPI/tion_python/pulls
Discussions https://github.com/TionAPI/tion_python/discussions
Actions https://github.com/TionAPI/tion_python/actions
Projects https://github.com/TionAPI/tion_python/projects
Security https://github.com/TionAPI/tion_python/security
Insights https://github.com/TionAPI/tion_python/pulse
New issuehttps://github.com/login?return_to=https://github.com/TionAPI/tion_python/issues/42
New issuehttps://github.com/login?return_to=https://github.com/TionAPI/tion_python/issues/42
S4 + esp32 (Micropython) - не получается выполнить pairhttps://github.com/TionAPI/tion_python/issues/42#top
bluetoothBT relatedhttps://github.com/TionAPI/tion_python/issues?q=state%3Aopen%20label%3A%22bluetooth%22
https://github.com/aalexey07
https://github.com/aalexey07
aalexey07https://github.com/aalexey07
on Oct 7, 2022https://github.com/TionAPI/tion_python/issues/42#issue-1401675064
https://docs.micropython.org/en/latest/library/bluetooth.htmlhttps://docs.micropython.org/en/latest/library/bluetooth.html
bluetoothBT relatedhttps://github.com/TionAPI/tion_python/issues?q=state%3Aopen%20label%3A%22bluetooth%22
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.