diff --git a/APP/peripheral.c b/APP/peripheral.c index a4e8671..6952739 100644 --- a/APP/peripheral.c +++ b/APP/peripheral.c @@ -43,7 +43,7 @@ */ // How often to perform periodic event -#define SBP_PERIODIC_EVT_PERIOD (160 * 10) // (160 = 100ms) +#define SBP_PERIODIC_EVT_PERIOD (160 * 10 * 5) // (160 = 100ms) // How often to perform read rssi event #define SBP_READ_RSSI_EVT_PERIOD (1600 * 3) // (160 = 100ms) @@ -76,27 +76,13 @@ // Company Identifier: WCH #define WCH_COMPANY_ID 0x07D7 -/********************************************************************* - * TYPEDEFS - */ +#define MAC_NAME "TYQ-93:B4:8F:10:53:5C" +// TYQ-93:B4:8F:10:53:5C +#define MAC_NAME_LEN 22 -/********************************************************************* - * GLOBAL VARIABLES - */ - -/********************************************************************* - * EXTERNAL VARIABLES - */ - -/********************************************************************* - * EXTERNAL FUNCTIONS - */ - -/********************************************************************* - * LOCAL VARIABLES - */ static uint8_t Peripheral_TaskID = INVALID_TASK_ID; // Task ID for internal task/event processing +// 蓝牙广播包的最大长度是37个字节,其中设备地址占用了6个字节,只有31个字节是可用的。 // TODO:响应体,名称加上MAC地址 // GAP - SCAN RSP data (max size = 31 bytes) static uint8_t scanRspData[] = { @@ -152,72 +138,6 @@ static uint8_t advertData[] = { HI_UINT16(SIMPLEPROFILE_SERV_UUID) }; -#if 0 -// 蓝牙广播包的最大长度是37个字节,其中设备地址占用了6个字节,只有31个字节是可用的。 - -// GAP - SCAN RSP data (max size = 31 bytes) -static uint8_t scanRspData[] = { - // complete name - 0x08, // length of this data - GAP_ADTYPE_LOCAL_NAME_COMPLETE, - 'B', - 'L', - 'E', - '-', - 'T', - 'Y', - 'Q', - - // connection interval range - 0x05, // length of this data - GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE, - LO_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL), // 100ms - HI_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL), - LO_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL), // 1s - HI_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL), - - // Tx power level - 0x02, // length of this data - GAP_ADTYPE_POWER_LEVEL, - 0 // 0dBm - - 0x03, // length of this data - GAP_ADTYPE_MANUFACTURER_SPECIFIC, - // 前两个字节表示厂商 ID - 0, - 0, - 0x10, // 1B 电池电压 30=3V,18=1.8V - 0x01, // 1B 阀门类型 - 0x00, // 1B 阀门工作状态 超欠压、过流 - 0x00, // 1B 阀门连接状态 (电磁阀BLE控制盒) 0=未连接 1=已连接 - 0x01, // 1B 阀门开关状态 0=未知 1=关闭 2=关闭过,未按按键恢复 3=关闭过,按下了恢复键 4=打开 - 0x03, // 1B 阀门温度 有符号整数 25 C - 0x04, // 1B 阀门进口压力 0~156 (0)kPa - 0x05, // 1B 阀门出口压力 0~100 hPa 0.1kpa - 0x06, // 1B 阀门大气压力 80~110 kPa -}; - - -// GAP - Advertisement data (max size = 31 bytes, though this is -// best kept short to conserve power while advertising) -static uint8_t advertData[] = { - // Flags; this sets the device to use limited discoverable - // mode (advertises for 30 seconds at a time) instead of general - // discoverable mode (advertises indefinitely) - 0x02, // length of this data - GAP_ADTYPE_FLAGS, - DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED, - - // service UUID, to notify central devices what services are included - // in this peripheral - 0x03, // length of this data - GAP_ADTYPE_16BIT_MORE, // some of the UUID's, but not all - LO_UINT16(SIMPLEPROFILE_SERV_UUID), - HI_UINT16(SIMPLEPROFILE_SERV_UUID) -}; - -#endif - // GAP GATT Attributes static uint8_t attDeviceName[GAP_DEVICE_NAME_LEN] = "BLE_TYQ"; @@ -301,6 +221,7 @@ void Peripheral_Init() GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initial_advertising_enable); GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof(scanRspData), scanRspData); GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData); + GAPRole_SetParameter(GAPROLE_MIN_CONN_INTERVAL, sizeof(uint16_t), &desired_min_interval); GAPRole_SetParameter(GAPROLE_MAX_CONN_INTERVAL, sizeof(uint16_t), &desired_max_interval); } @@ -347,11 +268,11 @@ void Peripheral_Init() // Setup the SimpleProfile Characteristic Values { - uint8_t charValue1[SIMPLEPROFILE_CHAR1_LEN] = {1}; - uint8_t charValue2[SIMPLEPROFILE_CHAR2_LEN] = {2}; - uint8_t charValue3[SIMPLEPROFILE_CHAR3_LEN] = {3}; - uint8_t charValue4[SIMPLEPROFILE_CHAR4_LEN] = {4}; - uint8_t charValue5[SIMPLEPROFILE_CHAR5_LEN] = {1, 2, 3, 4, 5}; + uint8_t charValue1[SIMPLEPROFILE_CHAR1_LEN] = {0}; + uint8_t charValue2[SIMPLEPROFILE_CHAR2_LEN] = {0}; + uint8_t charValue3[SIMPLEPROFILE_CHAR3_LEN] = {0}; + uint8_t charValue4[SIMPLEPROFILE_CHAR4_LEN] = {0}; + uint8_t charValue5[SIMPLEPROFILE_CHAR5_LEN] = {0, 0, 0, 0, 0}; SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR1, SIMPLEPROFILE_CHAR1_LEN, charValue1); SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR2, SIMPLEPROFILE_CHAR2_LEN, charValue2); @@ -456,7 +377,7 @@ uint16_t Peripheral_ProcessEvent(uint8_t task_id, uint16_t events) if(events & SBP_PHY_UPDATE_EVT) { // start phy update - logDebug("PHY Update %x...\n", GAPRole_UpdatePHY(peripheralConnList.connHandle, 0, + logDebug("PHY Update %x...", GAPRole_UpdatePHY(peripheralConnList.connHandle, 0, GAP_PHY_BIT_LE_2M, GAP_PHY_BIT_LE_2M, 0)); return (events ^ SBP_PHY_UPDATE_EVT); @@ -488,7 +409,7 @@ static void Peripheral_ProcessGAPMsg(gapRoleEvent_t *pEvent) { case GAP_SCAN_REQUEST_EVENT: { - logDebug("Receive scan req from %x %x %x %x %x %x ..\n", pEvent->scanReqEvt.scannerAddr[0], + logDebug("Receive scan req from %x %x %x %x %x %x ..", pEvent->scanReqEvt.scannerAddr[0], pEvent->scanReqEvt.scannerAddr[1], pEvent->scanReqEvt.scannerAddr[2], pEvent->scanReqEvt.scannerAddr[3], pEvent->scanReqEvt.scannerAddr[4], pEvent->scanReqEvt.scannerAddr[5]); break; @@ -496,7 +417,7 @@ static void Peripheral_ProcessGAPMsg(gapRoleEvent_t *pEvent) case GAP_PHY_UPDATE_EVENT: { - logDebug("Phy update Rx:%x Tx:%x ..\n", pEvent->linkPhyUpdate.connRxPHYS, pEvent->linkPhyUpdate.connTxPHYS); + logDebug("Phy update Rx:%x Tx:%x ..", pEvent->linkPhyUpdate.connRxPHYS, pEvent->linkPhyUpdate.connTxPHYS); break; } @@ -532,7 +453,7 @@ static void Peripheral_ProcessTMOSMsg(tmos_event_hdr_t *pMsg) if(pMsgEvent->method == ATT_MTU_UPDATED_EVENT) { peripheralMTU = pMsgEvent->msg.exchangeMTUReq.clientRxMTU; - logDebug("mtu exchange: %d\n", pMsgEvent->msg.exchangeMTUReq.clientRxMTU); + logDebug("mtu exchange: %d", pMsgEvent->msg.exchangeMTUReq.clientRxMTU); } break; } @@ -559,7 +480,7 @@ static void Peripheral_LinkEstablished(gapRoleEvent_t *pEvent) if(peripheralConnList.connHandle != GAP_CONNHANDLE_INIT) { GAPRole_TerminateLink(pEvent->linkCmpl.connectionHandle); - logDebug("Connection max...\n"); + logDebug("Connection max..."); } else { @@ -577,7 +498,7 @@ static void Peripheral_LinkEstablished(gapRoleEvent_t *pEvent) // Start read rssi tmos_start_task(Peripheral_TaskID, SBP_READ_RSSI_EVT, SBP_READ_RSSI_EVT_PERIOD); - logDebug("Conn %x - Int %x \n", event->connectionHandle, event->connInterval); + logDebug("Conn %x - Int %x ", event->connectionHandle, event->connInterval); } } @@ -605,13 +526,17 @@ static void Peripheral_LinkTerminated(gapRoleEvent_t *pEvent) // Restart advertising { + // 三个广播通道全部打开 + // uint8_t init_adv_channel_map = GAP_ADVCHAN_ALL ; + // GAPRole_SetParameter( GAPROLE_ADV_CHANNEL_MAP, sizeof( uint8_t ), &init_adv_channel_map); + uint8_t advertising_enable = TRUE; GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &advertising_enable); } } else { - logDebug("ERR..\n"); + logError("ERR.."); } } @@ -627,7 +552,7 @@ static void Peripheral_LinkTerminated(gapRoleEvent_t *pEvent) */ static void peripheralRssiCB(uint16_t connHandle, int8_t rssi) { - logDebug("RSSI -%d dB Conn %x \n", -rssi, connHandle); + logDebug("RSSI -%d dB Conn %x ", -rssi, connHandle); } /********************************************************************* @@ -656,7 +581,7 @@ static void peripheralParamUpdateCB(uint16_t connHandle, uint16_t connInterval, } else { - logDebug("ERR..\n"); + logError("ERR.."); } } @@ -674,19 +599,19 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven switch(newState & GAPROLE_STATE_ADV_MASK) { case GAPROLE_STARTED: - logDebug("Initialized..\n"); + logDebug("Initialized.."); break; case GAPROLE_ADVERTISING: if(pEvent->gap.opcode == GAP_LINK_TERMINATED_EVENT) { Peripheral_LinkTerminated(pEvent); - logDebug("Disconnected.. Reason:%x\n", pEvent->linkTerminate.reason); - logDebug("Advertising..\n"); + logDebug("Disconnected.. Reason:%x", pEvent->linkTerminate.reason); + logDebug("Advertising.."); } else if(pEvent->gap.opcode == GAP_MAKE_DISCOVERABLE_DONE_EVENT) { - logDebug("Advertising..\n"); + logDebug("Advertising.."); } break; @@ -694,46 +619,46 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven if(pEvent->gap.opcode == GAP_LINK_ESTABLISHED_EVENT) { Peripheral_LinkEstablished(pEvent); - logDebug("Connected..\n"); + logDebug("Connected.."); } break; case GAPROLE_CONNECTED_ADV: if(pEvent->gap.opcode == GAP_MAKE_DISCOVERABLE_DONE_EVENT) { - logDebug("Connected Advertising..\n"); + logDebug("Connected Advertising.."); } break; case GAPROLE_WAITING: if(pEvent->gap.opcode == GAP_END_DISCOVERABLE_DONE_EVENT) { - logDebug("Waiting for advertising..\n"); + logDebug("Waiting for advertising.."); } else if(pEvent->gap.opcode == GAP_LINK_TERMINATED_EVENT) { Peripheral_LinkTerminated(pEvent); - logDebug("Disconnected.. Reason:%x\n", pEvent->linkTerminate.reason); + logDebug("Disconnected.. Reason:%x", pEvent->linkTerminate.reason); } else if(pEvent->gap.opcode == GAP_LINK_ESTABLISHED_EVENT) { if(pEvent->gap.hdr.status != SUCCESS) { - logDebug("Waiting for advertising..\n"); + logDebug("Waiting for advertising.."); } else { - logDebug("Error..\n"); + logError("Err.."); } } else { - logDebug("Error..%x\n", pEvent->gap.opcode); + logError("Err..%x", pEvent->gap.opcode); } break; case GAPROLE_ERROR: - logDebug("Error..\n"); + logError("Err.."); break; default: @@ -836,7 +761,7 @@ static void peripheralChar4Notify(uint8_t *pValue, uint16_t len) attHandleValueNoti_t noti; if(len > (peripheralMTU - 3)) { - logDebug("Too large noti\n"); + logDebug("Too large noti"); return; } noti.len = len; @@ -851,9 +776,6 @@ static void peripheralChar4Notify(uint8_t *pValue, uint16_t len) } } - -uint8_t newValue[SIMPLEPROFILE_CHAR3_LEN]; - /********************************************************************* * @fn simpleProfileChangeCB * @@ -867,6 +789,7 @@ uint8_t newValue[SIMPLEPROFILE_CHAR3_LEN]; */ static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len) { + // tmos_event_hdr_t *test_message; TsRawFrameData RawData; switch(paramID) { @@ -874,30 +797,37 @@ static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len { uint8_t newValue[SIMPLEPROFILE_CHAR1_LEN]; tmos_memcpy(newValue, pValue, len); - logDebug("profile ChangeCB CHAR1.. Start\n"); + logDebug("profile ChangeCB CHAR1.. Start"); for (uint8_t i = 0; i < len; i++) { logDebug("%02x ", newValue[i]); + BSP_UART1_TxLoop(); } - logDebug("\n profile ChangeCB CHAR1.. End\n"); + logDebug("\n profile ChangeCB CHAR1.. End"); + + // test_message =(tmos_event_hdr_t*) tmos_msg_allocate(sizeof(tmos_event_hdr_t)); + BSP_UART1_TxLoop(); + break; } case SIMPLEPROFILE_CHAR3: { + uint8_t newValue[SIMPLEPROFILE_CHAR3_LEN]; tmos_memset(newValue, 0, sizeof(newValue)); tmos_memcpy(newValue, pValue, len); - logDebug("profile ChangeCB CHAR3.. Start"); - // logHexDumpAll(newValue, len); - for (uint8_t i = 0; i < len; i++) - { - logDebug("%02x ", newValue[i]); - } + logDebug("CHAR3 Start"); + logHexDumpAll(newValue, len); + // for (uint8_t i = 0; i < len; i++) + // { + // logDebug("%02x ", newValue[i]); + // } #if 1 TsFrameData *HostFrameData = BSP_VAVLE_GetFrameData(newValue, len); if (HostFrameData != NULL) { - logHexDumpAll(&HostFrameData->data[0], HostFrameData->len); // 数据段 + // logHexDumpAll(&HostFrameData->data[0], HostFrameData->len); // 数据段 + // BSP_UART1_TxLoop(); // HR_ProcessData(HostFrameData); switch (HostFrameData->cmd) { @@ -911,11 +841,13 @@ static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len logDebug("kCmdCloseVavle"); BSP_VALVE_Generate_ValveResponse(&RawData, kCmdCloseVavle, 1); peripheralChar4Notify((uint8_t*)&RawData.buf[0], RawData.len); + BSP_UART1_TxLoop(); break; case kCmdOpenVavle: logDebug("kCmdOpenVavle"); BSP_VALVE_Generate_ValveResponse(&RawData, kCmdOpenVavle, 1); peripheralChar4Notify((uint8_t*)&RawData.buf[0], RawData.len); + BSP_UART1_TxLoop(); break; default: logError("无效的命令"); @@ -923,6 +855,10 @@ static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len break; } } + else + { + logError("数据帧解析失败"); + } tmos_msg_deallocate((uint8_t*)HostFrameData); HostFrameData = NULL; #endif @@ -936,5 +872,16 @@ static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len } } -/********************************************************************* -*********************************************************************/ +// TODO:应用加入广播数据更新部分状态数据 +// 动态更新广播数据 +// taskID: 请求更改广播任务的 ID +// adType:TRUE 更改广播数据,FALSE 更改扫描回复数据 +// datalen:数据长度 +// *pAdvertData:数据指针 +void Peripheral_UpdateAdvertData(uint8_t adType, uint8_t dataLen, uint8_t *pAdvertData) +{ + GAP_UpdateAdvertisingData(Peripheral_TaskID, adType, dataLen, pAdvertData); +} + + + diff --git a/BSP/src/bsp_uart.c b/BSP/src/bsp_uart.c index 283cd9e..8534726 100644 --- a/BSP/src/bsp_uart.c +++ b/BSP/src/bsp_uart.c @@ -3,6 +3,7 @@ #include "CH59x_uart.h" #include "shell_port.h" +// https://www.cnblogs.com/iot-fan/p/14744671.html lwrb_t Uart1Rx; diff --git a/HAL/include/CONFIG.h b/HAL/include/CONFIG.h index 4d10b1d..a633c3f 100644 --- a/HAL/include/CONFIG.h +++ b/HAL/include/CONFIG.h @@ -142,7 +142,7 @@ #define PERIPHERAL_MAX_CONNECTION 1 #endif #ifndef CENTRAL_MAX_CONNECTION -#define CENTRAL_MAX_CONNECTION 3 +#define CENTRAL_MAX_CONNECTION 2 #endif extern uint32_t MEM_BUF[BLE_MEMHEAP_SIZE / 4]; diff --git a/Profile/include/gattprofile.h b/Profile/include/gattprofile.h index 29b9340..163cdee 100644 --- a/Profile/include/gattprofile.h +++ b/Profile/include/gattprofile.h @@ -46,11 +46,11 @@ extern "C" { #define SIMPLEPROFILE_SERVICE 0x00000001 // Length of characteristic in bytes ( Default MTU is 23 ) -#define SIMPLEPROFILE_CHAR1_LEN 30 -#define SIMPLEPROFILE_CHAR2_LEN 30 -#define SIMPLEPROFILE_CHAR3_LEN 30 -#define SIMPLEPROFILE_CHAR4_LEN 30 -#define SIMPLEPROFILE_CHAR5_LEN 30 +#define SIMPLEPROFILE_CHAR1_LEN 64 +#define SIMPLEPROFILE_CHAR2_LEN 64 +#define SIMPLEPROFILE_CHAR3_LEN 64 +#define SIMPLEPROFILE_CHAR4_LEN 64 +#define SIMPLEPROFILE_CHAR5_LEN 64 /********************************************************************* * TYPEDEFS