OSAL操作系统实验学习笔记08

    xiaoxiao2021-04-05  38

    广播

    1.开启广播

    uint8 initial_advertising_enable = TRUE; GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );

    然后我们进入到GAPRole_SetParameter中发现,每次进到这个函数里,就会把gapRole_AdvEnabled的值保存到oldAdvEnabled,再把新的状态写到gapRole_AdvEnabled。

    uint8 oldAdvEnabled = gapRole_AdvEnabled; gapRole_AdvEnabled = *((uint8*)pValue);

    然后在这个函数中打开广播的情况是

    else if ( (oldAdvEnabled == FALSE) && (gapRole_AdvEnabled) ) { // Turn on Advertising if ( (gapRole_state == GAPROLE_STARTED) || (gapRole_state == GAPROLE_WAITING) || (gapRole_state == GAPROLE_WAITING_AFTER_TIMEOUT) ) { VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); } }

    执行START_ADVERTISING_EVT这个事件。

    //START_ADVERTISING_EVT事件

    if ( events & START_ADVERTISING_EVT ) { ................................. if ( GAP_MakeDiscoverable( gapRole_TaskID, &params ) != SUCCESS ) ......................................... }

    这个事件里面调用GAP_MakeDiscoverable就打开了广播。 当广播开启不成功,会调用simpleBLEPeripheral_PeripheralCBs的回调函数peripheralStateNotificationCB的GAPROLE_ERROR. 2.广播现象 我用的是AmoMcu的板子,oled上显示的第二行是MAC的地址,如图 /………………………………………../

    define GAPROLE_BD_ADDR 0x304 //Device’s Address

    GAPRole_GetParameter(GAPROLE_BD_ADDR, ownAddress); //配置设备地址 HalLcdWriteString( bdAddr2Str( ownAddress ), HAL_LCD_LINE_2 ); //显示地址

    地址用字符串的形式显char *bdAddr2Str( uint8 *pAddr ) { uint8 i; char hex[] = “0123456789ABCDEF”; static char str[B_ADDR_STR_LEN]; char *pStr = str; *pStr++ = ‘0’; *pStr++ = ‘x’; // Start from end of addr pAddr += B_ADDR_LEN; for ( i = B_ADDR_LEN; i > 0; i– ) { pStr++ = hex[–pAddr >> 4]; *pStr++ = hex[*pAddr & 0x0F]; } *pStr = 0; return str; }C(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置。在OSI模型中,第三层网络层负责 IP地址,第二层数据链路层则负责 MAC地址。因此一个主机会有一个MAC地址,而每个网络位置会有一个专属于它的IP地址) 手机打开BLE读写器显示的数据累加变化,如图

    static uint8 index = 0; index++; // 累加 //动态改变广播数据,1秒钟内累加1, 如果跟数据加密结合起来, 就可以达到商用目的 advertData_Ex[4+0] = index; advertData_Ex[4+1] = index; advertData_Ex[4+2] = index; advertData_Ex[4+3] = index; advertData_Ex[4+4] = index; advertData_Ex[4+5] = index; advertData_Ex[4+6] = index; advertData_Ex[4+7] = index; // 掉用以下函数达到更新广播内容的目的 GAP_UpdateAdvertisingData( simpleBLEPeripheral_TaskID, TRUE, sizeof( advertData_Ex ), advertData_Ex );

    至于手机和板子连接的代码是写在GAP协议里面的,GATT用来做数据交换,具体可以细细阅读了解GAP和GATT协议。

    转载请注明原文地址: https://ju.6miu.com/read-666338.html

    最新回复(0)