Хочу обратить внимание на виртуальный Воркшоп фирмы Silicon Labs (9-10 сентября). Первоначально он планировался как обычная конференция с приличным орг-взносом, но из-за вируса они сделали его виртуальным и бесплатным. Более того, для участников некоторых классов воркшопа фирма предлагает свой dev. kit SLWSTK6006A с 50% скидкой. Интерес к нему огромный, и несмотря на высокую цену, при заказе он был даже упомянут как Out of stock. Однако, получил его сегодня быстрее чем обещали. Классы воркшопа обещают записывать и сделать доступными для участников, так что не большая беда если Кит приедет позже.
Это хорошее по цене предложение получить просто замечательный Кит для разраборки безпроводных приложений, включая Zigbee и Bluetooth/Mesh. Кстати, насчёт Mesh, неплохой Кит CYBT-213043-MESH под PSoC-6 имеется и у Cypress.
Выше я писал про новые модули DA14531 фирмы Dialog Semiconductor. Интересно, что сами чипы содержат DC конвертор, способный работать как на повышение напряжения, так и на понижение (к сожалению, модули сконфигурированы только на понижение). Однако, после работы с ними у меня осталось глубокое разочарование. ПО модуля явно недоработано, даже если перекомпилировать исходник. Переписка с их тех. поддержкой длится уже полтора месяца и напоминает испорченный телефон. Несмотря на мои разъяснения в картинках что именно не работает, они переспрашивают это несколько раз, похоже просто тянут время. Первый раз сталкиваюсь с подобной бестолковщиной. Копаться в их исходниках, к тому-же разработанных под неведомой для меня RTOS, нет времени. Считаю, что фирма сама должна свои баги исправлять.
В качестве позитивной новости отмечу долгожданный выпуск Силлабами новых модулей BGM22 (справа). Они имеют такие-же размеры и footprint как и BGM13 (слева), но не совместимы с ними по выводам.
Совершенно верно. Планирую для себя переход на версию 5 к следующему лету, поскольку не хочу переделывать имеющиеся учебные наработки во время учебного года - и без этого забот хватает. Пока можно поставить обе версии на однои компе и они друг другу мешать не будут.
Возможно, мне нужна помощь. Пытаюсь написать клиента на Thunderboard Sense 2, который будет соединяться с BT модулем HM-11. Я его (HM-11) сконфигурировал на соединение с PIN кодом. С утилитой CySmart соединение удалось сделать следующим способом: Нажал "Start Scan" и когда модуль появился в списке, нажал коннект. Вывалилось окошко, что требуется спаривание, я нажал Yes, после чего получил окошко, что последняя операция выполнилась с ошибкой.
Код:
Info: gpm.M1102: Pairing request received from peer device, F4:84:4C:4D:D5:13. CyDesigner.Common.Base.CyStsMsgDisp+CyDialogResult [19:56:47:627] : 'Initiate Pairing' request sent [19:56:47:643] : 'Command Status' event received [19:56:47:643] : Status: BLE_ERROR_INVALID_OPERATION Error: gpm.M0101: Invalid operation
Но после, нажав кнопку "Pair", нормально ввёл PIN код и соединение установилось: на HM-11 выскочила надпись OK+CONN и я смог даже кое что там передать (все хекс коды позабыл, кроме как для букв A и U).
А вот теперь, пытаюсь то же самое проделать скомбинировав Клиентский код из первой и второй части статей. Вот протокол.
Код:
stack version: 2.13.2 local BT device address: 08:6b:d7:fe:15:2e Scanning started f4:84:4c:4d:d5:13 (0) f4:84:4c:4d:d5:13 (4) HMSoft Scanning stopped Connected bonding failed, reason 0x303 Connection closed, reason: 0x208 Advertising started
В evt_system_boot_id добавил только секюрную способность:
Код:
case gecko_evt_system_boot_id: bootMessage(&(evt->data.evt_system_boot)); gecko_cmd_sm_configure(0x07,sm_io_capability_keyboarddisplay);// allow all connections gecko_cmd_sm_set_bondable_mode(1);// enable new bondings gecko_cmd_le_gap_set_discovery_timing(le_gap_phy_1m, 160, 160);// set scanning period 10ms gecko_cmd_le_gap_set_discovery_type(le_gap_phy_1m, 1);// do active scanning gecko_cmd_le_gap_set_conn_timing_parameters(80, 100, 0, 1000, 0, 0xffff);// set connection interval 100ms gecko_cmd_le_gap_start_discovery(le_gap_phy_1m, le_gap_discover_observation);// start discovering all devices printLog("Scanning started\r\n"); break;
в connection_opened добавил команду элевации секюрности:
Код:
case gecko_evt_le_connection_opened_id: GPIO_PinOutSet(BSP_LED0_PORT, BSP_LED0_PIN);// turn on LED printLog("Connected\r\n"); conn_handle = evt->data.evt_le_connection_opened.connection; gecko_cmd_sm_increase_security(conn_handle); break;
И добавил обработку событий (сам код не привожу, там ничего отличающегося от приведённого в статье нет):
Код:
case gecko_evt_sm_passkey_request_id: case gecko_evt_sm_confirm_passkey_id: case gecko_evt_sm_bonded_id: case gecko_evt_sm_bonding_failed_id:
Ставил брейкпоинт на "passkey_request" - никогда не срабатывал (и сообщение "Enter Passkey:" ни разу не выскочило). похоже, что у меня не правильно выполнилось gecko_cmd_sm_increase_security и в результате не приходит запрос на passkey_request.
Есть ли какие мысли куда мне копать?
Добавлено after 1 hour 14 minutes 38 seconds: Добавил еще один ивент:
Код:
case gecko_evt_le_connection_parameters_id: printLog("Connection parameters - security mode: 0x%2.2x\r\n", evt->data.evt_le_connection_parameters.security_mode); break;
И вот результат:
Код:
stack version: 2.13.2 local BT device address: 08:6b:d7:fe:15:2e Scanning started f4:84:4c:4d:d5:13 (0) f4:84:4c:4d:d5:13 (4) NonamePRK Scanning stopped Connected Increase security result 0x00 Connection parameters - security mode: 0x00 bonding failed, reason 0x303 Connection closed, reason: 0x208 Advertising started
Connection parameters - security mode: 0x00 - это "0 le_connection_mode1_level1 No security". Вот только еще не врубился, что это значит - ответ сервера или статус текущего соединения?
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Пружинные клеммные блоки Degson для монтажа на печатную плату – это простое и надежное соединение, которое позволяет легко решать задачи для различных приложений за счет обширного ассортимента. Клеммники Degson доступны в двух конструктивных исполнениях (торцевой контакт и зажимная клеть), имеют различные направления ввода проводника (45°, 90°, 180°) и обладают широким диапазоном поперечных сечений (0,2…2,5 мм2).
Я никогда не работал с HM-11, поэтому не понимаю как отобразить фразу "сконфигурировал на соединение с PIN кодом" на таблицу алгоритмов соединения во второй части статьи. Сервер у Вас оснащён клавиатурой и дисплеем? Я-бы копал в сторону изменения параметров в строке
У вас показывается ошибка 303, что говорит о несоответствии алгоритма бондинга сервера и клиента.
Connection parameters - Это статус текущего соединения. А на сервере имеется-ли хоть одна характеристика с защищённым уровнем доступа?
Если у Вас есть 2 платы Thunderboard, неважно BG13 или 22, попробуйте сначала для тренировки запустить secure server на одной из них, а клиента - на другой.
Компания «Компэл» и Analog Devices приглашают всех желающих 27/04/2021 принять участие в вебинаре, посвященном решениям Analog Devices для гальванической изоляции. В программе вебинара: технологии гальванической изоляции iCoupler, цифровые изоляторы, изолированное питание и технология isoPower, гальванически изолированные интерфейсы (RS-485, CAN, USB, I2C, LVDS) и другое.
Перепробовал sm_io_capability... c 0 по 4 - отличие только в случае 3: sm_io_capability_noinputnooutput, тогда получил код ошибки вместо 0x303 - 0x206:
Про HM-11 известно мало. вот из даташита: Ø Security: Authentication and encryption Ø Service: 0xFFE0 (Modifiable use AT+UUID command) Ø Characteristic: 0xFFE1 (Modifiable use AT+UUID command) Ø Characteristic: Notify and Write (Modifiable use AT+UUID command)
Я дал команды AT+TYPE2 AT+TYPE[P1] OK+Set:[P1] P1: 0~2 0:Not need PIN Code 1:Auth not need PIN 2:Auth with PIN 3:Auth and bond
И установил PIN командой AT+PIN012345
Вот как в CySmart выглядят характеристики Выделенная характеристика как раз та, что меня интересует. Если я туда пишу, то HM-11 её принимает, если HM-11 передаёт, то она срабатывает как Notify, а если её просто читать - возвращает MAC-адрес. Я правильно понимаю, чтобы писать мне надо обращаться по handle 0x0012?
Насчёт handle 0х0012 - понимаете правильно. Однако, в свойствах этой характеристики запись в неё возможна только без confirmation. Поэтому следует использовать метод cmd_gatt_write_characteristic_value_without_response().
Я тут вычитал, что HM-11 поддерживает лишь Bluetooth 4.0. Поэтому бит флага 2 в вызове функции sm_configure должен быть 0, чтобы аутентификация велась legacy методами версий Bluetooth 4.0 и 4.1. T.e.,
У меня таких устройств нет и проверить не на чем, поэтому Ваш опыт был-бы интересен.
Далее, если хотите сделать bonding между устройствами, думаю, следует в команде AT+TYPE2 на HM-11 подать type=3. При этом не грех было-бы стереть в нём все данные о сопряжённых устройствах. Не знаю сколько ключей сопряжения хранит HM-11. У BG-13 этот параметр по умолчанию =6, если я правильно помню.
И так мой опыт.... хотел уже было сказать, что этот виноград зелен и не очень то он и нужен... Тем более скорость у него 2-6К(килобит или килобайт в секунду?), да и протоколы основанные на временных задержках меня вгоняют в тоску. Но, продолжил свои мучения.
Параметр Security requirement bitmask я уже пытался крутить, правда в сторону установки третьего бита "Bonding requests need to be confirmed" и снятия остальных в разных комбинациях. Правда, бессистемно и не особо изучая коды ошибок. Сейчас попробовал сконфигурировать legasy и получил отлуп, но уже с кодом 0x206. Кстати, погуглил этот код ошибки и нашел такой топик. В событие коннекта добавил распечатку поля bonding и увидел там взамен 0xFF просто 0x00. Похоже, что бондинг уже где-то есть. На HM-11 выполнил команду AT+ERASE, которая стирает все бондинги - не помогло. Тогда выполнил при старте Thunderboard gecko_cmd_sm_delete_bondings() - и вот результат:
На дисплее устройства, где стоит HM-11 увидел заветную надпись "OK+CONN".
Приём-передача пока еще не работает почему-то - буду изучать. И надо бы добавить обработку этой ситуации, если при соединении bonding не 0xFF, а bonding failed, то делать стирание бондингов?
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Если устройства уже bonded, то новый bonding не производится. Я обычно ставлю кнопки на сервере и клиенте при нажатии на которые стираю все данные bonded устройств и/или разрешаю новый бондинг, наподобии как это сделано во второй части статьи.
Так с какими-же параметрами sm_configure() удалось сделать bonding?
И, похоже, действительно самое простое, это сделать в меню команду для очистки таблицы привязанных устройств и вызывать вручную при возникновении необходимости.
Приём сделал, и даже работает, а вот с передачей у меня проблема. Не могу придумать куда вставить эту передачу. Поначалу был поставивши в цикле while(1), но там же находится команда evt = gecko_wait_event(), которая этот цикл тормозит. Поэтому сейчас изучаю, как с последовательным портом сделать такую же генерацию событий, как в статье сделана с кнопками. Проблема, что у обработчика прерывания RETARGET нет никакого callback.
Добавлено after 1 hour 6 minutes 45 seconds: Немножко не понял конструкцию: gecko_external_signal((1<<BSP_BUTTON1_PIN) | (1<<16)); Ведь, во внешнем событии надо устанавливать один бит, который укажет какое событие произошло и в обработчике события по этим битам вызываются соответствующие обработчики?
Добавлено after 2 hours 51 minute 23 seconds: Не понимаю. Почему-то при соединении перестаёт работать USART. Поставил контрольную распечатку - пока соединений нет на каждое нажатие выскакивает событие, как соединение установилось - всё пропадает. Поставил контрольные распечатки - если срабатывает gecko_external_signal(), то событие происходит. А этот gecko_external_signal() у меня вызывается из прерывания USART - тогда эти прерывания пропадают?
A!!! Понял! Не СПАТЬ! USART не работает в спячке.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Насчёт организации передачи - трудно советовать без знания приложения. Проще всего передать стеку внешнее событие либо от таймера (если оно периодическое), либо от кнопки. В последнем случае используйте gecko_external_signal() в обработчике прерывания кнопки, как в статье (первая часть). При этом код передачи по UART следует вставить в обработчик события таймера или внешнего события и МК тогда спать не будет при передаче по UART. В конструкции (1<<BSP_BUTTON1_PIN) | (1<<16) действительно достаточно установить лишь 1 бит, я потом так и делал.
Если этого мало и у приложения помимо стека БТ (и его цикла обработки событий) имеется свой while-loop, возможные подходы комбинации этих циклов описаны в этом документе.
Если-же и этого мало, то RTOS (третья часть). Правда, когда я её писал, версия 2.7 SDK страдала детскими болезнями, поэтому я использовал 2.6, чего и Вам советую, поскольку в 2.7 до сих пор ещё не всё исправлено.
Текущую задачу я выполнил, поэтому обобщу результаты.
Задача была сделать мост между USB-UART и модулем HM-11.
Ключевая проблема оказалась то, что в gecko_cmd_sm_configure() в параметр "Security requirement bitmask" надо оставить Legasy. Вторая проблема была в том, что надо удалять bondings после экспериментов - могут попить крови. Третья проблема в том, что порты USART не работают, когда процессор спит, поэтому в app.h надо изменить
Код:
/* Set this value to 1 if you want to disable deep sleep completely */ #define DISABLE_SLEEP 1
Порт LEUART - похоже может.
Следующая проблема с драйвером последовательного порта. "родной" драйвер "RETARGET" (просто переименованный USART0), не имеет функций callback при помощи которого можно сообщить BT стеку о наличии внешнего события. Поэтому пришлось грязными ручками влезть в обработчик прерывания приёма по последовательному порту и вставил вызов __WEAK функции RETARGET_callback(). Эту функцию определил в app.c и там она вызывает gecko_external_signal(). В качестве аргумента надо передавать 32-битное число в котором выставлена одна 1. Надо учесть, что не на каждый gecko_external_signal будет срабатывать событие
Код:
case gecko_evt_system_external_signal_id:
поэтому в этом обработчике нельзя ожидать, что принят только один байт - надо выбрать весь буфер. Потому как эта функция всего навсего устанавливает бит в маске событий, а если бит уже стоит он и останется стоять, пока не вызовется обработчик. А вызывается он не моментально.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Не любят меня блютусные устройства. Новая проблема: сделал секюрный сервер на BGM13P: даёт читать уровень батарейки (пока подсовываю просто число - ацп буду заводить позже), приём-передача последовательного потока (работает, но не стабильно) и есть две характиристики secure notification - на входы приходят лог.уровни и по их изменению посылается клиенту notification. Проблема в том, что они оба идентичны, но один работает, а второй нет. На устройстве они подключены к двум светодиодам (красному и зеленому) и модуль должен транслировать их состояние:
case gecko_evt_system_external_signal_id: // button event event = evt->data.evt_system_external_signal.extsignals; if (event & (1ul << 0)) { switch_value = GPIO_PinInGet(GREEN_LED_PORT, GREEN_LED_PIN); gecko_cmd_gatt_server_send_characteristic_notification(0xFF, gattdb_motor_id, 1, (const uint8*)&switch_value); } if (event & (1ul << 1)) { switch_value = GPIO_PinInGet(RED_LED_PORT, RED_LED_PIN); gecko_cmd_gatt_server_send_characteristic_notification(0xFF, gattdb_user_led_id, 1, (const uint8*) &switch_value); } if (event & (1ul << 2)) { int i, serial_symbol; // послать принятое из UART ....
Всё одинаково, но изменения зелёного светодиода я при помощи cySmart на планшете вижу, а красного - нет. Даже ставил брейкпоинт - callback отрабатывает и send_characteristic_notification тоже. Только что проверил - выход на светодиод пушпульный, не открытый сток или исток (да и светодиод сидит между выводом и массой), т.е. на входе нормальные логические уровни.
Что еще проверить?
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Проверьте Bluetooth profile, именно, что для обоих характеристик разрешены нотификации. Если по одному событию происходит, то тоже не получаете нотификацию от красного диода? Я-бы посылал по одной характеристике, т.е.
Код:
if (event & (1ul << 0)) { .... } ELSE if (event & (1ul << 1)) { .... }
Извините, что замолк, но я впал в ступор... На утро после отправки своего вопроса, я сообразил, что у меня два "идентичных" канала и можно было бы их просто посегментно поменять местами. А потом, я понял, что самый первый этап этой цепи - наличие уровня на входе, я так еще и не проверил - может там контакт не пропаялся? И я сделал так, что в дефайнах поменял 4 и 5 разряд порта А местами. Хм, если раньше загорался зеленый светодиод, то теперь стал красный, а зеленый перестал зажигаться. Значит контакт всё же есть.
Заметил одну странность. Для контроля я пользуюсь аппликацией CySmart на планшете. И вот, когда я вхожу в характеристику которая работает, я вижу 2 кнопки: Notify (которую я нажимаю, чтобы видеть приход извещений) и Descriptors, а в той, которая не работает - только Notify, второй кнопки нет. После чего я стал сравнивать чем отличаются и не нашел. Но перегенерил gatt_db.* и пересобрал проект несколько раз. Правда, в результате чего, у моего клиента вообще оба светодиода перестали работать. И для того чтобы проверить, не поменялись ли номера хендлов характеристик, я подключился при помощи PCшной программы CySmart (я донглом особо не пользуюсь, потому как он слишком хлипкий и в электричке, если кто случайно зацепит его или донгл сломает, или USB порт выломает из ноутбука) и... а там все нотификации видны как надо и все работает! И номера хэндлов на месте. Так что почему вдруг перестал работать клиент мне пока не понятно. Буду разбираться и когда будет больше полезной информации, отфильтрованной от моих глюков - тогда.
Вариант с флудингом событий - не мой случай. У меня пока события происходят размеренно и медленно (кроме сериального канала). И вариантом if else пользоваться нельзя, так как я потеряю событие - ведь эта ветка второй раз не вызовется, так как нет никакого квитирования, какое из внешних событий обработано, а какое нет.
Кстати, у характристики обслуживающей сериальный порт (Notify и Write) кнопка Descriptors наличествует и нотификации приходят. Там правда, есть проблема с размером. У меня данные теряются. У характеристики поставил размер 1 и галочку variable length (или вместо 1 надо было поставить больше?) А у функции
Код:
gecko_cmd_gatt_server_send_characteristic_notification(0xFF, gattdb_serial, i, message);
написано, что за раз можно передавать ATT_MTU - 3 байта за раз. Но я не могу увидеть, сколько это ATT_MTU.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Да, очень сложно что-то посоветовать не видя всего функционирования устройства. У меня CySmart на смартфоне тоже как-то странно работает, даже иногда устройства не видит или видит с оргомной задержкой. Я перестал ей пользоваться в пользу EFR Connect. Раньше лучше работало, может быть связано с постоянными модификациями ОС Android(?) Давно они это приложение не обновляли, может и не будут больше... На компе, однако, CySmart и донгл работают пока безукоризненно.
ATT_MTU на силлабовских модулях можно прочитать/установить функциями типа gecko_cmd_gatt_set_max_mtu(). На Сайпровских этот параметр устанавливается через GUI.
Я тут занялся вплотную модулями BGM220P. Интересно, что сам чип модулей поддерживается версией 4 Studio, также как и плата Thunderboard Sense BG22, но не модуль. Они обяснили, что модуль вышел на рынок уже после того как фирма перестала развивать версию 4. Пришлось установить версию 5 наряду с 4 пока, и, в общем, не жалею. Конфигурирование периферии значительно упрощено, а логика обработки событий стека моих Bluetooth приложений практически не изменилась. Также упрощена обработка внешних прерываний и теперь не надо посылать сигнал о них в стек. Вообще, код приложения перестал крутиться вокруг событий стека и сам стек выступает как-бы как равноправная часть периферии. Надо будет ещё RTOS и security попробовать, займусь плотнее на зимних каникулах прежде чем новые статьи писать. Пока сделал на этом модуле бикон для гаража, передающий раз в секунду положение двери (акселерометр LIS2DW12) и температуру (TMP112). Токопотребление от CR2032 снизилось до 6 мкА по сравнению с ~22 мкА у модулей первого поколения. Эти данные интергируются в имя устройства, так что их можно прочитать любым сканером, даже без специального приложения и без установки соединения с модулем (впрочем, бикон и не подерживает никакие соединения и работает только на передачу).
Кстати, недавно вышла интересная демо-плата BGM220 Explorer Kit по цене всего 10$, т.е. дешевле чем все компоненты на ней, если их покупать в розницу. На плате имеется дебаггер и коннекторы для установки бесчисленных модулей mikro-BUS. Надо будет заказать что-то на пробу или самому сделать платку расширеня под них. Не понимаю, почему нигде не сказано, что на обратной стороне платы имеются площадки под Simplicity Connector для программирования внешним программатором с Wireless Main платы (нужно для измерения токопотребления этой платой). Знал-бы заранее, заказал-бы соответствующий коннектор.
Sillabs.com анансировала новые воркшопы по модулям BG22. Даже похоже, что опять будут бесплатно рассылать модули участникам.
Фирма Silicon Labs анонсировала новую серию вебинаров по Bluetooth устройствам на основе семейства BG22. Ежемесячные вебинары расписаны вплоть до октября 2021. Время и день проведения завит от региона, подробности при регистрации по ссылке выше.
Вопрос по вебинару. Они пришлют эту платку или как? Вроде зарегистрировался где-то после нового года, прислали письмо, что адрес проверен и типа будет e-mail с трекингом про высланную плату (ну я так понял), но нет ни платы, ни письма. Может, я не правильно понял?
Цитата:
We would like to inform you that your shipping address has been validated.
Your Thunderboard kit for the hands-on, virtual Bluetooth Workshop: BG22 Project Series will be shipped shortly. You will receive mailing tracking information in a separate email.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Должны прислать, особенно по первому разу. Я прошёл этот семинар 2 раза (один раз под Studio v4, и второй после выпуска Studio v5). В первый раз плату мне прислали (по-моему также без трекинга, не помню точно, т.к. было в начале лета), а во второй - нет. Я сначала думал, что не прислали, поскольку "знают", что у меня уже есть одна; кстати, я там во время одного из вебинаров ещё одну выиграл). Однако, во время семинара выяснилось, что паре участников также не прислали платы, уж не знаю какие там были обстоятельства. Лектор сказал, что следует к ним емайл прислать и плата обязательно будет выслана. Я не стал ничего писать, т.к. мне эти дополнительные платы не нужны. Но если у Вас таких плат нет, то рекомендую написать.
Сейчас этот форум просматривают: Mizetsky, vlad465 и гости: 23
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения