Skip to content

BIPSO Specification

hedy edited this page Jan 4, 2017 · 3 revisions

Why BIPSO?

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.

BIPSO Characteristics

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 the counter field in it. If the flags is 0000,1110 in binary, then the Characteristic Value does have the dInPolarity, debouncePeriod, and edgeSelection fields in it.

Important:

  1. Add a mandatory id field to identify different Object Instances.
  2. With node.js, it is quite simple to use .frame() and .parse() to build and parse your BIPSO-defined Characteristic Value.
  3. 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