npm package: @nitsnetsnpm/cordova-plugin-mindv2le
Description: Use the Bluetooth Low Energy plugin to connect NITSNETS app to new Mondraker MINDV2 devices. *Based on cordova-plugin-bluetoothle.
Author: Ignacio Vidal
Latest version: 1.0.3

# MINDV2 Bluetooth LE Plugin #
This plugin allows you to interact with MINDV2 Bluetooth LE devices on Android and iOS.

* Added support for Espressif Blufi Protocol


### Instalación y uso ###

* **Cordova install: cordova plugin add @nitsnetsnpm/cordova-plugin-mindv2le**

* **NPM install: npm i @nitsnetsnpm/cordova-plugin-mindv2le**

* Uso de plugin **mindv2le** con Promise (Observable en Ionic):
```javascript

new Promise(function (resolve) {
    mindv2le.initialize(resolve, {
    request: true,
    statusReceiver: true,
    restoreKey: "mindv2leplugin",
    });
}).then(initializeSuccess, handleError);

```

* **[Source de ejemplo](https://bitbucket.org/nitsnetsstudios-ondemand/cordova-plugin-mindv2le/src/master/index_demo.js)**


### Métodos básicos ###

Los métodos básicos de inicialización de BLe, escaneo de dispositivos, conexión, desconexión, estado...etc son los mismos del plugin original [Métodos cordova-plugin-bluetoothle](https://github.com/randdusing/cordova-plugin-bluetoothle/tree/master#methods)

* mindv2le.initialize
* mindv2le.enable
* mindv2le.disable
* mindv2le.startScan (Buscar dispositivos MINDV2)
* mindv2le.stopScan
* mindv2le.connect
* mindv2le.reconnect
* mindv2le.disconnect
* mindv2le.close
* mindv2le.isEnabled
* mindv2le.isScanning
* mindv2le.wasConnected
* mindv2le.isConnected
* ...etc


### Métodos y Eventos conexión MindV2 ###

* Registro Callback MINDv2 [mindv2le.regMINDv2](#regMINDv2)
* Evento Callback [isPreparedMINDv2](#isPreparedMINDv2)
* Evento Callback [recvErrorMINDv2](#recvErrorMINDv2)


### Métodos MindV2 ###

* [mindv2le.getIDConMINDv2](#getIDConMINDv2)
* [mindv2le.regSerialMINDv2](#regSerialMINDv2)
* [mindv2le.requestDeviceScanMINDv2](#requestDeviceScanMINDv2)
* [mindv2le.postProvisionMINDv2](#postProvisionMINDv2)



### Ciclo de conexión ###

* Inicializar BLe y esperar evento OK de inicialización plugin: **mindv2le.initialize** 
* Escanear dispositivos MindV2 y buscar dispositivos "MINDV2": **mindv2le.startScan**
* Registrar regMINDv2CallBack: **[Método mindv2le.regMINDv2](#regMINDv2)**
* Conectar a dispositivo MindV2: **mindv2le.connect**
* Esperar eventos OK: **isPreparedMINDv2**
* Get keyID de sesión y Shock/Fork Serial, FW version y HW version: **[Método mindv2le.getIDConMINDv2](#getIDConMINDv2)**
* Desencriptar keyID con servidor.
* Registrar Bike Serial y keyID de autenticación con MINDv2: **[Método mindv2le.regSerialMINDv2](#regSerialMINDv2)**
* Ejecutar función MindV2 necesaria: **mindv2le.requestDeviceScanMINDv2, mindv2le.postProvisionMINDv2**
* Desconectar de dispositivo: **mindv2le.disconnect**
* Cerrar y liberar recurso: **mindv2le.close**


## keyID Autenticación

* MINDv2 generará a partir de un número random un cifrado AES-128-CBC y codificación en base64.

```javascript
keyID = "1234567890"
keyID cifrado: = "jFSJtrLGCGmO5V2GSoL3mg=="
```

* Servidor desencriptará el keyID y lo enviará como autenticación cuando registre Bike Serial. 

Ej. PHP:
```php
$pass = 'A2EC71B835F49D71';
$iv = "62C95F98BA425ED6";
$method = 'aes-128-cbc';
echo openssl_decrypt(base64_decode('jFSJtrLGCGmO5V2GSoL3mg=='),$method,$pass,OPENSSL_RAW_DATA,$iv);

```



## regMINDv2
El primer paso antes de conectar con un dispositivo es registrar el Callback MINDv2 necesario para recibir cualquier evento relacionado con el protocolo de MindV2. 
- No es necesario llamar el método con Promise (por determinar con Observable).
- En caso de error o no obtener respuesta no se debería conectar a dispositivo.

```javascript
mindv2le.regMINDv2(regMINDv2CallBack, handleError, { address: addr });

```

#### params #####

* **regMINDv2CallBack**: función para recibir tipo de evento, status y/o resultado.
* **handleError**: error function
* **address**: dirección obtenida tras respuesta de **mindv2le.startScan**



## isPreparedMINDv2
Evento MINDv2 CallBack: Estado de conexión a dispositivo MindV2 e inicialización de GATT peripheral.
- En caso de error proceder a desconexión. 

#### result #####

* result.type: **"isPreparedMINDv2"**
* result.status: **true / false**



## recvErrorMINDv2
Evento MINDv2 CallBack: Estado sobre error en la conexión.
- En caso de error proceder a desconexión. 

#### result #####
* result.type: **"recvErrorMINDv2"**
* result.status: **false**
* result.message: **Srtring mensaje error**




## getIDConMINDv2
Obtener KeyID secret encriptado, el servidor debe desencriptarlo y devolver el keyID al registrar Bike Serial.
Obtener Shock & Fork Serial, Firmware y Hardware

```javascript
new Promise(function (resolve, error) {
    mindv2le.getIDConMINDv2(resolve, error, { address: addr });
}).then(getIDConMINDv2CallBack, handleError);

```

#### params #####

* **address**: dirección dispositivo MindV2

#### result #####

* result.status: **true false**
* result.keyID:  **String en base64**
* result.ShockSerial
* result.ForkSerial
* result.ShockFW
* result.ShockHW
* result.ForkFW
* result.ForkHW




## regSerialMINDv2
Registrar Bike Serial y keyID desencriptado por servidor (autenticación en Mind2)

```javascript
new Promise(function (resolve, error) {
    mindv2le.regSerialMINDv2(resolve, error, { address: addr , mindv2bikeserial:"ABCDEFGHI1", keyID:"1234567890"});
}).then(regSerialMINDv2CallBack, handleError);

```

#### params #####

* **address**: dirección dispositivo MindV2
* **mindv2bikeserial**: Bike Serial
* **keyID**: keyID Autenticación

#### result #####

* result.regSerialStatus: **0**   **Registro serial OK: el dispositivo era nuevo o tenía el mismo serial**
* result.regSerialStatus: **1**   **Serial no coincide con el que está registrado en SHOCK**
* result.regSerialStatus: **2**   **Error Autenticación**
* result.regSerialStatus: **-1**  **Error**




## requestDeviceScanMINDv2
Obtener lista de Puntos de Acceso Wifi detectada por MindV2 (No es necesario indicar callback, las respuestas se reciben directamente en BlufiCallBack)
- El listado de Wifis debe obtenerse desde MindV2, no del escaneo que realiza el propio móvil.

```javascript
new Promise(function (resolve, error) {
    mindv2le.requestDeviceScanMINDv2(resolve, error, { address: addr});
}).then(requestDeviceScanMINDv2CallBack, handleError);

```

#### params #####

* **address**: dirección dispositivo MindV2

#### result #####

* result.status: **true false**
* result.wifiList: **Lista Wifi en formato JSON ({"SSID":nivel_señal_rssi, ...})**





## postProvisionMINDv2
Provisioning SSID y credenciales para conectar a Punto Acceso Wifi (No es necesario indicar callback, las respuestas se reciben directamente en BlufiCallBack)
- Si conecta correctamente automáticamente MindV2 devuelve un evento de tipo Status.

```javascript
new Promise(function (resolve, error) {
    mindv2le.postProvisionMINDv2(resolve, error, { address: addr, provssid: "YOUR-WIFI-SSID", provpass: "YOUR-PASS" });
}).then(postProvisionMINDv2CallBack, handleError);

```

#### params #####

* **address**: dirección dispositivo MindV2
* **provssid**: Nombre punto acceso Wifi
* **provpass**: Password

#### result #####

* result.provWifiStatus:  **0**  **Conectado**
* result.provWifiStatus:  **!0**  **No Conectado/ No se guarda Wifi**