Overview
What we do
GoIndoor offers real time indoor navigation tools and technologies which are as easy to use as GPS is for outdoors. We help you locate and guide your visitors inside a building through their mobile devices. We offer technology which is very useful and easy to implement.
Why Indoor navigation
The need for indoor Locationing arises since GPS doesn’t work inside the buildings. It may be difficult for visitors to reach a specific location without being delayed especially if it’s a new and big place. Whether it’s a hospital, railway station, an office campus or a big shopping complex, GoIndoor technology can help you guide your visitors to navigate through the place without any hassles.
Advantages of using Indoor LocationingImprove visitor experience
Gain insights into visitors interest
Improved business intelligence
Engage with visitors
How does it work
Bluetooth Low Energy signals from devices known as beacons are the base of our technology. These beacons are inexpensive, small and have a long battery life. And, Bluetooth technology is being supported by all the devices these days. Signals received from the beacons are then processed by our SDK to compute precise location of the device. This location information can then be used in different applications in many different ways.
What we offer
Admin Panel – Web based application to manage GoIndoor data
GoIndoor Quick Set up tool – Application for iOS and Android devices to set up beacons around the building
SDK – Framework to build indoor navigation apps for Android and iOS
REST API – Web services to manage GoIndoor resources
GoIndoor offers real time indoor navigation tools and technologies which are as easy to use as GPS is for outdoors. We help you locate and guide your visitors inside a building through their mobile devices. We offer technology which is very useful and easy to implement.
Why Indoor navigation
The need for indoor Locationing arises since GPS doesn’t work inside the buildings. It may be difficult for visitors to reach a specific location without being delayed especially if it’s a new and big place. Whether it’s a hospital, railway station, an office campus or a big shopping complex, GoIndoor technology can help you guide your visitors to navigate through the place without any hassles.
Advantages of using Indoor Locationing
How does it work
Bluetooth Low Energy signals from devices known as beacons are the base of our technology. These beacons are inexpensive, small and have a long battery life. And, Bluetooth technology is being supported by all the devices these days. Signals received from the beacons are then processed by our SDK to compute precise location of the device. This location information can then be used in different applications in many different ways.
What we offer
Admin Panel
GoIndoor's Admin Panel is a web based service which offers tools needed for the initial set up for your Indoor positioning project. It helps you manage your locations, create navigation routes, set up Points Of Interest (POIs), create notifications and define default properties for places, edges and notifications. This data is available to the applications through the GoIndoor library. Any changes made to any of the objects is instantly available to the applications through GoIndoor SDK.
The important change with this version is with respect to the UI of the application. It has been designed to make it more responsive and user friendly.
The Admin Panel functionalities discussed in the following sections are also exposed through a REST interface for use by third party applications. Refer this section for more details.
The important change with this version is with respect to the UI of the application. It has been designed to make it more responsive and user friendly.
The Admin Panel functionalities discussed in the following sections are also exposed through a REST interface for use by third party applications. Refer this section for more details.
Login
To be able to access the Admin Panel, you need to register for a new account here.
After the account is successfully created, log in to the account and create a workspace account. Use the workspace credentials to login to the Admin Panel.

3. The home page of the Admin Panel is as shown below.

After the account is successfully created, log in to the account and create a workspace account. Use the workspace credentials to login to the Admin Panel.

3. The home page of the Admin Panel is as shown below.

Manage Buildings
The first step of the setup is to provide the building and floor details to the GoIndoor library. Go to the 'Mapping' tab and use this console to create your building and add floor details.
To create a new building, follow the steps listed below:
1. Go to the 'Mapping' tab from the left panel and click on the ‘+’ icon next to the ‘Create building’ drop down widget on the top of the page.
2. Provide building name and location on the following pop up screen.
3. Click ‘Create Building’. This will create a new building.
4. All the buildings created will be shown in the drop down box at the top of the page.

5. You can edit or delete the building by opening the drop down menu and clicking the edit
and
delete
icons respectively, shown in front of the building name.
To create a new building, follow the steps listed below:
1. Go to the 'Mapping' tab from the left panel and click on the ‘+’ icon next to the ‘Create building’ drop down widget on the top of the page.
2. Provide building name and location on the following pop up screen.

3. Click ‘Create Building’. This will create a new building.
4. All the buildings created will be shown in the drop down box at the top of the page.

5. You can edit or delete the building by opening the drop down menu and clicking the edit



Manage Floors
After creating a building, you can set up its floors. When a building is selected from the drop down menu on the top of the page, the existing floors for that building are listed under it.
To add a new floor
1. Click the ‘Add Floor’ button.
2. Enter the floor number and upload its detailed plan on the following page.

3. Click ‘Ok’.

4. Overlay the floor plan precisely on the underlying map . The floor plan image will show up on top of the map with three white dots. Decrease the overlay opacity and place those dots on the end points of the building. The 'Keep Image Ratio' switch on the map facilitates accurate placement of the plan on the map. It changes the way user can interact with the plan. When the switch is ON , the image vertex will be shown in blue and the user can resize the plan. With the switch OFF, three of its corners will be shown in white and can be moved to change the geometry of the plan, as needed.
5. Once the plan is properly placed, it appears as shown below.

6. The added floor shows in the floor list for the building.
7. Click ‘Save’ to save the information on the server.
8. You can add any number of floors to a building by repeating the steps listed above.
Note: Use the zoom features on the map to precisely mark the floor on the end points of the building. If you reach the maximum limit in satellite view, switch to the normal view.
To edit a floor
1. Click the edit icon in front of the floor name in the floor list.
2. It shows the edit floor page.

3. Make changes as required and click Ok.
4. Click Save on the bottom to save the changes on the server.
To delete a floor
1. Click the delete icon in front of the floor name in the floor list.
2. Click ‘Ok’ on the confirmation page.

To add a new floor
1. Click the ‘Add Floor’ button.
2. Enter the floor number and upload its detailed plan on the following page.

3. Click ‘Ok’.

4. Overlay the floor plan precisely on the underlying map . The floor plan image will show up on top of the map with three white dots. Decrease the overlay opacity and place those dots on the end points of the building. The 'Keep Image Ratio' switch on the map facilitates accurate placement of the plan on the map. It changes the way user can interact with the plan. When the switch is ON , the image vertex will be shown in blue and the user can resize the plan. With the switch OFF, three of its corners will be shown in white and can be moved to change the geometry of the plan, as needed.
5. Once the plan is properly placed, it appears as shown below.

6. The added floor shows in the floor list for the building.
7. Click ‘Save’ to save the information on the server.
8. You can add any number of floors to a building by repeating the steps listed above.
Note: Use the zoom features on the map to precisely mark the floor on the end points of the building. If you reach the maximum limit in satellite view, switch to the normal view.
To edit a floor
1. Click the edit icon in front of the floor name in the floor list.
2. It shows the edit floor page.

3. Make changes as required and click Ok.
4. Click Save on the bottom to save the changes on the server.
To delete a floor
1. Click the delete icon in front of the floor name in the floor list.
2. Click ‘Ok’ on the confirmation page.

Manage Places
Places
A POI is a point or specific zone which may be interesting or useful to the visitors of the location. POIs can also be referred to as Places. For example, with reference to a university campus, the labs, library, canteen etc. may be referred to as POIs.
A POI can be a single point like in case of an ATM or a bigger area like a conference room in an office.
This section will explain how to add Places Of Interest (POIs) on your map.
To manage places, click on the 'Places' tab in the left pane.
To add a new place
1. Select the building and the floor where a new place is to be added.
2. This enables the 'Add Place' button. Click it to add a new place.
3. There are three types of place markers to choose from to mark your POI on the plan : pointed marker, circular marker or polygon drawer tool.

- to mark a single point on the plan.
- to define a circular region.
- to define a polygonal area.
4. Choose the appropriate marker and give it a name.

5. Place the marker on the plan appropriately. The following sample image shows a circular place marked on the plan.

6. You can now edit the place to enter its properties, tags, color and associated notifications.

7. Click Ok.
8. Repeat the steps listed above to create any number of places for a floor. All the POIs for a floor will be listed under the floor.
9. The position or boundaries of the POI can be changed any time by clicking on it.
10. Click Save after making all the changes.
To edit the properties of the POI or delete a particular POI, click the edit or delete icons in front of the POI name.

Properties: Properties can be used to save additional information about the POIs. Like, if an area indicates a restaurant, you can use the property fields to store its opening and closing timings. This information can then be used in any way in the application. The SDK passes this information as it is to the applications when place information is fetched.
Tags: Tags can be used to save any attributes of a place. These tags can be used in the applications to group similar places, search through the places or for different graphical representations of the places. For example, if all the POIs which show doors marked as emergency exits have same tag, let’s say, ‘emergency_exit’, then the application can be coded so as to show these gates in a particular color on the map. The application can query the SDK with these tags to fetch only particular type of places.
A POI is a point or specific zone which may be interesting or useful to the visitors of the location. POIs can also be referred to as Places. For example, with reference to a university campus, the labs, library, canteen etc. may be referred to as POIs.
A POI can be a single point like in case of an ATM or a bigger area like a conference room in an office.
This section will explain how to add Places Of Interest (POIs) on your map.
To manage places, click on the 'Places' tab in the left pane.
To add a new place
1. Select the building and the floor where a new place is to be added.
2. This enables the 'Add Place' button. Click it to add a new place.
3. There are three types of place markers to choose from to mark your POI on the plan : pointed marker, circular marker or polygon drawer tool.




