Go and Get Physical with the Cloud Using Arduino with Google App Engine for Go ! Justin Grammens [email protected]
I Want to Build Something! Goal : Track movement using a motion sensor Technology Requirements: Use Go Use Google App Engine Use Arduino Send text message when movement occurs
What Well Cover Go Programming Language Deployment on Google App Engine ( using Go ) REST interface on App Engine ( using go-restful ) Reading sensor data on Arduino Sending data to our application on App Engine Send message to 3rd party SMS provider ( Twillio )
Block Diagram App Engine ArduinoBrowser SMS Service
Go Programming Language Developed by Google in 2007 Statically typed language, loosely derived from C. Automatic memory management FAST compilation and execution! Download at: https://code.google.com/p/go/
Go Language Key Points Some dynamic typing ( x:= 0 instead of int x = 0 ) Remote package management ( go get ) Built in mechanisms for concurrency Able to produce statically linked native binaries Strong focus on support for concurrency
Go Language Key Points No type inheritance No method overloading Has pointers, but no pointer arithmetic (ie. cant be changed) No generics (a la List in Java for instance) No Exceptions - instead uses an error return type func Open(name string) (le *File, err error)
Workspaces Designed from the ground up to work with code in public repositories $GOPATH variable points to your workspace location Put your code in a unique path convention is: $GOPATH/src/github/user/project
Example: hello-world.go usage: type go on command line $: go run hello.go hello world ! $: go install $: $GOPATH/bin/hello ! $ go build ./hello ( note the size of the executable )
Writing a Library package mydate ! import "time" ! func Birthdate() time.Time { d := time.Date(2014, time.May, 6, 0, 0, 0, 0, time.UTC) return d } Return type Capital letter means public access Calling function
Publish Library git push to public repository: https://github.com/ justingrammens/gdev Access with: import github.com/justingrammens/gdev/go- examples/mydate Anyone can install to their workspace with: go get github.com/justingrammens/gdev/go- examples/mydate
Calling Library package main ! import "fmt" import "github.com/justingrammens/gdev/mydate" import "time" ! func main() { now := time.Now() birthday := mydate.Birthdate() diff := birthday.YearDay() - now.YearDay() fmt.Printf("There are only %d days to my birthday!n", diff ) }
Example: Functions can return multiple values: func AddandSub(x, y int) (sum, difference int) { sum = x + y difference = x - y return } Called with: sum, difference := mydate.AddandSub(10, 11)
App Engine Using Go Platform as a Service (PaSS) Run applications in Googles infrastructure Frees you up to develop, not system admin Develop and test locally, deploy globally Beware - Go is Experimental! https://developers.google.com/appengine/downloads
App Engine Using Go Deployed to [your_app_id].appspot.com Quotas: Request & Response Size - 32 MB Request Duration - 60 sec Max total les - 10,000 total : 1,000 per directory Max size les - 32 MB
App Engine Using Go Run goapp to see commands goapp serve : runs local server goapp deploy : upload to App Engine
App Engine Using Go Run Hello World Example cd appengine-examples goapp server Local service: http://localhost:8080 Local datastore viewer: http://localhost:8000
App Engine Using Go No standard REST framework out of the box Use go-restful project Easy install and setup with go get command Resources: Events Sms
App Engine Using Go Run DevFest App cd devfest goapp server Access swagger for API at http://localhost:8080/apidocs Push update to google app engine at: appcfg.py --oauth2 update my app Manage at: https://appengine.google.com
Test Web Service Simple REST Client Verify the values are being stored Toggle values for SMS notications
Arduino Open source microcontroller board Started in Italy in 2005 as a college student project Based on a simplied version of C++ ( Wiring ) Allows for adding additional boards via shields WIFI shield is added for our project Many readily available sensors and libraries!
Arduino Wi Shield
Hardware Parts PIR Motion Sensor - $9.95 Arduino R3 Board - $30.00 Ofcial Arduino WIFI Shield - $70.00
Schematic
Arduino Basics Only 2 functions are required ! void setup() { // put your setup code here, to run once. } ! void loop() { // put your main code here, to run repeatedly. }
Motion Sample Code Motion activated by: Takes an infrared snapshot of the room If anything changes, pin #2 goes LOW Use the digitalRead of values Use WiClient to Post JSON to our web service. Print the status to the serial monitor.
Resources Play with Go Code! http://tour.golang.org/ https://groups.google.com/forum/m/#!forum/google- appengine-go https://developers.google.com/appengine/docs/go/ http://arduino.mn - Local Arduino users group!