ble_action.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  1. #include "ble_action.h"
  2. #include "_string.h"
  3. #include "transcode.h"
  4. #include "debug.h"
  5. #include "tools.h"
  6. #include "user_config.h"
  7. #include "user_elect.h"
  8. #include "user_charge.h"
  9. #include "user_server.h"
  10. #include "user_led.h"
  11. static void ble_action_set_rst(void);
  12. /* Flash data temporary storage */
  13. __attribute__((aligned(8))) uint8_t block_buf[256];
  14. /*********************************************************************
  15. * @fn Jump_OTA
  16. *
  17. * @brief Jump to OTA upgrade
  18. *
  19. * @return none
  20. */
  21. void Jump_OTA(void)
  22. {
  23. uint16_t i;
  24. uint32_t ver_flag;
  25. /* Read the first block */
  26. FLASH_read(OTA_DATAFLASH_ADDR, (uint8_t *)&block_buf[0], 4);
  27. FLASH_Unlock_Fast();
  28. /* Erase the first block */
  29. FLASH_ErasePage_Fast( OTA_DATAFLASH_ADDR );
  30. /* Update Image information */
  31. block_buf[0] = IMAGE_OTA_FLAG;
  32. block_buf[1] = IMAGE_FLAG_1;
  33. block_buf[2] = IMAGE_FLAG_2;
  34. block_buf[3] = IMAGE_FLAG_3;
  35. /* Programming DataFlash */
  36. FLASH_ProgramPage_Fast(OTA_DATAFLASH_ADDR, (uint32_t *)&block_buf[0]);
  37. FLASH_Lock_Fast();
  38. ble_action_set_rst();
  39. }
  40. static upload_ble_data_func upload_ble_data = NULL;
  41. static ble_data_s last_test_data;
  42. static bool ble_connected = false;
  43. static uint32_t token = 0;
  44. static uint32_t unixTime_delay = 0;
  45. static uint32_t unixTime = 0;
  46. static void unixTime_pro(void)
  47. {
  48. if(unixTime_delay > 0)
  49. {
  50. unixTime_delay--;
  51. }
  52. else{
  53. unixTime_delay = 1000 / BLE_ACTION_TICKS;
  54. unixTime++;
  55. }
  56. }
  57. uint32_t * get_unixTime(void)
  58. {
  59. return &(unixTime);
  60. }
  61. void set_unixTime(uint32_t value)
  62. {
  63. unixTime = value;
  64. }
  65. static void ble_owned_data_send(uint8_t *data, int len)
  66. {
  67. if(upload_ble_data != NULL)
  68. {
  69. upload_ble_data(data, len);
  70. }
  71. }
  72. static void ble_Return_Stat_Send(bool stat)
  73. {
  74. uint8_t data[4]={0};
  75. if(stat == true)
  76. {
  77. data[0]='O';
  78. data[1]='K';
  79. data[2]=0;
  80. data[3]=0;
  81. }
  82. else{
  83. data[0]='N';
  84. data[1]='O';
  85. data[2]='K';
  86. data[3]=0;
  87. }
  88. ble_owned_data_send(data,4);
  89. }
  90. static void Set_Ble_Encrypt_Data(uint8_t *data,uint8_t len)
  91. {
  92. int pCipher_len = 0;
  93. PRINT("ble upload\n");
  94. uint8_t *paradata = device_encrypt(MacAddr,(ble_connected == true)?token:0,data,len,&pCipher_len);
  95. ble_owned_data_send(paradata,pCipher_len);
  96. free(paradata);
  97. }
  98. static bool Set_ble_data_s_sendData(ble_data_s *ble_data)
  99. {
  100. uint8_t data[64]={0};
  101. if(ble_data->len >= 55)
  102. {
  103. return false;
  104. }
  105. data[0] = ble_data->ins;
  106. data[1] = ble_data->data_type;
  107. data[2] = ble_data->len + 1;
  108. data[3] = ble_data->cmd;
  109. memcpy(&data[4], ble_data->data, ble_data->len);
  110. memcpy(&data[4 + ble_data->len], get_unixTime(), 4);
  111. memcpy(&data[8 + ble_data->len], &token, 4);
  112. #if AES_ENABLE == 1
  113. Set_Ble_Encrypt_Data(data, ble_data->len + 12);
  114. #else
  115. ble_owned_data_send(data, ble_data->len + 12);
  116. #endif
  117. return true;
  118. }
  119. static void set_token(void)
  120. {
  121. token = Get_Rand();
  122. token = get_gb_token(token);
  123. }
  124. void ble_connect_act(bool stat)
  125. {
  126. if(stat == false)
  127. {
  128. set_token();
  129. ble_connected = false;
  130. vUser_led_set_alarm_view(LED_ALL_ALARM_BLE, false);
  131. // action_work.ble_conn_stat = false;
  132. // net_led_stat_pro(NET_LED_DISCONNECT);
  133. }
  134. else{
  135. // upgrade_succ();
  136. // net_led_stat_pro(NET_LED_CONNECT);
  137. }
  138. }
  139. static bool Get_Token_Act(ble_data_s *test_data)
  140. {
  141. if(test_data->len!=0x05 || test_data->data[0]!=0x00)
  142. {
  143. return false;
  144. }
  145. uint32_t unixtime = 0;
  146. memcpy(&unixtime, &(test_data->data[1]), 4);
  147. set_unixTime(unixtime);
  148. uint8_t data[16]={0};
  149. data[0]=INS_TOKEN;
  150. data[1]=BLE_UPLOAD_SLAVE;
  151. data[2]=0x04;
  152. memcpy(&data[3],&token,4);
  153. memcpy(&data[7],get_unixTime(),4);
  154. memcpy(&data[11],&token,4);
  155. #if AES_ENABLE == 1
  156. Set_Ble_Encrypt_Data(data,15);
  157. #else
  158. ble_owned_data_send(data, 15);
  159. #endif
  160. ble_connected = true;
  161. // action_work.ble_conn_stat = true;
  162. vUser_led_set_alarm_view(LED_ALL_ALARM_BLE, true);
  163. return true;
  164. }
  165. static bool Check_UnixTime_Token(uint8_t *data)
  166. {
  167. uint32_t master_token;
  168. uint32_t unixtime = 0;
  169. memcpy(&unixtime, data, 4);
  170. set_unixTime(unixtime);
  171. memcpy(&master_token, &data[4], 4);
  172. if(master_token!=token)
  173. {
  174. return false;
  175. }
  176. return true;
  177. }
  178. static void ble_devRst_set_stat_send(bool stat)
  179. {
  180. ble_data_s ble_data;
  181. ble_data.data_type = BLE_UPLOAD_SLAVE;
  182. ble_data.ins = INS_PARAM_SET;
  183. ble_data.len = 1;
  184. uint8_t data[1] = {0};
  185. ble_data.cmd = PARAM_SET_RST;
  186. data[0] = (stat == true)?SET_PARAM_SUCCESS:SET_PARAM_FAILURE;
  187. ble_data.data = data;
  188. Set_ble_data_s_sendData(&ble_data);
  189. }
  190. static bool DevRst_Set_Act(uint8_t *data)
  191. {
  192. if(*data == 0xEE)
  193. {
  194. ble_devRst_set_stat_send(true);
  195. return true;
  196. }
  197. ble_devRst_set_stat_send(false);
  198. return false;
  199. }
  200. static void ble_devcan_baud_set_stat_send(bool stat)
  201. {
  202. ble_data_s ble_data;
  203. ble_data.data_type = BLE_UPLOAD_SLAVE;
  204. ble_data.ins = INS_PARAM_SET;
  205. ble_data.len = 1;
  206. uint8_t data[4] = {0};
  207. ble_data.cmd = PARAM_SET_CAN;
  208. uint32_t baud = (uint32_t)user_config_param.can_baud;
  209. memcpy(data, &baud, 4);
  210. ble_data.data = data;
  211. Set_ble_data_s_sendData(&ble_data);
  212. }
  213. static bool Can_baud_Set_Act(ble_data_s *test_data)
  214. {
  215. uint32_t baud = 0;
  216. if(test_data->len == 5)
  217. {
  218. memcpy(&baud, &(test_data->data[1]), 4);
  219. if(true == user_config_save_can_baud(baud))
  220. {
  221. return true;
  222. }
  223. }
  224. ble_devRst_set_stat_send(false);
  225. return false;
  226. }
  227. static bool Set_Param_Set_Act(ble_data_s *test_data)
  228. {
  229. bool stat = false;
  230. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  231. {
  232. return false;
  233. }
  234. switch(test_data->data[0])
  235. {
  236. case PARAM_SET_CAN: stat = Can_baud_Set_Act(test_data);break;
  237. case PARAM_SET_RST: stat = DevRst_Set_Act(&(test_data->data[1]));break; //设备重启
  238. default:return false;
  239. }
  240. return stat;
  241. }
  242. static void ble_get_canbaud_set_send(void)
  243. {
  244. ble_data_s ble_data;
  245. ble_data.data_type = BLE_UPLOAD_SLAVE;
  246. ble_data.ins = INS_PARAM_GET;
  247. ble_data.len = 5;
  248. uint8_t data[4] = {0};
  249. ble_data.cmd = PARAM_GET_CAN;
  250. uint32_t baud = (uint32_t)user_config_param.can_baud;
  251. memcpy(data, &baud, 4);
  252. ble_data.data = data;
  253. Set_ble_data_s_sendData(&ble_data);
  254. }
  255. static bool Get_Param_Set_Act(ble_data_s *test_data)
  256. {
  257. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  258. {
  259. return false;
  260. }
  261. switch(test_data->data[0])
  262. {
  263. case PARAM_GET_CAN: ble_get_canbaud_set_send();break; //CAN参数设置
  264. default:return false;
  265. }
  266. return true;
  267. }
  268. void ble_get_nfc_send(ble_data_s *test_data)
  269. {
  270. ble_data_s ble_data;
  271. ble_data.data_type = BLE_UPLOAD_SLAVE;
  272. ble_data.ins = INS_DATA_GET;
  273. ble_data.len = 5;
  274. uint8_t data[5] = {0};
  275. ble_data.cmd = DATA_GET_NFC;
  276. if(test_data->len != 2)
  277. {
  278. data[0] = 0xFF;
  279. }
  280. else{
  281. key_data_s *key = vUser_server_get_key_data();
  282. uint8_t idx = test_data->data[1];
  283. if(idx == LEFT_IDX)
  284. {
  285. data[0] = key->key_stat.left_key_stat;
  286. memcpy(&data[1], key->left_key_id, 4);
  287. }
  288. else if(idx == RIGHT_IDX)
  289. {
  290. data[0] = key->key_stat.right_key_stat;
  291. memcpy(&data[1], key->right_key_id, 4);
  292. }
  293. else{
  294. data[0] = 0xFE;
  295. }
  296. }
  297. ble_data.data = data;
  298. Set_ble_data_s_sendData(&ble_data);
  299. }
  300. static bool Get_Data_Act(ble_data_s *test_data)
  301. {
  302. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  303. {
  304. return false;
  305. }
  306. switch(test_data->data[0])
  307. {
  308. case DATA_GET_NFC:ble_get_nfc_send(test_data);break; //获取电子钥匙NFC号
  309. default:return false;
  310. }
  311. return true;
  312. }
  313. // static void ble_control_lock_send(bool stat)
  314. // {
  315. // ble_data_s ble_data;
  316. // ble_data.data_type = BLE_UPLOAD_SLAVE;
  317. // ble_data.ins = INS_CONTROL;
  318. // ble_data.len = 2;
  319. // uint8_t data[2] = {0};
  320. // ble_data.cmd = CONTROL_LOCK;
  321. // data[0] = 0x01;
  322. // if(stat == true)
  323. // {
  324. // data[1] = (action_work.lock01_stat == true)?0x01:0x02;
  325. // }
  326. // else{
  327. // data[1] = 0x00;
  328. // }
  329. // ble_data.data = data;
  330. // Set_ble_data_s_sendData(&ble_data);
  331. // }
  332. // static bool ble_control_lock(uint8_t *data)
  333. // {
  334. // uint16_t temp = 0;
  335. // memcpy((uint8_t *)&temp, (uint8_t *)&can_open_data.data, 2);
  336. // can_open_data_s s_data;
  337. // s_data.ins = R_INS_WR_SUCC;
  338. // s_data.idx = REG_ELECT_STAT_IDX;
  339. // s_data.subidx = REG_ELECT_STAT_SUBIDX;
  340. // memset(s_data.data, 0, 4);
  341. // memcpy(s_data.data,(uint8_t *)&temp, 2);
  342. // vUser_can_send_data((uint8_t *)&s_data, 8);
  343. // for(int i = 0; i < LOCK_COUNT; i++)
  344. // {
  345. // if((temp & (1 << (i + 8))) != 0)
  346. // {
  347. // if((temp & (1 << i)) != 0)
  348. // {
  349. // set_elect_work_stat(i, true);
  350. // }
  351. // else{
  352. // set_elect_work_stat(i, false);
  353. // }
  354. // }
  355. // }
  356. // uint8_t lock = *data++;
  357. // if(lock == 0x01)
  358. // {
  359. // bool stat = user_work_control_lock(0);
  360. // if(stat == false)
  361. // {
  362. // ble_control_lock_send(false);
  363. // }
  364. // else{
  365. // bStatus_t stat = tmos_start_task(action_task_id, (1 << BLE_ACTION_QUEUE_LOCK), MS1_TO_SYSTEM_TIME(800));
  366. // }
  367. // return true;
  368. // }
  369. // ble_control_lock_send(false);
  370. // return false;
  371. // }
  372. static bool Control_Data_Act(ble_data_s *test_data)
  373. {
  374. bool stat = false;
  375. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  376. {
  377. return false;
  378. }
  379. switch(test_data->data[0])
  380. {
  381. case CONTROL_LOCK:break; //电磁锁控制
  382. case CONTROL_CHARGE:break; //充电控制
  383. default:return false;
  384. }
  385. return stat;
  386. }
  387. static bool Get_Firmware_Act(uint8_t *test_data)
  388. {
  389. if(*test_data != 0x01)
  390. {
  391. return false;
  392. }
  393. ble_data_s ble_data;
  394. ble_data.data_type = BLE_UPLOAD_SLAVE;
  395. ble_data.ins = INS_FIRMWARE;
  396. ble_data.len = 2;
  397. uint8_t data[2] = {SOFTWARE_VERSION, HARDWARE_VERSION};
  398. ble_data.cmd = FIRMWARE_GET;
  399. ble_data.data = data;
  400. Set_ble_data_s_sendData(&ble_data);
  401. return true;
  402. }
  403. static bool Rst_Firmware_Act(uint8_t *test_data)
  404. {
  405. if(*test_data == 0x01)
  406. {
  407. Jump_OTA();
  408. }
  409. else{
  410. return false;
  411. }
  412. ble_data_s ble_data;
  413. ble_data.data_type = BLE_UPLOAD_SLAVE;
  414. ble_data.ins = INS_FIRMWARE;
  415. ble_data.len = 1;
  416. uint8_t data[1] = {0};
  417. ble_data.cmd = FIRMWARE_RST;
  418. data[0] = *test_data;
  419. ble_data.data = data;
  420. Set_ble_data_s_sendData(&ble_data);
  421. return true;
  422. }
  423. static bool Firmware_Data_Act(ble_data_s *test_data)
  424. {
  425. bool stat = false;
  426. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  427. {
  428. return false;
  429. }
  430. switch(test_data->data[0])
  431. {
  432. case FIRMWARE_GET:stat = Get_Firmware_Act(&(test_data->data[1]));break; //获取固件版本号
  433. case FIRMWARE_RST:stat = Rst_Firmware_Act(&(test_data->data[1]));break; //设备重启
  434. default:return false;
  435. }
  436. return stat;
  437. }
  438. bool download_ble_data_callback(uint8_t *data, int len)
  439. {
  440. if(_strstr((char *)data,"rst=1")==0)
  441. {
  442. PRINT("SOFT RST!\n");
  443. ble_action_set_rst();
  444. ble_Return_Stat_Send(true);
  445. return true;
  446. }
  447. else if(_strstr((char *)data,"ENTER OTA")==0)
  448. {
  449. PRINT("ENTER OTA!\n");
  450. Jump_OTA();
  451. ble_Return_Stat_Send(true);
  452. return true;
  453. }
  454. else if(_strstr((char *)data,"configInit")==0)
  455. {
  456. PRINT("CONFIG INIT!\n");
  457. set_user_config_param_init(&user_config_param);
  458. User_Config_Write_Config();
  459. ble_Return_Stat_Send(true);
  460. return true;
  461. }
  462. else if(_strstr((char *)data, "open=") == 0)
  463. {
  464. int value = -1;
  465. if(1 == sscanf((char *)data, "open=%d", &value))
  466. {
  467. if(value == 0)
  468. {
  469. set_elect_work_stat(LEFT_IDX, true);
  470. }
  471. else if(value == 1)
  472. {
  473. set_elect_work_stat(RIGHT_IDX, true);
  474. }
  475. }
  476. ble_Return_Stat_Send(true);
  477. return true;
  478. }
  479. else if(_strstr((char *)data, "close=") == 0)
  480. {
  481. int value = -1;
  482. if(1 == sscanf((char *)data, "close=%d", &value))
  483. {
  484. if(value == 0)
  485. {
  486. set_elect_work_stat(LEFT_IDX, false);
  487. }
  488. else if(value == 1)
  489. {
  490. set_elect_work_stat(RIGHT_IDX, false);
  491. }
  492. }
  493. ble_Return_Stat_Send(true);
  494. return true;
  495. }
  496. else if(_strstr((char *)data, "charge=") == 0)
  497. {
  498. int value = -1;
  499. int chargestat = -1;
  500. if(2 == sscanf((char *)data, "charge=%d,%d", &value, &chargestat))
  501. {
  502. if(value == 0)
  503. {
  504. if(chargestat == 0)
  505. {
  506. set_user_charge_Queue(CHARGE_QUEUE_LEFT_CLOSE);
  507. }
  508. else if(chargestat == 1)
  509. {
  510. set_user_charge_Queue(CHARGE_QUEUE_LEFT_OPEN);
  511. }
  512. }
  513. else if(value == 1)
  514. {
  515. if(chargestat == 0)
  516. {
  517. set_user_charge_Queue(CHARGE_QUEUE_RIGHT_CLOSE);
  518. }
  519. else if(chargestat == 1)
  520. {
  521. set_user_charge_Queue(CHARGE_QUEUE_RIGHT_OPEN);
  522. }
  523. }
  524. }
  525. ble_Return_Stat_Send(true);
  526. return true;
  527. }
  528. #if AES_ENABLE == 1
  529. uint8_t *paradata = device_decrypt(MacAddr, (ble_connected == true)?token:0, data, len);
  530. PRINT("Decrypt:\n");
  531. print_hex(paradata, len);
  532. #else
  533. uint8_t *paradata = data;
  534. #endif
  535. ble_data_s test_data;
  536. test_data.ins = (ble_dev_ins_e)paradata[0];
  537. test_data.data_type = (ble_dev_data_type_e)paradata[1];
  538. if(test_data.data_type == BLE_UPLOAD_SLAVE)
  539. {
  540. #if AES_ENABLE == 1
  541. free(paradata);
  542. #endif
  543. return false;
  544. }
  545. test_data.len = paradata[2];
  546. test_data.data = &paradata[3];
  547. bool stat = false;
  548. switch(test_data.ins)
  549. {
  550. case INS_TOKEN: stat = Get_Token_Act(&test_data);break; //获取token
  551. case INS_PARAM_SET: stat = Set_Param_Set_Act(&test_data);break; //参数设置指令
  552. case INS_PARAM_GET: stat = Get_Param_Set_Act(&test_data);break; //获取设置参数指令
  553. case INS_DATA_GET: stat = Get_Data_Act(&test_data);break; //获取数据指令
  554. case INS_CONTROL: stat = Control_Data_Act(&test_data);break; //控制指令
  555. case INS_FIRMWARE:stat = Firmware_Data_Act(&test_data);break; //固件获取指令
  556. default:{
  557. #if AES_ENABLE == 1
  558. free(paradata);
  559. #endif
  560. }return false;
  561. }
  562. memcpy((uint8_t *)&last_test_data,(uint8_t *)&test_data,sizeof(ble_data_s));
  563. #if AES_ENABLE == 1
  564. free(paradata);
  565. #endif
  566. // if(stat == true)
  567. // {
  568. // net_led_stat_pro(NET_LED_DATA_OK);
  569. // Set_User_Work_Queue(USER_WORK_QUEUE_ONLINE);
  570. // }
  571. // else{
  572. // net_led_stat_pro(NET_LED_DATA_NOK);
  573. // }
  574. return stat;
  575. }
  576. static void ble_action_set_rst(void)
  577. {
  578. vUser_led_set_alarm_view(LED_ALL_ALARM_RST, true);
  579. bStatus_t stat = tmos_start_reload_task(user_server_task_id, (1 << SERVER_BLE_RST), MS1_TO_SYSTEM_TIME(1000));
  580. }
  581. /*******************************************************************************
  582. * @函数名称 vBle_action_init
  583. * @函数说明 初始化
  584. * @输入参数 无
  585. * @输出参数 无
  586. * @返回参数 无
  587. *******************************************************************************/
  588. void vBle_action_init(void)
  589. {
  590. set_token();
  591. }
  592. bool download_ble_file_callback(uint8_t *data, int len)
  593. {
  594. return download_ble_data_callback(data, len);
  595. }
  596. void set_upload_ble_data_func(upload_ble_data_func func)
  597. {
  598. upload_ble_data = func;
  599. }