4. Choose the appropriate marker and give it a name.

5. Place the marker on the plan appropriately. The following sample image shows a circular place marked on the plan.

6. You can now edit the place to enter its properties, tags, color and associated notifications.

7. Click Ok.
8. Repeat the steps listed above to create any number of places for a floor. All the POIs for a floor will be listed under the floor.
9. The position or boundaries of the POI can be changed any time by clicking on it.
10. Click Save after making all the changes.
To edit the properties of the POI or delete a particular POI, click the edit or delete icons in front of the POI name.

Properties: Properties can be used to save additional information about the POIs. Like, if an area indicates a restaurant, you can use the property fields to store its opening and closing timings. This information can then be used in any way in the application. The SDK passes this information as it is to the applications when place information is fetched.
Tags: Tags can be used to save any attributes of a place. These tags can be used in the applications to group similar places, search through the places or for different graphical representations of the places. For example, if all the POIs which show doors marked as emergency exits have same tag, let’s say, ‘emergency_exit’, then the application can be coded so as to show these gates in a particular color on the map. The application can query the SDK with these tags to fetch only particular type of places.
Notifications
Notifications refer to different geolocalized events associated with a place or POI. There are four types
of notifications that you can associate with any POI through the Admin Panel.
Enter – triggered when someone enters a particular POI.
Leave – triggered when someone leaves a particular POI.
Stay – triggered when someone is inside a particular POI and has stayed there for atleast a specified duration.
Nearby – triggered when someone passes nearby a particular POI.
You can create any number of notifications of these types to be sent to the visitors. These notifications are triggered by the SDK when the specified event happens and sent to the applications. It is then up to the application to handle them appropriately.
Notifications can have any number of properties associated with them. Properties are key value pairs which can be used by the developers in any way relevant to their application. For example, if they want to show a promotional ad, the key value pairs can be ad and its link respectively. Any properties associated with a notification is sent to the application when it triggers.
To associate Notifications with a place
1. Select the POI and click edit.
2. Go to the Notifications tab.
3. Select the type of notification to be added (enter, leave, stay or nearby) and click ‘Add Notification’ to add a new notification.

4. Add properties to that notification as required.
5. You can also add filters to select your target audience for the notification. Click on
icon and add filters to the notification.
Choose the appropriate criteria and enter its value. This property and its value will be evaluated before sending a notification to a particular user. You can optionally mark it as a mandatory filter too which indicates that a particular criteria should be fulfilled for the notification to be sent.

Please note that the filter criterion shown in the drop down are the default user properties, which can be modified through the settings page.
7. For ‘STAY’ type of notification, there is an additional property, ‘Delay’ that can be set. It specifies how long to wait before sending the notification once the user has entered the place. Click the edit icon and set its value. The unit for this time attribute is seconds.

8. Similarly, for ‘NEARBY’ type of notification, there is an additional parameter, ’Distance’ that defines what can be the maximum distance of the user from the place when the notification is triggered. Its unit is meters.
Enter – triggered when someone enters a particular POI.
Leave – triggered when someone leaves a particular POI.
Stay – triggered when someone is inside a particular POI and has stayed there for atleast a specified duration.
Nearby – triggered when someone passes nearby a particular POI.
You can create any number of notifications of these types to be sent to the visitors. These notifications are triggered by the SDK when the specified event happens and sent to the applications. It is then up to the application to handle them appropriately.
Notifications can have any number of properties associated with them. Properties are key value pairs which can be used by the developers in any way relevant to their application. For example, if they want to show a promotional ad, the key value pairs can be ad and its link respectively. Any properties associated with a notification is sent to the application when it triggers.
To associate Notifications with a place
1. Select the POI and click edit.
2. Go to the Notifications tab.
3. Select the type of notification to be added (enter, leave, stay or nearby) and click ‘Add Notification’ to add a new notification.

4. Add properties to that notification as required.
5. You can also add filters to select your target audience for the notification. Click on

Choose the appropriate criteria and enter its value. This property and its value will be evaluated before sending a notification to a particular user. You can optionally mark it as a mandatory filter too which indicates that a particular criteria should be fulfilled for the notification to be sent.

Please note that the filter criterion shown in the drop down are the default user properties, which can be modified through the settings page.
7. For ‘STAY’ type of notification, there is an additional property, ‘Delay’ that can be set. It specifies how long to wait before sending the notification once the user has entered the place. Click the edit icon and set its value. The unit for this time attribute is seconds.

8. Similarly, for ‘NEARBY’ type of notification, there is an additional parameter, ’Distance’ that defines what can be the maximum distance of the user from the place when the notification is triggered. Its unit is meters.

Settings
The application allows us to add custom predefined properties to places, edges, notifications and users. Once a predefined property for any of these objects is created, it will be automatically be associated to the newly created objects of that type. This not only saves time while creating newer objects but also makes them uniform across similar objects and thus reduces scope of error. For every new object created, only the value of the property will have to be set. For example, if we define a predefined property for an edge ‘wheelchair_accessible’, then for every new edge created, we will only have to specify if this property is true or false for that edge.
1. To make these settings, click on Settings icon shown on the map under 'Places' and 'Navigation' tabs.

2. Following screen appears.

3. Add appropriate settings for places, notifications, edges or users.
4. Provide iBeacon' proximity UUID, if required. This attribute is required by the iOS devices to be able to hear the iBeacon devices. Android devices, on the other hand, can hear all the beacon devices without any limitations.
Please note that the default value of this field is set to UUID of the beacons provided by us. Change this attribute if you are using your own beacons with a different UUID.
5. Click ‘Save’ to store these properties on the server.
The properties associated with places, edges and notifications are used to save additional information about them. These properties can be used in different ways in the applications to offer customization of UI and tasks. For example, a property ‘alert_type’ could be associated with notifications to inform the application how to alert the user when that notification is generated.
The user properties, on the other hand, are used to create a set of properties (of type - number/ string/ fixed values) that can represent a user profile. These user profile properties are used by the notifications to set filter targets. When a notification is defined, any set of user profile properties can be used to choose the subset of people to which that particular notification should be sent.
1. To make these settings, click on Settings icon shown on the map under 'Places' and 'Navigation' tabs.

2. Following screen appears.

3. Add appropriate settings for places, notifications, edges or users.
4. Provide iBeacon' proximity UUID, if required. This attribute is required by the iOS devices to be able to hear the iBeacon devices. Android devices, on the other hand, can hear all the beacon devices without any limitations.
Please note that the default value of this field is set to UUID of the beacons provided by us. Change this attribute if you are using your own beacons with a different UUID.
5. Click ‘Save’ to store these properties on the server.
The properties associated with places, edges and notifications are used to save additional information about them. These properties can be used in different ways in the applications to offer customization of UI and tasks. For example, a property ‘alert_type’ could be associated with notifications to inform the application how to alert the user when that notification is generated.
The user properties, on the other hand, are used to create a set of properties (of type - number/ string/ fixed values) that can represent a user profile. These user profile properties are used by the notifications to set filter targets. When a notification is defined, any set of user profile properties can be used to choose the subset of people to which that particular notification should be sent.
Beacon Placement
Overview
Beacons form the baseline of the indoor locationing technology. Hence, Beacon placement is a very important part of the set up. Follow the best practices guide of beacon placement to achieve optimum results.
Beacons form the baseline of the indoor locationing technology. Hence, Beacon placement is a very important part of the set up. Follow the best practices guide of beacon placement to achieve optimum results.
Best Practices for Beacon Placement
Beacon placement is a very important step to ensure that the desired accuracy is achieved. Number of beacons, their orientation and the height at which they are placed are some of the factors that contribute to the overall performance of any beacon based indoor locationing system.
Keep the following factors in mind while placing the beacons.
Beacon orientation
The way beacons are oriented has a huge influence over the signal strength. One common mistake is to test beacons by only putting them on top of a furniture for example. If the beacon is oriented upwards, the signal is strongly weakened. Orient them correctly by sticking them to the ceiling or on a wall for best results.
Beacon settings
Tx power and update rate are the two parameters that define beacons. The Tx power has an influence on the beacon range and the update rate influences the stability of the signal. Having a high tx power can drain the beacon battery really fast. At the same time, its signals wont be useful to far away devices because it's hard to compute distance to a beacon beyond 20 meters. Not hearing a beacon can be a valuable information but hearing too many of them can decrease the location stability. For a lot of buildings, we use -77dBm and 300ms for tx rate and frequency.
Best height
To avoid having an obstacle between your device and the beacons, put them at least at 3 meters high to get a clear line of sight. At a height of 5 meters and more, the signals are weakened. In that case, increase the tx power from the default settings ( around -77dBm ).
Obstacles and interference
Signals can be blocked or absorbed by obstacles. Metals and water have a great effect. Even extreme temperatures can affect the signals of the beacons.
Number of beacons
Too few beacons may leave some places in your location uncovered. At the same time, too many beacons can affect the accuracy of the position computed.
Keep the following factors in mind while placing the beacons.
Beacon orientation
The way beacons are oriented has a huge influence over the signal strength. One common mistake is to test beacons by only putting them on top of a furniture for example. If the beacon is oriented upwards, the signal is strongly weakened. Orient them correctly by sticking them to the ceiling or on a wall for best results.
Beacon settings
Tx power and update rate are the two parameters that define beacons. The Tx power has an influence on the beacon range and the update rate influences the stability of the signal. Having a high tx power can drain the beacon battery really fast. At the same time, its signals wont be useful to far away devices because it's hard to compute distance to a beacon beyond 20 meters. Not hearing a beacon can be a valuable information but hearing too many of them can decrease the location stability. For a lot of buildings, we use -77dBm and 300ms for tx rate and frequency.
Best height
To avoid having an obstacle between your device and the beacons, put them at least at 3 meters high to get a clear line of sight. At a height of 5 meters and more, the signals are weakened. In that case, increase the tx power from the default settings ( around -77dBm ).
Obstacles and interference
Signals can be blocked or absorbed by obstacles. Metals and water have a great effect. Even extreme temperatures can affect the signals of the beacons.
Number of beacons
Too few beacons may leave some places in your location uncovered. At the same time, too many beacons can affect the accuracy of the position computed.
Beacon Deployment - Buildings
Buildings usually consist of rooms and corridors.
For rooms, it depends on what you want to achieve. Usually for a room, one beacon is enough to be able to navigate to the room or trigger notifications based on it. You may also choose to put beacons in the corridors outside the room if only navigation to that room is the requirement.
Sample - rooms equipped with one beacon each.

