返回列表 发新帖我要提问本帖赏金: 20.00元(功能说明)

[蓝牙芯片] 分享CH582的MultiCentral一主二从实现接收两蓝牙从机noti

[复制链接]
 楼主| lilijin1995 发表于 2023-3-14 11:26 | 显示全部楼层 |阅读模式
<
本帖最后由 lilijin1995 于 2023-3-14 14:34 编辑

背景:
之前有使用过Multicentral还是之前的CH58x_BLE_LIB_V1.41版本,连接两个其他品牌蓝牙芯片FR8012HAQ从机,是可以直接接收到两个从机的notify的。现在两个从机都改成CH582了。然后连接之后,只收到了先连接的那个从机的noti,然后一看Multicentral,只实现了连接0的:如下图
8121364100a44a5e6b.png

一开始我也是想直接添加连接1的,但第一次添加的时候我应该是忘记调用了,然后才没有成功,我还特意找了WCH的FAE问了,是直接根据连接0的重写一遍就行。

软件说明:
添加连接1的处理之前,我们先来看看BLE Central是怎么启动的:
  1. void Central_Init()
  2. {
  3.     centralTaskId = TMOS_ProcessEventRegister(Central_ProcessEvent);

  4.     // Setup GAP
  5.     GAP_SetParamValue(TGAP_DISC_SCAN, DEFAULT_SCAN_DURATION);
  6.     GAP_SetParamValue(TGAP_CONN_EST_INT_MIN, DEFAULT_MIN_CONNECTION_INTERVAL);
  7.     GAP_SetParamValue(TGAP_CONN_EST_INT_MAX, DEFAULT_MAX_CONNECTION_INTERVAL);
  8.     GAP_SetParamValue(TGAP_CONN_EST_SUPERV_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT);

  9.     // Setup the GAP Bond Manager
  10.     {
  11.         uint32_t passkey = DEFAULT_PASSCODE;
  12.         uint8_t  pairMode = DEFAULT_PAIRING_MODE;
  13.         uint8_t  mitm = DEFAULT_MITM_MODE;
  14.         uint8_t  ioCap = DEFAULT_IO_CAPABILITIES;
  15.         uint8_t  bonding = DEFAULT_BONDING_MODE;

  16.         GAPBondMgr_SetParameter(GAPBOND_CENT_DEFAULT_PASSCODE, sizeof(uint32_t), &passkey);
  17.         GAPBondMgr_SetParameter(GAPBOND_CENT_PAIRING_MODE, sizeof(uint8_t), &pairMode);
  18.         GAPBondMgr_SetParameter(GAPBOND_CENT_MITM_PROTECTION, sizeof(uint8_t), &mitm);
  19.         GAPBondMgr_SetParameter(GAPBOND_CENT_IO_CAPABILITIES, sizeof(uint8_t), &ioCap);
  20.         GAPBondMgr_SetParameter(GAPBOND_CENT_BONDING_ENABLED, sizeof(uint8_t), &bonding);
  21.     }

  22.     // Init Connection Item
  23.     centralInitConnItem(centralTaskId, centralConnList);
  24.     // Initialize GATT Client
  25.     GATT_InitClient();
  26.     // Register to receive incoming ATT Indications/Notifications
  27.     GATT_RegisterForInd(centralTaskId);
  28.     // Setup a delayed profile startup
  29.     tmos_set_event(centralTaskId, START_DEVICE_EVT);
  30. }
wch的BLE协议实现好像都是基于TMOS的,在Central_Init这个我们看到最后一行代码这里tmos_set_event(centralTaskId, START_DEVICE_EVT)直接启动设备启动事件,我们直接看事件回调函数Central_ProcessEvent里面的START_DEVICE_EVT
  1. uint16_t Central_ProcessEvent(uint8_t task_id, uint16_t events)
  2. {
  3.     if(events & SYS_EVENT_MSG)
  4.     {
  5.         uint8_t *pMsg;

  6.         if((pMsg = tmos_msg_receive(centralTaskId)) != NULL)
  7.         {
  8.             central_ProcessTMOSMsg((tmos_event_hdr_t *)pMsg);
  9.             // Release the TMOS message
  10.             tmos_msg_deallocate(pMsg);
  11.         }
  12.         // return unprocessed events
  13.         return (events ^ SYS_EVENT_MSG);
  14.     }

  15.     if(events & START_DEVICE_EVT)
  16.     {
  17.         // Start the Device
  18.         GAPRole_CentralStartDevice(centralTaskId, ¢ralBondCB, ¢ralRoleCB);
  19.         return (events ^ START_DEVICE_EVT);
  20.     }
  21. }
