SlideShare a Scribd company logo
Internet of Things - The Salesforce
Lego Machine Cloud
Andrew Fawcett
FinancialForce.com, CTO
@andyinthecloud
Andrew Fawcett
FinancialForce.com, CTO
@andyinthecloud
About FinancialForce.com
‱ San Francisco Headquarters
‱ Harrogate, UK
‱ Granada, Spain
‱ Toronto, Canada
‱ Manchester, US
‱ Opening Sydney, AUS in Sept, 2014
‱ 350+ Employees
‱ 400+ by 12/31/2014
‱ Customers in 31 countries
‱ 80% Y-o-Y revenue growth
‱ Advent commitment of $50 million
Session Resources
‱ Follow the Session in the Dreamforce
App, I will share this slide deck and
other related links on the Feed
‱ Be social and feel free to ask follow up
questions! 
Introduction
‱ What are the device requirements?
‱ How intelligent does the device need to be?
‱ What is a Machine Cloud?
‱ Building a Machine Cloud with Salesforce1 Platform
‱ Demos
‱ How to make your own Machine Cloud with
with Lego Mindstorms EV3
What does a Device need to call the Salesforce API’s?
‱ Ability to connect to a local internet gateway
– e.g. phone or other computer connected to Internet
‱ Ability to connect direct to Internet
– SSL support ideally, though non-SSL end points
proxies can be used
‱ Ability to parse XML or JSON
– String manipulation or ideally JSON or XML parsers
‱ Ability to consume Java libraries
– Ideally Salesforce Web Service Connector
Basic Capabilities, limited RAM/CPU
Advanced Capabilities e.g. running OS’s
What does a Device need to call the Salesforce API’s?
‱ Common runtime language
– Such as Java!
‱ Oracle port to ARMv5 process running on Lego Mindstorms EV3
‱ Community Java runtime known as Lejos for Lego Mindstorms NXT
How intelligent should the device be?
‱ Processing power and storage can vary
– Depends on sensor input and output demands
– Cloud based logic can be used via HTTPS communications
– HTTPS communications
‱ Streaming communications vs Polling
‱ Ability to connect locally to the device is useful
– Lego Mindstorms EV3 runs a Lego variation of Linux
– Can TELNET to it and execute Unix commands
– Java Remote Debug is also possible
LEGO Mindstorms EV3 Programmable Brick
Feature Spec
Display Monochrome LCD
178 x 128 pixels
Operating System Linux based
Main Processor 300 MH Texas Instruments Sitara
AM11808 (ARM9 core)
Main Memory 64 MB RAM, 16 MB Flash
USB Host Port Yes
WiFi Yes via USB Dongle
Bluetooth Yes
What is a Machine Cloud?
‱ A single place for machines to
communicate and share information
‱ Machines can communicate to us and
other machines across the world
‱ Can be used to store data
‱ Can perform calculations on behalf of
devices, with access to more
information, also easier maintenance
and updates to software
Introducing a Machine Cloud built with Salesforce1 Platform
Salesforce1
Mobile
Custom
Objects
REST and
Streaming
API’s
Connected
Applications
Controlling Machines through Custom Objects
#clicksnotcode
Controlling Machines through Custom Objects
#clicksnotcode
Demo : Pairing
Pairing Mindstorm EV3 Robots to our Machine Cloud and sending commands
Ok so what just happened under the hood?
Salesforce
Streaming and
REST APIEV3 #1
ev3force.jar
Heroku
Connected App
EV3 Pairing REST API
EV3 #2
ev3force.jar
Custom
Objects
Commands
Commands
Pairing Pairing
You want to go further under the hood?
Salesforce
Streaming and
REST API
Heroku
Connected App
EV3 Pairing REST API
EV3
2. Get Pin
3. Wait for PIN Entry and
receive oAuth Token
4. User Enters PIN, oAuth Token is passed
/ev3force.properties
5. EV3 stores oAuth Token
ev3force.jar
Custom
Objects
1. oAuth Token
stored?
First time ev3force.jar runs
Each time ev3force.jar runs
6. Read Robot Details
7. Start Listening
8. Create
Command records
Demo: Controlling a Lego Robot
Moving a Robot around
Demo: Programming a Robot
Pre-creating Command records and sending a Run Program command
How is it implemented?
Code: Pairing
// Http commons with pairing service
HttpClient httpClient = new HttpClient();
httpClient.setConnectTimeout(20 * 1000); // Connection timeout
httpClient.setTimeout(120 * 1000); // Read timeout
httpClient.start();
// Get a pin number
ContentExchange getPin = new ContentExchange();
getPin.setMethod("GET");
getPin.setURL("https://ev3forcepairing.herokuapp.com/service/pin");
httpClient.send(getPin);
getPin.waitForDone();
Map<String, Object> parsed = (Map<String, Object>) JSON.parse(getPin.getResponseContent());
// Display pin number to enter into Salesforce
LCD.clear();
LCD.drawString("Pin " + parsed.get("pin"), 0, 3);
Code: Pairing
// Wait for oAuth token for the given pin number
while(true)
{
getPin = new ContentExchange();
getPin.setMethod("GET");
getPin.setURL("https://ev3forcepairing.herokuapp.com/service/pin?pin=" + pin);
httpClient.send(getPin);
getPin.waitForDone();
parsed = (Map<String, Object>) JSON.parse(getPin.getResponseContent());
oAuthToken = (String) parsed.get("oAuthToken");
robotId = (String) parsed.get("robotId");
serverUrl = (String) parsed.get(”serverUrl");
if(oAuthToken!=null)
break;
LCD.drawString("Waiting " + waitCount++, 0, 4);
Delay.msDelay(1000);
}
Code: Pairing
<td><b>Pin:</b></td>
<td>
<form action="/default/pinset.jsp">
<input name="pin"/>
<input type="submit" value="Pair"/>
<input name=”refreshToken" type="hidden"
value="${canvasRequest.client.refreshToken}"/>
<input name="recordId" type="hidden"
value="${canvasRequest.context.environmentContext.record.Id}"/>
</form>
</td>
<body>
<%
String pin = request.getParameter("pin");
String refreshToken = request.getParameter(”refreshToken");
String robotId = request.getParameter("recordId");
PairingResource.setConnection(pin, refreshToken, robotId);
%>
Now check your EV3!
</body>
Code: Listening for Commands via Streaming API
// Subscribe to the 'commands' topic to listen for new Command__c records
client.getChannel("/topic/commands").subscribe(new ClientSessionChannel.MessageListener()
{
public void onMessage(ClientSessionChannel channel, Message message)
{
HashMap<String, Object> data = (HashMap<String, Object>)
JSON.parse(message.toString());
HashMap<String, Object> record =
(HashMap<String, Object>) data.get("data");
HashMap<String, Object> sobject =
(HashMap<String, Object>) record.get("sobject");
String commandName = (String) sobject.get("Name");
String command = (String) sobject.get("Command__c");
String commandParameter = (String) sobject.get("CommandParameter__c");
String programToRunId = (String) sobject.get("ProgramToRun__c");
executeCommand(
commandName, command, commandParameter, programToRunId, partnerConnection);
}
});
Code: Moving the Robot around with Lejos
import lejos.hardware.motor.Motor;
public static void moveForward(int rotations)
{
Motor.B.rotate((180 * rotations)*1, true);
Motor.C.rotate((180 * rotations)*1, true);
while (Motor.B.isMoving() || Motor.C.isMoving());
Motor.B.flt(true);
Motor.C.flt(true);
}
public static void moveBackwards(int rotations)
{
Motor.B.rotate((180 * rotations)*-1, true);
Motor.C.rotate((180 * rotations)*-1, true);
while (Motor.B.isMoving() || Motor.C.isMoving());
Motor.B.flt(true);
Motor.C.flt(true);
}
Building your Lego Robot
‱ What do I need?
– Edimax EW-7811UN 150Mbps Wireless Nano USB Adapter
– Micro SD Card (SDHC Only), 1GB, no greater than 32GB
– Lego Mindstorms EV3 Set, Gripper Robot!
Creating your own Lego Robot Machine Cloud!
‱ Installation in Salesforce
– Install the Machine Cloud managed package (see Readme)
‱ https://github.com/afawcett/legoev3-machinecloud
‱ Installation on Lego Mindstorms EV3
1. Install Lejos on your SDCard and install in the EV3
‱ http://sourceforge.net/p/lejos/wiki/Home/
2. Use the Lejos menu on the EV3 to connect to your Wifi
3. Copy the ev3force.jar to your EV3 Robot (from /dist folder in GitHub Repo)
‱ Run the /bin/ev3console UI and deploy using the Programs tab
Creating your own Lego Robot Machine Cloud!
‱ Connecting your Robots
1. Run the ev3force.jar application on the EV3
2. Note the PIN number shown on the EV3 Robot
3. Login to your Salesforce org and create a Robot record
4. Enter PIN number, wait for the device to connect to Salesforce
5. Send it commands and programs to run!
Further Ideas

‱ Expose the Machine Cloud via Salesforce Communities
‱ Machine Cloud API?
– Perhaps we already have this?
‱ Using the Salesforce API to insert records to the Command__c object? 
‱ Add support for other Devices?
– Watches, Phones etc
‱ Add support for Generic Streaming API events
– Events not driven by Database events but by processes
Session Resources
‱ Follow the Session in the Dreamforce
App, I will share this slide deck and
other related links on the Feed
‱ Be social and feel free to ask follow up
questions! 
Internet of things   the salesforce lego machine cloud

More Related Content

PPTX
Building strong foundations apex enterprise patterns
PPTX
Salesforce World Tour 2016 : Lightning Out : Components on any Platform
PDF
Building a Lightning App with Angular Material Design
PDF
Designing Forge UI: A Story of Designing an App UI System
PDF
Forge: Under the Hood
PDF
Building Faster With Your Team's UI Kit
PPTX
Introduction to lightning components
PDF
Alon Fliess: APM – What Is It, and Why Do I Need It? - Architecture Next 20
Building strong foundations apex enterprise patterns
Salesforce World Tour 2016 : Lightning Out : Components on any Platform
Building a Lightning App with Angular Material Design
Designing Forge UI: A Story of Designing an App UI System
Forge: Under the Hood
Building Faster With Your Team's UI Kit
Introduction to lightning components
Alon Fliess: APM – What Is It, and Why Do I Need It? - Architecture Next 20

What's hot (20)

PPTX
Phonegap android angualr material design
PPTX
Debugging lightning components
PDF
Firebase Cloud Messaging for iOS
PDF
Take Action with Forge Triggers
PDF
iOSDevCamp Firebase Overview
PDF
Meet the Forge Runtime
PDF
Exposing Salesforce REST Services Using Swagger
PDF
Build a video chat application with twilio, rails, and javascript (part 1)
PDF
Forge UI: A New Way to Customize the Atlassian User Experience
PPTX
2014 SharePoint Saturday Melbourne Apps or not to Apps
PDF
Spec-first API Design for Speed and Safety
PPTX
Next level of Appium
PPTX
Do's and don'ts for Office 365 development
PDF
Declaring Server App Components in Pure Java
PDF
Building a Cerberus App Without Losing Our Heads: The Passage to a Cross-Plat...
PPTX
Lightning Components Workshop
PDF
Trusted by Default: The Forge Security & Privacy Model
PDF
Creating Your Own Server Add-on that Customizes Confluence or JIRA
PDF
Integrating consumers IoT devices into Business Workflow
PDF
Practical Patterns for Developing a Cross-product Cross-version App
Phonegap android angualr material design
Debugging lightning components
Firebase Cloud Messaging for iOS
Take Action with Forge Triggers
iOSDevCamp Firebase Overview
Meet the Forge Runtime
Exposing Salesforce REST Services Using Swagger
Build a video chat application with twilio, rails, and javascript (part 1)
Forge UI: A New Way to Customize the Atlassian User Experience
2014 SharePoint Saturday Melbourne Apps or not to Apps
Spec-first API Design for Speed and Safety
Next level of Appium
Do's and don'ts for Office 365 development
Declaring Server App Components in Pure Java
Building a Cerberus App Without Losing Our Heads: The Passage to a Cross-Plat...
Lightning Components Workshop
Trusted by Default: The Forge Security & Privacy Model
Creating Your Own Server Add-on that Customizes Confluence or JIRA
Integrating consumers IoT devices into Business Workflow
Practical Patterns for Developing a Cross-product Cross-version App
Ad

Viewers also liked (20)

PDF
Building BI Publisher Reports using Templates
PPTX
Introduction to Analytics Cloud
PDF
Real-time SQL Access to Your Salesforce.com Data Using Progress Data Direct
PDF
Apex Connector for Lightning Connect: Make Anything a Salesforce Object
PPTX
Force.com Canvas in the Publisher and Chatter Feed
PPTX
Lightning strikes twice- SEDreamin
PPTX
Go Faster with Process Builder
PDF
Lightning Connect: Lessons Learned
PDF
Lightning Out: Components for the Rest of the World
PDF
Lightning Connect Custom Adapters: Connecting Anything with Salesforce
PDF
Two-Way Integration with Writable External Objects
PDF
How the Best Consumer Brands like Angie's List Find New Customers on Facebook
PDF
How Intuit Turned Transactional Emails Into Quick Customer Wins
PDF
XLS PE How To Tutorials Tips & Tricks
PDF
Secure Salesforce: Lightning Components Best Practices
PDF
Marketing and Sales Aligned with a Common Goal
PPTX
Access External Data in Real-time with Lightning Connect
PPTX
Detecting Signals from the Noise to Engage Consumers During Their Path to Pur...
PDF
Basics of Killer Content Marketing
PPT
Slideshare About Me
Building BI Publisher Reports using Templates
Introduction to Analytics Cloud
Real-time SQL Access to Your Salesforce.com Data Using Progress Data Direct
Apex Connector for Lightning Connect: Make Anything a Salesforce Object
Force.com Canvas in the Publisher and Chatter Feed
Lightning strikes twice- SEDreamin
Go Faster with Process Builder
Lightning Connect: Lessons Learned
Lightning Out: Components for the Rest of the World
Lightning Connect Custom Adapters: Connecting Anything with Salesforce
Two-Way Integration with Writable External Objects
How the Best Consumer Brands like Angie's List Find New Customers on Facebook
How Intuit Turned Transactional Emails Into Quick Customer Wins
XLS PE How To Tutorials Tips & Tricks
Secure Salesforce: Lightning Components Best Practices
Marketing and Sales Aligned with a Common Goal
Access External Data in Real-time with Lightning Connect
Detecting Signals from the Noise to Engage Consumers During Their Path to Pur...
Basics of Killer Content Marketing
Slideshare About Me
Ad

Similar to Internet of things the salesforce lego machine cloud (20)

PPTX
PowerShell: A Language for the Internet of Things #ATLPUG
PPTX
Azure Internet of Things
PPTX
The Internet of Fails - Mark Stanislav, Senior Security Consultant, Rapid7
 
PDF
Athens IoT meetup #7 - Create the Internet of your Things - Laurent Ellerbach...
PDF
IoT Workshop in Macao
PDF
IoT Workshop in Macao
PPTX
How to Introduce Telemetry Streaming (gNMI) in Your Network with SNMP with Te...
PPTX
FIWARE Primer - Learn FIWARE in 60 Minutes
PPTX
Federico Michele Facca - FIWARE Primer - Learn FIWARE in 60 Minutes
PPTX
SignalR Intro + WPDev integration @ Codetock
PPTX
IoT on azure
PDF
APIs for the Internet of Things
 
PPT
Internetandjava
PPT
Javauserguide
PPT
ppttips
PPT
ppttips
PPT
ppttips
PPT
ppttips
PPT
ppt tips
PPT
Java
PowerShell: A Language for the Internet of Things #ATLPUG
Azure Internet of Things
The Internet of Fails - Mark Stanislav, Senior Security Consultant, Rapid7
 
Athens IoT meetup #7 - Create the Internet of your Things - Laurent Ellerbach...
IoT Workshop in Macao
IoT Workshop in Macao
How to Introduce Telemetry Streaming (gNMI) in Your Network with SNMP with Te...
FIWARE Primer - Learn FIWARE in 60 Minutes
Federico Michele Facca - FIWARE Primer - Learn FIWARE in 60 Minutes
SignalR Intro + WPDev integration @ Codetock
IoT on azure
APIs for the Internet of Things
 
Internetandjava
Javauserguide
ppttips
ppttips
ppttips
ppttips
ppt tips
Java

Recently uploaded (20)

PDF
2_STM32&SecureElements2_STM32&SecureElements
PDF
CAB UNIT 1 with computer details details
DOCX
Copy-OT LIST 12.8.25.docxjdjfufufufufuuffuf
PDF
20A LG INR18650HJ2 3.6V 2900mAh Battery cells for Power Tools Vacuum Cleaner
PPTX
AI_ML_Internship_WReport_Template_v2.pptx
PPTX
Growth Capital Investment - Espresso Capital.pptx
PPTX
vortex flow measurement in instrumentation
PPTX
Subordinate_Clauses_BlueGradient_Optimized.pptx
PDF
ISS2022 present sdabhsa hsdhdfahasda ssdsd
PPTX
Pin configuration and project related to
PDF
Maxon CINEMA 4D 2025 Crack Free Download Latest Version
PPTX
Unit-1.pptxgeyeuueueu7r7r7r77r7r7r7uriruru
PDF
PakistanCoinageAct-906.pdfdbnsshsjjsbsbb
PDF
ICT grade for 8. MATATAG curriculum .P2.pdf
PPTX
unit1d-communitypharmacy-240815170017-d032dce8.pptx
PPTX
Group 4 [BSIT-1C] Computer Network (1).pptx
PDF
SAHIL PROdhdjejss yo yo pdf TOCOL PPT.pdf
PPTX
New professional education PROF-ED-7_103359.pptx
PDF
2- Physical Layer (06).pdfgshshshbsbshshshhs
PPTX
Computer Hardware - Technology and Livelihood Education
2_STM32&SecureElements2_STM32&SecureElements
CAB UNIT 1 with computer details details
Copy-OT LIST 12.8.25.docxjdjfufufufufuuffuf
20A LG INR18650HJ2 3.6V 2900mAh Battery cells for Power Tools Vacuum Cleaner
AI_ML_Internship_WReport_Template_v2.pptx
Growth Capital Investment - Espresso Capital.pptx
vortex flow measurement in instrumentation
Subordinate_Clauses_BlueGradient_Optimized.pptx
ISS2022 present sdabhsa hsdhdfahasda ssdsd
Pin configuration and project related to
Maxon CINEMA 4D 2025 Crack Free Download Latest Version
Unit-1.pptxgeyeuueueu7r7r7r77r7r7r7uriruru
PakistanCoinageAct-906.pdfdbnsshsjjsbsbb
ICT grade for 8. MATATAG curriculum .P2.pdf
unit1d-communitypharmacy-240815170017-d032dce8.pptx
Group 4 [BSIT-1C] Computer Network (1).pptx
SAHIL PROdhdjejss yo yo pdf TOCOL PPT.pdf
New professional education PROF-ED-7_103359.pptx
2- Physical Layer (06).pdfgshshshbsbshshshhs
Computer Hardware - Technology and Livelihood Education

Internet of things the salesforce lego machine cloud

  • 1. Internet of Things - The Salesforce Lego Machine Cloud Andrew Fawcett FinancialForce.com, CTO @andyinthecloud
  • 3. About FinancialForce.com ‱ San Francisco Headquarters ‱ Harrogate, UK ‱ Granada, Spain ‱ Toronto, Canada ‱ Manchester, US ‱ Opening Sydney, AUS in Sept, 2014 ‱ 350+ Employees ‱ 400+ by 12/31/2014 ‱ Customers in 31 countries ‱ 80% Y-o-Y revenue growth ‱ Advent commitment of $50 million
  • 4. Session Resources ‱ Follow the Session in the Dreamforce App, I will share this slide deck and other related links on the Feed ‱ Be social and feel free to ask follow up questions! 
  • 5. Introduction ‱ What are the device requirements? ‱ How intelligent does the device need to be? ‱ What is a Machine Cloud? ‱ Building a Machine Cloud with Salesforce1 Platform ‱ Demos ‱ How to make your own Machine Cloud with with Lego Mindstorms EV3
  • 6. What does a Device need to call the Salesforce API’s? ‱ Ability to connect to a local internet gateway – e.g. phone or other computer connected to Internet ‱ Ability to connect direct to Internet – SSL support ideally, though non-SSL end points proxies can be used ‱ Ability to parse XML or JSON – String manipulation or ideally JSON or XML parsers ‱ Ability to consume Java libraries – Ideally Salesforce Web Service Connector Basic Capabilities, limited RAM/CPU Advanced Capabilities e.g. running OS’s
  • 7. What does a Device need to call the Salesforce API’s? ‱ Common runtime language – Such as Java! ‱ Oracle port to ARMv5 process running on Lego Mindstorms EV3 ‱ Community Java runtime known as Lejos for Lego Mindstorms NXT
  • 8. How intelligent should the device be? ‱ Processing power and storage can vary – Depends on sensor input and output demands – Cloud based logic can be used via HTTPS communications – HTTPS communications ‱ Streaming communications vs Polling ‱ Ability to connect locally to the device is useful – Lego Mindstorms EV3 runs a Lego variation of Linux – Can TELNET to it and execute Unix commands – Java Remote Debug is also possible
  • 9. LEGO Mindstorms EV3 Programmable Brick Feature Spec Display Monochrome LCD 178 x 128 pixels Operating System Linux based Main Processor 300 MH Texas Instruments Sitara AM11808 (ARM9 core) Main Memory 64 MB RAM, 16 MB Flash USB Host Port Yes WiFi Yes via USB Dongle Bluetooth Yes
  • 10. What is a Machine Cloud? ‱ A single place for machines to communicate and share information ‱ Machines can communicate to us and other machines across the world ‱ Can be used to store data ‱ Can perform calculations on behalf of devices, with access to more information, also easier maintenance and updates to software
  • 11. Introducing a Machine Cloud built with Salesforce1 Platform Salesforce1 Mobile Custom Objects REST and Streaming API’s Connected Applications
  • 12. Controlling Machines through Custom Objects #clicksnotcode
  • 13. Controlling Machines through Custom Objects #clicksnotcode
  • 14. Demo : Pairing Pairing Mindstorm EV3 Robots to our Machine Cloud and sending commands
  • 15. Ok so what just happened under the hood? Salesforce Streaming and REST APIEV3 #1 ev3force.jar Heroku Connected App EV3 Pairing REST API EV3 #2 ev3force.jar Custom Objects Commands Commands Pairing Pairing
  • 16. You want to go further under the hood? Salesforce Streaming and REST API Heroku Connected App EV3 Pairing REST API EV3 2. Get Pin 3. Wait for PIN Entry and receive oAuth Token 4. User Enters PIN, oAuth Token is passed /ev3force.properties 5. EV3 stores oAuth Token ev3force.jar Custom Objects 1. oAuth Token stored? First time ev3force.jar runs Each time ev3force.jar runs 6. Read Robot Details 7. Start Listening 8. Create Command records
  • 17. Demo: Controlling a Lego Robot Moving a Robot around
  • 18. Demo: Programming a Robot Pre-creating Command records and sending a Run Program command
  • 19. How is it implemented?
  • 20. Code: Pairing // Http commons with pairing service HttpClient httpClient = new HttpClient(); httpClient.setConnectTimeout(20 * 1000); // Connection timeout httpClient.setTimeout(120 * 1000); // Read timeout httpClient.start(); // Get a pin number ContentExchange getPin = new ContentExchange(); getPin.setMethod("GET"); getPin.setURL("https://ev3forcepairing.herokuapp.com/service/pin"); httpClient.send(getPin); getPin.waitForDone(); Map<String, Object> parsed = (Map<String, Object>) JSON.parse(getPin.getResponseContent()); // Display pin number to enter into Salesforce LCD.clear(); LCD.drawString("Pin " + parsed.get("pin"), 0, 3);
  • 21. Code: Pairing // Wait for oAuth token for the given pin number while(true) { getPin = new ContentExchange(); getPin.setMethod("GET"); getPin.setURL("https://ev3forcepairing.herokuapp.com/service/pin?pin=" + pin); httpClient.send(getPin); getPin.waitForDone(); parsed = (Map<String, Object>) JSON.parse(getPin.getResponseContent()); oAuthToken = (String) parsed.get("oAuthToken"); robotId = (String) parsed.get("robotId"); serverUrl = (String) parsed.get(”serverUrl"); if(oAuthToken!=null) break; LCD.drawString("Waiting " + waitCount++, 0, 4); Delay.msDelay(1000); }
  • 22. Code: Pairing <td><b>Pin:</b></td> <td> <form action="/default/pinset.jsp"> <input name="pin"/> <input type="submit" value="Pair"/> <input name=”refreshToken" type="hidden" value="${canvasRequest.client.refreshToken}"/> <input name="recordId" type="hidden" value="${canvasRequest.context.environmentContext.record.Id}"/> </form> </td> <body> <% String pin = request.getParameter("pin"); String refreshToken = request.getParameter(”refreshToken"); String robotId = request.getParameter("recordId"); PairingResource.setConnection(pin, refreshToken, robotId); %> Now check your EV3! </body>
  • 23. Code: Listening for Commands via Streaming API // Subscribe to the 'commands' topic to listen for new Command__c records client.getChannel("/topic/commands").subscribe(new ClientSessionChannel.MessageListener() { public void onMessage(ClientSessionChannel channel, Message message) { HashMap<String, Object> data = (HashMap<String, Object>) JSON.parse(message.toString()); HashMap<String, Object> record = (HashMap<String, Object>) data.get("data"); HashMap<String, Object> sobject = (HashMap<String, Object>) record.get("sobject"); String commandName = (String) sobject.get("Name"); String command = (String) sobject.get("Command__c"); String commandParameter = (String) sobject.get("CommandParameter__c"); String programToRunId = (String) sobject.get("ProgramToRun__c"); executeCommand( commandName, command, commandParameter, programToRunId, partnerConnection); } });
  • 24. Code: Moving the Robot around with Lejos import lejos.hardware.motor.Motor; public static void moveForward(int rotations) { Motor.B.rotate((180 * rotations)*1, true); Motor.C.rotate((180 * rotations)*1, true); while (Motor.B.isMoving() || Motor.C.isMoving()); Motor.B.flt(true); Motor.C.flt(true); } public static void moveBackwards(int rotations) { Motor.B.rotate((180 * rotations)*-1, true); Motor.C.rotate((180 * rotations)*-1, true); while (Motor.B.isMoving() || Motor.C.isMoving()); Motor.B.flt(true); Motor.C.flt(true); }
  • 25. Building your Lego Robot ‱ What do I need? – Edimax EW-7811UN 150Mbps Wireless Nano USB Adapter – Micro SD Card (SDHC Only), 1GB, no greater than 32GB – Lego Mindstorms EV3 Set, Gripper Robot!
  • 26. Creating your own Lego Robot Machine Cloud! ‱ Installation in Salesforce – Install the Machine Cloud managed package (see Readme) ‱ https://github.com/afawcett/legoev3-machinecloud ‱ Installation on Lego Mindstorms EV3 1. Install Lejos on your SDCard and install in the EV3 ‱ http://sourceforge.net/p/lejos/wiki/Home/ 2. Use the Lejos menu on the EV3 to connect to your Wifi 3. Copy the ev3force.jar to your EV3 Robot (from /dist folder in GitHub Repo) ‱ Run the /bin/ev3console UI and deploy using the Programs tab
  • 27. Creating your own Lego Robot Machine Cloud! ‱ Connecting your Robots 1. Run the ev3force.jar application on the EV3 2. Note the PIN number shown on the EV3 Robot 3. Login to your Salesforce org and create a Robot record 4. Enter PIN number, wait for the device to connect to Salesforce 5. Send it commands and programs to run!
  • 28. Further Ideas
 ‱ Expose the Machine Cloud via Salesforce Communities ‱ Machine Cloud API? – Perhaps we already have this? ‱ Using the Salesforce API to insert records to the Command__c object?  ‱ Add support for other Devices? – Watches, Phones etc ‱ Add support for Generic Streaming API events – Events not driven by Database events but by processes
  • 29. Session Resources ‱ Follow the Session in the Dreamforce App, I will share this slide deck and other related links on the Feed ‱ Be social and feel free to ask follow up questions! 