1. Go and Get Physical with
the Cloud
Using Arduino with Google App Engine for Go
!
Justin Grammens
justin@arduino.mn
2. 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
3. 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 )
5. 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/
6. 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
7. Go Language Key Points
No 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)
8. 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
12. 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 )
13. 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
14. 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
15. 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 )
}
16. 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)
17. 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
18. 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
19. App Engine Using Go
Run “goapp” to see commands
goapp serve : runs local server
goapp deploy : upload to App Engine
20. App Engine Using Go
Run Hello World Example
cd appengine-examples
goapp server
Local service: http://localhost:8080
Local datastore viewer: http://localhost:8000
21. 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”
22. 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
23. Test Web Service
Simple REST Client
Verify the values are being stored
Toggle values for SMS notifications
24. 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!
28. 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.
}
29. 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.
30. 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!