在GAPRole_CentralStartDevice(centralTaskId, ¢ralBondCB, ¢ralRoleCB)里面又实现了
绑定管理回调函数:
  1. // Bond Manager Callbacks
  2. static gapBondCBs_t centralBondCB = {
  3.     centralPasscodeCB,
  4.     centralPairStateCB
  5. };
以及GAP角色回调函数
  1. // GAP Role Callbacks
  2. static gapCentralRoleCB_t centralRoleCB = {
  3.     centralRssiCB,        // RSSI callback
  4.     centralEventCB,       // Event callback
  5.     centralHciMTUChangeCB // MTU change callback
  6. };
centralEventCB这个事件回调函数里面全是GAP连接相关的事件的处理,GAP连接相关的事件可以CH58xBLE_LIB.h里面找到
  1. #define GAP_DEVICE_INIT_DONE_EVENT              0x00 //!< Sent when the Device Initialization is complete.  This event is sent as an tmos message defined as gapDeviceInitDoneEvent_t.
  2. #define GAP_DEVICE_DISCOVERY_EVENT              0x01 //!< Sent when the Device Discovery Process is complete. This event is sent as an tmos message defined as gapDevDiscEvent_t.
  3. #define GAP_ADV_DATA_UPDATE_DONE_EVENT          0x02 //!< Sent when the Advertising Data or SCAN_RSP Data has been updated. This event is sent as an tmos message defined as gapAdvDataUpdateEvent_t.
  4. #define GAP_MAKE_DISCOVERABLE_DONE_EVENT        0x03 //!< Sent when the Make Discoverable Request is complete. This event is sent as an tmos message defined as gapMakeDiscoverableRspEvent_t.
  5. #define GAP_END_DISCOVERABLE_DONE_EVENT         0x04 //!< Sent when the Advertising has ended. This event is sent as an tmos message defined as gapEndDiscoverableRspEvent_t.
  6. #define GAP_LINK_ESTABLISHED_EVENT              0x05 //!< Sent when the Establish Link Request is complete. This event is sent as an tmos message defined as gapEstLinkReqEvent_t.
  7. #define GAP_LINK_TERMINATED_EVENT               0x06 //!< Sent when a connection was terminated. This event is sent as an tmos message defined as gapTerminateLinkEvent_t.
  8. #define GAP_LINK_PARAM_UPDATE_EVENT             0x07 //!< Sent when an Update Parameters Event is received. This event is sent as an tmos message defined as gapLinkUpdateEvent_t.
我们在GAP_DEVICE_INFO_EVENT里面过滤一下"Simple Peripheral"广播的peripheral如下代码:
  1.         case GAP_DEVICE_INFO_EVENT:
  2.         {
  3.             // Add device to list
  4.             if(strstr(pEvent->deviceInfo.pEvtData,"Simple Peripheral")!=NULL)
  5.             {
  6.                 PRINT("%s\r\n",pEvent->deviceInfo.pEvtData);
  7.                 centralAddDeviceInfo(pEvent->deviceInfo.addr, pEvent->deviceInfo.addrType);

  8.             }
  9. //            // Add device to list
  10. //            centralAddDeviceInfo(pEvent->deviceInfo.addr, pEvent->deviceInfo.addrType);
  11.         }
