MobiChat is a communication and entertainment center for use on the nation’s highways. As families drive long distances for vacation, they form groups of cars traveling in the same direction. Using MobiChat, the passengers in one car can communicate, share files, exchange pictures, and play games with passengers in another car. Thus, MobiChat is actually a collection of several applications including instant messaging, file sharing, chat rooms, and game rooms. Instant messaging allows passengers to exchange text messages and photos in real-time. File sharing allows a passenger to share and exchange files. MobiChat allows passengers to create chat rooms. Chat rooms differ from instant messaging in that they offer n-to-n communication, whereas instant messaging is just 1-to-1. When a passenger types a message in a chat room, all other passengers in the chat room receive the message. Chat rooms are named and may be public or private. Any user can join a public chat room, but a user can only join a private chat room if invited by a user already in it (the user that creates it is automatically in it). MobiChat allows a user to take a picture and send the picture to another user, who can then save the image locally. Finally, MobiChat allows passengers to play games with each other. The two games offered by MobiChat are checkers and jumble. Checkers offers a team style of game play. When a passenger creates or joins a checker game, he must choose which color to be (either red or black). All players that are of the same color form a team that must coordinate their next move. Any member may perform the move. Once a move has been made, the turn goes to the other team. Jumble is a word-search game consisting of a two-dimensional array of letters with words hidden within it. When a word is found, the position of the word is distributed to all players. Thus, all of the participants cooperate in solving the jumble game.

How to use MobiChat

First compile the code using the included Makefile. In addition to the standard LIME packages (lime, groupmgmt, lights, comm, mucode, and location), MobiChat requires the additional packages:

To use the picture taker, be sure to install a Logitech QuickCam and install the QuickCam software available from

You can compile MobiChat by typing "make" in examples/MobiChat This will create the class files in examples/MobiChat/bin. To make the jar file, type "make jar." This will create a jar file in examples/MobiChat/jars. To run the application, add mobiChat.jar to your CLASSPATH or change into the src directory.

To launch MobiChat, make sure the classpath is properly set and type: java mobiChat.chatUser.MobiChatApp

This will launch the MobiChat program. The first thing the application will ask you is to enter your name. This name must be unique to each user. Upon entering your name, the following main screen will appear:

The main screen consists of a list of users, chat rooms, checker rooms, and jumble rooms that are currently available. In the figure above, it shows that there are currently currently two people running MobiChat (Liang Fok and Octav Chipara) and that there are no rooms available. right-clicking on the name of the user allows you to interact with that user. This is shown below:

If you double click on a user's name, an instant messaging screen will appear. Using this screen, you can exchange messages with another user. This is shown in the following image:

If you right-click and choose "Send a photo," MobiChat will display the following window that allows you to take a picture:

Once you are ready to take a picture, hit the "Take Picture button". You will be asked to enter a caption. Upon typing in a caption, MobiChat will deliver the photo to the recipient. The recipient will be given an option to accept or reject the photo. If he or she accepts the photo, the following will be displayed:

The user can then go to File -> Save to save the image to the local hard drive as a JPEG file.

The following three buttons are located below the list of users and chat rooms in the main screen:

The left button allows you to create a chat room. If you click on it, the following screen will appear:

This allows you to specify the name of the chat room and whether it is public. The name identifies the topic of the chat room. It should be unique to each chat room. Below the name is an option that allows you to choose whether the chat room is public or private. If the chat room is public, other MobiChat users can join the chat room. If it is private, you must invite other people to join it. Once done, hit continue. Once you hit continue, the following screen will appear.

The window on the right is the chat room that you have created. Notice that the list of available and participating chat rooms in the left window has been updated to reflect new chat room. This list is updated on all other users, which allows them to join the chat room at a later point in time.

Going back to the three buttons below the list of users and chat rooms in the main screen, the center button allows you to create a checker room. Here you can play checkers with another MobiChat user. Once a checker room is created, other users can join it provided it is public. If it is private, then a user can only join it if invited. A user is invited by going to File -> Invite Buddy. A checker room's interface is shown below.

The state of the game on on the left half of the window, while the right half allows you to chat with other people on your team, chat with your opponents, view the history of moves, and the statistics of the game. When you start the checker game, you are given a choice as to which color you want to be. Multiple people can be the same color. Those that share the same color are on the same team and must coordinate with each other when determining where to move. There is no team leader, instead, the first team member that makes a move is the move the entire team makes. A move is made by left-clicking on the piece you want to move, then right-clicking or double clicking on the destination position.

