Building a Sensor Network Controller Michael Pigg Chariot - - PowerPoint PPT Presentation

building a sensor network controller
SMART_READER_LITE
LIVE PREVIEW

Building a Sensor Network Controller Michael Pigg Chariot - - PowerPoint PPT Presentation

Building a Sensor Network Controller Michael Pigg Chariot Solutions November 5, 2010 This work is licensed under the Creative Commons Attribution- Noncommercial-Share Alike 3.0 United States License. Friday, November 5, 2010 1 Chariot


slide-1
SLIDE 1

Building a Sensor Network Controller

Michael Pigg Chariot Solutions

November 5, 2010

This work is licensed under the Creative Commons Attribution- Noncommercial-Share Alike 3.0 United States License.

1 Friday, November 5, 2010

slide-2
SLIDE 2

Chariot Solutions

Practical, smart software development powered by Java, open source and emerging technologies

2 Friday, November 5, 2010

slide-3
SLIDE 3

Agenda

  • What are we building?
  • Why use OSGi?
  • Look at interesting code features
  • Run the system

3 Friday, November 5, 2010

slide-4
SLIDE 4

An engineer* walks into a room ...

*Software guy with old, dusty electrical technology degree, really

4 Friday, November 5, 2010

slide-5
SLIDE 5

and notices it’s too cold.

5 Friday, November 5, 2010

slide-6
SLIDE 6

He walks into another and notices it’s too warm.

6 Friday, November 5, 2010

slide-7
SLIDE 7

Hire someone to fix it?

7 Friday, November 5, 2010

slide-8
SLIDE 8

No Way!

8 Friday, November 5, 2010

slide-9
SLIDE 9

Build a system to monitor temperature in multiple rooms.

9 Friday, November 5, 2010

slide-10
SLIDE 10

What should it do?

10 Friday, November 5, 2010

slide-11
SLIDE 11

Collect temperature data from multiple locations

Requirements

11 Friday, November 5, 2010

slide-12
SLIDE 12

Record data for later analysis

Requirements

12 Friday, November 5, 2010

slide-13
SLIDE 13

No wires

Requirements

13 Friday, November 5, 2010

slide-14
SLIDE 14

Easily add new capabilities

Requirements

14 Friday, November 5, 2010

slide-15
SLIDE 15

Proposed Solution

  • Hardware
  • Custom wireless sensor module
  • Software
  • Controller software based on Apache

Felix

15 Friday, November 5, 2010

slide-16
SLIDE 16

Why OSGi and Felix?

  • Highly modular architecture
  • Capable of being updated at runtime
  • Already implemented solutions
  • console shell commands
  • configuration implementation
  • web-based configuration UI

16 Friday, November 5, 2010

slide-17
SLIDE 17

Hardware

17 Friday, November 5, 2010

slide-18
SLIDE 18

Sensor Module

  • Digi XBee wireless mesh network module
  • Has integrated ADC
  • Operates in voltage range of 2 AA batteries
  • Relatively low power consumption

18 Friday, November 5, 2010

slide-19
SLIDE 19

Vref Wireless Module Temp Sensor

(under board)

Professional Wiring* Super Soldering Job*

Text

*Not so much

19 Friday, November 5, 2010

slide-20
SLIDE 20

Life of a Node

  • Sleep for 5 minutes, then wake up
  • Sample ADC port
  • Send sample data over network
  • Go back to sleep

20 Friday, November 5, 2010

slide-21
SLIDE 21

XBee

USB

XBee XBee XBee XBee

21 Friday, November 5, 2010

slide-22
SLIDE 22

Software

22 Friday, November 5, 2010

slide-23
SLIDE 23

XBee Communication

23 Friday, November 5, 2010

slide-24
SLIDE 24

Connect XBee to PC

  • XBee to USB
  • Appears as serial port

24 Friday, November 5, 2010

slide-25
SLIDE 25

XBee has custom protocol

25 Friday, November 5, 2010

slide-26
SLIDE 26

XBeeLib

  • Implementation of XBee API protocol
  • Open source, BSD license
  • http://kenai.com/projects/xbeelib

26 Friday, November 5, 2010

slide-27
SLIDE 27

Apache Mina

  • Eases implementation of custom protocol

encoder/decoder

  • Support for fragmented packets
  • Comes with serial port transport

27 Friday, November 5, 2010

slide-28
SLIDE 28

XbeeLib Config Admin Metatype Service

ManagedServiceFactory metatype.xml XBeeService xb xbr xbconfig

Mina Core RXTX Mina Serial

Indirect Exported Packages

XBee USB

28 Friday, November 5, 2010