这样MultiCentral就只添加Simple Peripheral了。
接着修改对端设备地址,根据MAC连接的,并且我们只需要2个外设设备,所以这里修改一下对端设备地址和连接数:
  1. #ifndef CENTRAL_MAX_CONNECTION
  2. #define CENTRAL_MAX_CONNECTION              2
  3. #endif
  4. // Peer device address
  5. static peerAddrDefItem_t PeerAddrDef[CENTRAL_MAX_CONNECTION] = {
  6.     {0x3d, 0x61, 0x85, 0x26, 0x3b, 0x38 },
  7.     {0x34, 0x53, 0x24, 0x7b, 0x54, 0x50 }
  8. };

GAP_LINK_ESTABLISHED_EVENT是建立连接的事件,在这里wch已经实现了连接0的了,如下:
  1.                     //  连接0
  2.                     if(connItem == CONNECT0_ITEM)
  3.                     {
  4.                         centralConnList[connItem].procedureInProgress = TRUE;

  5.                         // Initiate service discovery
  6.                         tmos_start_task(centralConnList[connItem].taskID, START_SVC_DISCOVERY_EVT, DEFAULT_SVC_DISCOVERY_DELAY);

  7.                         // Initiate connect parameter update
  8.                         tmos_start_task(centralConnList[connItem].taskID, START_PARAM_UPDATE_EVT, DEFAULT_PARAM_UPDATE_DELAY);

  9.                         // Start RSSI polling
  10.                         tmos_start_task(centralConnList[connItem].taskID, START_READ_RSSI_EVT, DEFAULT_RSSI_PERIOD);
  11.                     }
这里直接复制连接0的即可:
  1.                     //  连接1
  2.                     else if(connItem == CONNECT1_ITEM)
  3.                     {
  4.                         centralConnList[connItem].procedureInProgress = TRUE;

  5.                         // Initiate service discovery
  6.                         tmos_start_task(centralConnList[connItem].taskID, START_SVC_DISCOVERY_EVT, DEFAULT_SVC_DISCOVERY_DELAY);

  7.                         // Initiate connect parameter update
  8.                         tmos_start_task(centralConnList[connItem].taskID, START_PARAM_UPDATE_EVT, DEFAULT_PARAM_UPDATE_DELAY);

  9.                         // Start RSSI polling
  10.                         tmos_start_task(centralConnList[connItem].taskID, START_READ_RSSI_EVT, DEFAULT_RSSI_PERIOD);
  11.                     }
