ble_action.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  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_server.h"
  9. #include "user_led.h"
  10. #include "user_ws2812b.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. vUser_ws2812b_set_alarm_view(LEFT_IDX, WS2812B_ALL_ALARM_BLE, false);
  132. vUser_ws2812b_set_alarm_view(RIGHT_IDX, WS2812B_ALL_ALARM_BLE, false);
  133. // action_work.ble_conn_stat = false;
  134. // net_led_stat_pro(NET_LED_DISCONNECT);
  135. }
  136. else{
  137. // upgrade_succ();
  138. // net_led_stat_pro(NET_LED_CONNECT);
  139. }
  140. }
  141. static bool Get_Token_Act(ble_data_s *test_data)
  142. {
  143. if(test_data->len!=0x05 || test_data->data[0]!=0x00)
  144. {
  145. return false;
  146. }
  147. uint32_t unixtime = 0;
  148. memcpy(&unixtime, &(test_data->data[1]), 4);
  149. set_unixTime(unixtime);
  150. uint8_t data[16]={0};
  151. data[0]=INS_TOKEN;
  152. data[1]=BLE_UPLOAD_SLAVE;
  153. data[2]=0x04;
  154. memcpy(&data[3],&token,4);
  155. memcpy(&data[7],get_unixTime(),4);
  156. memcpy(&data[11],&token,4);
  157. #if AES_ENABLE == 1
  158. Set_Ble_Encrypt_Data(data,15);
  159. #else
  160. ble_owned_data_send(data, 15);
  161. #endif
  162. ble_connected = true;
  163. // action_work.ble_conn_stat = true;
  164. vUser_led_set_alarm_view(LED_ALL_ALARM_BLE, true);
  165. vUser_ws2812b_set_alarm_view(LEFT_IDX, WS2812B_ALL_ALARM_BLE, true);
  166. vUser_ws2812b_set_alarm_view(RIGHT_IDX, WS2812B_ALL_ALARM_BLE, true);
  167. return true;
  168. }
  169. static bool Check_UnixTime_Token(uint8_t *data)
  170. {
  171. uint32_t master_token;
  172. uint32_t unixtime = 0;
  173. memcpy(&unixtime, data, 4);
  174. set_unixTime(unixtime);
  175. memcpy(&master_token, &data[4], 4);
  176. if(master_token!=token)
  177. {
  178. return false;
  179. }
  180. return true;
  181. }
  182. static void ble_devRst_set_stat_send(bool stat)
  183. {
  184. ble_data_s ble_data;
  185. ble_data.data_type = BLE_UPLOAD_SLAVE;
  186. ble_data.ins = INS_PARAM_SET;
  187. ble_data.len = 1;
  188. uint8_t data[1] = {0};
  189. ble_data.cmd = PARAM_SET_RST;
  190. data[0] = (stat == true)?SET_PARAM_SUCCESS:SET_PARAM_FAILURE;
  191. ble_data.data = data;
  192. Set_ble_data_s_sendData(&ble_data);
  193. }
  194. static bool DevRst_Set_Act(uint8_t *data)
  195. {
  196. if(*data == 0xEE)
  197. {
  198. ble_devRst_set_stat_send(true);
  199. return true;
  200. }
  201. ble_devRst_set_stat_send(false);
  202. return false;
  203. }
  204. static void ble_devcan_baud_set_stat_send(bool stat)
  205. {
  206. ble_data_s ble_data;
  207. ble_data.data_type = BLE_UPLOAD_SLAVE;
  208. ble_data.ins = INS_PARAM_SET;
  209. ble_data.len = 1;
  210. uint8_t data[4] = {0};
  211. ble_data.cmd = PARAM_SET_CAN;
  212. uint32_t baud = (uint32_t)user_config_param.can_baud;
  213. memcpy(data, &baud, 4);
  214. ble_data.data = data;
  215. Set_ble_data_s_sendData(&ble_data);
  216. }
  217. static bool Can_baud_Set_Act(ble_data_s *test_data)
  218. {
  219. uint32_t baud = 0;
  220. if(test_data->len == 5)
  221. {
  222. memcpy(&baud, &(test_data->data[1]), 4);
  223. if(true == user_config_save_can_baud(baud))
  224. {
  225. return true;
  226. }
  227. }
  228. ble_devRst_set_stat_send(false);
  229. return false;
  230. }
  231. static bool Set_Param_Set_Act(ble_data_s *test_data)
  232. {
  233. bool stat = false;
  234. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  235. {
  236. return false;
  237. }
  238. switch(test_data->data[0])
  239. {
  240. case PARAM_SET_CAN: stat = Can_baud_Set_Act(test_data);break;
  241. case PARAM_SET_RST: stat = DevRst_Set_Act(&(test_data->data[1]));break; //设备重启
  242. default:return false;
  243. }
  244. return stat;
  245. }
  246. static void ble_get_canbaud_set_send(void)
  247. {
  248. ble_data_s ble_data;
  249. ble_data.data_type = BLE_UPLOAD_SLAVE;
  250. ble_data.ins = INS_PARAM_GET;
  251. ble_data.len = 5;
  252. uint8_t data[4] = {0};
  253. ble_data.cmd = PARAM_GET_CAN;
  254. uint32_t baud = (uint32_t)user_config_param.can_baud;
  255. memcpy(data, &baud, 4);
  256. ble_data.data = data;
  257. Set_ble_data_s_sendData(&ble_data);
  258. }
  259. static bool Get_Param_Set_Act(ble_data_s *test_data)
  260. {
  261. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  262. {
  263. return false;
  264. }
  265. switch(test_data->data[0])
  266. {
  267. case PARAM_GET_CAN: ble_get_canbaud_set_send();break; //CAN参数设置
  268. default:return false;
  269. }
  270. return true;
  271. }
  272. // void ble_get_nfc_send(ble_data_s *test_data)
  273. // {
  274. // ble_data_s ble_data;
  275. // ble_data.data_type = BLE_UPLOAD_SLAVE;
  276. // ble_data.ins = INS_DATA_GET;
  277. // ble_data.len = 5;
  278. // uint8_t data[5] = {0};
  279. // ble_data.cmd = DATA_GET_NFC;
  280. // if(test_data->len != 2)
  281. // {
  282. // data[0] = 0xFF;
  283. // }
  284. // else{
  285. // key_data_s *key = vUser_server_get_key_data();
  286. // uint8_t idx = test_data->data[1];
  287. // if(idx == LEFT_IDX)
  288. // {
  289. // data[0] = key->key_stat.left_key_stat;
  290. // memcpy(&data[1], key->left_key_id, 4);
  291. // }
  292. // else if(idx == RIGHT_IDX)
  293. // {
  294. // data[0] = key->key_stat.right_key_stat;
  295. // memcpy(&data[1], key->right_key_id, 4);
  296. // }
  297. // else{
  298. // data[0] = 0xFE;
  299. // }
  300. // }
  301. // ble_data.data = data;
  302. // Set_ble_data_s_sendData(&ble_data);
  303. // }
  304. static bool Get_Data_Act(ble_data_s *test_data)
  305. {
  306. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  307. {
  308. return false;
  309. }
  310. switch(test_data->data[0])
  311. {
  312. case DATA_GET_NFC:break; //获取电子钥匙NFC号
  313. default:return false;
  314. }
  315. return true;
  316. }
  317. // static void ble_control_lock_send(bool stat)
  318. // {
  319. // ble_data_s ble_data;
  320. // ble_data.data_type = BLE_UPLOAD_SLAVE;
  321. // ble_data.ins = INS_CONTROL;
  322. // ble_data.len = 2;
  323. // uint8_t data[2] = {0};
  324. // ble_data.cmd = CONTROL_LOCK;
  325. // data[0] = 0x01;
  326. // if(stat == true)
  327. // {
  328. // data[1] = (action_work.lock01_stat == true)?0x01:0x02;
  329. // }
  330. // else{
  331. // data[1] = 0x00;
  332. // }
  333. // ble_data.data = data;
  334. // Set_ble_data_s_sendData(&ble_data);
  335. // }
  336. // static bool ble_control_lock(uint8_t *data)
  337. // {
  338. // uint16_t temp = 0;
  339. // memcpy((uint8_t *)&temp, (uint8_t *)&can_open_data.data, 2);
  340. // can_open_data_s s_data;
  341. // s_data.ins = R_INS_WR_SUCC;
  342. // s_data.idx = REG_ELECT_STAT_IDX;
  343. // s_data.subidx = REG_ELECT_STAT_SUBIDX;
  344. // memset(s_data.data, 0, 4);
  345. // memcpy(s_data.data,(uint8_t *)&temp, 2);
  346. // vUser_can_send_data((uint8_t *)&s_data, 8);
  347. // for(int i = 0; i < LOCK_COUNT; i++)
  348. // {
  349. // if((temp & (1 << (i + 8))) != 0)
  350. // {
  351. // if((temp & (1 << i)) != 0)
  352. // {
  353. // set_elect_work_stat(i, true);
  354. // }
  355. // else{
  356. // set_elect_work_stat(i, false);
  357. // }
  358. // }
  359. // }
  360. // uint8_t lock = *data++;
  361. // if(lock == 0x01)
  362. // {
  363. // bool stat = user_work_control_lock(0);
  364. // if(stat == false)
  365. // {
  366. // ble_control_lock_send(false);
  367. // }
  368. // else{
  369. // bStatus_t stat = tmos_start_task(action_task_id, (1 << BLE_ACTION_QUEUE_LOCK), MS1_TO_SYSTEM_TIME(800));
  370. // }
  371. // return true;
  372. // }
  373. // ble_control_lock_send(false);
  374. // return false;
  375. // }
  376. static bool Control_Data_Act(ble_data_s *test_data)
  377. {
  378. bool stat = false;
  379. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  380. {
  381. return false;
  382. }
  383. switch(test_data->data[0])
  384. {
  385. case CONTROL_LOCK:break; //电磁锁控制
  386. case CONTROL_CHARGE:break; //充电控制
  387. default:return false;
  388. }
  389. return stat;
  390. }
  391. static bool Get_Firmware_Act(uint8_t *test_data)
  392. {
  393. if(*test_data != 0x01)
  394. {
  395. return false;
  396. }
  397. ble_data_s ble_data;
  398. ble_data.data_type = BLE_UPLOAD_SLAVE;
  399. ble_data.ins = INS_FIRMWARE;
  400. ble_data.len = 2;
  401. uint8_t data[2] = {SOFTWARE_VERSION, HARDWARE_VERSION};
  402. ble_data.cmd = FIRMWARE_GET;
  403. ble_data.data = data;
  404. Set_ble_data_s_sendData(&ble_data);
  405. return true;
  406. }
  407. static bool Rst_Firmware_Act(uint8_t *test_data)
  408. {
  409. if(*test_data == 0x01)
  410. {
  411. Jump_OTA();
  412. }
  413. else{
  414. return false;
  415. }
  416. ble_data_s ble_data;
  417. ble_data.data_type = BLE_UPLOAD_SLAVE;
  418. ble_data.ins = INS_FIRMWARE;
  419. ble_data.len = 1;
  420. uint8_t data[1] = {0};
  421. ble_data.cmd = FIRMWARE_RST;
  422. data[0] = *test_data;
  423. ble_data.data = data;
  424. Set_ble_data_s_sendData(&ble_data);
  425. return true;
  426. }
  427. static bool Firmware_Data_Act(ble_data_s *test_data)
  428. {
  429. bool stat = false;
  430. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  431. {
  432. return false;
  433. }
  434. switch(test_data->data[0])
  435. {
  436. case FIRMWARE_GET:stat = Get_Firmware_Act(&(test_data->data[1]));break; //获取固件版本号
  437. case FIRMWARE_RST:stat = Rst_Firmware_Act(&(test_data->data[1]));break; //设备重启
  438. default:return false;
  439. }
  440. return stat;
  441. }
  442. bool download_ble_data_callback(uint8_t *data, int len)
  443. {
  444. if(_strstr((char *)data,"rst=1")==0)
  445. {
  446. PRINT("SOFT RST!\n");
  447. ble_action_set_rst();
  448. ble_Return_Stat_Send(true);
  449. return true;
  450. }
  451. else if(_strstr((char *)data,"ENTER OTA")==0)
  452. {
  453. PRINT("ENTER OTA!\n");
  454. Jump_OTA();
  455. ble_Return_Stat_Send(true);
  456. return true;
  457. }
  458. else if(_strstr((char *)data,"configInit")==0)
  459. {
  460. PRINT("CONFIG INIT!\n");
  461. set_user_config_param_init(&user_config_param);
  462. User_Config_Write_Config();
  463. ble_Return_Stat_Send(true);
  464. return true;
  465. }
  466. else if(_strstr((char *)data, "open=") == 0)
  467. {
  468. int value = -1;
  469. if(1 == sscanf((char *)data, "open=%d", &value))
  470. {
  471. if(value == 0)
  472. {
  473. vUser_elect_open(LEFT_IDX);
  474. }
  475. else if(value == 1)
  476. {
  477. vUser_elect_open(RIGHT_IDX);
  478. }
  479. }
  480. ble_Return_Stat_Send(true);
  481. return true;
  482. }
  483. else if(_strstr((char *)data, "elect=") == 0)
  484. {
  485. int left = -1;
  486. int right = -1;
  487. if(2 == sscanf((char *)data, "elect=%d,%d", &left, &right))
  488. {
  489. bool stat = user_config_save_elect_time(left, right);
  490. ble_Return_Stat_Send(stat);
  491. }
  492. ble_Return_Stat_Send(false);
  493. return true;
  494. }
  495. else if(_strstr((char *)data, "rgb=") == 0)
  496. {
  497. int left = -1;
  498. int right = -1;
  499. if(2 == sscanf((char *)data, "rgb=%d,%d", &left, &right))
  500. {
  501. bool stat = user_config_save_ws2812b_count((uint8_t)left, (uint8_t)right);
  502. ble_Return_Stat_Send(stat);
  503. }
  504. ble_Return_Stat_Send(false);
  505. return true;
  506. }
  507. #if AES_ENABLE == 1
  508. uint8_t *paradata = device_decrypt(MacAddr, (ble_connected == true)?token:0, data, len);
  509. PRINT("Decrypt:\n");
  510. print_hex(paradata, len);
  511. #else
  512. uint8_t *paradata = data;
  513. #endif
  514. ble_data_s test_data;
  515. test_data.ins = (ble_dev_ins_e)paradata[0];
  516. test_data.data_type = (ble_dev_data_type_e)paradata[1];
  517. if(test_data.data_type == BLE_UPLOAD_SLAVE)
  518. {
  519. #if AES_ENABLE == 1
  520. free(paradata);
  521. #endif
  522. return false;
  523. }
  524. test_data.len = paradata[2];
  525. test_data.data = &paradata[3];
  526. bool stat = false;
  527. switch(test_data.ins)
  528. {
  529. case INS_TOKEN: stat = Get_Token_Act(&test_data);break; //获取token
  530. case INS_PARAM_SET: stat = Set_Param_Set_Act(&test_data);break; //参数设置指令
  531. case INS_PARAM_GET: stat = Get_Param_Set_Act(&test_data);break; //获取设置参数指令
  532. case INS_DATA_GET: stat = Get_Data_Act(&test_data);break; //获取数据指令
  533. case INS_CONTROL: stat = Control_Data_Act(&test_data);break; //控制指令
  534. case INS_FIRMWARE: stat = Firmware_Data_Act(&test_data);break; //固件获取指令
  535. default:{
  536. #if AES_ENABLE == 1
  537. free(paradata);
  538. #endif
  539. }return false;
  540. }
  541. memcpy((uint8_t *)&last_test_data,(uint8_t *)&test_data,sizeof(ble_data_s));
  542. #if AES_ENABLE == 1
  543. free(paradata);
  544. #endif
  545. // if(stat == true)
  546. // {
  547. // net_led_stat_pro(NET_LED_DATA_OK);
  548. // Set_User_Work_Queue(USER_WORK_QUEUE_ONLINE);
  549. // }
  550. // else{
  551. // net_led_stat_pro(NET_LED_DATA_NOK);
  552. // }
  553. return stat;
  554. }
  555. static void ble_action_set_rst(void)
  556. {
  557. vUser_led_set_alarm_view(LED_ALL_ALARM_RST, true);
  558. vUser_ws2812b_set_alarm_view(LEFT_IDX, WS2812B_ALL_ALARM_RST, true);
  559. vUser_ws2812b_set_alarm_view(RIGHT_IDX, WS2812B_ALL_ALARM_RST, true);
  560. bStatus_t stat = tmos_start_reload_task(user_server_task_id, (1 << SERVER_BLE_RST), MS1_TO_SYSTEM_TIME(1000));
  561. }
  562. /*******************************************************************************
  563. * @函数名称 vBle_action_init
  564. * @函数说明 初始化
  565. * @输入参数 无
  566. * @输出参数 无
  567. * @返回参数 无
  568. *******************************************************************************/
  569. void vBle_action_init(void)
  570. {
  571. set_token();
  572. }
  573. bool download_ble_file_callback(uint8_t *data, int len)
  574. {
  575. return download_ble_data_callback(data, len);
  576. }
  577. void set_upload_ble_data_func(upload_ble_data_func func)
  578. {
  579. upload_ble_data = func;
  580. }