slide-29
SLIDE 29

RXTX requires native library

29 Friday, November 5, 2010

slide-30
SLIDE 30

Where to put native library?

30 Friday, November 5, 2010

slide-31
SLIDE 31

How to get native library installed?

31 Friday, November 5, 2010

slide-32
SLIDE 32

Bundle-NativeCode

  • Parameters
  • path to native code in bundle JAR
  • osname (MacOS, Linux, etc.)
  • processor (x86, PowerPC, etc.)
  • osversion

32 Friday, November 5, 2010

slide-33
SLIDE 33

<plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>2.0.1</version> <extensions>true</extensions> <configuration> <instructions> <Import-Package>*</Import-Package> <Export-Package>net.michaelpigg.xbeelib.protocol,net.michaelpigg.xbeelib</Export-Package> <Embed-Dependency>rxtx,mina-transport-serial</Embed-Dependency>

<Bundle-NativeCode>lib/rxtx/mac/x86_64/

librxtxSerial.jnilib; osname=MacOSX; processor=x86_64</Bundle- NativeCode>

<Bundle-Activator>net.michaelpigg.xbeelib.impl.BundleActivator</Bundle-Activator>

</instructions> </configuration> </plugin>

33 Friday, November 5, 2010

slide-34
SLIDE 34

XBeeLib dependencies

  • Mina and most other dependencies are

deployed as bundles

  • Mina serial transport and RXTX are

embedded into XBeeLib bundle

  • RXTX is not OSGi-ready
  • Mina serial depends on RXTX

34 Friday, November 5, 2010

slide-35
SLIDE 35

<plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>2.0.1</version> <extensions>true</extensions> <configuration> <instructions> <Import-Package>*</Import-Package> <Export-Package>net.michaelpigg.xbeelib.protocol,net.michaelpigg.xbeelib</Export-Package>

<Embed-Dependency>rxtx,mina-transport-serial</Embed- Dependency>

<Bundle-NativeCode>lib/rxtx/mac/x86_64/librxtxSerial.jnilib; osname=MacOSX; processor=x86_64</Bundle- NativeCode>

<Bundle-Activator>net.michaelpigg.xbeelib.impl.BundleActivator</Bundle-Activator>

</instructions> </configuration> </plugin>

35 Friday, November 5, 2010

slide-36
SLIDE 36

First Contact

  • XBeeLib provides simple shell commands

for sending commands to XBee modules

  • xb - send command to local XBee
  • xbr - send command to remote XBee

36 Friday, November 5, 2010

slide-37
SLIDE 37

Shell Commands

  • Felix provides the Gogo shell as of 3.0
  • Bundles contribute commands by

registering a service with two properties

  • osgi.command.scope
  • osgi.command.function

37 Friday, November 5, 2010

slide-38
SLIDE 38