我们可以看到,这里启动了发现服务,参数更新,RSSI任务,那我们对应的也需要修改一下。连接0的是connect0_ProcessEvent处理的,那么我们直接复制修改如下:
  1. static uint16_t connect1_ProcessEvent(uint8_t task_id, uint16_t events)
  2. {
  3.     if(events & START_SVC_DISCOVERY_EVT)
  4.     {
  5.         // start service discovery
  6.         centralConnIistStartDiscovery_1();
  7.         return (events ^ START_SVC_DISCOVERY_EVT);
  8.     }

  9.     if(events & START_READ_OR_WRITE_EVT)
  10.     {
  11.         if(centralConnList[CONNECT1_ITEM].procedureInProgress == FALSE)
  12.         {
  13.             if(centralDoWrite)
  14.             {
  15.                 // Do a write
  16.                 attWriteReq_t req;

  17.                 req.cmd = FALSE;
  18.                 req.sig = FALSE;
  19.                 req.handle = centralConnList[CONNECT1_ITEM].charHdl;
  20.                 req.len = 1;
  21.                 req.pValue = GATT_bm_alloc(centralConnList[CONNECT1_ITEM].connHandle, ATT_WRITE_REQ, req.len, NULL, 0);
  22.                 if(req.pValue != NULL)
  23.                 {
  24.                     *req.pValue = centralCharVal;

  25.                     if(GATT_WriteCharValue(centralConnList[CONNECT1_ITEM].connHandle, &req, centralTaskId) == SUCCESS)
  26.                     {
  27.                         centralConnList[CONNECT1_ITEM].procedureInProgress = TRUE;
  28.                         centralDoWrite = !centralDoWrite;
  29.                         tmos_start_task(centralConnList[CONNECT1_ITEM].taskID, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);
  30.                     }
  31.                     else
  32.                     {
  33.                         GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);
  34.                     }
  35.                 }
  36.             }
  37.             else
  38.             {
  39.                 // Do a read
  40.                 attReadReq_t req;

  41.                 req.handle = centralConnList[CONNECT1_ITEM].charHdl;
  42.                 if(GATT_ReadCharValue(centralConnList[CONNECT1_ITEM].connHandle, &req, centralTaskId) == SUCCESS)
  43.                 {
  44.                     centralConnList[CONNECT1_ITEM].procedureInProgress = TRUE;
  45.                     centralDoWrite = !centralDoWrite;
  46.                 }
  47.             }
  48.         }
  49.         return (events ^ START_READ_OR_WRITE_EVT);
  50.     }

  51.     if(events & START_PARAM_UPDATE_EVT)
  52.     {
  53.         // start connect parameter update
  54.         GAPRole_UpdateLink(centralConnList[CONNECT1_ITEM].connHandle,
  55.                            DEFAULT_UPDATE_MIN_CONN_INTERVAL,
  56.                            DEFAULT_UPDATE_MAX_CONN_INTERVAL,
  57.                            DEFAULT_UPDATE_SLAVE_LATENCY,
  58.                            DEFAULT_UPDATE_CONN_TIMEOUT);

  59.         return (events ^ START_PARAM_UPDATE_EVT);
  60.     }

  61.     if(events & START_WRITE_CCCD_EVT)
  62.     {
  63.         if(centralConnList[CONNECT1_ITEM].procedureInProgress == FALSE)
  64.         {
  65.             // Do a write
  66.             attWriteReq_t req;

  67.             req.cmd = FALSE;
  68.             req.sig = FALSE;
  69.             req.handle = centralConnList[CONNECT1_ITEM].cccHdl;
  70.             req.len = 2;
  71.             req.pValue = GATT_bm_alloc(centralConnList[CONNECT1_ITEM].connHandle, ATT_WRITE_REQ, req.len, NULL, 0);
  72.             if(req.pValue != NULL)
  73.             {
  74.                 req.pValue[0] = 1;
  75.                 req.pValue[1] = 0;

  76.                 if(GATT_WriteCharValue(centralConnList[CONNECT1_ITEM].connHandle, &req, centralTaskId) == SUCCESS)
  77.                 {
  78.                     centralConnList[CONNECT1_ITEM].procedureInProgress = TRUE;
  79.                 }
  80.                 else
  81.                 {
  82.                     GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);
  83.                 }
  84.             }
  85.         }
  86.         return (events ^ START_WRITE_CCCD_EVT);
  87.     }

  88.     if(events & START_READ_RSSI_EVT)
  89.     {
  90.         GAPRole_ReadRssiCmd(centralConnList[CONNECT1_ITEM].connHandle);
  91.         tmos_start_task(centralConnList[CONNECT1_ITEM].taskID, START_READ_RSSI_EVT, DEFAULT_RSSI_PERIOD);
  92.         return (events ^ START_READ_RSSI_EVT);
  93.     }
  94.     // Discard unknown events
  95.     return 0;
  96. }
把CONNECT0_ITEM改成CONNECT1_ITEM,编译一下会发现centralConnIistStartDiscovery_1还没实现,这里也是复制粘贴修改
  1. static void centralConnIistStartDiscovery_1(void)
  2. {
  3.     uint8_t uuid[ATT_BT_UUID_SIZE] = {LO_UINT16(SIMPLEPROFILE_SERV_UUID),
  4.                                       HI_UINT16(SIMPLEPROFILE_SERV_UUID)};

  5.     // Initialize cached handles
  6.     centralConnList[CONNECT1_ITEM].svcStartHdl = centralConnList[CONNECT1_ITEM].svcEndHdl = centralConnList[CONNECT1_ITEM].charHdl = 0;

  7.     centralConnList[CONNECT1_ITEM].discState = BLE_DISC_STATE_SVC;

  8.     // Discovery simple BLE service
  9.     GATT_DiscPrimaryServiceByUUID(centralConnList[CONNECT1_ITEM].connHandle,
  10.                                   uuid,
  11.                                   ATT_BT_UUID_SIZE,
  12.                                   centralTaskId);
  13. }
