Using BLE to control WIFI configuration as SSID and PW.
Dependencies: BLE_API WIFI_API_32kRAM mbed nRF51822
Fork of NNN40_WiFi by
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
BLEControlWIFIService.h@11:e22dfe039dee, 2016-04-20 (annotated)
- 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?
User | Revision | Line number | New 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__*/ |