A Hybrid Visual Dataflow Language For Coordination in Mobile Ad Hoc Networks
Andoni Lombide Carreton and Theo D’Hondt
Department of Computer ScienceVrije Universiteit Brussel
12th International Conference on Coordination Models and LanguagesJune 7-10 2010Amsterdam, the Netherlands 1
Wednesday 9 June 2010
Mobile Reactive Applications
2
Wednesday 9 June 2010
Mobile Reactive Applications
Mobile devices
2
Wednesday 9 June 2010
Mobile Reactive Applications
Mobile devices
2
Wednesday 9 June 2010
Mobile Reactive Applications
Mobile devices
Intermittent connectivity
2
Wednesday 9 June 2010
Mobile Reactive Applications
Mobile devices
Intermittent connectivity
2
Spontaneous interactions
Wednesday 9 June 2010
Mobile Reactive Applications
Mobile devices
Intermittent connectivity
2
Scarce infrastructure
Spontaneous interactions
Wednesday 9 June 2010
Mobile Reactive Applications
Mobile devices
Intermittent connectivity
2
Scarce infrastructure
Representation of physical objects
Spontaneous interactions
Wednesday 9 June 2010
Distributed Event-driven Architecture
Mobile Reactive Applications
Scarce infrastructure
Representation of physical objects
Spontaneous interactions
Intermittent connectivity
Mobile devices
3
Wednesday 9 June 2010
Distributed Event-driven Architecture
Mobile Reactive Applications
Scarce infrastructure
Representation of physical objects
Spontaneous interactions
Intermittent connectivity
Mobile devices
Ad Hoc Discovery
3
Wednesday 9 June 2010
Distributed Event-driven Architecture
Mobile Reactive Applications
Scarce infrastructure
Representation of physical objects
Spontaneous interactions
Intermittent connectivity
Mobile devices
Decentralized
Ad Hoc Discovery
3
Wednesday 9 June 2010
Distributed Event-driven Architecture
Mobile Reactive Applications
Scarce infrastructure
Representation of physical objects
Spontaneous interactions
Intermittent connectivity
Mobile devices
Decentralized
Resilient
Ad Hoc Discovery
3
Wednesday 9 June 2010
Distributed Event-driven Architecture
Mobile Reactive Applications
Scarce infrastructure
Representation of physical objects
Spontaneous interactions
Intermittent connectivity
Mobile devices
Event streams
Decentralized
Resilient
Ad Hoc Discovery
3
Wednesday 9 June 2010
Distributed Event-driven Architecture
Mobile Reactive Applications
Scarce infrastructure
Representation of physical objects
Spontaneous interactions
Intermittent connectivity
Mobile devices
Event streams
Decentralized
Resilient
Ad Hoc Discovery Broadcasting
3
Wednesday 9 June 2010
AmbientTalk
whenever: Product discovered: { |product|
}
4
Distributed Event-driven Architecture
Wednesday 9 June 2010
AmbientTalk
def future := product<-getSerial(); when: future becomes: { |serial| println(“Product discovered: ” + serial);
}
whenever: Product discovered: { |product|
}
4
Distributed Event-driven Architecture
Wednesday 9 June 2010
AmbientTalk
def future := product<-getSerial(); when: future becomes: { |serial| println(“Product discovered: ” + serial);
}
whenever: Product discovered: { |product|
}
whenever: product disconnected: { println("Product disconnected: " + serial); }; whenever: product reconnected: { println("Product reconnected: " + serial); };
4
Distributed Event-driven Architecture
Wednesday 9 June 2010
AmbientTalk
def future := product<-getSerial(); when: future becomes: { |serial| println(“Product discovered: ” + serial);
}
whenever: Product discovered: { |product|
}
whenever: product disconnected: { println("Product disconnected: " + serial); }; whenever: product reconnected: { println("Product reconnected: " + serial); };
Decentralized discovery based on UDP broadcasting
4
Distributed Event-driven Architecture
Wednesday 9 June 2010
AmbientTalk
def future := product<-getSerial(); when: future becomes: { |serial| println(“Product discovered: ” + serial);
}
whenever: Product discovered: { |product|
}
whenever: product disconnected: { println("Product disconnected: " + serial); }; whenever: product reconnected: { println("Product reconnected: " + serial); };
Decentralized discovery based on UDP broadcasting
Resilient asynchronous
messages
4
Distributed Event-driven Architecture
Wednesday 9 June 2010
AmbientTalk
def future := product<-getSerial(); when: future becomes: { |serial| println(“Product discovered: ” + serial);
}
whenever: Product discovered: { |product|
}
whenever: product disconnected: { println("Product disconnected: " + serial); }; whenever: product reconnected: { println("Product reconnected: " + serial); };
Decentralized discovery based on UDP broadcasting
Resilient asynchronous
messages
Control flow driven by events, but specified by textual, sequential blocks
4
Distributed Event-driven Architecture
Wednesday 9 June 2010
Dataflow Programming
f(x,y,z)
x y z
5
Wednesday 9 June 2010
The Ambient Vinyl Store
6
Wednesday 9 June 2010
The Ambient Vinyl Store
6
Wednesday 9 June 2010
The Ambient Vinyl Store
6
Wednesday 9 June 2010
The Ambient Vinyl Store
6
Wednesday 9 June 2010
7
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Wednesday 9 June 2010
UserDatabase -> DB.getRecommendationsWithProducts(products);
7
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Wednesday 9 June 2010
UserDatabase -> DB.getRecommendationsWithProducts(products);
Shelf -> filterOutPresentProducts(recommendToUser);
7
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products recommendToUser
1
1
1
1 1
*
Wednesday 9 June 2010
UserDatabase -> DB.getRecommendationsWithProducts(products);
Shelf -> filterOutPresentProducts(recommendToUser);
7
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
recommendations
recommendToUser
1
1
1
1 1
1
1
*
Wednesday 9 June 2010
UserDatabase -> DB.getRecommendationsWithProducts(products);
Shelf -> filterOutPresentProducts(recommendToUser);
7
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
recommendations
nearbyRecommendations
recommendToUser
1
1
1
1 1
1 1
1
1
*
Wednesday 9 June 2010
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
Shelf -> filterOutPresentProducts(recommendToUser);
7
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
recommendations
nearbyRecommendations
recommendToUser
1
1
1
1 1
1 1
1
1
*
Wednesday 9 June 2010
A Visual Dataflow Language For Coordination in Mobile Ad Hoc Networks
Role -> << par1, par2, par3 << code
dependency1
dependency4dependen
cy2
dependen
cy31
1
*
1
1
1
1
*
JVM
AmbientTalk VMJVM
AmbientTalk VM
8
Role- method1- method2- method3
Role- method1- method2- method3
Wednesday 9 June 2010
Executing Mobile AmbientTalk Code Resilient
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
productsInBag recommendations nearbyRecommendations
1 1 1
[ record1, record2, record3, record4 ]
[ record1, record2, record4 ]
[ record2, record4 ]
def customer := extend: OperatorHostInterface with: { // ... Private fields ... def GUI := extend: JFrame with: { def showProductsInBag(products) { ... }; def showRecommendations(products) { ... }; def showRecommendationsInShop(products) { ... }; } }
JVM
AmbientTalk VM9
Wednesday 9 June 2010
Propagating and Reacting to EventsEvent streams
Resilient
Shelf -> filterOutPresentProducts(recommendToUser);
nearbyRecommendations
recommendToUser
1
*
[ record1, record2, record3, record4 ]
[ record2, record4 ]
filterOutPresentProducts( )
>> system.println(recommendToUser) [ record1, record2 ]
10
Wednesday 9 June 2010
Propagating and Reacting to EventsEvent streams
Resilient
Shelf -> filterOutPresentProducts(recommendToUser);
nearbyRecommendations
recommendToUser
1
*
[ record1, record2, record3, record4 ]
[ record2, record4 ]
filterOutPresentProducts( )
>> system.println(recommendToUser) [ record1, record2 ]
10
[ record1, record2, record3 ]
Wednesday 9 June 2010
Propagating and Reacting to EventsEvent streams
Resilient
Shelf -> filterOutPresentProducts(recommendToUser);
nearbyRecommendations
recommendToUser
1
*
[ record1, record2, record3, record4 ]
[ record2, record4 ]
filterOutPresentProducts( )
>> system.println(recommendToUser) [ record1, record2 ]
10
[ record1, record2, record3 ][ ]
Wednesday 9 June 2010
Propagating and Reacting to EventsEvent streams
Resilient
Shelf -> filterOutPresentProducts(recommendToUser);
nearbyRecommendations
recommendToUser
1
*
[ record1, record2, record3, record4 ]
[ record2, record4 ]
filterOutPresentProducts( )
>> system.println(recommendToUser) [ record1, record2 ]
10
[ record1, record2, record3 ][ ][ record4 ]
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
[ record1, record2, ... recordN ]
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
[ record1, record2, ... recordN ]
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
products
1
1
1
1
Resilient
11
Wednesday 9 June 2010
Discovering NodesAd Hoc Discovery
Decentralized
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
ListeningStation -> rfidTags.map: { |t| t.getProduct() };
productsInBag
1
1
UserDatabase -> DB.getRecommendationsWithProducts(products);
products
1
1
Resilient
11
Wednesday 9 June 2010
Dependency Arities
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
Shelf -> filterOutPresentProducts(recommendToUser);
nearbyRecommendations
recommendToUser
1
1
1
*
incoming 1 incoming *
outgoing 1send one
recommendationbroadcast one
recommendation
outgoing * send list of recommendations
broadcast list of recommendations
12
Broadcasting
Wednesday 9 June 2010
Dependency Arities
Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);
UserDatabase -> DB.getRecommendationsWithProducts(products);
Shelf -> filterOutPresentProducts(recommendToUser);
nearbyRecommendations
recommendToUser
1
*
incoming 1 incoming *
outgoing 1send one
recommendationbroadcast one
recommendation
outgoing * send list of recommendations
broadcast list of recommendations
1
*
send list of recommendations
12
Broadcasting
Wednesday 9 June 2010
Remembering State
Averager -> << buffer << if: (buffer == nil) then: { buffer := Buffer.new(5); }; buffer.put(value); def accumulated := 0; buffer.each: { |val| accumulated := accumulated + val }; accumulated / 5;
value
1
1
average
1
1
Event streams
13
Wednesday 9 June 2010
Editing Dataflow Graphs
14
Wednesday 9 June 2010
Limitations and Future Work
• Node discovery based on role names may cause name clashes: look into more advanced publish/subscribe mechanisms?
• Security: build a secure environment to execute mobile AmbientTalk code.
• Current editor prototype is still very rudimentary.
• Dataflow debugging support.
15
Wednesday 9 June 2010
Conclusion
• Hybrid visual dataflow language to coordinate distributed AmbientTalk components.
• Coarse grained control flow encoded in dataflow graph and separated from fine grained control flow (AmbientTalk statement level).
• Dynamically reconfiguring dataflow graph when mobile network topology changes.
• Based on reactive programming.
• Extends basic dataflow coordination model with broadcasting primitives by means of dependency arities.
16
Ad Hoc Discovery
Decentralized
Resilient
Event streams
http://soft.vub.ac.be/soft/research/amopcop
Broadcasting
Wednesday 9 June 2010
Top Related