1 Reply Latest reply on Aug 18, 2015 10:50 PM by VictorZ_46

    Peer, bonding and Notifications

      Hello everybody,

       

      I'm still creating a BLE application on the BCM20736S that is more or less an enhanced UART-bridge from a Cortex-M4 to BLE. The SDK version is 2.2.1.

       

      Receiving data via BLE and sending it on PUART to the Cortex is working flawlessly, the other way round, it is hampered by not sending a notification.

      This function fails:

      __find_bonded_peer
      

      It is called inside these generated functions:

      BOOL store_in_db_*(UINT8* p_value, UINT8 value_len, BOOL write, BOOL notify)
      

       

      But the iPhone is connected to the BLE module and the connection up callback is executed. A maximum of five peers is allowed.

       

      I'm afraid, that there might be a basic misunderstanding on my side, regarding peers and bonding.

      Do I have to actively add a peer on connection up? How to do this?

       

      The use case is, that multiple devices are connected to the BLE module, be it mobile phones or future BLE accessories. But at the moment I'd be glad, if only one device would work...

       

      On the iPhone a cross-platform software built around the Xamarin/MonkeyRobotics toolkit is running.

       

      Using my custom function

      static void notificationWithDB(UINT16 handle, unsigned char *data, unsigned char length)
      {
          static const unsigned char zeroPad[22] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
          unsigned int i;
          BLEPROFILE_DB_PDU tempPDU;
          if(length > 0)
          {
              i = bleprofile_ReadHandle(handle, &tempPDU);
              if (tempPDU.len > length) //zero padding here
              {
                  memcpy(tempPDU.pdu, zeroPad, tempPDU.len);
                  memcpy(tempPDU.pdu, data, length);
              } else if (tempPDU.len == length)
              {
                  memcpy(tempPDU.pdu, data, length);
              } else //truncate the data
              {
                  memcpy(tempPDU.pdu, data, tempPDU.len);
              }
              bleprofile_WriteHandle(handle, &tempPDU);
              if (blecm_getAvailableTxBuffers() > 0)
              {
                  bleprofile_sendNotification(handle, data, (INT32) length);
              }
          }
      }
      

      a notification is send.

      Some of these do not contain any attribute data and crash the iPhone.

       

      Do you spot a bug?

       

      Thanks for your help!

       

      Best regards

      Hannes Baumgart

        • 1. Re: Peer, bonding and Notifications
          VictorZ_46

          I assume your characteristic value is less or equal 20 octets in length.  Hopefully following should work better.

           

          static void notificationWithDB(UINT16 handle, unsigned char *data, unsigned char length) 

              BLEPROFILE_DB_PDU tempPDU;

              if (length > 0) 

              { 

                  memset(tempPDU.pdu, 0, sizeof(tempPDU.pdu)); 

                  bleprofile_ReadHandle(handle, &tempPDU);

                 

                  if (length > tempPDU.len)

                  {

                      length = tempPDU.len;

                  }

                  memcpy(tempPDU.pdu, data, length); 

                 

                  bleprofile_WriteHandle(handle, &tempPDU); 

           

                  if (blecm_getAvailableTxBuffers() > 0) 

                  { 

                      bleprofile_sendNotification(handle, tempPDU.pdu, (INT32) tempPDU.len); 

                  } 

              }