然后回到,Central_ProcessEvent添加调用
  1.     // 连接1的任务处理
  2.     else if(task_id == centralConnList[CONNECT1_ITEM].taskID)
  3.     {
  4.         return connect1_ProcessEvent(task_id, events);
  5.     }

如果直接编译下载的话,估计跟我第一次修改实现的一样,还是只能接收先连接的,只有一个外设的noti,
因为我还差了一步:
  1. /*********************************************************************
  2. * @fn      centralGATTDiscoveryEvent
  3. *
  4. * [url=home.php?mod=space&uid=247401]@brief[/url]   Process GATT discovery event
  5. *
  6. * [url=home.php?mod=space&uid=266161]@return[/url]  none
  7. */
  8. static void centralGATTDiscoveryEvent(uint8_t connItem, gattMsgEvent_t *pMsg)
  9. {
  10.     attReadByTypeReq_t req;
  11.     //  连接0的枚举
  12.     if(connItem == CONNECT0_ITEM)
  13.     {
  14.         if(centralConnList[connItem].discState == BLE_DISC_STATE_SVC)
  15.         {
  16.             // Service found, store handles
  17.             if(pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP &&
  18.                pMsg->msg.findByTypeValueRsp.numInfo > 0)
  19.             {
  20.                 centralConnList[connItem].svcStartHdl = ATT_ATTR_HANDLE(pMsg->msg.findByTypeValueRsp.pHandlesInfo, 0);
  21.                 centralConnList[connItem].svcEndHdl = ATT_GRP_END_HANDLE(pMsg->msg.findByTypeValueRsp.pHandlesInfo, 0);

  22.                 // Display Profile Service handle range
  23.                 PRINT("Found Profile Service handle : %x ~ %x \n", centralConnList[connItem].svcStartHdl, centralConnList[connItem].svcEndHdl);
  24.             }
  25.             // If procedure complete
  26.             if((pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP &&
  27.                 pMsg->hdr.status == bleProcedureComplete) ||
  28.                (pMsg->method == ATT_ERROR_RSP))
  29.             {
  30.                 if(centralConnList[connItem].svcStartHdl != 0)
  31.                 {
  32.                     // Discover characteristic
  33.                     centralConnList[connItem].discState = BLE_DISC_STATE_CHAR;
  34.                     req.startHandle = centralConnList[connItem].svcStartHdl;
  35.                     req.endHandle = centralConnList[connItem].svcEndHdl;
  36.                     req.type.len = ATT_BT_UUID_SIZE;
  37.                     req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR1_UUID);
  38.                     req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR1_UUID);

  39.                     GATT_ReadUsingCharUUID(centralConnList[connItem].connHandle, &req, centralTaskId);
  40.                 }
  41.             }
  42.         }
  43.         else if(centralConnList[connItem].discState == BLE_DISC_STATE_CHAR)
  44.         {
  45.             // Characteristic found, store handle
  46.             if(pMsg->method == ATT_READ_BY_TYPE_RSP &&
  47.                pMsg->msg.readByTypeRsp.numPairs > 0)
  48.             {
  49.                 centralConnList[connItem].charHdl = BUILD_UINT16(pMsg->msg.readByTypeRsp.pDataList[0],
  50.                                                                  pMsg->msg.readByTypeRsp.pDataList[1]);
  51.                 centralConnList[connItem].procedureInProgress = FALSE;

  52.                 // Start do read or write
  53.                 tmos_start_task(centralConnList[connItem].taskID, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);

  54.                 // Display Characteristic 1 handle
  55.                 PRINT("Found Characteristic 1 handle : %x \n", centralConnList[0].charHdl);
  56.             }

  57.             if((pMsg->method == ATT_READ_BY_TYPE_RSP &&
  58.                 pMsg->hdr.status == bleProcedureComplete) ||
  59.                 (pMsg->method == ATT_ERROR_RSP))
  60.             {
  61.                 // Discover characteristic
  62.                 centralConnList[connItem].discState = BLE_DISC_STATE_CCCD;
  63.                 req.startHandle = centralConnList[connItem].svcStartHdl;
  64.                 req.endHandle = centralConnList[connItem].svcEndHdl;
  65.                 req.type.len = ATT_BT_UUID_SIZE;
  66.                 req.type.uuid[0] = LO_UINT16(GATT_CLIENT_CHAR_CFG_UUID);
  67.                 req.type.uuid[1] = HI_UINT16(GATT_CLIENT_CHAR_CFG_UUID);

  68.                 GATT_ReadUsingCharUUID(centralConnList[connItem].connHandle, &req, centralTaskId);
  69.             }

  70.         }
  71.         else if(centralConnList[connItem].discState == BLE_DISC_STATE_CCCD)
  72.         {
  73.             // Characteristic found, store handle
  74.             if(pMsg->method == ATT_READ_BY_TYPE_RSP &&
  75.             pMsg->msg.readByTypeRsp.numPairs > 0)
  76.             {
  77.                 centralConnList[connItem].cccHdl = BUILD_UINT16(pMsg->msg.readByTypeRsp.pDataList[0],
  78.                                             pMsg->msg.readByTypeRsp.pDataList[1]);

  79.                 centralConnList[connItem].procedureInProgress = FALSE;

  80.                 // Start do write CCCD
  81.                 tmos_start_task(centralConnList[connItem].taskID, START_WRITE_CCCD_EVT, DEFAULT_WRITE_CCCD_DELAY);

  82.                 // Display Characteristic 1 handle
  83.                 PRINT("Found client characteristic configuration handle : %x \n", centralConnList[connItem].cccHdl);
  84.             }
  85.             centralConnList[connItem].discState = BLE_DISC_STATE_IDLE;
  86.         }
  87.     }
  88.     //  连接1的枚举
  89.     else if(connItem == CONNECT1_ITEM)
  90.     {
  91.         if(centralConnList[connItem].discState == BLE_DISC_STATE_SVC)
  92.         {
  93.             // Service found, store handles
  94.             if(pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP &&
  95.                pMsg->msg.findByTypeValueRsp.numInfo > 0)
  96.             {
  97.                 centralConnList[connItem].svcStartHdl = ATT_ATTR_HANDLE(pMsg->msg.findByTypeValueRsp.pHandlesInfo, 0);
  98.                 centralConnList[connItem].svcEndHdl = ATT_GRP_END_HANDLE(pMsg->msg.findByTypeValueRsp.pHandlesInfo, 0);

  99.                 // Display Profile Service handle range
  100.                 PRINT("Found Profile Service handle : %x ~ %x \n", centralConnList[connItem].svcStartHdl, centralConnList[connItem].svcEndHdl);
  101.             }
  102.             // If procedure complete
  103.             if((pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP &&
  104.                 pMsg->hdr.status == bleProcedureComplete) ||
  105.                (pMsg->method == ATT_ERROR_RSP))
  106.             {
  107.                 if(centralConnList[connItem].svcStartHdl != 0)
  108.                 {
  109.                     // Discover characteristic
  110.                     centralConnList[connItem].discState = BLE_DISC_STATE_CHAR;
  111.                     req.startHandle = centralConnList[connItem].svcStartHdl;
  112.                     req.endHandle = centralConnList[connItem].svcEndHdl;
  113.                     req.type.len = ATT_BT_UUID_SIZE;
  114.                     req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR1_UUID);
  115.                     req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR1_UUID);

  116.                     GATT_ReadUsingCharUUID(centralConnList[connItem].connHandle, &req, centralTaskId);
  117.                 }
  118.             }
  119.         }
  120.         else if(centralConnList[connItem].discState == BLE_DISC_STATE_CHAR)
  121.         {
  122.             // Characteristic found, store handle
  123.             if(pMsg->method == ATT_READ_BY_TYPE_RSP &&
  124.                pMsg->msg.readByTypeRsp.numPairs > 0)
  125.             {
  126.                 centralConnList[connItem].charHdl = BUILD_UINT16(pMsg->msg.readByTypeRsp.pDataList[0],
  127.                                                                  pMsg->msg.readByTypeRsp.pDataList[1]);
  128.                 centralConnList[connItem].procedureInProgress = FALSE;

  129.                 // Start do read or write
  130.                 tmos_start_task(centralConnList[connItem].taskID, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);

  131.                 // Display Characteristic 1 handle
  132.                 PRINT("Found Characteristic 1 handle : %x \n", centralConnList[0].charHdl);
  133.             }

  134.             if((pMsg->method == ATT_READ_BY_TYPE_RSP &&
  135.                 pMsg->hdr.status == bleProcedureComplete) ||
  136.                 (pMsg->method == ATT_ERROR_RSP))
  137.             {
  138.                 // Discover characteristic
  139.                 centralConnList[connItem].discState = BLE_DISC_STATE_CCCD;
  140.                 req.startHandle = centralConnList[connItem].svcStartHdl;
  141.                 req.endHandle = centralConnList[connItem].svcEndHdl;
  142.                 req.type.len = ATT_BT_UUID_SIZE;
  143.                 req.type.uuid[0] = LO_UINT16(GATT_CLIENT_CHAR_CFG_UUID);
  144.                 req.type.uuid[1] = HI_UINT16(GATT_CLIENT_CHAR_CFG_UUID);

  145.                 GATT_ReadUsingCharUUID(centralConnList[connItem].connHandle, &req, centralTaskId);
  146.             }

  147.         }
  148.         else if(centralConnList[connItem].discState == BLE_DISC_STATE_CCCD)
  149.         {
  150.             // Characteristic found, store handle
  151.             if(pMsg->method == ATT_READ_BY_TYPE_RSP &&
  152.             pMsg->msg.readByTypeRsp.numPairs > 0)
  153.             {
  154.                 centralConnList[connItem].cccHdl = BUILD_UINT16(pMsg->msg.readByTypeRsp.pDataList[0],
  155.                                             pMsg->msg.readByTypeRsp.pDataList[1]);

  156.                 centralConnList[connItem].procedureInProgress = FALSE;

  157.                 // Start do write CCCD
  158.                 tmos_start_task(centralConnList[connItem].taskID, START_WRITE_CCCD_EVT, DEFAULT_WRITE_CCCD_DELAY);

  159.                 // Display Characteristic 1 handle
  160.                 PRINT("Found client characteristic configuration handle : %x \n", centralConnList[connItem].cccHdl);
  161.             }
  162.             centralConnList[connItem].discState = BLE_DISC_STATE_IDLE;
  163.         }
  164.     }
  165.     //  连接2的枚举
  166.     else if(connItem == CONNECT2_ITEM)
  167.     {
  168.     }
  169. }
