Using BLE to control WIFI configuration as SSID and PW.

Dependencies:   BLE_API WIFI_API_32kRAM mbed nRF51822

Fork of NNN40_WiFi by Delta

BLE_WIFIControl enables user to setup Wifi connection via BLE link. Here is iPhone app that teaches you how to use this BLE_WIFIControl example. /media/uploads/Marcomissyou/ios_app_for_wifi_configure.pdf

Committer:
tsungta
Date:
Wed Apr 20 05:56:38 2016 +0000
Revision:
11:e22dfe039dee
Parent:
8:d39bc94f139b
Update all libraries in this program

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Marcomissyou 7:5d82c92ec2a3 1 #ifndef __BLE_HEART_RATE_SERVICE_H__
Marcomissyou 7:5d82c92ec2a3 2 #define __BLE_HEART_RATE_SERVICE_H__
Marcomissyou 7:5d82c92ec2a3 3
Marcomissyou 8:d39bc94f139b 4 #include "BLE.h"
Marcomissyou 7:5d82c92ec2a3 5 #include "WIFIDevice.h"
Marcomissyou 7:5d82c92ec2a3 6
Marcomissyou 7:5d82c92ec2a3 7 static const uint8_t UUID_WIFI_CONFIGURATION_SERVICE[] = { 0x44, 0x38, 0x70, 0x22, 0x40, 0x02, 0x11, 0xe4, 0x85, 0x14, 0x16, 0x42, 0x30, 0xd1, 0xdf, 0x67 };
Marcomissyou 7:5d82c92ec2a3 8 static const uint8_t UUID_CONNECTION_STATUS_CHAR[] = { 0x44, 0x38, 0x73, 0x7e, 0x40, 0x02, 0x11, 0xe4, 0x85, 0x14, 0x16, 0x42, 0x30, 0xd1, 0xdf, 0x67 };
Marcomissyou 7:5d82c92ec2a3 9 static const uint8_t UUID_SSID_INFO_CHAR[] = { 0x44, 0x38, 0x75, 0xd6, 0x40, 0x02, 0x11, 0xe4, 0x85, 0x14, 0x16, 0x42, 0x30, 0xd1, 0xdf, 0x67 };
Marcomissyou 7:5d82c92ec2a3 10 static const uint8_t UUID_NETWORK_SECURITY_PASSWORD_CHAR[] = { 0x44, 0x38, 0x78, 0x1a, 0x40, 0x02, 0x11, 0xe4, 0x85, 0x14, 0x16, 0x42, 0x30, 0xd1, 0xdf, 0x67 };
Marcomissyou 7:5d82c92ec2a3 11
Marcomissyou 7:5d82c92ec2a3 12 static const uint8_t MAX_PAYLOAD_SIZE = 20;
Marcomissyou 7:5d82c92ec2a3 13
Marcomissyou 7:5d82c92ec2a3 14 class BLEControlWIFIService {
Marcomissyou 7:5d82c92ec2a3 15 public:
Marcomissyou 7:5d82c92ec2a3 16 bool is_config;
Marcomissyou 7:5d82c92ec2a3 17 char *ssid;
Marcomissyou 7:5d82c92ec2a3 18 uint8_t uint_ssid[20];
Marcomissyou 7:5d82c92ec2a3 19 char *pw;
Marcomissyou 7:5d82c92ec2a3 20 uint8_t uint_pw[20];
Marcomissyou 7:5d82c92ec2a3 21
Marcomissyou 7:5d82c92ec2a3 22 public:
Marcomissyou 7:5d82c92ec2a3 23
Marcomissyou 7:5d82c92ec2a3 24 BLEControlWIFIService(BLEDevice &_ble, WIFIDevice &_wifi) :
Marcomissyou 7:5d82c92ec2a3 25 ble(_ble),
Marcomissyou 7:5d82c92ec2a3 26 wifi(_wifi),
Marcomissyou 7:5d82c92ec2a3 27 is_config(false),
Marcomissyou 7:5d82c92ec2a3 28 statusCharacteristic(UUID_CONNECTION_STATUS_CHAR, statusPayload, 1, MAX_PAYLOAD_SIZE,
Marcomissyou 7:5d82c92ec2a3 29 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ),
Marcomissyou 7:5d82c92ec2a3 30 ssidCharacteristic (UUID_SSID_INFO_CHAR, ssidPayload, 1, MAX_PAYLOAD_SIZE,
Marcomissyou 7:5d82c92ec2a3 31 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ),
Marcomissyou 7:5d82c92ec2a3 32 pwCharacteristic (UUID_NETWORK_SECURITY_PASSWORD_CHAR, statusPayload, 1, MAX_PAYLOAD_SIZE,
Marcomissyou 7:5d82c92ec2a3 33 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ)
Marcomissyou 7:5d82c92ec2a3 34 {
Marcomissyou 7:5d82c92ec2a3 35 setupService();
Marcomissyou 7:5d82c92ec2a3 36 }
Marcomissyou 7:5d82c92ec2a3 37
Marcomissyou 7:5d82c92ec2a3 38
Marcomissyou 8:d39bc94f139b 39 virtual void onDataWritten(const GattWriteCallbackParams *params) {
Marcomissyou 7:5d82c92ec2a3 40 uint8_t rssi, i;
Marcomissyou 7:5d82c92ec2a3 41 uint16_t bytesRead = params->len;
Marcomissyou 8:d39bc94f139b 42 if (params->handle == statusCharacteristic.getValueAttribute().getHandle()) {
Marcomissyou 7:5d82c92ec2a3 43 memcpy(statusPayload, params->data, bytesRead);
Marcomissyou 7:5d82c92ec2a3 44
Marcomissyou 7:5d82c92ec2a3 45 ble.updateCharacteristicValue(statusCharacteristic.getValueAttribute().getHandle(), statusPayload, bytesRead);
Marcomissyou 8:d39bc94f139b 46 } else if (params->handle == ssidCharacteristic.getValueAttribute().getHandle()) {
Marcomissyou 7:5d82c92ec2a3 47 rssi = ssidPayload[0];
Marcomissyou 7:5d82c92ec2a3 48 for(i=1; i<bytesRead; i++)
Marcomissyou 7:5d82c92ec2a3 49 uint_ssid[i-1] = params->data[i];
Marcomissyou 7:5d82c92ec2a3 50 uint_ssid[bytesRead-1] = '\0';
Marcomissyou 7:5d82c92ec2a3 51 ssid = (char*) uint_ssid;
Marcomissyou 7:5d82c92ec2a3 52 memcpy(ssidPayload, params->data, bytesRead);
Marcomissyou 7:5d82c92ec2a3 53
Marcomissyou 7:5d82c92ec2a3 54 ssidPayload[0] = rssi; // Added by Tsungta, restore RSSI value
Marcomissyou 7:5d82c92ec2a3 55 ble.updateCharacteristicValue(ssidCharacteristic.getValueAttribute().getHandle(), ssidPayload, bytesRead);
Marcomissyou 8:d39bc94f139b 56 } else if (params->handle == pwCharacteristic.getValueAttribute().getHandle()) {
Marcomissyou 7:5d82c92ec2a3 57 for(i=1; i<bytesRead; i++)
Marcomissyou 7:5d82c92ec2a3 58 uint_pw[i-1] = params->data[i];
Marcomissyou 7:5d82c92ec2a3 59 uint_pw[bytesRead-1] = '\0';
Marcomissyou 7:5d82c92ec2a3 60 pw = (char*) uint_pw;
Marcomissyou 7:5d82c92ec2a3 61 memcpy(pwPayload, params->data, bytesRead);
Marcomissyou 7:5d82c92ec2a3 62 ble.updateCharacteristicValue(pwCharacteristic.getValueAttribute().getHandle(), pwPayload, bytesRead);
Marcomissyou 7:5d82c92ec2a3 63 wifi.setNetwork(ssid, pw, 0);
Marcomissyou 7:5d82c92ec2a3 64 is_config = true;
Marcomissyou 7:5d82c92ec2a3 65 }
Marcomissyou 7:5d82c92ec2a3 66 }
Marcomissyou 7:5d82c92ec2a3 67
Marcomissyou 7:5d82c92ec2a3 68
Marcomissyou 7:5d82c92ec2a3 69 private:
Marcomissyou 7:5d82c92ec2a3 70 void setupService(void) {
Marcomissyou 7:5d82c92ec2a3 71 static bool serviceAdded = false; /* We should only ever need to add the heart rate service once. */
Marcomissyou 7:5d82c92ec2a3 72 if (serviceAdded) {
Marcomissyou 7:5d82c92ec2a3 73 return;
Marcomissyou 7:5d82c92ec2a3 74 }
Marcomissyou 7:5d82c92ec2a3 75
Marcomissyou 7:5d82c92ec2a3 76 GattCharacteristic *charTable[] = {&statusCharacteristic, &ssidCharacteristic, &pwCharacteristic};
Marcomissyou 7:5d82c92ec2a3 77 GattService BLEWIFIService(UUID_WIFI_CONFIGURATION_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
Marcomissyou 7:5d82c92ec2a3 78
Marcomissyou 7:5d82c92ec2a3 79 ble.addService(BLEWIFIService);
Marcomissyou 7:5d82c92ec2a3 80 serviceAdded = true;
Marcomissyou 7:5d82c92ec2a3 81
Marcomissyou 7:5d82c92ec2a3 82 ble.onDataWritten(this, &BLEControlWIFIService::onDataWritten);
Marcomissyou 7:5d82c92ec2a3 83 }
Marcomissyou 7:5d82c92ec2a3 84
Marcomissyou 7:5d82c92ec2a3 85
Marcomissyou 7:5d82c92ec2a3 86 private:
Marcomissyou 7:5d82c92ec2a3 87 BLEDevice &ble;
Marcomissyou 7:5d82c92ec2a3 88 WIFIDevice &wifi;
Marcomissyou 7:5d82c92ec2a3 89 uint8_t statusPayload[MAX_PAYLOAD_SIZE];
Marcomissyou 7:5d82c92ec2a3 90 uint8_t ssidPayload[MAX_PAYLOAD_SIZE];
Marcomissyou 7:5d82c92ec2a3 91 uint8_t pwPayload[MAX_PAYLOAD_SIZE];
Marcomissyou 7:5d82c92ec2a3 92
Marcomissyou 7:5d82c92ec2a3 93 GattCharacteristic statusCharacteristic;
Marcomissyou 7:5d82c92ec2a3 94 GattCharacteristic ssidCharacteristic;
Marcomissyou 7:5d82c92ec2a3 95 GattCharacteristic pwCharacteristic;
Marcomissyou 7:5d82c92ec2a3 96 };
Marcomissyou 7:5d82c92ec2a3 97
Marcomissyou 8:d39bc94f139b 98 #endif /* #ifndef __BLE_HEART_RATE_SERVICE_H__*/