Going back to the three buttons below the list of users and chat rooms in the main screen, the right button allows you to create a jumble room where you can cooperate with remote MobiChat users in finding all of the words. It's interface is shown below.

Here there are words hidden in the two-dimensional array of letters. The goal is to find the words. When a jumble room is created, other users can join it provided it is public. If it is private, then a user can only join it if invited. A user is invited by going to File -> Invite Buddy. Anyone in the jumble room can find a word. To find a word, left click on the start of the word, and drag the mouse to the end of the word. When a word is found, all other users are notified of the find, and update their screens accordingly. Notice the tab at the top allows you to chat with the other people trying to solve the jumble puzzle.

A file sharing button is located at the bottom of the main screen. If you click on it, the following will appear:

This screen shows you what files you are sharing and what files other users are sharing. It enables you to modify which files you want to share, and to download files from remote users. To download a file, simply double click on the file.

How MobiChat uses LIME

The main program in MobiChat is ChatUser. ChatUser is an agent that maintains the main window showing the users and available chat and game rooms. It registers reactions on the LimeSystemTupleSpace to discover other users and determine what chat and game rooms have been created. When MobiChat is started, the user creates a special user tuple space that is named after the user. The creation of this tuple space results in a _tuplespace tuple being added to the LimeSystemTupleSpace. The presence of the new user is detected using reactions sensitive to this tuple. The same general mechanism is used to detect for the presence of chat rooms, checker rooms, and game rooms. That is, when a room is created, a tuple space for it is formed. The name of the tuple space is the same as the name of the room. The presence of this tuple space triggers a reaction informing the ChatUser of the availability of the room. When a room is closed, the tuple space for it is destroyed, which sets of another reaction sensitive to _tuplespace_gone tuples.

The InstantMessaging functionality is handled by the ChatUser agent. In addition to creating a chat user tuple space, it also creates a univeral tuple space. This tuple space is created and shared by all agents, forming a federated tuple space when they engage. Each user registers a reaction sensitive to instant message and picture tuples. These reactions are localized, allowing each ChatUser to only react to instant messaging and picture tuples that are destined for it. When a user sends another user an instant message, the sender creates an instant messaging tuple and OUTs it into the portion of the tuple space that belongs to the destination agent. The destination agent reacts to this tuple, removes it, and displays the message on the user's screen.

The ChatRoom subprogram is handled by its own agent. The chat room agent creates and shares a tuple space named after the chat room. It registers a weak reaction sensitive to message tuples within this tuple space. When a user types a message, a message tuple is inserted into the tuple space. The weak reactions of all agents react to this message and display the message. Each time a user types a new message, the old message is removed prior to the new message being inserted. Thus, the federated tuple space contains at most one message per user.

The CheckerRoom subprogram allows players to face off in a game of checkers. Each CheckerRoom instance has an attached ChatRoom that allows players to exchange messages while playing. Each move in the CheckerRoom is represented as a tuple and placed in the tuple space via an out operation. These tuples are ordered and remain in the tuple space till the end of the game. This allows new users who join the game in the middle of the game to reconstruct the sequence of moves that have been executed since the beginning of the game. When a new move is OUTed, the other users react to it and update their board accordingly.

The JumbleRoom allows players to compete in a jumble game. When a new game is initiated, the game board is represented as a tuple and placed in the tuple space via an OUT operation. Any player who connects can download the game. The JumbleRoom subprogram fosters disconnected operation because, after downloading the game, a player can disconnect (disengage) from the other players and continue to work on the puzzle. When the players re-engage, their agents exchange information about the words found using reactions sensitive to the word tuples..

The FileSharing subprogram uses LIME tuple spaces to transfer data between connected parties. When a user shares a file, the file sharing agent inserts an advertisement tuple into the tuple space. This advertisement contains the name of the file and is accessible by all other file sharing agents within the group. If another user is interested in this file, double-clicks on the file causing his file-sharing agent to insert a FileRequest tuple into the tuple space. The advertising agent reacts to this and responds by placing numerous FilePacket tuples into the tuple space. Each FilePacket tuple contains a sequence number and a portion of the file. This was done to avoid transferring large files over an unreliable, low-bandwidth, wireless communication link. By splitting the file into numerous pieces, the agent that requested the file can gradually download the file and re-assemble it once all of the pieces are obtained.

LIME: Linda in a Mobile Environment