sipp11
7 years ago
commit
d4efa76643
6 changed files with 251 additions and 0 deletions
@ -0,0 +1,46 @@ |
|||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"github.com/aws/aws-sdk-go/aws" |
||||||
|
"github.com/aws/aws-sdk-go/service/dynamodb" |
||||||
|
"github.com/aws/aws-sdk-go/service/dynamodb/expression" |
||||||
|
) |
||||||
|
|
||||||
|
// GetDevices is to get all devices we know
|
||||||
|
func GetDevices(svc *dynamodb.DynamoDB) (*dynamodb.ScanOutput, error) { |
||||||
|
|
||||||
|
proj := expression.NamesList( |
||||||
|
expression.Name("device"), |
||||||
|
expression.Name("name")) |
||||||
|
|
||||||
|
expr, _ := expression.NewBuilder().WithProjection(proj).Build() |
||||||
|
|
||||||
|
// Build the query input parameters
|
||||||
|
params := &dynamodb.ScanInput{ |
||||||
|
ExpressionAttributeNames: expr.Names(), |
||||||
|
ExpressionAttributeValues: expr.Values(), |
||||||
|
ProjectionExpression: expr.Projection(), |
||||||
|
TableName: aws.String("iot-item"), |
||||||
|
} |
||||||
|
return svc.Scan(params) |
||||||
|
} |
||||||
|
|
||||||
|
// GetHistory is a query history for any device
|
||||||
|
func GetHistory(svc *dynamodb.DynamoDB, deviceID string, limit int64) (*dynamodb.QueryOutput, error) { |
||||||
|
keyCond := expression.Key("device").Equal(expression.Value(deviceID)) |
||||||
|
qProj := expression.NamesList(expression.Name("device"), expression.Name("timestamp"), expression.Name("data")) |
||||||
|
|
||||||
|
qBuilder := expression.NewBuilder().WithKeyCondition(keyCond).WithProjection(qProj) |
||||||
|
qExpression, _ := qBuilder.Build() |
||||||
|
|
||||||
|
queryInput := &dynamodb.QueryInput{ |
||||||
|
KeyConditionExpression: qExpression.KeyCondition(), |
||||||
|
ProjectionExpression: qExpression.Projection(), |
||||||
|
ExpressionAttributeNames: qExpression.Names(), |
||||||
|
ExpressionAttributeValues: qExpression.Values(), |
||||||
|
ScanIndexForward: aws.Bool(false), |
||||||
|
TableName: aws.String("iot-logger"), |
||||||
|
Limit: aws.Int64(limit), |
||||||
|
} |
||||||
|
return svc.Query(queryInput) |
||||||
|
} |
@ -0,0 +1,8 @@ |
|||||||
|
<html> |
||||||
|
<header> |
||||||
|
<title>Home</title> |
||||||
|
</header> |
||||||
|
<body> |
||||||
|
<h1>{{ query }}</h1> |
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1,28 @@ |
|||||||
|
package main |
||||||
|
|
||||||
|
// Device struct for store device data from iot-item table
|
||||||
|
type Device struct { |
||||||
|
Device string `json:"device"` |
||||||
|
Name string `json:"name"` |
||||||
|
} |
||||||
|
|
||||||
|
// Create structs to hold info about new item
|
||||||
|
type ItemInfo struct { |
||||||
|
Firmware string `json:"firmware"` |
||||||
|
Sensor string `json:"sensor"` |
||||||
|
} |
||||||
|
|
||||||
|
type ItemFloraData struct { |
||||||
|
Battery int `json:"battery"` |
||||||
|
Light int `json:"light"` |
||||||
|
Conductivity float32 `json:"conductivity"` |
||||||
|
Moisture float32 `json:"moisture"` |
||||||
|
Temperature float32 `json:"temperature"` |
||||||
|
} |
||||||
|
|
||||||
|
type Item struct { |
||||||
|
Device string `json:"device"` |
||||||
|
Timestamp string `json:"timestamp"` |
||||||
|
Info ItemInfo `json:"info"` |
||||||
|
Data ItemFloraData `json:"data"` |
||||||
|
} |
@ -0,0 +1,96 @@ |
|||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"io" |
||||||
|
"log" |
||||||
|
"net/http" |
||||||
|
|
||||||
|
"github.com/flosch/pongo2" |
||||||
|
"github.com/gorilla/mux" |
||||||
|
) |
||||||
|
|
||||||
|
var tplHome = pongo2.Must(pongo2.FromFile("home.html")) |
||||||
|
|
||||||
|
func indexHandler(w http.ResponseWriter, r *http.Request) { |
||||||
|
// Execute the template per HTTP request
|
||||||
|
err := tplHome.ExecuteWriter(pongo2.Context{"query": "dddd"}, w) |
||||||
|
if err != nil { |
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func healthCheckHandler(w http.ResponseWriter, r *http.Request) { |
||||||
|
// A very simple health check.
|
||||||
|
w.WriteHeader(http.StatusOK) |
||||||
|
w.Header().Set("Content-Type", "application/json") |
||||||
|
|
||||||
|
// In the future we could report back on the status of our DB, or our cache
|
||||||
|
// (e.g. Redis) by performing a simple PING, and include them in the response.
|
||||||
|
io.WriteString(w, `{"alive": true}`) |
||||||
|
} |
||||||
|
|
||||||
|
func main() { |
||||||
|
// Initialize a session in us-west-2 that the SDK will use to load
|
||||||
|
// credentials from the shared credentials file ~/.aws/credentials.
|
||||||
|
// sess, err := session.NewSession(&aws.Config{
|
||||||
|
// Region: aws.String("ap-southeast-1")},
|
||||||
|
// )
|
||||||
|
|
||||||
|
// Create DynamoDB client
|
||||||
|
/* svc := dynamodb.New(sess) |
||||||
|
devices, err := GetDevices(svc) |
||||||
|
if err != nil { |
||||||
|
fmt.Println("Got error unmarshalling:") |
||||||
|
fmt.Println(err.Error()) |
||||||
|
os.Exit(1) |
||||||
|
} |
||||||
|
for _, i := range devices.Items { |
||||||
|
device := Device{} |
||||||
|
err := dynamodbattribute.UnmarshalMap(i, &device) |
||||||
|
fmt.Printf(":: Name: %+v (%+v)\n", device.Name, device.Device) |
||||||
|
|
||||||
|
result, err := GetHistory(svc, device.Device, 2) |
||||||
|
// Make the DynamoDB Query API call
|
||||||
|
// fmt.Printf("result count item: %+v|%+v|", result.Count, result.ScannedCount)
|
||||||
|
for _, i := range result.Items { |
||||||
|
item := Item{} |
||||||
|
|
||||||
|
err = dynamodbattribute.UnmarshalMap(i, &item) |
||||||
|
|
||||||
|
if err != nil { |
||||||
|
fmt.Println("Got error unmarshalling:") |
||||||
|
fmt.Println(err.Error()) |
||||||
|
os.Exit(1) |
||||||
|
} |
||||||
|
|
||||||
|
// fmt.Println("Found item:")
|
||||||
|
fmt.Println(" > Timestamp: ", item.Timestamp, |
||||||
|
"Data == Temp: ", item.Data.Temperature, |
||||||
|
" | moisure: ", item.Data.Moisture) |
||||||
|
} |
||||||
|
} */ |
||||||
|
|
||||||
|
// func main() {
|
||||||
|
// session, err := r.Connect(r.ConnectOpts{
|
||||||
|
// Address: "localhost:28015",
|
||||||
|
// Database: "rtcom",
|
||||||
|
// })
|
||||||
|
// if err != nil {
|
||||||
|
// log.Panic(err.Error())
|
||||||
|
// }
|
||||||
|
// router := NewRouter()
|
||||||
|
|
||||||
|
// router.Handle("channel add", addChannel)
|
||||||
|
// router.Handle("channel subscribe", subscribeChannel)
|
||||||
|
|
||||||
|
// http.Handle("/", router)
|
||||||
|
// http.ListenAndServe(":4000", nil)
|
||||||
|
r := mux.NewRouter() |
||||||
|
// r.HandleFunc("/", HomeHandler)
|
||||||
|
// r.HandleFunc("/products", ProductsHandler)
|
||||||
|
// r.HandleFunc("/articles/{id}", handler).Methods("GET", "PUT")
|
||||||
|
// r.HandleFunc("/authors", handler).Queries("surname", "{surname}")
|
||||||
|
r.HandleFunc("/health", healthCheckHandler) |
||||||
|
r.HandleFunc("/", indexHandler) |
||||||
|
log.Fatal(http.ListenAndServe(":8000", r)) |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
# my IoT services |
||||||
|
|
||||||
|
This is show data from sensors around the house from Amazon DynamoDB. |
||||||
|
|
||||||
|
It probably is dead or changes as time goes by. |
||||||
|
|
||||||
|
Let's see. |
@ -0,0 +1,66 @@ |
|||||||
|
package main |
||||||
|
|
||||||
|
// import (
|
||||||
|
// "fmt"
|
||||||
|
// "net/http"
|
||||||
|
|
||||||
|
// "github.com/gorilla/websocket"
|
||||||
|
// )
|
||||||
|
|
||||||
|
// type Message struct {
|
||||||
|
// Name string `json:"name"`
|
||||||
|
// Data interface{} `json:"data"`
|
||||||
|
// }
|
||||||
|
|
||||||
|
// type Client struct {
|
||||||
|
// send chan Message
|
||||||
|
// socket *websocket.Conn
|
||||||
|
// // findHandler FindHandler
|
||||||
|
// // session *r.Session
|
||||||
|
// }
|
||||||
|
|
||||||
|
// type Handler func(*Client, interface{})
|
||||||
|
|
||||||
|
// var upgrader = websocket.Upgrader{
|
||||||
|
// ReadBufferSize: 1024,
|
||||||
|
// WriteBufferSize: 1024,
|
||||||
|
// CheckOrigin: func(r *http.Request) bool { return true },
|
||||||
|
// }
|
||||||
|
|
||||||
|
// type Router struct {
|
||||||
|
// rules map[string]Handler
|
||||||
|
// // session *r.Session
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func NewRouter() *Router {
|
||||||
|
// return &Router{
|
||||||
|
// rules: make(map[string]Handler),
|
||||||
|
// // session: session,
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func (r *Router) Handle(msgName string, handler Handler) {
|
||||||
|
// r.rules[msgName] = handler
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func (r *Router) FindHandler(msgName string) (Handler, bool) {
|
||||||
|
// handler, found := r.rules[msgName]
|
||||||
|
// return handler, found
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func (e *Router) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
|
// socket, err := upgrader.Upgrade(w, r, nil)
|
||||||
|
// if err != nil {
|
||||||
|
// w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
// fmt.Fprint(w, err.Error())
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
// client := NewClient(socket, e.FindHandler, e.session)
|
||||||
|
// go client.Write()
|
||||||
|
// client.Read()
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // func main() {
|
||||||
|
// // router := NewRouter()
|
||||||
|
// // // router.Handle('channel add', addChannel)
|
||||||
|
// // }
|
Loading…
Reference in new issue