public void start(BundleContext context) throws Exception { Hashtable cmdProps = new Hashtable(); // these commands are in scope “xbee” cmdProps.put(CommandProcessor.COMMAND_SCOPE, “xbee”); // “xb” and “xbr” are functions that can act as commands cmdProps.put(CommandProcessor.COMMAND_FUNCTION, new String[] {“xb”, “xbr”}); context.registerService( ToXbeeCommand.class.getName(), new ToXbeeCommand(context), cmdProps); }

38 Friday, November 5, 2010

slide-39
SLIDE 39

g! help felix:bundlelevel ..... felix:which gogo:cat .... gogo:until

  • br:deploy

....

  • br:source

xbee:listports xbee:xb xbee:xbconfig xbee:xbr xbee:xmon xbee:xsample g!

Listing Shell Commands

39 Friday, November 5, 2010

slide-40
SLIDE 40

Using Commands

g! xb nd ND response: Frame ID = 109;Status = OK;Address = 0013a200403c5e93;Signal strength = 32; g! x1 = "0013a200403c5e93" 0013a200403c5e93 g! xbr $x1 is IS response: Frame ID = 11;Status = OK;Data: 010200013c g!

Send node discover command Request sample

40 Friday, November 5, 2010

slide-41
SLIDE 41

Transform Data

41 Friday, November 5, 2010

slide-42
SLIDE 42

Incoming Data

  • Number resulting from ADC sample on

XBee

42 Friday, November 5, 2010

slide-43
SLIDE 43

XbeeAnalogData Transformer Interface

  • Implementations convert raw ADC reading

to useful data

  • TemperatureSensorTransformer does this

for our temperature sensor hardware

43 Friday, November 5, 2010

slide-44
SLIDE 44

xbee-temp-sensor bundle

xbee- listener temp- sensor

XbeeAnalogDataTransfomer

Config Admin

ManagedServiceFactory

Metatype

metatype.xml

44 Friday, November 5, 2010

slide-45
SLIDE 45

Sample with no Transformer

g! xsample $x1 Command returned with status OK Raw data in response:1200dd Number of samples 1 Digital I/O No digital I/O data in response. Analog Data 1: DD(221) g!

45 Friday, November 5, 2010

slide-46
SLIDE 46

Configuring Temperature Sensors

46 Friday, November 5, 2010

slide-47
SLIDE 47

Config file?

47 Friday, November 5, 2010

slide-48
SLIDE 48

NO!

48 Friday, November 5, 2010

slide-49
SLIDE 49

Configuration Admin Service

  • Stores configuration for a service
  • Sends configuration to service
  • at startup
  • when configuration changes

49 Friday, November 5, 2010

slide-50
SLIDE 50

ManagedService or ManagedServiceFactory?

  • ManagedService
  • Configures at most one instance
  • ManagedServiceFactory
  • Configures one or more instances

50 Friday, November 5, 2010

slide-51
SLIDE 51

We need to configure multiple sensors

51 Friday, November 5, 2010

slide-52
SLIDE 52

Implementation

  • Make up a PID
  • Implement ManagedServiceFactory
  • Register implementation as a service with

the chosen PID

52 Friday, November 5, 2010

slide-53
SLIDE 53

public class XbeeTemperatureSensorFactory implements ManagedServiceFactory { public void updated(String pid, Dictionary properties) throws ConfigurationException { // get configuration properties and copy to registration properties String address = properties.get(LOCATION_ADDRESS); String name = properties.get(LOCATION_NAME); Dictionary<String, String> registrationProperties = new Hashtable<String, String>(); registrationProperties.put( LOCATION_NAME, name); registrationProperties.put( LOCATION_ADDRESS, address); // create new transformer TemperatureSensorTransformer transformer = new TemperatureSensorTransformer(); // register newly configured transformer ServiceRegistration registration = bundleContext.registerService( XbeeAnalogDataTransformer.class.getName(), transformer, registrationProperties); } }

53 Friday, November 5, 2010

slide-54
SLIDE 54

public class BundleActivator implements BundleActivator { // factory PID - will be used as base PID for configured instances public static String PID = "com.pigglogic.phomenet.xbee.sensor.temperature"; public void start(BundleContext context) throws Exception { // create ManagedServiceFactory instance sensorFactory = new XbeeTemperatureSensorFactory(context); Dictionary properties = new Hashtable<String, String>(); // set SERVICE_PID property to our factory PID properties.put(Constants.SERVICE_PID, PID); // register factory instance factoryRegistration = context.registerService( ManagedServiceFactory.class.getName(), sensorFactory, properties); }

54 Friday, November 5, 2010

slide-55
SLIDE 55

What is allowed in configuration?

  • What are the attribute names?
  • What type of data do they take?
  • Are they required?

55 Friday, November 5, 2010

slide-56
SLIDE 56

Metatype Specification

  • Specify attributes used in configuration
  • name, type, required, default value, etc.
  • XML file in OSGI-INF/metatype
  • Felix web console will use this data to

dynamically create a configuration UI

56 Friday, November 5, 2010

slide-57
SLIDE 57

<metatype:MetaData xmlns:metatype="http://www.osgi.org/xmlns/metatype/v1.0.0"> <OCD description="xbee-temperature-sensor" name="com.pigglogic.phomenet.xbee.sensor.temperature" id="com.pigglogic.phomenet.xbee.sensor.temperature"> <AD name="Location Name" id="location.name" required="true" type="String" default="Temperature Sensor"/> <AD name="Location Address" id="location.address" required="true" type="String"/> <AD name="Correction" id="location.correction" required="false" type="Double" default="0.0"/> </OCD> <Designate pid="com.pigglogic.phomenet.xbee.sensor.temperature" factoryPid="com.pigglogic.phomenet.xbee.sensor.temperature"> <Object ocdref="com.pigglogic.phomenet.xbee.sensor.temperature"/> </Designate> </metatype:MetaData>

57 Friday, November 5, 2010

slide-58
SLIDE 58

Configure Sensor

58 Friday, November 5, 2010

slide-59
SLIDE 59

g! xsample $x1 Command returned with status OK Raw data in response:12013e Number of samples 1 Digital I/O No digital I/O data in response. Analog Data 1: 13E(318) Transformer reports value of -11.609971

Sample with Transfomer

59 Friday, November 5, 2010

slide-60
SLIDE 60

Collecting and Recording Data

60 Friday, November 5, 2010

slide-61
SLIDE 61

xbee-listener bundle

XbeeLib xbee- listener

XBeeService

Event Admin temp- sensor recorder

Observation Recorder Event Admin XbeeAnalogDataTransfomer

61 Friday, November 5, 2010

slide-62
SLIDE 62

Piping Hot Data

  • xbee-listener gets data from XBeeService,

but what to do with it?

  • Needs to find a transformer that will

handle the data

  • There should be a number of transformers

registered

  • Chooses based on source address

62 Friday, November 5, 2010

slide-63
SLIDE 63

Recording data

  • xbee-listener records transformed data
  • Finds an instance of

ObservationRecorder service

63 Friday, November 5, 2010

slide-64
SLIDE 64

Default Storage

phomenet service Derby Config Admin

Observation Recorder

64 Friday, November 5, 2010

slide-65
SLIDE 65

NoSql?

  • What if we wanted to be cool and store

data in Cassandra?

  • We could provide a different bundle that

implements ObservationRecorder

  • but uses Cassandra instead of Derby

65 Friday, November 5, 2010

slide-66
SLIDE 66

Visualizing Sensor Data

66 Friday, November 5, 2010

slide-67
SLIDE 67

Show me a GUI!

  • Web page GUI
  • Show latest observation for each sensor

67 Friday, November 5, 2010

slide-68
SLIDE 68

phomenet-web

phomenet- web Felix Web Console

Servlet

Event Admin

Event Handler

68 Friday, November 5, 2010

slide-69
SLIDE 69

Observation Events

  • xbee-listener posts an OSGi event when

data is transformed

  • Event topic is “phomenet/Observation/

Temperature/<address>”

69 Friday, November 5, 2010

slide-70
SLIDE 70

OSGi Event Admin

  • Bundles can post events
  • Bundles can register to be notified of

posted events

70 Friday, November 5, 2010

slide-71
SLIDE 71

Posting an Event

// build Map containing event data Map<String, Object> eventProperties = new HashMap<String, Object>(); eventProperties.put("location.name", locationName); final String addressString = frame.getSourceAddress().toString(); eventProperties.put("location.address", addressString); eventProperties.put("observedValue", value); // create Event with topic and properties final Event event = new Event( "phomenet/Observation/Temperature/" + addressString, eventProperties); // call postEvent with event eventAdmin.postEvent(event);

71 Friday, November 5, 2010

slide-72
SLIDE 72

Listening to Events

public void start(BundleContext context) throws Exception { Hashtable<String, Object> props = new Hashtable<String, Object>(); // Felix web console extension properties props.put("felix.webconsole.label", "phomenet"); props.put("felix.webconsole.title", "pHomeNet Console");

// property to say that we want all Observation events props.put(EventConstants.EVENT_TOPIC, "phomenet/Observation/*");

// register under Servlet and EventHandler interfaces webConsoleRegistration = context.registerService( new String[] {Servlet.class.getName(), EventHandler.class.getName()}, new PhomenetConsolePlugin(context), props); }

72 Friday, November 5, 2010

slide-73
SLIDE 73

Extending Web Console

  • Register a class that extends HTTPServlet
  • Add properties
  • felix.webconsole.label - used in URL
  • felix.webconsole.title - title of page

73 Friday, November 5, 2010

slide-74
SLIDE 74

Registering Extension

public void start(BundleContext context) throws Exception { Hashtable<String, Object> props = new Hashtable<String, Object>(); // Felix web console extension properties

props.put("felix.webconsole.label", "phomenet"); props.put("felix.webconsole.title", "pHomeNet Console"); // property to say that we want all Observation events props.put(EventConstants.EVENT_TOPIC, "phomenet/Observation/*");

// register under Servlet and EventHandler interfaces webConsoleRegistration = context.registerService( new String[] {Servlet.class.getName(), EventHandler.class.getName()}, new PhomenetConsolePlugin(context), props); }

74 Friday, November 5, 2010

slide-75
SLIDE 75

Resources

  • XBeeLib - kenai.com/projects/xbeelib
  • pHomeNet - kenai.com/projects/phomenet

75 Friday, November 5, 2010

slide-76
SLIDE 76

Resources

  • XBee 802.15.4 OEM module
  • http://www.digi.com/products/wireless/point-multipoint/xbee-series1-

module.jsp#overview

  • Droids XBee USB board
  • http://www.droids.it/990_002.html
  • MCP9700 Temperature Sensor
  • http://www.microchip.com/wwwproducts/Devices.aspx?

dDocName=en022289

76 Friday, November 5, 2010