Introduction

We started thinking about the old method that most companies use to reserve meeting rooms, where paper is used and reception has to call every time someone arrives. What could be done to streamline this process?

We wanted to put together a service that would allow you to reserve a meeting room with your phone, without the need to fill out paperwork or call for a reservation. By creating Rogerthat, we accomplished this goal. With Rogerthat, you can specify a date, the meeting length, the number of people, and even the room necessities (e.g., Beamer, WiFi, coffee).

After you provide the meeting information, the availability of a room matching your requirements is checked. If you make a successful reservation, a confirmation is sent to you with the name of the room you reserved.

Rogerthat also includes a room schedule, which allows you to check the availability of rooms and to check your reservations. Clicking on a meeting room you have reserved allows you to get notified when people arrive in the meeting room.

A beacon is placed in every meeting room, which is subscribed to the InReachRequest of our reserve meeting room service. This way, our service can send emails or messages to you when people arrive.

Step 1: Create a simple way to reserve a meeting room.

A meeting room reservation system can be created through the use of a message flow, such as the one shown below:
FlowMeetingRoom
To see how create a new message flow, refer to: message flow designer guide.

Note: For each item in the flow, you can edit the message by entering your text in the Message field. You can also edit the button labels and other form information by clicking Form settings and entering the desired text for the proper fields.

First, you need the date of the meeting, so place a Date select module in the flow and fill in the information.

After you have the date, you will want the start and end times of the meeting. This can be done with a Range slider. The low value will be the start time and the high value will be the end time. You can assign the minimum and maximum values for the range slider (under Form settings) according to time of the day the meeting room will be available. For example: 6 to 22.

Next, you want to be able to choose the number of people in the meeting, which can be done with a Single slider. The maximum value of the slider can be the capacity of your largest meeting room.

Finally, you want to be able to choose what is needed in the meeting room, such as coffee, Beamer, WiFi, or other necessities. The Multi select allows all of the items that can be provided in meeting rooms to be added and selected from a list.

Now you can create your service menu. Go to your service panel and click on Service menu. You can create a new menu item by clicking an empty cell and completing the edit menu item windows.

Here is an example of the service menu of the reservation system:

MeetingRoomMenu

Here is an example of the Edit menu item window for the Get a Room item:

GetARoomItem

You can test your service now by opening it on your mobile device. If you press the Get a room button, the flow will be launched and you should see the following four steps:

Reserve meeting room date Reserve meeting room when Reserve meeting room count Reserve meeting room requirements

At this point, the flow will not give you a room. At the end of the message flow, the system sends a callback to the API with the choices you made in each step of this flow. You have to implement the response of this callback in order to book a room.

Step 2: Create a backend.

Create a web project that will handle incoming calls from Rogerthat.

In your favorite C#/.Net software, create a new web project.

If you use Visual Studio, you can go to: File > New > Web site, choose ASP.NET Empty WebSite, enter the location of the project, and create it.

Now that you have an empty web site, you need an aspx file to handle incoming calls from Rogerthat, so add one to your project.

If you use Visual Studio you can right click on your project, go to Add > Web form, and call it CallbackHandler.

You don’t want to show anything on the web site, so you can keep the first line of CallbackHandler.aspx.

If you have not configured CallbackHandler.aspx.cs before, download the integration libraries.

Add Com.Mobicage.Rogerthat.dll to your project.

Next, you need to add the database. You can find it in App_Data file. In Visual studio, right click, go to add > existing item, and select the two files.

You can now modify CallbackHandler.aspx.cs like this:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Com.Mobicage.Rogerthat;
using Com.Mobicage.Rogerthat.Messaging;
using Com.Mobicage.Rogerthat.RogerthatSystem;
using Newtonsoft.Json;