要在这个函数里面实现连接1的枚举。

最后可以看到multicentrl是有接收两个设备的noti 563476410155b33597.png


打赏榜单

21ic小管家 打赏了 20.00 元 2023-04-14

zhuotuzi 发表于 2023-3-19 17:37 | 显示全部楼层
学习了,受教了。
tpgf 发表于 2023-4-10 10:22 | 显示全部楼层
TMOS是沁恒微电子针对蓝牙协议栈开发的“操作系统”,是简化版的OSAL
qcliu 发表于 2023-4-10 11:14 | 显示全部楼层
要实现一个BLE应用,首先需要一个支持BLE射频的芯片,然后还需要提供一个与此芯片配套的BLE协议栈,最后在协议栈上开发自己的应用
drer 发表于 2023-4-10 11:24 | 显示全部楼层
TMOS是通过时间片轮询的方式实现多任务调度运行,实际上每次只有一个任务运行
coshi 发表于 2023-4-10 12:00 | 显示全部楼层
TMOS循环查询任务链表,根据任务ID确定优先级,越小越高
kxsi 发表于 2023-4-10 12:18 | 显示全部楼层
如果使用了ble,建议不要在单个任务中执行超过连接间隔一半时长的任务,否则将影响蓝牙通讯
wiba 发表于 2023-4-10 13:25 | 显示全部楼层
请注意 ,  TMOS禁止在中断中调用任务调度函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

165

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部