-
Notifications
You must be signed in to change notification settings - Fork 4
BIPSO Specification
With BLE, manufacturers can build up their applications by using the SIG-defined Characteristics or by their own private GATT definitions. It is quick and flexible, but sometimes sacrifices the compatibility between BLE products.
Imagine a scenario that you are a BLE light bulb user, you've got some in your home, and you are happy to control lights with your smartphone APP.
Unfortunately, there is a bulb broken today, and you have to buy a new one for the replacement. However, you couldn't find a bulb that is the same as those you are using in your house. It left you with no choice but to buy a new one manufactured by another company.
When you are back home, you find out that your current APP is simply not working with the new light bulb you just installed. Then, you download the specific APP made for your new bulb, and now it's working.
Soon, you find it annoying switching between different APPs in order to control those light bulbs made by different brand names, that is not cool. You feel so frustrated with your BLE lights and, of course, your many BLE APPs on your smartphone.
BIPSO is born to solve this problem of consistency and compatibility for BLE applications. It defines a set of BLE Characteristics that follows the IPSO Smart Object Guideline for developers to build their applications with an unified data model. You don't have to worry about how to map a real-world gadget into BLE Characteristics, IPSO and BIPSO have modeled many for you.
BIPSO is trying to let you operate all BLE gadgets with only a single smartphone APP, and let BLE gadgets be IPSO-compatible.
In BIPSO, an IPSO Smart Object will be mapped to a BLE Characteristic with a well-defined Characteristic Value. The Characteristic Value is a piece of data containing IPSO Resources on a Smart Object.
BIPSO uses Characteristic UUIDs range from 0xcc00 to 0xcccc to do the mapping. BIPSO has mapped 51 Smart Objects at this moment, and UUIDs 0xcc33 to 0xcccc is reserved for future use. The following table is a cross-reference between a IPSO Smart Object and its BIPSO-defined Characteristic, each column in this table is:
-
Object ID: IPSO Object identifier defined by IPSO Alliance. For example, lightCtrl is a light controller Smart Object, its ID is
'lightCtrl'
in string. - Char. UUID: BIPSO-defined Characteristic UUID corresponding to an IPSO Object.
-
Possible Fields in Char. Value: Possible fields within a Characteristic Value. For example, sensorValue(float) is a field named
'sensorValue'
and its value is a float number.- The boldface field is mandatory while the other fields are optional Resources.
- A Characteristic Value should be parsed into an data object with these fields as its keys.
- The mandatory field id is a Object Instance Id. In your application, you may have many instances of same IPSO Object , and id can help you distinguish between different instances.
- The mandatory field flags is a bit-vector to tell which optional fields does a Characteristic Value have. Let's take 'dIn' Object as an example, if the flags has a value of
0000,0001
in binary, then the Characteristic Value does only have thecounter
field in it. If the flags is0000,1110
in binary, then the Characteristic Value does have thedInPolarity
,debouncePeriod
, andedgeSelection
fields in it.
Important:
- Add a mandatory id field to identify different Object Instances.
- With node.js, it is quite simple to use .frame() and .parse() to build and parse your BIPSO-defined Characteristic Value.
- If you need a tool to manage your BLE network on node.js, ble-shepherd is a BLE network controller which has all the features you need in controlling your BLE network, and it also supports BIPSO Specification.
Object ID | Char. UUID | Possible Fields in Char. Value | Description |
---|---|---|---|
dIn (3200) | 0xcc00 | id(uint8), flags(uint8), dInState(boolean)[, counter(uint8), dInPolarity(boolean), debouncePeriod(uint16), edgeSelection(uint8), counterReset(buffer), appType(string), sensorType(string) ] | digital input |
dOut (3201) | 0xcc01 | id(uint8), flags(uint8), dOutState(boolean)[, dOutPolarity(boolean), appType(string) ] | digital output |
aIn (3202) | 0xcc02 | id(uint8), flags(uint8), aInCurrValue(float)[, minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), appType(string), sensorType(string) ] | analogue input |
aOut (3203) | 0xcc03 | id(uint8), flags(uint8), aOutCurrValue(float)[, minRangeValue(float), maxRangeValue(float), appType(string) ] | analogue output |
generic (3300) | 0xcc04 | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), appType(string), sensorType(string) ] | generic sensor |
illuminance (3301) | 0xcc05 | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer) ] | illuminance sensor |
presence (3302) | 0xcc06 | id(uint8), flags(uint8), dInState(boolean)[, counter(uint8), counterReset(buffer), sensorType(string), busyToClearDelay(uint16), clearToBusyDelay(uint16) ] | presence sensor |
temperature (3303) | 0xcc07 | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer) ] | temperature sensor |
humidity (3304) | 0xcc08 | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer) ] | humidity sensor |
pwrMea (3305) | 0xcc09 | id(uint8), flags(uint32), instActivePwr(float)[, minMeaActivePwr(float), maxMeaActivePwr(float), minRangeActivePwr(float), maxRangeActivePwr(float), cumulActivePwr(float), activePwrCal(float), instReactivePwr(float), minMeaReactivePwr(float), maxMeaReactivePwr(float), minRangeReactivePwr(float), maxRangeReactivePwr(float), resetMinMaxMeaValues(buffer), cumulReactivePwr(float), reactivePwrCal(float), pwrFactor(float), currCal(float), resetCumulEnergy(buffer) ] | power measurement |
actuation (3306) | 0xcc0a | id(uint8), flags(uint8), onOff(boolean)[, dimmer(uint8), onTime(uint16), mStateOut(string), appType(string) ] | actuation |
setPoint (3308) | 0xcc0b | id(uint8), flags(uint8), setPointValue(float)[, colour(string), units(string), appType(string) ] | set point |
loadCtrl (3310) | 0xcc0c | id(uint8), flags(uint8), eventId(string), startTime(uint32), durationInMin(uint16)[, criticalLevel(uint8), avgLoadAdjPct(uint8), dutyCycle(uint8) ] | load control |
lightCtrl (3311) | 0xcc0d | id(uint8), flags(uint8), onOff(boolean)[, dimmer(uint8), colour(string), units(string), onTime(uint16), cumulActivePwr(float), pwrFactor(float) ] | light control |
pwrCtrl (3312) | 0xcc0e | id(uint8), flags(uint8), onOff(boolean)[, dimmer(uint8), onTime(uint16), cumulActivePwr(float), pwrFactor(float) ] | power control |
accelerometer (3313) | 0xcc0f | id(uint8), flags(uint8), xValue(float)[, yValue(float), zValue(float), units(string), minRangeValue(float), maxRangeValue(float) ] | accelerometer |
magnetometer (3314) | 0xcc10 | id(uint8), flags(uint8), xValue(float)[, yValue(float), zValue(float), units(string), compassDir(float) ] | magnetometer |
barometer (3315) | 0xcc11 | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer) | barometer |
voltage (3316) | 0xcc12 | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), calOffset(float), appType(string) ] | voltage |
current (3317) | 0xcc13 | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), calOffset(float), appType(string) ] | current |
frequency (3318) | 0xcc14 | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), calOffset(float), appType(string) ] | frequency |
depth (3319) | 0xcc15 | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), calOffset(float), appType(string) ] | depth |
percentage (3320) | 0xcc16 | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), calOffset(float), appType(string) ] | percentage |
altitude (3321) | 0xcc17 | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), calOffset(float), appType(string) ] | altitude |
load (3322) | 0xcc18 | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), calOffset(float), appType(string) ] | load |
pressure (3323) | 0xcc19 | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), calOffset(float), appType(string) ] | pressure |
loudness (3324) | 0xcc1a | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), calOffset(float), appType(string) ] | loudness |
concentration (3325) | 0xcc1b | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), calOffset(float), appType(string) ] | concentration |
acidity (3326) | 0xcc1c | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), calOffset(float), appType(string) ] | acidity |
conductivity (3327) | 0xcc1d | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), calOffset(float), appType(string) ] | conductivity |
power (3328) | 0xcc1e | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), calOffset(float), appType(string) ] | power |
powerFactor (3329) | 0xcc1f | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), calOffset(float), appType(string) ] | power factor |
distance (3330) | 0xcc20 | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), calOffset(float), appType(string) ] | distance |
energy (3331) | 0xcc21 | id(uint8), flags(uint8), sensorValue(float)[, units(string), resetCumulEnergy(buffer), appType(string) ] ] | energy |
direction (3332) | 0xcc22 | id(uint8), flags(uint8), compassDir(float)[, minMeaValue(float), maxMeaValue(float), resetMinMaxMeaValues(buffer), appType(string) ] | direction |
time (3333) | 0xcc23 | id(uint8), flags(uint8), currentTime(uint32)[, fracTime(float), appType(string) ] | time |
gyrometer (3334) | 0xcc24 | id(uint8), flags(uint8), xValue(float)[, yValue(float), zValue(float), units(string), minXValue(float), maxXValue(float), minYValue(float), maxYValue(float), minZValue(float), maxZValue(float), resetMinMaxMeaValues(buffer), minRangeValue(float), maxRangeValue(float), appType(string) ] | gyrometer |
colour (3335) | 0xcc25 | id(uint8), flags(uint8), colour(string)[, units(string), appType(string) ] | colour |
gpsLocation (3336) | 0xcc26 | id(uint8), flags(uint8), latitude(string), longitude(string)[, uncertainty(string), compassDir(float), velocity(buffer), timestamp(uint32), appType(string) ] | gps location |
positioner (3337) | 0xcc27 | id(uint8), flags(uint8), currentPos(float)[, transTime(float), remainTime(float), minMeaValue(float), maxMeaValue(float), resetMinMaxMeaValues(buffer), minLimit(float), maxLimit(float), appType(string) ] | positioner |
buzzer (3338) | 0xcc28 | id(uint8), flags(uint8), onOff(boolean), minOffTime(float)[, level(float), timeDuration(float), appType(string) ] | buzzer |
audioClip (3339) | 0xcc29 | id(uint8), flags(uint8), clip(buffer)[, trigger(buffer), level(float), soundDuration(float), appType(string) ] | audio clip |
timer (3340) | 0xcc2a | id(uint8), flags(uint8), timeDuration(float)[, remainTime(float), minOffTime(float), trigger(buffer), onOff(boolean), counter(uint8), cumulTime(float), digitalState(boolean), eventCounter(uint8), mode(uint8), appType(string) ] | timer |
addressableTextDisplay (3341) | 0xcc2b | id(uint8), flags(uint8), text(string)[, xCoord(uint16), yCoord(uint16), maxXCoord(uint16), maxYCoord(uint16), clearDisplay(buffer), level(float), contrast(float), appType(string) ] | addressable text display |
onOffSwitch (3342) | 0xcc2c | id(uint8), flags(uint8), dInState(boolean)[, counter(uint8), onTime(uint16), offTime(uint16), appType(string) ] | on/off switch |
levelControl (3343) | 0xcc2d | id(uint8), flags(uint8)[, level(float), onTime(uint16), offTime(uint16), appType(string) ] | level control |
upDownControl (3344) | 0xcc2e | id(uint8), flags(uint8)[, incInputState(boolean), decInputState(boolean), upCounter(uint8), downCounter(uint8), appType(string) ] | up/down control |
multipleAxisJoystick (3345) | 0xcc2f | id(uint8), flags(uint8)[, dInState(boolean), counter(uint8), xValue(float), yValue(float), zValue(float), appType(string) ] | multiple axis joystick |
rate (3346) | 0xcc30 | id(uint8), flags(uint8), sensorValue(float)[, units(string), minMeaValue(float), maxMeaValue(float), minRangeValue(float), maxRangeValue(float), resetMinMaxMeaValues(buffer), calOffset(float), appType(string) ] | rate |
pushButton (3347) | 0xcc31 | id(uint8), flags(uint8), dInState(boolean)[, counter(uint8), appType(string) ] | push button |
multistateSelector (3348) | 0xcc32 | id(uint8), flags(uint8), mStateIn(uint8)[, appType(string) ] | multistate selector |