Используется разработка ESP32 для тестирования функциональности определения местоположения beacon.
Поскольку проект использует подмодули MicroPython BLE Library и MicroPython Beacon Library, чтобы получить полный проект, требуется выполнить следующие действия:
$ git clone --recursive https://gitee.com/walkline/esp32-ble-beacon_locating.git
$ cd esp32-ble-beacon_locating
$ git submodule update --init --recursive
Из-за сложной структуры проекта, передача файлов на разработку может вызвать трудности, поэтому рекомендуется использовать инструмент ab для массовой загрузки.
Если вы загружаете прошивку из каталога firmware/
, то она уже включает вышеупомянутые два подмодуля, и можно использовать обычный способ получения проекта.
Здесь используется разработка ESP32 и разработка ESP32C3 для тестирования.
Использование прошивки с встроенными подмодулями
$ ab abc-nolib
Использование официальной прошивки
$ ab
Без использования инструмента ab
```bash
drivers/button.py libs/ble/ble/ libs/beacon/beacon/ utils.py config.py main.py
После первой загрузки кода при повторном запуске устройства переходит в режим сканирования. Нажмите кнопку BOOT более чем на 3 секунды после первого запуска, чтобы перезапустить устройство и войти в режим маяка. LED будет гореть постоянно.
Перейти в режим REPL с помощью инструмента ab
.
$ ab --repl
Просмотр полного вывода.
активация BLE...
W (4841) BTDM_INIT: esp_bt_controller_mem_release не реализовано, возвращено OK
I (4841) BTDM_INIT: версия компилятора контроллера Bluetooth [501d88d]
I (4851) coexist: версия ROM coexist 9387209
I (4851) phy_init: версия PHY 500,985899c,Apr 19 2021,16:05:08
I (4971) system_api: базовый адрес MAC не установлен
I (4971) system_api: чтение базового адреса MAC по умолчанию из EFUSE
I (4971) BTDM_INIT: Bluetooth MAC: 7c:df:a1:c2:a3:0e
Процедура GAP начата: остановка рекламы.
BLE активирован
рекламируется...
Процедура GAP начата: реклама; disc_mode=2 adv_channel_map=7 own_addr_type=0 adv_filter_policy=0 adv_itvl_min=160 adv_itvl_max=160
>>>
Постоянное свечение LED на плате указывает на то, что текущий режим — это режим маяка. При нажатии и удержании кнопки BOOT более трех секунд устройство будет перезапущено и войдет в режим сканирования, при этом LED на плате выключится.Командная строка:
активация BLE...
I (32694) BTDM_INIT: версия компиляции контроллера Bluetooth [1342a48]
I (32694) system_api: базовый адрес MAC не установлен
I (32694) system_api: чтение базового адреса MAC по умолчанию из EFUSE
I (32704) phy_init: версия PHY 4670, 719f9f6, 18 февраля 2021 года, 17:07:07
BLE активировано
сканирование...
Процедура GAP запущена: открытие; тип собственного адреса = 0, политика фильтрации = 0, пассивный = 1, ограниченный = 0, фильтрация повторяющихся данных = 0, продолжительность = бесконечность
Используйте две платы для входа в режимы маяк
и сканирование
соответственно, чтобы просмотреть вывод платы в режиме сканирование
.
[7C:DF:A1:C2:A3:0E] уровень сигнала (-rssi): -54, расстояние: 1.584893 м
[7C:DF:A1:C2:A3:0E] уровень сигнала (-rssi): -60, расстояние: 3.162278 м
[7C:DF:A1:C2:A3:0E] уровень сигнала (-rssi): -53, расстояние: 1.412538 м
[7C:DF:A1:C2:A3:0E] уровень сигнала (-rssi): -55, расстояние: 1.778279 м
[7C:DF:A1:C2:A3:0E] уровень сигнала (-rssi): -57, расстояние: 2.238721 м
[7C:DF:A1:C2:A3:0E] уровень сигнала (-rssi): -53, расстояние: 1.412538 м
[7C:DF:A1:C2:A3:0E] уровень сигнала (-rssi): -54, расстояние: 1.584893 м
Расстояние
представляет расстояние между двумя платами, рассчитанное с помощью параметров, единицы измерения: метры
Также можно использовать один режим
сканирования
для просмотра данных нескольких плат в режимемаяк
Led1 (красный) | Led1 (зелёный) | Led1 (синий) | Led2 | Led3 | Кнопка2 |
---|---|---|---|---|---|
IO3 | IO4 | IO5 | IO18 | IO19 | IO9 |
Номер | |
---|---|
12F | 0, 1, 2, 3, 4, 5, 8, 9, 10, 18, 19, 20, 21 |
13 | 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 19, 20, 21 |
13U | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 19, 20, 21 |
32S | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 19, 20, 21 |
libs/
подмодульные записиНедавно освоил использование git submodule
, поэтому решил применить его здесь.
Прям так сразу добавил подмодуль
$ git submodule add https://gitee.com/walkline/micropython-ble-library ble-lib/ble
Результат: импорт не поддерживает пути с дефисами.
После некоторых размышлений путь к подмодулю был установлен как libs/ble
и libs/beacon
. Для обеспечения совместимости с способом использования без полной загрузки проекта были применены следующие хаки:
try:
from ble.tools import BLETools # Сначала попытаемся импортировать модуль из прошивки
from ble.beacon.client.ibeacon import iBeacon
except:
from libs.ble.ble.tools import BLETools # Если это не удалось, то импортируем из раздела пользователя
from libs.beacon.ble.beacon.client.ibeacon import iBeacon
Похоже, всё в порядке? Тогда давайте сразу же проверим!
Нашли платформу, специально прошитую без модуля ble
, использовали инструмент ab
для загрузки файла, открыли Thonny
и ввели код:```python
from libs.ble.ble.tools import BLETools Traceback (most recent call last): File "", line 1, in File "libs/ble/ble/init.py", line 2, in File "libs/ble/ble/tools.py", line 8, in ImportError: нет модуля 'ble'
Неожиданность! Код 8 строки файла `tools.py` выглядит так:
```python
from ble.const import BLEConst
Неужели придётся менять код в директории libs/
? Это же никак не универсально!
И наконец, используя идею порядка загрузки пакетов, нашёл список sys.path
. Давайте сначала посмотрим на его содержимое.
>>> import sys
>>> help(sys)
Объект <module 'sys'> является типом модуль
__name__ -- sys
path -- ['', '/lib']
argv -- []
version -- 3.4.0
version_info -- (3, 4, 0)
implementation -- (name='micropython', version=(1, 12, 0), mpy=10757)
platform -- esp32
byteorder -- little
maxsize -- 2147483647
exit -- <функция>
stdin -- <io.FileIO 0>
stdout -- <io.FileIO 1>
stderr -- <io.FileIO 2>
modules -- {'flashbdev': <module 'flashbdev' from 'flashbdev.py'>}
print_exception -- <функция>
>>>
Смотрите документацию и узнайте, что этот sys.path
представляет собой путь поиска модулей при импорте, по умолчанию <root>
и /lib
(по слухам, на PyBoard
есть ещё пути вроде 0:/lib
и 1:/flash
, но здесь мы их не рассматриваем). Поскольку это список, можно добавлять свои пути, поэтому попробовал следующий подход:
>>> import sys
>>> sys.path.append('libs/ble')
>>> sys.path.append('libs/beacon')
>>> from ble.tools import BLETools
>>>
```Похоже, работает? Проверим после перезапуска устройства!
```python
>>> import sys
>>> sys.path.append('libs/ble')
>>> sys.path.append('libs/beacon')
>>> from ble.tools import BLETools
>>> from ble.beacon.client.ibeacon import iBeacon
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: нет модуля с именем 'ble.beacon'
>>>
Занимательная проблема!
Ключевой момент здесь — порядок добавления путей в sys.path
. Сначала был добавлен путь 'libs/ble'
, а затем попытка импорта ble.beacon
нашла совпадение в пути 'libs/ble/ble'
, где модуль beacon
отсутствует. Пробуем следующее:
>>> import sys
>>> sys.path.append('libs/beacon') # Изменяем порядок
>>> sys.path.append('libs/ble')
>>> from ble.beacon.client.ibeacon import iBeacon
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "libs/beacon/ble/beacon/client/ibeacon/iBeacon.py", line 11, in <module>
ImportError: нет модуля с именем 'ble.const'
>>>
Это подтверждает наши догадки, но как решить эту проблему?
Одним из способов решения является одновременный импорт всех файлов из модуля.
Предположим, что в файле libs/ble/ble/__init__.py
присутствуют следующие строки:
from .const import *
from .tools import *
from .characteristics import *
from .descriptors import *
from .profile import *
from .services import *
Тогда мы можем сделать следующую попытку:
>>> import sys
>>> sys.path.append('libs/ble')
>>> from ble import *
>>> sys.path.remove('libs/ble')
>>> sys.path.append('libs/beacon')
>>> from ble.beacon.client.ibeacon import iBeacon
>>>
Близко к идеалу! Однако при этом происходит импорт множества модулей:
>>> print('\n'.join(sys.modules.keys()))
'ble.characteristics.__characteristic'
'ble.beacon.client.ibeacon.iBeacon'
'ble.profile'
'ble.descriptors.descriptors'
'ble.beacon.client'
'ble.descriptors.__descriptor'
'flashbdev'
'ble.descriptors'
'ble.characteristics'
'ble.characteristics.characteristics'
'ble.beacon.client.ibeacon'
'ble.services'
'ble.services.__service'
'ble.const'
'ble.tools'
'ble'
'ble.services.services'
'ble.beacon'
```##### Окончательное решение
Итоговым решением стало создание новой `libs` ветки для [MicroPython Beacon Library](https://gitee.com/walkline/micropython-beacon-library/tree/libs/), с корректировкой структуры директорий и изменением нескольких путей импорта внутри файлов. После этого была сделана попытка следующего типа:
```python
>>> import sys
>>> sys.path.append('libs/ble')
>>> sys.path.append('libs/beacon')
>>> from ble.tools import BLETools
>>> from beacon.client.ibeacon import iBeacon
>>>
>>> print('\n'.join(sys.modules.keys()))
flashbdev
beacon
beacon.client.ibeaconaibeacon
ble.tools
beacon.clientaibeaconiBeacon
ble.const
ble
beacon.client
>>>
Проблема решена успешно
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )