38 #ifdef BTRTEST_LE_ONBRDG_ENABLE
42 #include "wifiSrvMgrIarmIf.h"
54 #include "btrMgr_logger.h"
57 #define get_value_string(obj,str) strcpy(str, obj->valuestring);
60 #define get_value_number(obj, num) num = obj->valueint;
62 #define kPrivateKeyPath "/tmp/bootstrap_private.pem"
63 #define kPublicKeyPath "/tmp/bootstrap_public.pem"
68 SECURITY_MODE_NONE = 1,
69 SECURITY_MODE_WPA2_PSK,
70 SECURITY_MODE_RESERVED1,
71 SECURITY_MODE_WPA_WPA2_PSK
75 int gLeOnboardingState = BTRMGR_LE_ONBRDG_UNDEFINED;
76 short int gUuidProvisionStatus = 0;
77 char gWifiPayload[MAX_PAYLOAD_LEN];
78 int gWifiPayloadLen = 0;
80 bool gWifiPayloadDecodeSuccess =
false;
81 bool gWifiConnectSuccess =
false;
82 bool gWifiPayloadRxd =
false;
86 eBTRMgrRet BTRMGR_LeWifi_CheckWifiConnSuccess(
char* aSSID);
87 static void BTRMGR_LeLoadDatatoBuffer(
char *aData);
88 static int get_wifi_creds(cJSON* wifi_settings,
wifi_creds_t *creds,
int index,
int *ptotalEntries);
89 void BTRMGR_LeDecodeRxdWifiPayload(
char * agWifiPayload);
90 eBTRMgrRet BTRMGR_LeWifi_ConnectToWifi(
char* aSSID,
char* aPassword,
int aSecurityMode);
99 char header[] =
"-----BEGIN PUBLIC KEY-----";
100 char footer[] =
"-----END PUBLIC KEY-----";
104 file = fopen(kPublicKeyPath,
"r");
106 while ((nread = getline(&line, &len, file)) != -1) {
107 if ((strncmp(line, header, nread - 1) != 0) && (strncmp(line, footer, nread - 1) != 0)) {
108 strncpy(&key[strlen(key)], line, nread - 1);
118 BTRMGR_LeLoadDatatoBuffer (
121 if (gWifiPayloadLen == 0) {
122 sscanf(aData,
"%4x", &gWifiPayloadLen);
123 BTRMGRLOG_DEBUG(
"Data length is %d", gWifiPayloadLen);
126 gDataLenRxd += snprintf(&gWifiPayload[gDataLenRxd], 2048,
"%s", aData);
128 BTRMGRLOG_DEBUG(
"\nLength received is %d\n", gDataLenRxd);
130 if (gDataLenRxd == gWifiPayloadLen) {
131 BTRMGRLOG_DEBUG(
"Data is %s", gWifiPayload);
139 cJSON* wifi_settings,
148 noofEntries = cJSON_GetArraySize(wifi_settings);
149 *ptotalEntries = noofEntries;
150 BTRMGRLOG_DEBUG(
"noofEntries in ssid json %d and current index %d", *ptotalEntries, index);
152 if (noofEntries >= index) {
153 cJSON* cur_ssid = cJSON_GetArrayItem(wifi_settings, (index - 1));
156 get_value_string(cJSON_GetObjectItem(cur_ssid,
"ssid"), creds->ssid);
157 BTRMGRLOG_INFO(
"creds->ssid (%s)", creds->ssid);
159 get_value_string(cJSON_GetObjectItem(cur_ssid,
"password"), creds->passphrase);
160 BTRMGRLOG_DEBUG(
"creds->passphrase (%s)", creds->passphrase);
162 if (!cJSON_GetObjectItem(cur_ssid,
"frequency")) {
163 BTRMGRLOG_WARN(
"json doesn't have frequency... using default");
166 get_value_string(cJSON_GetObjectItem(cur_ssid,
"frequency"), creds->frequency);
168 BTRMGRLOG_INFO(
"creds->frequency (%s)", creds->frequency);
170 if (!cJSON_GetObjectItem(cur_ssid,
"securitymode")) {
171 BTRMGRLOG_WARN(
"json doesn't have securitymode... using default");
172 creds->securitymode = SECURITY_MODE_WPA_WPA2_PSK;
175 get_value_number(cJSON_GetObjectItem(cur_ssid,
"securitymode"), creds->securitymode);
177 BTRMGRLOG_INFO(
"creds->securitymode (%d)", creds->securitymode);
181 BTRMGRLOG_ERROR(
"Error index %d greater than available entries %d", index, noofEntries);
189 BTRMGR_LeDecodeRxdWifiPayload (
192 cJSON* psrv_payload = NULL;
193 cJSON* wifi_settings = NULL;
197 psrv_payload = cJSON_Parse((
char const*)agWifiPayload);
199 BTRMGRLOG_DEBUG(
"wifi_payload parse error!!");
204 BTRMGRLOG_DEBUG(
"decrypt wifi settings");
205 int sts = ECDH_DecryptWiFiSettings(psrv_payload, &wifi_settings);
207 BTRMGRLOG_ERROR(
"Unable to decrypt wifi settings");
210 memset(&WifiCreds, 0,
sizeof(WifiCreds));
211 int ret = get_wifi_creds(wifi_settings, &WifiCreds, entry, &noofEntries);
213 BTRMGRLOG_DEBUG(
"wifi creds for %s radio: ssid (%s) password (%s)",
214 WifiCreds.frequency, WifiCreds.ssid, WifiCreds.passphrase);
215 gWifiPayloadDecodeSuccess =
true;
223 BTRMGR_LeOnboarding_GetData (
224 BTRMGR_LeOnboardingChar_t aenLeOnboardingChar,
230 switch (aenLeOnboardingChar) {
231 case BTRMGR_LE_ONBRDG_SYSTEMID: {
232 snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"%s",
"3C9872F8DA9F");
235 case BTRMGR_LE_ONBRDG_HWREVISION:
236 case BTRMGR_LE_ONBRDG_MODELNUMBER: {
237 snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"%s",
"SCHC2AEW");
240 case BTRMGR_LE_ONBRDG_SERIALNUMBER: {
241 snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"%s",
"S1807CKZ000113");
244 case BTRMGR_LE_ONBRDG_FWREVISION: {
245 snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"%s",
"V.0.0.1");
248 case BTRMGR_LE_ONBRDG_SWREVISION: {
249 snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"%s",
"SCHC2_0917_VBN");
252 case BTRMGR_LE_ONBRDG_MFGRNAME: {
253 snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"%s",
"Sercomm");
256 case BTRMGR_LE_ONBRDG_UUID_QR_CODE: {
257 snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"%s",
"SCHC2AEW.S1807CKZ000113.3C9872F8DA9F");
260 case BTRMGR_LE_ONBRDG_UUID_PROVISION_STATUS: {
261 switch (gLeOnboardingState) {
262 case BTRMGR_LE_ONBRDG_UNDEFINED: {
263 gWifiPayloadDecodeSuccess =
false;
264 gLeOnboardingState = BTRMGR_LE_ONBRDG_ADVERTISE;
267 case BTRMGR_LE_ONBRDG_ADVERTISE: {
268 gLeOnboardingState = BTRMGR_LE_ONBRDG_BT_PAIRING;
269 snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"0x%x", 0);
272 case BTRMGR_LE_ONBRDG_BT_PAIRING: {
273 gLeOnboardingState = BTRMGR_LE_ONBRDG_INPROGRESS;
274 snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"0x%x", BTRMGR_LE_ONBRDG_AWAITING_WIFI_CONFIG);
277 case BTRMGR_LE_ONBRDG_INPROGRESS: {
278 gLeOnboardingState = BTRMGR_LE_ONBRDG_GET_WIFI_CREDS;
279 snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"0x%x", BTRMGR_LE_ONBRDG_AWAITING_WIFI_CONFIG);
282 case BTRMGR_LE_ONBRDG_GET_WIFI_CREDS: {
283 if(
true == gWifiPayloadRxd) {
284 gLeOnboardingState = BTRMGR_LE_ONBRDG_CONNECT_WIFI;
285 snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"0x%x", BTRMGR_LE_ONBRDG_PROCESSING_WIFI_CONFIG);
288 snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"0x%x", BTRMGR_LE_ONBRDG_AWAITING_WIFI_CONFIG);
292 case BTRMGR_LE_ONBRDG_CONNECT_WIFI: {
293 if ((
true == gWifiConnectSuccess) && (eBTRMgrSuccess == BTRMGR_LeWifi_CheckWifiConnSuccess(WifiCreds.ssid))) {
294 BTRMGRLOG_INFO(
"Wifi is connected\n");
295 snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"0x%x", BTRMGR_LE_ONBRDG_WIFI_CONNECT_SUCCESS);
296 gLeOnboardingState = BTRMGR_LE_ONBRDG_COMPLETE;
298 else if (
true == gWifiPayloadDecodeSuccess) {
299 snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"0x%x", BTRMGR_LE_ONBRDG_CONNECTING_TO_WIFI);
300 WifiCreds.securitymode = 6;
301 if (eBTRMgrSuccess == BTRMGR_LeWifi_ConnectToWifi(WifiCreds.ssid, WifiCreds.passphrase, WifiCreds.securitymode)) {
302 gWifiConnectSuccess =
true;
307 case BTRMGR_LE_ONBRDG_COMPLETE: {
308 snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"0x%x", BTRMGR_LE_ONBRDG_COMPLETE_SUCCESS);
315 BTRMGRLOG_INFO(
"Onboarding status is %d\n", gLeOnboardingState);
318 case BTRMGR_LE_ONBRDG_UUID_PUBLIC_KEY: {
319 char lPublicKey[MAX_LEN_PUBLIC_KEY] =
"";
320 get_publicKey(lPublicKey);
321 int ret =snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"%s", lPublicKey);
322 if (ret > (BTRMGR_LE_STR_LEN_MAX - 1)) {
323 BTRMGRLOG_DEBUG(
"BTRMGR_LE_ONBRDG_UUID_PUBLIC_KEY truncated\n");
328 case BTRMGR_LE_ONBRDG_UUID_WIFI_CONFIG: {
331 case BTRMGR_LE_ONBRDG_UUID_SSID_LIST: {
332 snprintf(aData, (BTRMGR_LE_STR_LEN_MAX - 1),
"%s",
" ");
344 BTRMGR_LeOnboarding_SetData (
345 BTRMGR_LeOnboardingChar_t aenLeOnboardingChar,
350 switch(aenLeOnboardingChar) {
351 case BTRMGR_LE_ONBRDG_UUID_WIFI_CONFIG: {
352 char tempBuffer[BTRMGR_LE_STR_LEN_MAX] =
"\0";
354 char *ptrPayload = payload;
356 BTRMGRLOG_DEBUG(
"Length of payload is %u\n", (
unsigned int)strlen(payload));
357 BTRMGRLOG_INFO(
"Payload is %s\n", payload);
358 for (index = 0; index < strlen(payload);) {
359 datatxd = snprintf(tempBuffer, BTRMGR_LE_STR_LEN_MAX,
"%s", ptrPayload);
360 BTRMGRLOG_DEBUG(
"data txd is %d\n", datatxd);
362 if (datatxd > BTRMGR_LE_STR_LEN_MAX) {
363 tempBuffer[BTRMGR_LE_STR_LEN_MAX-1] =
'\0';
364 BTRMGRLOG_DEBUG(
"Tx buffer is %s\n", tempBuffer);
365 BTRMGR_LeLoadDatatoBuffer(tempBuffer);
366 index += strlen(tempBuffer);
367 ptrPayload = &payload[index];
370 BTRMGR_LeLoadDatatoBuffer(tempBuffer);
373 BTRMGRLOG_DEBUG(
"index is %d\n", index);
377 if (gDataLenRxd == gWifiPayloadLen) {
378 gWifiPayloadRxd =
true;
379 BTRMGRLOG_DEBUG(
"Data is %s", gWifiPayload);
382 BTRMGR_LeDecodeRxdWifiPayload(gWifiPayload);
394 BTRMGR_LeWifi_CheckWifiConnSuccess (
399 #ifdef BTRTEST_LE_ONBRDG_ENABLE
403 memset(¶m, 0,
sizeof(param));
407 if (!strncmp(param.data.getConnectedSSID.ssid, aSSID, strlen(aSSID))) {
408 BTRMGRLOG_DEBUG(
"Wifi has been successfully connected\n");
409 lRetCode = eBTRMgrSuccess;
412 BTRMGRLOG_DEBUG(
"Wifi not available\n");
419 BTRMGR_LeWifi_ConnectToWifi (
426 #ifdef BTRTEST_LE_ONBRDG_ENABLE
427 IARM_Result_t retVal = IARM_RESULT_SUCCESS;
430 strcpy(param.data.connect.ssid, aSSID);
431 strcpy(param.data.connect.passphrase, aPassword);
432 param.data.connect.security_mode = (
SsidSecurity)aSecurityMode;
433 BTRMGRLOG_DEBUG(
"Wifi ssid is : %s\n", aSSID);
434 BTRMGRLOG_DEBUG(
"Wifi pwd is : %s\n", aPassword);
435 BTRMGRLOG_DEBUG(
"Wifi sec mode is : %d\n", param.data.connect.security_mode);
438 BTRMGRLOG_DEBUG(
"\"%s\", status: \"%s\"",
IARM_BUS_WIFI_MGR_API_connect, ((retVal == IARM_RESULT_SUCCESS && param.status) ?
"Success" :
"Failure"));
439 if (retVal != IARM_RESULT_SUCCESS) {
440 lRetCode = eBTRMgrFailure;
443 BTRMGRLOG_DEBUG(
"Wifi not available\n");