For corridors, it is best to put beacons on the ceiling every 10-15 meters. If however, you can't put them on the ceiling, put them on the wall. Put one beacon on the left, the next one on the right, and repeat the process. Remember to always put one beacon at crossroads. Accuracy is better when you're close to a beacon, and this type of location is important for navigation.
Sample - corridors
For rooms, it depends on what you want to achieve. Usually for a room, one beacon is enough to be able to navigate to the room or trigger notifications based on it. You may also choose to put beacons in the corridors outside the room if only navigation to that room is the requirement.
Sample - rooms equipped with one beacon each.

For corridors, it is best to put beacons on the ceiling every 10-15 meters. If however, you can't put them on the ceiling, put them on the wall. Put one beacon on the left, the next one on the right, and repeat the process. Remember to always put one beacon at crossroads. Accuracy is better when you're close to a beacon, and this type of location is important for navigation.
Sample - corridors

Beacon Deployment - Open Spaces
In such spaces, where you have to place many beacons to cover the whole place effectively, factors such as interference come into the picture. Play with signal strength to reduce overlap. The best practice for such places is to create a symmetric beacon grid to cover the whole place. The density of the grid will define the accuracy in locationing.
As a best practice, it is recommended that the distance between each beacon should be between 10 and 20 meters. When beacons are 10 meters apart, it will give you an accuracy of around 2 meters. 20 meters will give a 5 meters accuracy.
Sample- Open Space with grid placement of beacons 10 meters apart

With such a setup, an area of 10,000 square meters can be covered either by 121 beacons (11 x 11) or 36 beacons (6 x 6) depending on the accuracy needed.
If however, the location is too huge and needs thousands of beacons to be installed which may not turn out to be cost effective, spot the best locations like POIs, entry and exit places.
As a best practice, it is recommended that the distance between each beacon should be between 10 and 20 meters. When beacons are 10 meters apart, it will give you an accuracy of around 2 meters. 20 meters will give a 5 meters accuracy.
Sample- Open Space with grid placement of beacons 10 meters apart

With such a setup, an area of 10,000 square meters can be covered either by 121 beacons (11 x 11) or 36 beacons (6 x 6) depending on the accuracy needed.
If however, the location is too huge and needs thousands of beacons to be installed which may not turn out to be cost effective, spot the best locations like POIs, entry and exit places.
Beacon Deployment - General Advices
If the areas to be covered are not symmetric or need to be given special attention like a reception area or the turn of a corridor where the location is bad, extra beacon may be added to enhance their coverage.
For areas less than 40 square meters, our advice is to use no more than one beacon.
For small rooms where beacons are required inside, place them as far as possible from the entrance so that they cannot be heard outside the room. You could also choose to lower the Tx power of that particular beacon.
While changing levels, it is advised that one beacon is placed near the start of the stairs, escalator or elevator and one near its end. This will give you best accuracy and make floor transition faster in the application. If the stairs are too long, we may need another beacon in the middle as well.
For areas less than 40 square meters, our advice is to use no more than one beacon.
For small rooms where beacons are required inside, place them as far as possible from the entrance so that they cannot be heard outside the room. You could also choose to lower the Tx power of that particular beacon.
While changing levels, it is advised that one beacon is placed near the start of the stairs, escalator or elevator and one near its end. This will give you best accuracy and make floor transition faster in the application. If the stairs are too long, we may need another beacon in the middle as well.
Quick Set up Tool - Introduction and Installation
GoIndoor SDK needs the information of the beacons placed in your building to provide you useful indoor locationing information. This can be done easily with the help of our free and easy to use ‘quick set up’ tool to install and manage beacons in your building.
Quick Set Up Tool is a mobile application for easy installation of beacons in your location. It is available for android devices currently. It supports both ibeacon and eddystone beacon protocol.
'Quick Set Up Tool' needs the following permissions on the device to run.
Location
Storage
Network access
Bluetooth access
1. Download the application from Google Play Store on your phone or tablet.(Search Quick Setup tool , onyourmap)
2. Install the application on your device.
3. Go to https://www.goindoor.co/freetrial and request for your credentials.
Quick Set Up Tool is a mobile application for easy installation of beacons in your location. It is available for android devices currently. It supports both ibeacon and eddystone beacon protocol.
'Quick Set Up Tool' needs the following permissions on the device to run.
1. Download the application from Google Play Store on your phone or tablet.(Search Quick Setup tool , onyourmap)
2. Install the application on your device.
3. Go to https://www.goindoor.co/freetrial and request for your credentials.
Place Beacon
1. After the application is successfully installed on the device, login using the credentials given to you.

2. After login, it will show the list of buildings that you have created through the Admin Panel. Select the building in which you are placing the beacons.

3. It will show the plan of the lowest floor in the building.

4. You can change the floor or go back to the buildings list by clicking the menu icon on the left of the building name.

5. Press the icon on the bottom right of the screen to scan a beacon to be placed.

6. When the beacon is successfully scanned, following screen appears. Click on the Add button and place the beacon at its physical location.

7. Mark the same location on the plan where you have placed the beacon. Once properly marked, select the
icon to store the beacon. The beacon turns green in color once its information is saved on the server.

8. Repeat the above steps until all the beacons are placed.

2. After login, it will show the list of buildings that you have created through the Admin Panel. Select the building in which you are placing the beacons.

3. It will show the plan of the lowest floor in the building.

4. You can change the floor or go back to the buildings list by clicking the menu icon on the left of the building name.

5. Press the icon on the bottom right of the screen to scan a beacon to be placed.

6. When the beacon is successfully scanned, following screen appears. Click on the Add button and place the beacon at its physical location.

7. Mark the same location on the plan where you have placed the beacon. Once properly marked, select the


8. Repeat the above steps until all the beacons are placed.
Remove Beacon
To delete a beacon, select the beacon. It will show its current status. Press the trash icon on the top of the page to delete this beacon.

Do not forget to remove the beacon from that location physically as well.

Do not forget to remove the beacon from that location physically as well.
Move Beacon
To move a beacon, select the beacon and press it for long on the screen. It will turn orange in color which indicates that it can now be moved from its original place. After placing it at its new position, click the save icon on the top. Once moved, do not forget to move the beacon physically as well.

To undo the movement of the beacon, click the undo icon

To undo the movement of the beacon, click the undo icon
Special Cases
1.If the beacon is not scanned properly, following screen will appear. In this case, rescan the beacon.

2. When you scan a beacon and there is another beacon in the vicinity, following screen appears. In this case, isolate your beacon and scan it again.
3. If the beacon being scanned has already been scanned before, following screen will appear. So, either you remove this beacon first or scan another one.


2. When you scan a beacon and there is another beacon in the vicinity, following screen appears. In this case, isolate your beacon and scan it again.

3. If the beacon being scanned has already been scanned before, following screen will appear. So, either you remove this beacon first or scan another one.

Beacon Maintenance
Select a beacon and click on it. It will show a set of details of the beacon like last scanned time, status, geolocation etc. The '+' icon on the bottom will change to
icon.

Click on the
icon to start listening to the beacon if its emitting. If the beacon is found, following screen appears which allows you to change the status of the beacon, if needed.

The beacon can be one of the following status at any time.

Please note that the device communicates to the beacon through bluetooth, hence it will be able to listen to the beacon only if they are close to each other.


Click on the


The beacon can be one of the following status at any time.

