Documentation ¶
Overview ¶
The iote package was designed to help build IoT edge software for on premise edge devices managing a large number of IoT Stations.
The package provides ¶
- MQTT messaging amoung IoT stations and control software - HTTP REST Server for data gathering and configuration - Websockets for realtime bidirectional communication with UI - Web server for mondern web based User Interface - Station manager to track a variety of IoT stations
Messaging Based ¶
The primary communication model for IoTe is a messaging system based on MQTT. These messages can be broke into the following categories
- Meta Data that help describe the "network" infrastructure - Sensor Data that produces data gathered by sensors - Control Data that represents actions to be performed by stations
The topic format used by MQTT is flexible but generally follows the following formats:
## ss/m/<source>/<type> -> { station-informaiton }
Where ss/m == sensor station, <source> is the station Id or source of the message and type represents the specific type of information.
### Meta Data (Station Information)
For example when a station comes alive it can provide some information about itself using the topic:
```ss/m/be:ef:ca:fe:02/station```
The station will announce itself along with some meta information and it's capabilities. The body of the message might look something like this:
```json
{ "id": "be:ef:ca:fe:02", "ip": "10.11.24.24", "sensors": [ "tempc", "humidity", "light" ], "relays": [ "heater", "light" ], }
```
### Sensor Data
Sensor data takes on the form:
```ss/d/<source>/<sensor>/<index>```
Where the source is the Station ID publishing the respective data. The sensor is the type of data being produced (temp, humidity, lidar, GPS).
The index is optional in situations where they may be more than one similar device or sensor, for example a couple of rotation counters on wheels.
The value published by the sensors is typically going to be floating point, however these values may also be integer or string values, including nema-0183.
### Control Data
```ss/c/<source>/<device>/<index>```
This is essentially the same as the sensor except that control commands are used to have a particular device change, for example turning a relay on or off.
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Dispatcher ¶
Dispatcher accepts
func NewDispatcher ¶
func NewDispatcher() (d *Dispatcher)
func (*Dispatcher) AddWebQ ¶
func (d *Dispatcher) AddWebQ() chan *Station
func (*Dispatcher) FreeWebQ ¶
func (d *Dispatcher) FreeWebQ(c chan *Station)
type MQTT ¶
type MQTT struct { ID string Broker string Debug bool gomqtt.Client // contains filtered or unexported fields }
type Msg ¶
type Msg struct { ID int64 `json:"id"` Type string `json:"type"` Data MsgStation `json:"station"` time.Time `json:"time"` }
Msg holds a value and some type of meta data to be pass around in the system.
type MsgStation ¶
type Rando ¶
type Rando struct {
F float64
}
PeriodicRandomData will collected a new random piece of data every period and transmit it to the given mqtt channel
type Server ¶
Server serves up HTTP on Addr (default 0.0.0.0:8011) It takes care of REST API, serving the web app if Appdir does not equal nil and initial Websocket upgrade
func (*Server) Register ¶
Register to handle HTTP requests for particular paths in the URL or MQTT channel.
type Station ¶
type Station struct { ID string `json:"id"` LastHeard time.Time `json:"last-heard"` Expiration time.Duration `json:"expiration"` // how long to timeout a station Sensors map[string]float64 `json:"sensors"` Relays map[string]bool `json:"relays"` // contains filtered or unexported fields }
Station is the primary structure that holds an array of Sensors which in turn hold a timeseries of datapoints.
func NewStation ¶
NewStation creates a new Station with an ID as provided by the first parameter
type StationEvent ¶
type StationManager ¶
type StationManager struct { Stations map[string]*Station `json:"stations"` Stale map[string]*Station `json:"stale"` EventQ chan *StationEvent // contains filtered or unexported fields }
StationManager keeps track of all the stations we have seen
var (
Stations *StationManager
)
func NewStationManager ¶
func NewStationManager() (sm *StationManager)
func (*StationManager) Count ¶
func (sm *StationManager) Count() int
func (*StationManager) Get ¶
func (sm *StationManager) Get(stid string) *Station
func (StationManager) ServeHTTP ¶
func (sm StationManager) ServeHTTP(w http.ResponseWriter, r *http.Request)
func (*StationManager) Update ¶
func (sm *StationManager) Update(msg *Msg) (st *Station)
type Subscriber ¶
type Subscriber struct { ID string Path string gomqtt.MessageHandler }
func (*Subscriber) String ¶
func (sub *Subscriber) String() string