Manufacturer Specific Data null

Hi! I am coding a datafield that should be able to scan nearby devices and get their manufacturer specific data without connecting or pairing. These devices are like beacons, broadcasting data via the Manufacturer section. Since I have developed the code for this beacons, the manufacturer id is a made up one. 

When I try reading the manufacturer specific data, it returns "null". If I try getting the raw data, it works fine and returns 20 bytes. Is there any specific structure that Garmin accepts for Manufacturer Specific Data? (Given that I can modify the sctructure on the MCUs...)

If I use a scanning app like LightBlue, I can definetely see these beacons advertising the data structure under the manufacturer section.

I have been stucked with this for a while, so any advice will be greatly appreciated Slight smile

  • With BLE and a byte array, you can use either little or big endian.

    See the decodeNumber call

    Again, CIQ has a very minimal implementation of BLE.

    Manufacturer data is obtained from the scan result (if it's available at all).  Or is there a characteristic where you can get it after connection?

  • "(if it's available at all)" that is specifically what I am talking about. Sorry for not being clear. I am talking about how the beacon has to be programmed for the Garmin to be able to read its data. The Garmin CIQ will not read it unless the Manufacturer Specific Data on the external (non-garmin) beacon is advertised as little-endian. Anything else will be returned as null. 

    The Garmin devices CIQ seem to require a specific format to be able to retried the device name, or manufacturing data. It is not random, since we have had this same problem with the name of the device, and after modifying the Beacon (again, this modification is done on an outside device) adv. package,then the Garmin started reading it's name too. 


    As another example, imagine havng and Arduino with a BLE module. Depending on how you strucutre the adv. packet and the manufacturer data on the Arduino code, the Garmin will or will not read it. For the manufacturer data it needs to look like 0xAABBCCDD for the Garmin to be able to read it without returning null. If instead you use: 0x0000AABCCDD, then the Garmin CIQ will return null. 

    Regarding this "CIQ has a very minimal implementation of BLE", I think it is not fully true. I believe that if you have a few devices following the right format that the CIQ can digest (E.g: Manufacturing data advertised from the external device you want to monitor as little-endian) then you can get all the info needed (disregarding the amount of bytes limit the CIQ has). So, if I put 10 arduinos advertising the data in the right format, I can get the CIQ to read all their names as NOT nulls, and all the data they are advertising correctly. The problem is that the majority of external devices are out of our control, and we can't modify them, but if you ever code and configure a custom beacon (like my case), then it would be awesome to know the exact format Garmin CIQ expects, so that I do not have to discover it Slight smile

    I hope this makes a bit more sense now. You can test it with an Arduino and modifying these advertising values, the biggest problem for me is that Garmin Dev CIQ has not disclosed which format is compatible and which not (as far as I know I haven't seen it anywhere).

  • And again, what you see in CIQ is a very minimal implementation. there so devs can provide data from sensors (new, HR, speed, etc.  Cameras in some cases)

    Lots of things are not there - like you have to hard code things like services and characteristic - nothing is "learned", and you are limited to at most 3 devices or services.

    Read and writes have a very limited size, as does raw data.

    BleScan shows you exactly what you can see with CIQ, and while you can connect, you can't read or write anything with it.  For that you need to do things like you see in the Nordic samples.