【Microchip WBZ451 Curiosity】-4- 从0创建简易BLE广播
[复制链接]
本帖最后由 慕容雪花 于 2023-8-17 12:00 编辑
简介:
作为一个BLE外部设备,想要被发现就需要按一定时间间隔发送广播报文,本文主要涉及BLE的GAP协议部分,该协议是保证BLE设备能互相发现和连接的规范
GAP定义了蓝牙设备如何发现和建立与其他设备的安全或不安全连接。它处理一些一般模式的业务,比如询问、命名和搜索,还处理一些安全问题,比如担保。同时还处理一些有关连接的业务,比如链路建立、信道和连接建立。GAP规定的是一些一般性的运行任务。因此,它具有强制性,并作为所有其他蓝牙应用规范的基础。
软硬件资源:
手机app: Light Blue
开发工具链:MPLABX IDE, MCC Harmony
USB-Micro线缆
项目从0开始创建,细节如下:
新建一个harmony工程:
选择框架路径:
选择Device型号:
进入到MCC选择界面,选择MPLAB HARMONY这个开发框架。
等待一段时间后,进入到MCC图形化编辑界面。
添加BLE驱动:
之后项目图如下所示:
接下来配置用到的组件参数:
BLE Stack:
之后点击MCC,自动生成配置代码:
之后,有基础源文件需要手动修改,比如app.c里面要使能广播。
void APP_Tasks ( void )
{
APP_Msg_T appMsg[1];
APP_Msg_T *p_appMsg;
p_appMsg=appMsg;
/* Check the application's current state. */
switch ( appData.state )
{
/* Application's initial state. */
case APP_STATE_INIT:
{
bool appInitialized = true;
//appData.appQueue = xQueueCreate( 10, sizeof(APP_Msg_T) );
APP_BleStackInit();
// Start Advertisement
//https://onlinedocs.microchip.com/pr/GUID-C5EAF60E-9124-427C-A0F1-F2DBE662EA92-en-US-1.2.1/index.html?GUID-C4D5F735-FEC4-4FA5-A778-C997D5A536AE
//Parameter Description
//[in] enable Advertising control option.
//[in] duration Duration for advertising. (Unit: 10 ms) Set to 0 to continuously advertise
BLE_GAP_SetAdvEnable(0x01, 0x00);
另外,生成的配置代码里面没有Device Address,需要收到配置。该处位于app_ble.c
void APP_BleConfigAdvance()
{
uint8_t devName[]={GAP_DEV_NAME_VALUE};
BLE_GAP_Addr_T devAddr;
BLE_SMP_Config_T smpParam;
BLE_DM_Config_T dmConfig;
BLE_GAP_ServiceOption_T gapServiceOptions;
// Configure Device Name
BLE_GAP_SetDeviceName(sizeof(devName), devName); /* Device Name */
devAddr.addrType = BLE_GAP_ADDR_TYPE_PUBLIC;
devAddr.addr[0] = 0xE9;
devAddr.addr[1] = 0xEA;
devAddr.addr[2] = 0xEB;
devAddr.addr[3] = 0xEC;
devAddr.addr[4] = 0xED;
devAddr.addr[5] = 0xEE;
// Configure device address
BLE_GAP_SetDeviceAddr(&devAddr);
编译,烧录:
原因分析:报错,猜测可能是USB-HUB的问题,所以直接插接在电脑上的USB口。修改后,成功下载!
之后进行测试:
按下RST,打开手机app:
关于广播报文中的RAW data,格式可以参考:Here is how the 31 bytes Advertising data and Scan response data should look like(Chapter 11 Part C Vol 3).
比如上文第二个截图中的0x020104:
0x02 = length 2 octects
0x01 = AD type flags
0x04 = BR_EDR_NOT_SUPPORTED
相关资料:
PIC32CX-BZ2/WBZ45x蓝牙协议栈API:
https://onlinedocs.microchip.com/pr/GUID-C5EAF60E-9124-427C-A0F1-F2DBE662EA92-en-US-1.2.1/index.html?GUID-94489357-3C47-427B-84D1-73FC2ACC68FA
项目文件树:
│ app.c
│ app.h
│ app_idle_task.c
│ app_idle_task.h
│ app_user_edits.c
│ main.c
│
├─app_ble
│ app_ble.c
│ app_ble.h
│ app_ble_handler.c
│ app_ble_handler.h
│
├─config
│ └─default
│ │ config.h
│ │ configuration.h
│ │ definitions.h
│ │ device.h
│ │ device_cache.h
│ │ device_vectors.h
│ │ exceptions.c
│ │ framework_defs.h
│ │ FreeRTOSConfig.h
│ │ freertos_hooks.c
│ │ harmony-manifest-success.yml
│ │ initialization.c
│ │ interrupts.c
│ │ interrupts.h
│ │ libc_syscalls.c
│ │ startup_xc32.c
│ │ tasks.c
│ │ toolchain_specifics.h
│ │ user.h
│ │ WBZ451.ld
│ │
│ ├─ble
│ │ ├─lib
│ │ │ │ ble_stack.a
│ │ │ │
│ │ │ └─include
│ │ │ att_uuid.h
│ │ │ ble_dtm.h
│ │ │ ble_gap.h
│ │ │ ble_l2cap.h
│ │ │ ble_smp.h
│ │ │ bt_sys.h
│ │ │ bt_sys_log.h
│ │ │ gap_defs.h
│ │ │ gatt.h
│ │ │ host_hci_defs.h
│ │ │ mba_error_defs.h
│ │ │ stack_mgr.h
│ │ │
│ │ └─middleware_ble
│ │ ├─ble_dm
│ │ │ ble_dm.c
│ │ │ ble_dm.h
│ │ │ ble_dm_aes.c
│ │ │ ble_dm_aes.h
│ │ │ ble_dm_conn.c
│ │ │ ble_dm_conn.h
│ │ │ ble_dm_dds.c
│ │ │ ble_dm_dds.h
│ │ │ ble_dm_info.c
│ │ │ ble_dm_info.h
│ │ │ ble_dm_internal.h
│ │ │ ble_dm_sm.c
│ │ │ ble_dm_sm.h
│ │ │
│ │ ├─ble_gcm
│ │ │ ble_dd.h
│ │ │ ble_scm.h
│ │ │
│ │ ├─ble_log
│ │ │ ble_log.h
│ │ │
│ │ └─ble_util
│ │ byte_stream.h
│ │ mw_assert.h
│ │
│ ├─crypto
│ │ │ crypto.h
│ │ │
│ │ └─src
│ │ crypto.c
│ │
│ ├─default.mhc
│ │ settings.yml
│ │
│ ├─driver
│ │ ├─device_support
│ │ │ │ pic32cx_bz2_device_support.a
│ │ │ │
│ │ │ └─include
│ │ │ info_block.h
│ │ │ pmu_system.h
│ │ │ rf_system.h
│ │ │ sleep_system.h
│ │ │
│ │ └─pds
│ │ │ pds.a
│ │ │
│ │ └─include
│ │ pds.h
│ │ pds_config.h
│ │
│ ├─osal
│ │ osal.h
│ │ osal_definitions.h
│ │ osal_freertos.c
│ │ osal_freertos.h
│ │ osal_freertos_extend.c
│ │ osal_freertos_extend.h
│ │
│ ├─peripheral
│ │ ├─clk
│ │ │ plib_clk.c
│ │ │ plib_clk.h
│ │ │
│ │ ├─cmcc
│ │ │ plib_cmcc.c
│ │ │ plib_cmcc.h
│ │ │
│ │ ├─evsys
│ │ │ plib_evsys.c
│ │ │ plib_evsys.h
│ │ │
│ │ ├─gpio
│ │ │ plib_gpio.c
│ │ │ plib_gpio.h
│ │ │
│ │ ├─nvic
│ │ │ plib_nvic.c
│ │ │ plib_nvic.h
│ │ │
│ │ └─nvm
│ │ plib_nvm.c
│ │ plib_nvm.h
│ │
│ └─stdio
│ xc32_monitor.c
│
├─packs
│ ├─CMSIS
│ │ └─CMSIS
│ │ └─Core
│ │ └─Include
│ │ cachel1_armv7.h
│ │ cmsis_armcc.h
│ │ cmsis_armclang.h
│ │ cmsis_armclang_ltm.h
│ │ cmsis_compiler.h
│ │ cmsis_gcc.h
│ │ cmsis_iccarm.h
│ │ cmsis_version.h
│ │ core_cm4.h
│ │ mpu_armv7.h
│ │
│ └─WBZ451_DFP
│ │ wbz451.h
│ │
│ ├─component
│ │ ac.h
│ │ adchs.h
│ │ aes.h
│ │ arb.h
│ │ ble.h
│ │ btzbsys.h
│ │ ccl.h
│ │ cfg.h
│ │ cmcc.h
│ │ cru.h
│ │ dmac.h
│ │ dmt.h
│ │ dscon.h
│ │ dsu.h
│ │ eic.h
│ │ evsys.h
│ │ freqm.h
│ │ fuses.h
│ │ gpio.h
│ │ hmatrixb.h
│ │ icm.h
│ │ nvm.h
│ │ pac.h
│ │ pche.h
│ │ pfw.h
│ │ pmu.h
│ │ pps.h
│ │ pukcc.h
│ │ qspi.h
│ │ ramecc.h
│ │ rcon.h
│ │ rtc.h
│ │ sercom.h
│ │ tc.h
│ │ tcc.h
│ │ trng.h
│ │ wdt.h
│ │ zigbee.h
│ │
│ ├─instance
│ │ ac.h
│ │ adchs.h
│ │ aes.h
│ │ arb.h
│ │ ble.h
│ │ btzbsys.h
│ │ ccl.h
│ │ cfg.h
│ │ cmcc.h
│ │ cru.h
│ │ dmac.h
│ │ dmt.h
│ │ dscon.h
│ │ dsu.h
│ │ eic.h
│ │ evsys.h
│ │ freqm.h
│ │ fuses.h
│ │ gpioa.h
│ │ gpiob.h
│ │ hmatrix.h
│ │ icm.h
│ │ nvm.h
│ │ pac.h
│ │ pche.h
│ │ pfw.h
│ │ pmu.h
│ │ pps.h
│ │ qspi.h
│ │ ramecc.h
│ │ rcon.h
│ │ rtc.h
│ │ sercom0.h
│ │ sercom1.h
│ │ sercom2.h
│ │ sercom3.h
│ │ tc0.h
│ │ tc1.h
│ │ tc2.h
│ │ tc3.h
│ │ tcc0.h
│ │ tcc1.h
│ │ tcc2.h
│ │ trng.h
│ │ wdt.h
│ │ zigbee.h
│ │
│ └─pio
│ wbz451.h
│
└─third_party
├─rtos
│ └─FreeRTOS
│ └─Source
│ │ croutine.c
│ │ event_groups.c
│ │ FreeRTOS_tasks.c
│ │ list.c
│ │ queue.c
│ │ stream_buffer.c
│ │ timers.c
│ │
│ ├─include
│ │ croutine.h
│ │ deprecated_definitions.h
│ │ event_groups.h
│ │ FreeRTOS.h
│ │ list.h
│ │ message_buffer.h
│ │ mpu_prototypes.h
│ │ mpu_wrappers.h
│ │ portable.h
│ │ projdefs.h
│ │ queue.h
│ │ semphr.h
│ │ stack_macros.h
│ │ stream_buffer.h
│ │ task.h
│ │ timers.h
│ │
│ └─portable
│ ├─GCC
│ │ └─SAM
│ │ └─ARM_CM4F
│ │ port.c
│ │ portmacro.h
│ │
│ └─MemMang
│ heap_4.c
│
└─wolfssl
└─wolfssl
│ certs_test.h
│
└─wolfcrypt
│ aes.h
│ arc4.h
│ asn.h
│ asn_public.h
│ blake2-impl.h
│ blake2-int.h
│ blake2.h
│ camellia.h
│ chacha.h
│ chacha20_poly1305.h
│ cmac.h
│ coding.h
│ compress.h
│ cpuid.h
│ cryptocb.h
│ curve25519.h
│ curve448.h
│ des3.h
│ dh.h
│ dsa.h
│ ecc.h
│ ed25519.h
│ ed448.h
│ error-crypt.h
│ fe_448.h
│ fe_operations.h
│ fips_test.h
│ ge_448.h
│ ge_operations.h
│ hash.h
│ hc128.h
│ hmac.h
│ idea.h
│ integer.h
│ logging.h
│ md2.h
│ md4.h
│ md5.h
│ memory.h
│ mem_track.h
│ misc.h
│ mpi_class.h
│ mpi_superclass.h
│ pkcs11.h
│ pkcs12.h
│ pkcs7.h
│ poly1305.h
│ pwdbased.h
│ rabbit.h
│ random.h
│ rc2.h
│ ripemd.h
│ rsa.h
│ selftest.h
│ settings.h
│ sha.h
│ sha256.h
│ sha3.h
│ sha512.h
│ signature.h
│ sp.h
│ sp_int.h
│ srp.h
│ tfm.h
│ types.h
│ visibility.h
│ wc_encrypt.h
│ wc_pkcs11.h
│ wc_port.h
│ wolfevent.h
│ wolfmath.h
│
├─port
│ └─pic32
│ CryptoLib_cf_pb.h
│ CryptoLib_ClearFlags_pb.h
│ CryptoLib_Comp_pb.h
│ CryptoLib_CondCopy_pb.h
│ CryptoLib_CRT_pb.h
│ CryptoLib_Div_pb.h
│ CryptoLib_ExpMod_pb.h
│ CryptoLib_FastCopy_pb.h
│ CryptoLib_Fill_pb.h
│ CryptoLib_Fmult_pb.h
│ CryptoLib_GCD_pb.h
│ CryptoLib_GF2NEccAdd_pb.h
│ CryptoLib_GF2NEccConv_pb.h
│ CryptoLib_GF2NEccDbl_pb.h
│ CryptoLib_GF2NEccMul_pb.h
│ CryptoLib_GF2NEcDsa_pb.h
│ CryptoLib_Hardware_pb.h
│ CryptoLib_Headers_pb.h
│ CryptoLib_JumpTable_pb.h
│ CryptoLib_mapping_pb.h
│ CryptoLib_PrimeGen_pb.h
│ CryptoLib_Rc_pb.h
│ CryptoLib_RedMod_pb.h
│ CryptoLib_Rng_pb.h
│ CryptoLib_SelfTest_pb.h
│ CryptoLib_Services_pb.h
│ CryptoLib_Smult_pb.h
│ CryptoLib_Square_pb.h
│ CryptoLib_Swap_pb.h
│ CryptoLib_typedef_pb.h
│ CryptoLib_ZpEccAddSub_pb.h
│ CryptoLib_ZpEccAdd_pb.h
│ CryptoLib_ZpEccConv_pb.h
│ CryptoLib_ZpEccDbl_pb.h
│ CryptoLib_ZpEccMul_pb.h
│ CryptoLib_ZpEccQuickDualMul_pb.h
│ CryptoLib_ZpEcDsa_pb.h
│ crypt_aes_hw.h
│ crypt_aes_hwInt.h
│ crypt_aes_sam6149.h
│ crypt_aes_u2238.h
│ crypt_crya_saml11.h
│ crypt_ecc_ba414e.h
│ crypt_ecc_pukcl.h
│ crypt_pukcl_definitions.h
│ crypt_pukcl_functions.h
│ crypt_rng_hw.h
│ crypt_rsa_pukcl.h
│ crypt_sha1_hw.h
│ crypt_sha224_hw.h
│ crypt_sha256_hw.h
│ crypt_sha384_hw.h
│ crypt_sha512_hw.h
│ crypt_sha_hw.h
│ crypt_sha_sam11105.h
│ crypt_sha_sam6156.h
│ crypt_tdes_hw.h
│ crypt_tdes_hwInt.h
│ crypt_tdes_sam6150.h
│ crypt_wolfcryptcb.h
│ pic32mz-crypt.h
│
└─src
│ aes.c
│ arc4.c
│ asm.c
│ asn.c
│ blake2b.c
│ blake2s.c
│ camellia.c
│ chacha.c
│ chacha20_poly1305.c
│ cmac.c
│ coding.c
│ compress.c
│ cpuid.c
│ cryptocb.c
│ curve25519.c
│ curve448.c
│ des3.c
│ dh.c
│ dsa.c
│ ecc.c
│ ecc_fp.c
│ ed25519.c
│ ed448.c
│ error.c
│ evp.c
│ fe_448.c
│ fe_low_mem.c
│ fe_operations.c
│ ge_448.c
│ ge_low_mem.c
│ ge_operations.c
│ hash.c
│ hc128.c
│ hmac.c
│ idea.c
│ integer.c
│ logging.c
│ md2.c
│ md4.c
│ md5.c
│ memory.c
│ misc.c
│ pkcs12.c
│ pkcs7.c
│ poly1305.c
│ pwdbased.c
│ rabbit.c
│ random.c
│ rc2.c
│ ripemd.c
│ rsa.c
│ sha.c
│ sha256.c
│ sha3.c
│ sha512.c
│ signature.c
│ sp_arm32.c
│ sp_arm64.c
│ sp_armthumb.c
│ sp_c32.c
│ sp_c64.c
│ sp_cortexm.c
│ sp_dsp32.c
│ sp_int.c
│ sp_x86_64.c
│ srp.c
│ tfm.c
│ wc_dsp.c
│ wc_encrypt.c
│ wc_pkcs11.c
│ wc_port.c
│ wolfevent.c
│ wolfmath.c
│
└─port
└─pic32
crypt_aes_sam6149.c
crypt_aes_u2238.c
crypt_ecc_ba414e.c
crypt_ecc_pukcl.c
crypt_pukcl_functions.c
crypt_rng_sam6334.c
crypt_rng_u2242.c
crypt_rsa_pukcl.c
crypt_sam_u2803.c
crypt_sha1_sam11105.c
crypt_sha1_sam6156.c
crypt_sha224_sam11105.c
crypt_sha224_sam6156.c
crypt_sha256_sam11105.c
crypt_sha256_sam6156.c
crypt_sha384_sam6156.c
crypt_sha512_sam6156.c
crypt_tdes_sam6150.c
crypt_wolfcryptcb.c
pic32mz-crypt.c
|