Please note that the device communicates to the beacon through bluetooth, hence it will be able to listen to the beacon only if they are close to each other.
GoIndoor SDK
Welcome to GoIndoor SDK which allows real time beacon based indoor locationing and more. This SDK will help you build smart applications without the need of understanding complex algorithms of indoor locationing. This guide will help you integrate GoIndoor technology with your application easily.
Introduction
GoIndoor SDK is a set of tools for building precise location services for indoor places. You can achieve an accuracy of upto 2 meters with our SDK. Our SDK makes use of the signals from the beacons to calculate your position. It is implemented as a wrapper to the native GPS location services available in the devices. The SDK will provide indoor location if beacons are available, otherwise it will change to GPS. The developer can thus rely on single set of APIs in our SDK for indoor/outdoor geolocation.
Here is a list of features which can be implemented easily with our SDK:
Accurate Indoor positioning
Routing
Floor Transitions
Asset Management (beacon management)
Event generation / Notifications
We offer native SDKs for both Android and iOS devices. GoIndoor Cordova plugin is also available but it is in beta state and offers limited features.
Introduction
GoIndoor SDK is a set of tools for building precise location services for indoor places. You can achieve an accuracy of upto 2 meters with our SDK. Our SDK makes use of the signals from the beacons to calculate your position. It is implemented as a wrapper to the native GPS location services available in the devices. The SDK will provide indoor location if beacons are available, otherwise it will change to GPS. The developer can thus rely on single set of APIs in our SDK for indoor/outdoor geolocation.
Here is a list of features which can be implemented easily with our SDK:
We offer native SDKs for both Android and iOS devices. GoIndoor Cordova plugin is also available but it is in beta state and offers limited features.
Getting Started
Prerequisites
A GoIndoor account
BLE enabled android or iOS device
For Android devices, Android version 4.3 (API level 18) or later is required.
For iOS devices, iOS 7.0 or later is required.
Sample Application
If you want to see a running application before writing your own, download our sample app ‘Indoor Navigator’ and get started. It demonstrates features like user location, routing, notifications, indoor maps and more.
You can also download the code, build and run it locally. Download the iOS sample from here and the android sample is available here.


