You are reading a single comment by @LongJogger and its replies. Click here to read the full conversation.
  • I had two issues during testing:

    1. I think the parameters in the set methods were in a wrong order: typedarr.set(array [,offset])
    2. NRF.setAdvertising has not accepted the Uint8Array as object: Error message "Uncaught TypeError: Expecting object or undefined, got Uint8Array"

    But, with some small adjustments below, I got your code running. The device is then successfully recognized as an iBeacon.

    var advertise = function(options) {
      var d = new Uint8Array([
        0x02, // Number of bytes after first AD structure
        0x01, // BLE_GAP_AD_TYPE_FLAGS
        0x04, // BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED
        0x1A, // Length
        0xFF, // BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA
        0x4C, 0x00, // 0x004C == Apple
        0x02, 0x15, // iBeacon type + length
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// iBeacon proximity uuid
        0, 0, // major
        0, 0, // minor
        0xc5]); // 2'c complement RSSI at 1 meter distance in dBm
      
      d.set(options.uuid,9);
      if (options.major!==undefined) d.set([options.major>>8,options.major],25);
      if (options.minor!==undefined) d.set([options.minor>>8,options.minor],27);
      if (options.rssi!==undefined) d.set([(options.rssi<0)?(options.rssi+256):options.rssi],29);
      
      var e = [].slice.call(d);
      NRF.setAdvertising(e, {interval:100});
    };
    
    advertise({
      uuid : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // ibeacon uuid
      major : 0x0001, // optional
      minor : 0x0001, // optional
      rssi : -59 // optional RSSI at 1 meter distance in dBm
    });
    

    Perhaps you have a better idea how to pass the Uint8Array to the NRF.setAdvertising function.

About

Avatar for LongJogger @LongJogger started