public partial class CallbackHandler : CallBackApiRequestHandler
{
    private const string SI_Key = "your_service_identifier_key";
    private const string DB_CONNECTION_STRING = "Data Source=\"E:\\Guillaume\\rogerthat-net-api-stubs\\Com.Mobicage.Rogerthat\\Com.Mobicage.Rogerthat.Enterprise.Samples.NET\\App_Data\\SampleDB.sdf\"";

    public CallbackHandler()
    {
        this.handler.ServiceIdentifierKey = SI_Key;
    }
}

Refer to: CallbackApiRequestHandler documentation

You can find your service identifier key in the service panel on the bottom of the Service callback configuration.

You can find the DB connection in the SampleDB property.

Configure the Rogerthat application to forward the callbacks to your web project

If you run your web site, you will see an error message in your browser. This is not a problem, because you only run the web site to have the URI.

Copy the link (it should look like this: http://localhost:53196/CallbackHandler.aspx). The port can be different, so copy the link directly from your browser.

In your service panel, go to Configuration, paste the link into the HTTP(S) field, save the configuration, and test it. If the test is successful, you can enable your service.

Under the Test configuration button, you can choose which callbacks you want receive. You need friend.in_reach, messaging.flow_member_result and system.api_call.

Optional: use a development setup with the Development Router

You can find the router here: Rogerthat service development tools.

In the router, you can enter the URI of your web site. Go to running and press run. Go back into your service panel, select XMPP, and enter your xmpp account. Save the configuration and test it, as in the previous section.

Add logic and test the data-input

Your site is now able to receive the callback and send a response. You can now create the meeting room reservation.

The get a room item launches a message flow, so you need to implement the messaging.flow_member_result callback.

Refer to: FlowMemberResultRequest documentation

Add this code in CallbackHandler.aspx.cs:

    this.handler.Subscribe(delegate(Com.Mobicage.Rogerthat.Messaging.FlowMemberResultRequest request)
    {
        using (SqlCeConnection db = new SqlCeConnection(DB_CONNECTION_STRING))
        {
            db.Open();
            if (request.Tag == MeetingRoomBooking.NEW_MEETING)
                return MeetingRoomBooking.BookMeetingRoom(db, request);
            return null;
        }
    });

The booking of a meeting needs to use the database, so when you receive a callback request you need to create a connection to the database and open it.

If the user wants to book a room, you call the BookMeetingRoom function, otherwise you return null.

At this point, you will need some additional references. System.Data.SqlServerCe should already be in your software. You just need to add it to your project.

Go into packages to find the Newtonsoft.Json needed in the MeetingRoomBooking.cs file.

The BookMeetingRoom function will be unknown, so add the App_Code files. These four files are necessary.

Here is what the BookMeetingRoom function does:

  • Gets the room information provided by the user.
  • Gets a list of rooms which have the necessary requirements.
  • Checks if a room is available.
  • The first empty room is booked and added to the database.
  • Sends a message to the user with the result of the booking, which is either:
    • The name of the room if successful.
    • A not found message in any other case.

Refer to: BookMeetingRoom code.

Run your web site and test the booking of a meeting. You should get one of the following results:

Reserve meeting room found Reserve meeting no room found

Step 3: Create a view on the scheduled meetings

For this part, you need schedule_html_app.zip. In your service panel, go to Screen branding. In the description field, enter meeting-room-schedule, and upload the schedule_html_app.zip file.

Go back to service menu and configure the Room schedule item like this:

RoomScheduleItem

You can now press the Room schedule item, and you will see a loading page and nothing else (it simply sends a system.api_call callback at this time).

If you go in your service panel then go into Logs, you can see that the Callback is successfully sent, but the result is null. The next step is to create a result. Refer to: ApiCallRequest documentation.

Add this code in CallbackHandler.aspx.cs:

this.handler.Subscribe(delegate(ApiCallRequest request)
{
    switch (request.Method)
    {
        case MeetingRoomBooking.GET_SCHEDULE:
            using (SqlCeConnection db = new SqlCeConnection(DB_CONNECTION_STRING))
            {
                db.Open();
                ApiCallResponse result = new ApiCallResponse();
                result.Result = MeetingRoomBooking.GetSchedule(db);
                result.Error = null;
                return result;
            }

        case MeetingRoomBooking.CANCEL_BOOKING:
            using (SqlCeConnection db = new SqlCeConnection(DB_CONNECTION_STRING))
            {
                db.Open();

                var parameters = new { meeting_room_booking_id = 0L };
                MeetingRoomBooking.Cancel(db, JsonConvert.DeserializeAnonymousType(request.Params, parameters).meeting_room_booking_id);

                ApiCallResponse result = new ApiCallResponse();
                result.Result = null;
                result.Error = null;
                return result;
            }

        case MeetingRoomBooking.WARN_ME_WHEN_PEOPLE_ARRIVE:
            using (SqlCeConnection db = new SqlCeConnection(DB_CONNECTION_STRING))
            {
                db.Open();

                var parameters = new { meeting_room_booking_id = 0L };
                MeetingRoomBooking.WarnMeWhenPeopleArrive(db, JsonConvert.DeserializeAnonymousType(request.Params, parameters).meeting_room_booking_id, request.UserDetails.Email);

                ApiCallResponse result = new ApiCallResponse();
                result.Result = null;
                result.Error = null;
                return result;
            }

        default:
            return null;
    }
});

Here is what GetSchedule does:

  • Lists all the bookings for the next several days.
  • Lists all the rooms.
  • Lists all users.
  • Concatenates all of the above information into a string.

The last step is done because the result should be a JSON string containing an object with bookings, another object with rooms, and a final object with users.

Refer to: GetSchedule code.

In CallbackHandler, create a new ApiCallResponse. Place the string returned by the GetSchedule function in the result of this response.

In the Cancel function you can delete a meetingRoomBooking from the database. To do this, you only need the id of the booking.

Refer to: Cancel code.

When you press the cancel meeting button, your service sends a system.api_call callback with the id of the booking in params. First you have to get back the id from params, like this:

var parameters = new { meeting_room_booking_id = 0L };
MeetingRoomBooking.Cancel(db, JsonConvert.DeserializeAnonymousType(request.Params, parameters).meeting_room_booking_id);

The first line is the model to extract your data from the string. In this case, you want meeting_room_booking_id.

The second line calls the cancel function.

You can now create the ApiCallResponse like this for GetSchedule.

In the WarnMeWhenPeopleArrive function, add the email of the user who wants to be notified when people arrive at a meeting.

Refer to: WarnMeWhenPeopleArrive code.

In the CallbackHandler, you need to get back the meeting_room_booking_id as you did for cancel, and create the ApiCallResponse.

If you want to try it, press the Get schedule button on your mobile device. You should see something similar to this:

Reserve meeting room Schedule Reserve meeting room detail

Step 4: Use Rogerthat Beacons to detected if the meeting started and notify subscribers via a push message.

When a Rogerthat user is next to a beacon, a friend.in_reach callback is sent.

Refer to InReachRequest Documentation.

Your service should know the beacon of the meeting room. In your service panel, go to Identities. Click on Edit and add the beacons of your meeting rooms.

Add the following code to CallbackHandler.aspx.cs:

this.handler.Subscribe(delegate(Com.Mobicage.Rogerthat.Friend.InReachRequest request)
{
    using (SqlCeConnection db = new SqlCeConnection(DB_CONNECTION_STRING))
    {
        db.Open();
        MeetingRoomBooking.UserInReach(db, request.UserDetails, request.Beacon, request.Proximity);
        return null;
    }
});

When a friend.in_reach callback is received, call the UserInReach function. This function will:

  • Find the room attached to this beacon.
  • Look for an earlier check-in in the same day. If it is the first check-in, send a welcome message
  • Get bookings for this room.
  • Get the list of users who want to be notified.
  • Send a start meeting message to these users.
  • Update the database for each user check-in.

Refer to: UserInReach code