You can also download the code, build and run it locally. Download the iOS sample from here and the android sample is available here.
Getting Started with Android SDK
Following sections show how to implement basic locationing related functionalities in android applications. For an extensive list of classes and methods exposed, refer this.
SDK Installation
Include the SDK in android studio using maven
The GoIndoor library can be downloaded from the jcenter and maven central repositories. In Android Studio, if you wish to add GoIndoor library to your application, add the following line of dependency in module's build.gradle file. Android Studio then automatically downloads this library from Maven Repository Server defined in build.gradle.
It might be required to add the following lines inside the android closure:
Include the SDK in android studio manually
1. First of all, download the latest version of Goindoor-x.y.z.aar file from here.
2. Next step is to import .aar file. Add the .aar library to the libs directory of the module (it is located in the same level as the java and res folders, create the folder manually if it does not already exist).
3. Add the following line at the end of the build.gradle file for your module
4. Add the following dependency in gradle
GoIndoor SDK is available to the project.
The GoIndoor library can be downloaded from the jcenter and maven central repositories. In Android Studio, if you wish to add GoIndoor library to your application, add the following line of dependency in module's build.gradle file. Android Studio then automatically downloads this library from Maven Repository Server defined in build.gradle.
dependencies{ compile 'com.oym.indoor:goindoor:x.y.z' }
It might be required to add the following lines inside the android closure:
packagingOptions { exclude 'META-INF/ASL2.0' exclude 'META-INF/LICENSE' exclude 'META-INF/NOTICE' }
Include the SDK in android studio manually
1. First of all, download the latest version of Goindoor-x.y.z.aar file from here.
2. Next step is to import .aar file. Add the .aar library to the libs directory of the module (it is located in the same level as the java and res folders, create the folder manually if it does not already exist).
3. Add the following line at the end of the build.gradle file for your module
repositories { flatDir { dirs 'libs' } }
4. Add the following dependency in gradle
dependencies { compile(name:'goindoor-x.y.z', ext:'aar') }
GoIndoor SDK is available to the project.
Create a new application
Steps to create a new application:
1. Start by creating a new Android Studio project. Name it appropriately.
2. Set “Minimum SDK” to “API 18:Android 4.3 (Jelly Bean)”.
3. Choose “Blank Activity” to begin with.
4. Add SDK dependency as shown in the previous section.
5. Make the following changes in AndroidManifest.xml.
Set the “Minimum SDK” for the application.
To be able to use Bluetooth and Google Location Services, add the following permissions.
To allow the application to use Bluetooth Low Energy (Bluetooth 4.0) feature, include the following line.
Finally we need to define the Indoor Location Service to be used, which can be defined as follows.
6. Ensure that Bluetooth and WiFi/Network connection features are available in the device.
1. Start by creating a new Android Studio project. Name it appropriately.
2. Set “Minimum SDK” to “API 18:Android 4.3 (Jelly Bean)”.
3. Choose “Blank Activity” to begin with.
4. Add SDK dependency as shown in the previous section.
5. Make the following changes in AndroidManifest.xml.
Set the “Minimum SDK” for the application.
<uses-sdk android:minSdkVersion="18"… />
To be able to use Bluetooth and Google Location Services, add the following permissions.
<!-- Internet --> <uses-permission android:name="android.permission.INTERNET" /> <!-- Bluetooth --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- GPS --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
To allow the application to use Bluetooth Low Energy (Bluetooth 4.0) feature, include the following line.
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
Finally we need to define the Indoor Location Service to be used, which can be defined as follows.
<application ..> <service android:name="com.oym.indoor.LocationService" android:exported="false" /> </application>
6. Ensure that Bluetooth and WiFi/Network connection features are available in the device.
Initialization and Synchronization
Initialization
To use the GoIndoor services in your application, include the following in your applications's AndroidManifest.xml
The first step to access GoIndoor's features is to create a GoIndoor object. Use the build() method of GoIndoor.Builder class to create the object. In the backend, it will try to connect to the server and synchronize with it. The connection status with the server will be notified through the ConnectCallback object, provided as an argument to the build() method.
where,context– GoIndoor server URL
account – GoIndoor account name
password – GoIndoor account password
callbackConnect – ConnectCallback object to handle the connection process.
It is mandatory to set the account, password and callback parameters in the builder class. If context is not provided, the default one will be used.
There are few other optional parameters which can be set in the builder class, if needed. The GoIndoor.Builder class exposes various setter methods for all the parameters.
setAccount(String account) - Sets the account name.
setConnectCallback(ConnectCallback connectCallback) - Sets the callback to handle the connection process.
setContext(Context context) - Sets the indoor backend URL.
setDatabaseUpdate(long refresh) - Sets the database update rate in msec.
setDebug(boolean debug) - Sets the debug mode.
setLocationType(int type) - Sets the positioning type.
setLocationUpdate(long refresh) - Sets the location update rate in msec.
setPassword(String password) - Sets the password.
setProfile(String type) - Sets the profile to be used.
setUpdatePolicy(int policy) - Sets the update policy.
setUrl(String url) - Sets the app context.
A sample ConnectCallback object is shown below.
Synchronization
When an application first connects to the server, it automatically downloads information about beacons, buildings, floors, POIs, notifications and assets to the device. This not only makes the application more efficient but also provides it offline capabilities. The SDK continues to synchronize with the server in the background at regular intervals to fetch updates, if any available.
To use the GoIndoor services in your application, include the following in your applications's AndroidManifest.xml
<application… <service android:name="com.oym.indoor.LocationService" android:exported="false" />
The first step to access GoIndoor's features is to create a GoIndoor object. Use the build() method of GoIndoor.Builder class to create the object. In the backend, it will try to connect to the server and synchronize with it. The connection status with the server will be notified through the ConnectCallback object, provided as an argument to the build() method.
/* Create a GoIndoor object . */ go = new GoIndoor.Builder() .setContext(context) .setAccount(account) .setPassword(password) .setConnectCallback(callbackConnect ) .build();
where,
It is mandatory to set the account, password and callback parameters in the builder class. If context is not provided, the default one will be used.
There are few other optional parameters which can be set in the builder class, if needed. The GoIndoor.Builder class exposes various setter methods for all the parameters.
setAccount(String account) - Sets the account name.
setConnectCallback(ConnectCallback connectCallback) - Sets the callback to handle the connection process.
setContext(Context context) - Sets the indoor backend URL.
setDatabaseUpdate(long refresh) - Sets the database update rate in msec.
setDebug(boolean debug) - Sets the debug mode.
setLocationType(int type) - Sets the positioning type.
setLocationUpdate(long refresh) - Sets the location update rate in msec.
setPassword(String password) - Sets the password.
setProfile(String type) - Sets the profile to be used.
setUpdatePolicy(int policy) - Sets the update policy.
setUrl(String url) - Sets the app context.
A sample ConnectCallback object is shown below.
private ConnectCallback callbackConnect = new ConnectCallback() { @Override //when the connection to the server has been correctly established and the library is initialized public void onConnected() { Log.i(TAG, "Connected"); } @Override //when an exception is thrown when trying to connect to the server public void onConnectFailure() { Log.i(TAG, "Connection Failed"); }
Synchronization
When an application first connects to the server, it automatically downloads information about beacons, buildings, floors, POIs, notifications and assets to the device. This not only makes the application more efficient but also provides it offline capabilities. The SDK continues to synchronize with the server in the background at regular intervals to fetch updates, if any available.
Location
In order to start the location services , it is required to provide a LocationBroadcast to the library. This will be called each time a position is computed or a new notification is triggered by the SDK.
Mark user's current position on a map:
LOCATION_TYPE_AVERAGE – In this case, signals from multiple beacons are used to triangulate the location.
LOCATION_TYPE_CLOSEST – In this case, the location is calculated by using only the signals of the beacon which is closest to the user.
LOCATION_TYPE_PROJECT - In this case, weighted average of signals from multiple beacons (as in the case of LOCATION_TYPE_AVERAGE) is used to determine the location which is then projected to the closest edge.
private LocationBroadcast broadcast = new LocationBroadcast() { @Override public void onLocation(LocationResult location) { //Process location updates } @Override public void onNotification(NotificationResult notification) { // Process notifications } };The LocationResult object has the following information about the new location.
public final double longitude; /* WGS84 Longitude */ public final double latitude; /* WGS84 Latitude */ public final int used; /* Number of beacons used */ public final double accuracy; /* Position accuracy (meters) */ public final ArrayList<Double> found; /* List including the longitude, latitude and accuracy of each beacon in sight */ public final String floor; /* Floor ID */ public final int floorNumber; /* Floor number */ public final int type; /* Positioning type: TYPE_BEACON or TYPE_FUSED} */ public final String buildingName; /* Building name */ public final String building; /* Building ID */ public final int geofences; /* Number of geofences */When ConnectCallback.onConnected() is invoked, it indicates a successful connection with the server. GoIndoor location service should now be started to start receiving location updates. After starting the service, every time a new position is computed, LocationBroadcast.onLocation() is invoked and every time a notification is triggered by the SDK, LocationBroadcast.onNotification() method is invoked.
go.startLocate(br);When you no longer wish to receive location updates, stop the location updates using this method.
go.stopLocate();Before exiting the app, close the session with the server properly using the following call.
go.disconnect();The location updates can be used in different ways in the code - to mark the location on the map, find distance from a particular place or to save the coordinates for analysis. Following code snippet shows how to use the location update to mark the location on a map. Go through the 'Show Indoor Maps' section to learn how to overlay your indoor map over Google Maps.
Mark user's current position on a map:
@Override public void onLocation(LocationResult location) { // Show indoor tiles if(location.type == LocationResult.TYPE_BEACON && (floorNumber != location.floorNumber || tileOverlay == null)) { Building building = go.getBuildings(location.building); if (tileOverlay != null) { tileOverlay.remove(); } currentFloor = building.getFloors().get(floornumber).getFloorNumber(); tileOverlay = map.addTileOverlay(new TileOverlayOptions().tileProvider(building.getFloors().get(floorNumber).getGMTileProvider()).zIndex(1)); } // Show marker LatLng point = new LatLng(location.latitude, location.longitude); if (markerPosition == null) { markerPosition = map.addMarker(new MarkerOptions().position(point)); } else { markerPosition.setPosition(point); } }There are three types that you can set for the location updates that you wish to receive. These differ in the algorithms which are used to derive the location. Use the following method to set the type.
go.setLocationType(type);In the above method, type can take the following values:
LOCATION_TYPE_AVERAGE – In this case, signals from multiple beacons are used to triangulate the location.
LOCATION_TYPE_CLOSEST – In this case, the location is calculated by using only the signals of the beacon which is closest to the user.
LOCATION_TYPE_PROJECT - In this case, weighted average of signals from multiple beacons (as in the case of LOCATION_TYPE_AVERAGE) is used to determine the location which is then projected to the closest edge.
Notifications
A notification is a kind of event that happens when a specific action happens with respect of a Point of Interest (POI).
Different notifications can be configured for a POI using the Admin Panel. SDK generates notifications when those specific events occur and it is the responsibility of the application to handle them appropriately.
Please note that the notifications generated by SDK are not push notifications on the phone. The LocationBroadcast object exposes onNotification() method which is invoked every time a notification is generated. This method can be used in different ways to handle notifications. The notifications can also be filtered further based on user profiles.
There are four types of notifications which can be associated to any POI :
Enter – This notification is generated when the device enters the POI.
Stay – This notification is generated when the device has been inside the POI for a specified time period.
Leave – This notification is generated after the device has left the POI.
Nearby – This notification is generated when the device goes near a POI.
Simple onNotification method usage:
You can also associate any number of properties with every notification. These properties can be used by the developers in any way in the code.
Filter notifications based on user profiles: Notifications can also be sent to specific users based on their profiles. For this, while configuring a notification from the Admin Panel, add a target to it. Target can be set based on user profile like age, gender or any other property. Update the user profile on the server. See the related sample here. The SDK will then automatically trigger notifications based on the profile. For example, if a notification is to be sent to adults above 21 years of age only, then update the user's age on the server through the application and while creating a notification on Admin Panel, add age property as a filter to it. The SDK will now send that notification only to users which fulfill the age criterion.
Different notifications can be configured for a POI using the Admin Panel. SDK generates notifications when those specific events occur and it is the responsibility of the application to handle them appropriately.
Please note that the notifications generated by SDK are not push notifications on the phone. The LocationBroadcast object exposes onNotification() method which is invoked every time a notification is generated. This method can be used in different ways to handle notifications. The notifications can also be filtered further based on user profiles.
There are four types of notifications which can be associated to any POI :
Simple onNotification method usage:
private LocationBroadcast indoorLocation = new LocationBroadcast() { @Override public void onLocation(LocationResult location) { } @Override public void onNotification(NotificationResult nr) { switch (nr.notification.action) { case ENTER: showMessage("Welcome to "+ nr.place.getName()); break; case STAY: showMessage("Would you like to know more about "+ nr.place.getName()); break; case LEAVE: showMessage("Thank you for visiting" + nr.place.getName()); break; case NEARBY: showMessage("We are waiting for you at" + nr.place.getName()); break; default: return; } } };Trigger an action on a specific notification: The following example shows displays a message to the user if his current location is close to exit (POI in this case) and the user is about to leave the place.
@Override public void onNotification(NotificationResult nr) { // Check if exit tag in POI && notification action is of type NEARBY if (nr.place.getTags().contains("exit") && nr.notification.action == Notification.NotificationAction.NEARBY) { showPopupWithText("Thanks for your visit"); } }
You can also associate any number of properties with every notification. These properties can be used by the developers in any way in the code.
Filter notifications based on user profiles: Notifications can also be sent to specific users based on their profiles. For this, while configuring a notification from the Admin Panel, add a target to it. Target can be set based on user profile like age, gender or any other property. Update the user profile on the server. See the related sample here. The SDK will then automatically trigger notifications based on the profile. For example, if a notification is to be sent to adults above 21 years of age only, then update the user's age on the server through the application and while creating a notification on Admin Panel, add age property as a filter to it. The SDK will now send that notification only to users which fulfill the age criterion.
Places
A point of interest or POI is a specific zone that someone may find useful or interesting. In our guide, terms place and POI are synonymously used. Some examples of POIs in a hotel would be restaurants, parking spaces, reception area, gym. Our SDK aids the user in finding specific places or find information about the points of interest he is near to.
With reference to GoIndoor, a POI can be of the following types based on their shapes:
Point - When the Point of interest can be defined by a point on the map. For example, an entry or exit gate.
Circle - When the POI covers a circular area. It is identified by a particular point and a radius around it.
Polygon - When the POI is of polygon geometry and is defined by a list of boundary points.
Place object contains all the information about a poi like building id, floor number, latitude, longitude, geometry, properties and tags.
Use getPlaces method to fetch the places in the location. You can specify tags and filters to add search criterion. The is an overloaded method and can be used in a number of ways to get the places. For more details, refer this.
Consider the following example where this method is used to fetch the closest place in the location. Assuming the current location of the user is 'location', specify the radius from the location as zero and tags and filters as null as there is no specific search criteria in this case.
Tags : Tags are used to save attributes of a place. These tags can be used in the applications in different ways, like, for grouping similar elements, searching through the elements or for different graphical representations. For instance, if you want to show all the emergency exit gates in your building in red color, add a tag to all of them as ‘emergency_exit’. In the application, fetch all the places with that tag and show them in red.
Following example illustrates a simple usage of tags. This code snippet shows how to get list of all the exit places. Assuming the exit gates (POIs in this case) have been tagged "exit_gate", to get the list of all the exit gates in a building with buildingID as '1e76b0ac-2e19-4c18-84a9-b5b2e66b6e7f', add the following code.
Find places in a building with a given tag
Properties: Properties are used to save additional information about the points of interest. For example, for a place like reception, add a property 'operating_timings' and save its operating timings as its value. This information can then be used in any way in the application.
With reference to GoIndoor, a POI can be of the following types based on their shapes:
Place object contains all the information about a poi like building id, floor number, latitude, longitude, geometry, properties and tags.
Use getPlaces method to fetch the places in the location. You can specify tags and filters to add search criterion. The is an overloaded method and can be used in a number of ways to get the places. For more details, refer this.
Consider the following example where this method is used to fetch the closest place in the location. Assuming the current location of the user is 'location', specify the radius from the location as zero and tags and filters as null as there is no specific search criteria in this case.
ArrayList<Place> places = go.getPlaces(location, 0, null, null);
Tags : Tags are used to save attributes of a place. These tags can be used in the applications in different ways, like, for grouping similar elements, searching through the elements or for different graphical representations. For instance, if you want to show all the emergency exit gates in your building in red color, add a tag to all of them as ‘emergency_exit’. In the application, fetch all the places with that tag and show them in red.
Following example illustrates a simple usage of tags. This code snippet shows how to get list of all the exit places. Assuming the exit gates (POIs in this case) have been tagged "exit_gate", to get the list of all the exit gates in a building with buildingID as '1e76b0ac-2e19-4c18-84a9-b5b2e66b6e7f', add the following code.
Find places in a building with a given tag
ArrayList <String> tags = new ArrayList<>(); tags.add("exit_gate"); ArrayList<Place> places = go.getPlaces("1e76b0ac-2e19-4c18-84a9-b5b2e66b6e7f";, tags, null);
Properties: Properties are used to save additional information about the points of interest. For example, for a place like reception, add a property 'operating_timings' and save its operating timings as its value. This information can then be used in any way in the application.
Tracking
Tracking can be done by logging the location of the user on the server frequently. This can be done using the logPosition method of the Logger class.
Every time there is a change in location, onLocation method of the LocationBroadcast is invoked with the new location attributes. Once the new location is received, use logPosition() to log the position to the server at a certain frequency.
Log user's position:
Every time there is a change in location, onLocation method of the LocationBroadcast is invoked with the new location attributes. Once the new location is received, use logPosition() to log the position to the server at a certain frequency.
Log user's position:
public void onLocation(LocationResult location) { go.getLogger().logPosition(loc); }This method sends user's location details to the server in the form of LocationResult object.
User profile
Our SDK can help you customize the user experience based on their profiles. For this, the user's profile needs to be updated on the server. An example would be to send different notifications to different users. This customization is based on the user properties defined in the Admin Panel.
Assume you want to send a notification that is suitable to only visitors above 18 years of age. In this case, you can configure the notification in the Admin Panel and set the target based on age. From the device application, update the user information (age, in this case). The SDK then takes care of triggering the notification only when the user profile satisfies the age criteria.
Following code sample shows how to update a user property on the server. Assuming that in the Admin Panel settings, there is a user property called age of type number and user's age is defined by a variable 'age', this code snippet updates user's age to the server. The same method putStatsProp can be used to update any user property to the server.
Another use case of maintaining user profiles is to compute multimodal routes. In this case, user specific values of the properties of the edges are to be updated on the server so as to compute appropriate navigational paths. This value can be updated by using putNavProp method. This method updates the value of an existing navigation property for the user by providing its key (a.k.a. the exact name as defined in the Admin Panel) and the new value encoded inside a UserValue object. Currently, it can only supports a BOOLEAN as value.
Below is an example which shows how to indicate the SDK that a wheelchair friendly path should be computed for the current user. Assuming the related property of the edges is called 'wheelchair_accessible', we are setting its value to true.
There is another overloaded method to store a bunch of properties together. Refer this for more details.
Assume you want to send a notification that is suitable to only visitors above 18 years of age. In this case, you can configure the notification in the Admin Panel and set the target based on age. From the device application, update the user information (age, in this case). The SDK then takes care of triggering the notification only when the user profile satisfies the age criteria.
Following code sample shows how to update a user property on the server. Assuming that in the Admin Panel settings, there is a user property called age of type number and user's age is defined by a variable 'age', this code snippet updates user's age to the server. The same method putStatsProp can be used to update any user property to the server.
Values.Settings.UserValue value = new Values.Settings.UserValue<>(age, Values.Format.NUMBER); go.getLogger().putStatsProp("age", value);
Another use case of maintaining user profiles is to compute multimodal routes. In this case, user specific values of the properties of the edges are to be updated on the server so as to compute appropriate navigational paths. This value can be updated by using putNavProp method. This method updates the value of an existing navigation property for the user by providing its key (a.k.a. the exact name as defined in the Admin Panel) and the new value encoded inside a UserValue object. Currently, it can only supports a BOOLEAN as value.
Below is an example which shows how to indicate the SDK that a wheelchair friendly path should be computed for the current user. Assuming the related property of the edges is called 'wheelchair_accessible', we are setting its value to true.
Values.Settings.UserValue value = new Values.Settings.UserValue<>(true, Values.Format.BOOLEAN); go.getLogger().putNavProp("wheelchair_accessible", value);
There is another overloaded method to store a bunch of properties together. Refer this for more details.
Show Indoor Maps
Google Maps Integration
In order to show an indoor map overlapped in Google Map, first step is to initialize a GoogleMap object called map as explained here.
Next step is to get the UrlTileProvider for the floor in question. The GoIndoor library includes a list of the buildings available for the account. Every Building object includes all the floors available for that building. Floor object has the information of TileProvider for indoor tiles. In order to access the UrlTileProvider for a floor, use getGMTileProvider() method . The following example shows how to do it.
Once the UrlTileProvider is available, it can be directly added to the map using the method shown below.
In order to show an indoor map overlapped in Google Map, first step is to initialize a GoogleMap object called map as explained here.
Next step is to get the UrlTileProvider for the floor in question. The GoIndoor library includes a list of the buildings available for the account. Every Building object includes all the floors available for that building. Floor object has the information of TileProvider for indoor tiles. In order to access the UrlTileProvider for a floor, use getGMTileProvider() method . The following example shows how to do it.
ArrayList<Floor> floors = building.getFloorsList(); UrlTileProvider tiles = floors.get(iFloor).getGMTileProvider();
Once the UrlTileProvider is available, it can be directly added to the map using the method shown below.
map.addTileOverlay(new TileOverlayOptions().tileProvider(tiles));
Getting started with iOS SDK
Following sections show how to implement basic locationing related functionalities in iOS applications. For an extensive list of classes and methods exposed, refer this.
SDK Installation
Manual set up of the SDK
1. Download latest version of the GoIndoor iOS SDK from here.
2. Drop the Goindoor.framework directory to the Xcode project. This will make the GoIndoor library available to the project.
3. Copy routing.bundle directory also to the Xcode project. This provides icons and strings to the routing framework.
1. Download latest version of the GoIndoor iOS SDK from here.
2. Drop the Goindoor.framework directory to the Xcode project. This will make the GoIndoor library available to the project.
3. Copy routing.bundle directory also to the Xcode project. This provides icons and strings to the routing framework.
Create a new application
For the SDK to work, it needs Bluetooth and WiFi/Network connection support from the devices. Ensure these features are available.
1. Create a basic iOS app.
2. Set the Base SDK version to iOS7.
3. Add –ObjC flag under the Linking section of the Build Settings tab of your Xcode project.
1. Create a basic iOS app.
2. Set the Base SDK version to iOS7.
3. Add –ObjC flag under the Linking section of the Build Settings tab of your Xcode project.
Initialization and Synchronization
Initialization
The first step is to create a new instance of the GoIndoor library. This can be done through the goIndoorWithBlock method of OYMGoIndoor class. Here, it tries to connect to the server and synchronize with it. The success or failure of this method is notified by the callback method provided.account – GoIndoor account name
password – GoIndoor account password
callback – callback method to handle the connection process.
It is mandatory to set the above three parameters in the GoIndoor library to get its object. There are other optional parameters that can be set through the following methods exposed in GoIndoorBuilder Protocol.
setURL: Sets the Goindoor backend URL.
setUser: Sets the profile to be used. Default is user.
setAccount: Sets the account.
setPassword: Sets the password.
setConnectCallBack: Sets the callback to handle the connection process.
setLocationType: Sets the positioning type. Default is kOYMGoIndoorLocationTypeAverage.
setLocationUpdate: Sets the update rate in msec. Default is kOYMGoIndoorDefaultLocationRefresh.
setDebug: Sets the debug mode. Default is false.
setUpdatePolicy: Sets the update policy. Default is (kOYMGoIndoorUpdateWifi | kOYMGoIndoorUpdateMobile).
setDatabaseUpdate: Sets the database update rate in msec. Default is kOYMGoIndoorDefaultUpdateTime.
Synchronization
When an application first connects to the server, it automatically downloads information about beacons, buildings, floors, POIs, notifications and assets to the device. This not only makes the application more efficient but also provides it offline capabilities. The SDK continues to synchronize with the server in the background at regular intervals to fetch updates, if any available.
The first step is to create a new instance of the GoIndoor library. This can be done through the goIndoorWithBlock method of OYMGoIndoor class. Here, it tries to connect to the server and synchronize with it. The success or failure of this method is notified by the callback method provided.
go = [OYMGoIndoor goIndoorWithBlock:^(id<GoIndoorBuilder> builder) { [builder setAccount:account]; [builder setPassword:password]; [builder setConnectCallBack:callback]; }];where,
It is mandatory to set the above three parameters in the GoIndoor library to get its object. There are other optional parameters that can be set through the following methods exposed in GoIndoorBuilder Protocol.
setURL: Sets the Goindoor backend URL.
setUser: Sets the profile to be used. Default is user.
setAccount: Sets the account.
setPassword: Sets the password.
setConnectCallBack: Sets the callback to handle the connection process.
setLocationType: Sets the positioning type. Default is kOYMGoIndoorLocationTypeAverage.
setLocationUpdate: Sets the update rate in msec. Default is kOYMGoIndoorDefaultLocationRefresh.
setDebug: Sets the debug mode. Default is false.
setUpdatePolicy: Sets the update policy. Default is (kOYMGoIndoorUpdateWifi | kOYMGoIndoorUpdateMobile).
setDatabaseUpdate: Sets the database update rate in msec. Default is kOYMGoIndoorDefaultUpdateTime.
Synchronization
When an application first connects to the server, it automatically downloads information about beacons, buildings, floors, POIs, notifications and assets to the device. This not only makes the application more efficient but also provides it offline capabilities. The SDK continues to synchronize with the server in the background at regular intervals to fetch updates, if any available.
Location
In order to use GoIndoor location library, define a delegate class that conforms to the OYMLocationDelegate protocol. If the Location provider is successfully initiated, didStartSuccessfully method is invoked and in case of failure/exception, didFailStarting is invoked. On successful initialization, onLocation method of this delegate is called each time a new position is computed and onNotification is called each time a new notification is triggered.
After starting the library, the onLocation method of the delegate will be invoked whenever a new position is computed. In order to stop receiving location updates, invoke the stopLocate method with the same delegate object.
In order to properly stop the library, it is necessary to call disconnect method.
kOYMGoIndoorLocationTypeAverage - Weighted average of the signals from multiple beacons is used to triangulate the location.
kOYMGoIndoorLocationTypeClosest - Location is calculated by using only the signals of the beacon which is closest to the user.
kOYMGoIndoorLocationTypeProject - Weighted average of signals from multiple beacons (as in the case of kOYMGoIndoorLocationTypeAverage) is used to determine the location which is then projected to the closest edge.
You can use the coordinates obtained from Indoor Location provider to do various things. One of the most common use cases is to show user's current location on the map. Refer the 'Show Indoor Maps' section to learn how to display indoor maps. Our SDK allows easy integration with both Google Maps and Apple's MapKit framework. In the following example, we are displaying user's location in Apple Maps.
Mark user's current position:
/** * This delegate will provide feedback to the user regarding the indoor location library. */ @protocol OYMLocationDelegate <NSObject> @required /** * This method is called when the indoor location service has been * correctly started. */ - (void) didStartSuccessfully; /** * This method is called when an exception is thrown when trying to * start the indoor location service. */ - (void) didFailStarting; /** * This method is called when a new position is available. * * @param location User position */ - (void) onLocation:(OYMLocationResult*)location; /** * This method is callen when a notification is triggered. * * @param notification Notification triggered */ - (void) onNotification:(OYMNotificationResult*)notification; @optional /** * This method is called when the app has not the right authorisation for the Location Services. * * @param current Current Authorisation Permission */ - (void) locationAlwaysAuthorizationRequired:(CLAuthorizationStatus)current; /** * This method is called when the Location Services are disabled. */ - (void) locationServicesAreDisabled; /** * This method is called when the Core Blueooth Central Manager state has changed. * * @param state The new Core Blueooth Central Manager state */ - (void) centralManagerDidChangeState:(enum CBCentralManagerState)state; @endThe location is sent by the library as OYMLocationResult object which has the following fields.
@property (readonly) double latitude; /** WGS84 Latitude */ @property (readonly) double longitude; /** WGS84 Longitude */ @property (readonly) int used; /** Number of iBeacons used */ @property (readonly) double accuracy; /** Position accuracy (meters) */ @property (readonly) NSArray* found; /** List including the longitude, latitude and accuracy of each iBeacon in sight */ @property (readonly) int floorNumber; /** Floor number */ @property (readonly) int type; /** Positioning type: kOYMIndoorLocationTypeNo, kOYMIndoorLocationTypeIbeacon, kOYMIndoorLocationTypeGps */ @property (readonly) NSString* buildingName; /** Building name */ @property (readonly) NSString* building; /** Building ID */ @property (readonly) int geofences; /** Number of geofences */To start receiving location updates, provide an object that conforms the OYMLocationDelegate protocol to startLocate method of OYMGoIndoor object.
[go startLocate:delegate];
After starting the library, the onLocation method of the delegate will be invoked whenever a new position is computed. In order to stop receiving location updates, invoke the stopLocate method with the same delegate object.
[go stopLocate:delegate];
In order to properly stop the library, it is necessary to call disconnect method.
[go disconnect];There are three positioning types that you can set for the location updates that you wish to receive. These types differ in the way SDK computes the location. Use the following method to set the type.
-(void)setLocationType:(OYMGoIndoorLocationType)typeIn the above method, type can take the following values:
kOYMGoIndoorLocationTypeAverage - Weighted average of the signals from multiple beacons is used to triangulate the location.
kOYMGoIndoorLocationTypeClosest - Location is calculated by using only the signals of the beacon which is closest to the user.
kOYMGoIndoorLocationTypeProject - Weighted average of signals from multiple beacons (as in the case of kOYMGoIndoorLocationTypeAverage) is used to determine the location which is then projected to the closest edge.
You can use the coordinates obtained from Indoor Location provider to do various things. One of the most common use cases is to show user's current location on the map. Refer the 'Show Indoor Maps' section to learn how to display indoor maps. Our SDK allows easy integration with both Google Maps and Apple's MapKit framework. In the following example, we are displaying user's location in Apple Maps.
Mark user's current position:
OYMAnnotation *markerPosition; int floorNumber; - (void) onLocation:(OYMLocationResult *)location { // Show indoor tiles if (location.type == kOYMLocationTypeIbeacon && (floorNumber != location.floorNumber || tileOverlay == nil)) { OYMBuilding *building = [go getBuildings:location.building]; if (tileOverlay) { [mapView removeOverlay:tileOverlay]; } floorNumber = location.floorNumber; OYMFloor *f = building.floors[@(location.floorNumber) stringValue]; tileOverlay = f.tileProvider; [mapView addOverlay:tileOverlay level:MKOverlayLevelAboveLabels]; } // Show marker CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(location.latitude, location.longitude); if (!markerPosition) { markerPosition = [[OYMAnnotation alloc] initWithLocation:coord andImage:markerImage]; } else { [markerPosition setCoordinate:coord]; } }
Notifications
A notification is a kind of event that happens when a specific action happens with respect of a Point of Interest (POI).
Different notifications can be configured for a POI using the Admin Panel. SDK generates notifications when those specific events occur and it is the responsibility of the application to handle them appropriately.
Please note that the notifications generated by SDK are not push notifications on the phone. Whenever a notification is generated, onNotification of OYMLocationDelegate protocol is invoked. This method can be then used in different ways to handle notifications. The notifications can also be filtered further based on its properties or according to the user profile.
There are four types of notifications triggered by the SDK:
Enter – This notification is generated when the device enters the POI.
Stay – This notification is generated when the device has been inside the POI for a specified time period.
Leave – This notification is generated after the device has left the POI.
Nearby – This notification is generated when the device goes near a POI.
Trigger an action on receiving a particular notification: The following code shows how to display a message to a user on a 'NEARBY' notification. In this particular case, the application will show a Thank you message when the user is near an exit gate and is about to leave the place.
Filter notifications based on user profiles: Notifications can also be sent to users based on their profiles. For this, add target to the notifications based on user properties. Update the user profile on the server. See the related sample here. The SDK will then automatically trigger notifications based on the profile. For example, if a notification is to be sent to adults above 21 years of age only, then update the user's age on the server through the application and while creating a notification on Admin Panel, add age property as a filter to it. The SDK will now send that notification only to users which fulfill the age criterion.
Different notifications can be configured for a POI using the Admin Panel. SDK generates notifications when those specific events occur and it is the responsibility of the application to handle them appropriately.
Please note that the notifications generated by SDK are not push notifications on the phone. Whenever a notification is generated, onNotification of OYMLocationDelegate protocol is invoked. This method can be then used in different ways to handle notifications. The notifications can also be filtered further based on its properties or according to the user profile.
There are four types of notifications triggered by the SDK:
Trigger an action on receiving a particular notification: The following code shows how to display a message to a user on a 'NEARBY' notification. In this particular case, the application will show a Thank you message when the user is near an exit gate and is about to leave the place.
- (void)onNotification:(OYMNotificationResult *)nr { // Check if exit tag in POI && notification action is of type NEARBY if ([nr.place.tags containsObject:@"exit"] && nr.notification.action == NEARBY) { [self showPopupWithText:@"Thanks for your visit"]; } }
Filter notifications based on user profiles: Notifications can also be sent to users based on their profiles. For this, add target to the notifications based on user properties. Update the user profile on the server. See the related sample here. The SDK will then automatically trigger notifications based on the profile. For example, if a notification is to be sent to adults above 21 years of age only, then update the user's age on the server through the application and while creating a notification on Admin Panel, add age property as a filter to it. The SDK will now send that notification only to users which fulfill the age criterion.
Places
A point of interest or POI is a specific zone that someone may find useful or interesting. For example, various POIs in a location like hotel would be restaurants, parking spaces, reception area, gym etc.
With respect to GoIndoor, a POI can be one of the following types based on their shapes:
Point - When the Point of interest can be defined by a point on the map. For example, an entry or exit gate.
Circle - When the POI covers a circular area. It is identified by a particular point and a radius around it.
Polygon - When the POI is of polygon geometry and is defined by a list of boundary points.
GoIndoor library defines a OYMPlace object which contains all the information about a POI like building id, floor number, latitude, longitude, geometry, properties and tags. OYMGoIndoor class exposes various methods to fetch places.For more details, refer this.
Consider the following example where 'getPlacesWithLocationResult:andRadius:andTags:andFilter:' method is used to fetch the closest place in the location. Assuming the current location of the user is 'location', specify the radius from the location as zero and tags and filters as null as there is no specific search criteria in this case.
Tags : Tags are used to save attributes of a place. These tags can be used in the applications in different ways, like, for grouping similar elements, searching through the elements or for different graphical representations. For instance, if you want to show all the emergency exit gates in your building in red color, add a tag to all of them as ‘emergency_exit’. In the application, fetch all the places with that tag and show them in red.
The following example illustrates the use of tags. This shows how to find all the exit gates in a location. Assuming the exit gates (POIs in this case) have been tagged "exit_gate", to get the list of all the exit gates in a building with buildingID as '1e76b0ac-2e19-4c18-84a9-b5b2e66b6e7f', add the following code:
Find places in a building with a given tag
Properties: Properties are used to save additional information about the points of interest. For example, for a place like reception, add a property 'timings' and save the receptionist's availability times as its value. This information can then be used in any way in the application.
With respect to GoIndoor, a POI can be one of the following types based on their shapes:
GoIndoor library defines a OYMPlace object which contains all the information about a POI like building id, floor number, latitude, longitude, geometry, properties and tags. OYMGoIndoor class exposes various methods to fetch places.For more details, refer this.
Consider the following example where 'getPlacesWithLocationResult:andRadius:andTags:andFilter:' method is used to fetch the closest place in the location. Assuming the current location of the user is 'location', specify the radius from the location as zero and tags and filters as null as there is no specific search criteria in this case.
NSArray<OYMPlace*>* places = [go getPlacesWithLocationResult:location andRadius:0 andTags:nil andFilter:nil];
Tags : Tags are used to save attributes of a place. These tags can be used in the applications in different ways, like, for grouping similar elements, searching through the elements or for different graphical representations. For instance, if you want to show all the emergency exit gates in your building in red color, add a tag to all of them as ‘emergency_exit’. In the application, fetch all the places with that tag and show them in red.
The following example illustrates the use of tags. This shows how to find all the exit gates in a location. Assuming the exit gates (POIs in this case) have been tagged "exit_gate", to get the list of all the exit gates in a building with buildingID as '1e76b0ac-2e19-4c18-84a9-b5b2e66b6e7f', add the following code:
Find places in a building with a given tag
NSArray *places = [go getPlacesWithId:@"1e76b0ac-2e19-4c18-84a9-b5b2e66b6e7f" andTags:@[@"exit_gate"] andFilter:nil];
Properties: Properties are used to save additional information about the points of interest. For example, for a place like reception, add a property 'timings' and save the receptionist's availability times as its value. This information can then be used in any way in the application.
Tracking
Tracking can be done by logging the location of the user on the server frequently. This can be done using various log methods of the OYMLogger class.
Every time there is a change in location, onLocation method of the OYMLocationDelegate is invoked with the new location attributes. Once the new location is received, use logPosition method to simply log current location to the server at a certain frequency.
Log user's position:
Every time there is a change in location, onLocation method of the OYMLocationDelegate is invoked with the new location attributes. Once the new location is received, use logPosition method to simply log current location to the server at a certain frequency.
Log user's position:
[go.getLogger logPosition:loc];This method sends user's location details to the server in the form of OYMLocationResult object.
User Profile
Our SDK can help you customize the user experience based on their profiles. For this, the user's profile needs to be updated on the server. An example would be to send different notifications to different users. This customization is based on the user properties defined in the Admin Panel.
Assume you want to send a notification that is suitable to only visitors above 18 years of age. In this case, you can configure the notification in the Admin Panel and set the target based on age. From the device application, update the user information (age, in this case). The SDK then takes care of triggering the notification only when the user profile satisfies the age criteria.
Following code sample shows how to update a user property on the server. Assuming that in the Admin Panel settings, there is a user property called age of type number and user age is defined by variable age, this code snippet updates user profile with the age field. This method putStatsPropKey can be used to update any user property to the server.
Another use case of maintaining user profiles is to compute multimodal routes. In this case, user specific values of the properties of the edges are to be updated on the server so as to compute appropriate navigational paths. This value can be updated by using '– putNavPropKey:andUserValue:' method. This method updates the value of an existing navigation property for the user by providing its key (a.k.a. the exact name as defined in the Admin Panel) and the new value encoded inside a UserValue object. Currently, it can only supports a BOOLEAN as value.
Below is an example which shows how to indicate the SDK that a wheelchair friendly path should be computed for the current user. Assuming the related property of the edges is called 'wheelchair_accessible', we are setting its value to true.
Assume you want to send a notification that is suitable to only visitors above 18 years of age. In this case, you can configure the notification in the Admin Panel and set the target based on age. From the device application, update the user information (age, in this case). The SDK then takes care of triggering the notification only when the user profile satisfies the age criteria.
Following code sample shows how to update a user property on the server. Assuming that in the Admin Panel settings, there is a user property called age of type number and user age is defined by variable age, this code snippet updates user profile with the age field. This method putStatsPropKey can be used to update any user property to the server.
OYMUserValue *value = [[OYMUserValue alloc] initWithValue:[NSNumber numberWithInt:age] settingFormat:NUMBER]; [go.getLogger putStatsPropKey:@"age" andUserValue:value];
Another use case of maintaining user profiles is to compute multimodal routes. In this case, user specific values of the properties of the edges are to be updated on the server so as to compute appropriate navigational paths. This value can be updated by using '– putNavPropKey:andUserValue:' method. This method updates the value of an existing navigation property for the user by providing its key (a.k.a. the exact name as defined in the Admin Panel) and the new value encoded inside a UserValue object. Currently, it can only supports a BOOLEAN as value.
Below is an example which shows how to indicate the SDK that a wheelchair friendly path should be computed for the current user. Assuming the related property of the edges is called 'wheelchair_accessible', we are setting its value to true.
OYMUserValue*value =[[OYMUserValue alloc] initWithValue:[NSNumber numberWithBool:YES] settingFormat:BOOLEAN]; [go.getLogger putStatsPropKey:@"wheelchair_accessible" andUserValue:value];There is another overloaded method to store a bunch of properties together. Refer this for more details.
Show Indoor Maps
MapKit integration
The GoIndoor library maintains the list of the buildings available for your account. Each Building object in turn includes all the floors available for that building and every floor has information about the tile provider. In order to show an indoor map overlap in MapKit framework, our SDK has a helper class OYMTileOverlay that inherits from MKTileOverlay. This object can be retrieved from the OYMFloor class and can be used to overlay it on a MKMapView instance.
Google Maps integration
GoIndoor can also be used with Google Maps for iOS. In this case, first of all add the Google Maps for iOS frameworks. Find more information on this here. In order to ensure compatibility, it is required to include the OYMFloor+GoogleMaps category available in our repository. This category provides a tileProviderGoogle variable of type GMSURLTileLayer to be integrated in the GMSMapView. Assuming the map variable has been correctly initialized, to overlay indoor tiles in Google Maps, use the following code snippet for reference.
The GoIndoor library maintains the list of the buildings available for your account. Each Building object in turn includes all the floors available for that building and every floor has information about the tile provider. In order to show an indoor map overlap in MapKit framework, our SDK has a helper class OYMTileOverlay that inherits from MKTileOverlay. This object can be retrieved from the OYMFloor class and can be used to overlay it on a MKMapView instance.
tileOverlay = f.tileProvider; [mapView addOverlay:tileOverlay level:MKOverlayLevelAboveLabels];
Google Maps integration
GoIndoor can also be used with Google Maps for iOS. In this case, first of all add the Google Maps for iOS frameworks. Find more information on this here. In order to ensure compatibility, it is required to include the OYMFloor+GoogleMaps category available in our repository. This category provides a tileProviderGoogle variable of type GMSURLTileLayer to be integrated in the GMSMapView. Assuming the map variable has been correctly initialized, to overlay indoor tiles in Google Maps, use the following code snippet for reference.
GMSURLTileLayer *layer = floor.tileProviderGoogle; layer.map = map;
GoIndoor REST API
Introduction
GoIndoor REST API provides a powerful, convenient, simple and programmatic way of interacting and managing GoIndoor resources. These APIs can act like an intermediate layer for data storage and information processing. The web services are available for both web and mobile apps. They let you interact with the server and do various things like:Access data from GoIndoor server and show on your own server
Upload data to GoIndoor server to be consumed by your mobile applications
GoIndoor Resources
A REST resource is an abstraction of a piece of information such as a single data record, a collection of records, or a query accessed using standard HTTP methods (GET, PUT, POST and DELETE).
GoIndoor resources include information about Buildings, Floors, Beacons, Proxibeacons, Assets , Places, Userprofiles, ConnectedUsers, Notifications, Settings, Edges and Indicators.
Request
All APIs can be accessed over HTTPS via "https://www.goindoor.co/ws/v2/sql" domain.
Response
The response format is JSON.
Authentication
The REST API identifies GoIndoor users using account and password in the request header.
Detailed description of various APIs can be found here.
GoIndoor REST API provides a powerful, convenient, simple and programmatic way of interacting and managing GoIndoor resources. These APIs can act like an intermediate layer for data storage and information processing. The web services are available for both web and mobile apps. They let you interact with the server and do various things like:
GoIndoor Resources
A REST resource is an abstraction of a piece of information such as a single data record, a collection of records, or a query accessed using standard HTTP methods (GET, PUT, POST and DELETE).
GoIndoor resources include information about Buildings, Floors, Beacons, Proxibeacons, Assets , Places, Userprofiles, ConnectedUsers, Notifications, Settings, Edges and Indicators.
Request
All APIs can be accessed over HTTPS via "https://www.goindoor.co/ws/v2/sql" domain.
Response
The response format is JSON.
Authentication
The REST API identifies GoIndoor users using account and password in the request header.
Detailed description of various APIs can be found here.