Go and Get Physical with the CloudUsing 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 We’ll 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 PointsNo type inheritance
No method overloading
Has pointers, but no pointer arithmetic (ie. can’t be changed)
No generics (a la List<String> in Java for instance)
No Exceptions - instead uses an error return type
func Open(name string) (file *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 Workspacebin/ hello # command executable pkg/ darwin_amd64/github.com/justingrammens mydate.a # package object src/ github.com/justingrammens/ hello/ .git/ # git repository metadata hello.go # package source mydate/ .git/ # git repository metadata mydate.go # package source
IDEs / Editors with Plugins
Emacs
Eclipse - ( GoClipse )
IntelliJ IDEA
Sublime Text
TextMate
Vim
Example: hello.gogit clone https://github.com/justingrammens/gdev !
package main import "fmt" func main() { fmt.Println("hello world") } !
Example: hello-world.gousage: 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 Librarygit 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 Librarypackage 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 Google’s 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 files - 10,000 total : 1,000 per directory
Max size files - 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 GoRun 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 notifications
Arduino
Open source microcontroller board
Started in Italy in 2005 as a college student project
Based on a simplified 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 Wifi Shield
Hardware PartsPIR Motion Sensor - $9.95
Arduino R3 Board - $30.00
Official Arduino WIFI Shield - $70.00
Schematic
Arduino BasicsOnly 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 WifiClient 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 user’s group!
Thanks!
Questions?