Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
Yonah Forst authored and Yonah Forst committed Mar 23, 2016
0 parents commit bf1fd05
Show file tree
Hide file tree
Showing 10 changed files with 597 additions and 0 deletions.
21 changes: 21 additions & 0 deletions LICENSE
@@ -0,0 +1,21 @@
The MIT License (MIT)

Copyright (c) 2015 Yonah Forst

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
106 changes: 106 additions & 0 deletions README.md
@@ -0,0 +1,106 @@
# Discovery
Discover nearby devices using BLE.

React native implementation of https://github.com/omergul123/Discovery

(Android uses https://github.com/joshblour/discovery-android)

##What
Discovery is a very simple but useful library for discovering nearby devices with BLE(Bluetooth Low Energy) and for exchanging a value (kind of ID or username determined by you on the running app on peer device) regardless of whether the app on peer device works at foreground or background state.


####Example
```java
const {DeviceEventEmitter} = require('react-native');
const Discovery = require('react-native-discovery');

Discovery.initialize(
"3E1180E5-222E-43E9-98B4-E6C0DD18E728",
"SpacemanSpiff"
);
Discovery.setShouldAdvertise(true);
Discovery.setShouldDiscover(true);

// Listen for discovery changes
DeviceEventEmitter.addListener(
'discoveredUsers',
(data) => {
if (data.didChange || data.usersChanged) //slight callback discrepancy between the iOS and Android libraries
console.log(data.users)
}
);

```


####API

`initialize(uuidString, username)` - Initialize the Discovery object with a UUID specific to your app, and a username specific to your device.

`setPaused(isPaused)` - bool. pauses advertising and detection

`setShouldDiscover(shouldDiscover)` - bool. starts and stops discovery only

`setShouldAdvertise(shouldAdvertise)` - bool. starts and stops advertising only

`setUserTimeoutInterval(userTimeoutInterval)` - integer in seconds, default is 5. After not seeing a user for x seconds, we remove him from the users list in our callback.


*The following two methods are specific to the Android version, since the Android docs advise against continuous scanning. Instead, we cycle scanning on and off. This also allows us to modify the scan behaviour when the app moves to the background.*

`setScanForSeconds(scanForSeconds)` - integer in seconds, default is 5. This parameter specifies the duration of the ON part of the scan cycle.

`setWaitForSeconds(waitForSeconds)` - integer in seconds default is 5. This parameter specifies the duration of the OFF part of the scan cycle.


##Setup

````
npm install --save react-native-discovery
````

###iOS
* Run open node_modules/react-native-discovery
* Drag ReactNativeDiscovery.xcodeproj into your Libraries group

###Android
#####Step 1 - Update Gradle Settings

```
// file: android/settings.gradle
...
include ':react-native-discovery'
project(':react-native-discovery').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-discovery/android')
```
#####Step 2 - Update Gradle Build

```
// file: android/app/build.gradle
...
dependencies {
...
compile project(':react-native-discovery')
}
```
#####Step 3 - Register React Package
```
...
import com.joshblour.reactnativediscovery.ReactNativeDiscoveryPackage; // <--- import
public class MainActivity extends ReactActivity {
...
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new ReactNativeDiscoveryPackage(this) // <------ add the package
);
}
...
}
```
14 changes: 14 additions & 0 deletions ReactNativePermissions.h
@@ -0,0 +1,14 @@
//
// ReactNativePermissions.h
// ReactNativePermissions
//
// Created by Yonah Forst on 18/02/16.
// Copyright © 2016 Yonah Forst. All rights reserved.
//
#import "RCTBridgeModule.h"

#import <Foundation/Foundation.h>

@interface ReactNativePermissions : NSObject <RCTBridgeModule>

@end
6 changes: 6 additions & 0 deletions ReactNativePermissions.ios.js
@@ -0,0 +1,6 @@
'use strict';

var React = require('react-native');
var Heading = React.NativeModules.ReactNativePermissions;

module.exports = Heading;
65 changes: 65 additions & 0 deletions ReactNativePermissions.m
@@ -0,0 +1,65 @@
//
// ReactNativePermissions.m
// ReactNativePermissions
//
// Created by Yonah Forst on 18/02/16.
// Copyright © 2016 Yonah Forst. All rights reserved.
//

#import "ReactNativePermissions.h"

#import "RCTBridge.h"
#import "RCTConvert.h"
#import "RCTEventDispatcher.h"


@interface ReactNativePermissions()
@end

@implementation ReactNativePermissions

RCT_EXPORT_MODULE();
@synthesize bridge = _bridge;

#pragma mark Initialization

- (instancetype)init
{
if (self = [super init]) {
}

return self;
}

RCT_REMAP_METHOD(start, start:(int)headingFilter resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
// Start heading updates.
if ([CLLocationManager headingAvailable]) {
if (!headingFilter)
headingFilter = 5;

self.locManager.headingFilter = headingFilter;
[self.locManager startUpdatingHeading];
resolve(@YES);
} else {
resolve(@NO);
}
}

RCT_EXPORT_METHOD(stop) {
[self.locManager stopUpdatingHeading];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
if (newHeading.headingAccuracy < 0)
return;

// Use the true heading if it is valid.
CLLocationDirection heading = ((newHeading.trueHeading > 0) ?
newHeading.trueHeading : newHeading.magneticHeading);

NSDictionary *headingEvent = @{@"heading": @(heading)};

[self.bridge.eventDispatcher sendDeviceEventWithName:@"headingUpdated" body:headingEvent];
}

@end

0 comments on commit bf1fd05

Please sign in to comment.