ble_action.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  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_nfc.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. uint8_t idx = test_data->data[1];
  282. if(idx >= USER_NFC_MAX_COUNT)
  283. {
  284. data[0] = 0xFE;
  285. }
  286. else{
  287. lock_data_s *lock = vUser_server_get_lock_data();
  288. data[0] = (lock->lock_stat >> idx) & 0x01;
  289. memcpy(&data[1], lock->lock_id[idx], 4);
  290. }
  291. }
  292. ble_data.data = data;
  293. Set_ble_data_s_sendData(&ble_data);
  294. }
  295. static bool Get_Data_Act(ble_data_s *test_data)
  296. {
  297. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  298. {
  299. return false;
  300. }
  301. switch(test_data->data[0])
  302. {
  303. case DATA_GET_NFC:ble_get_nfc_send(test_data);break; //获取挂锁NFC号
  304. default:return false;
  305. }
  306. return true;
  307. }
  308. static bool Control_Data_Act(ble_data_s *test_data)
  309. {
  310. bool stat = false;
  311. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  312. {
  313. return false;
  314. }
  315. switch(test_data->data[0])
  316. {
  317. case CONTROL_LOCK:break; //电磁锁控制
  318. default:return false;
  319. }
  320. return stat;
  321. }
  322. static bool Get_Firmware_Act(uint8_t *test_data)
  323. {
  324. if(*test_data != 0x01)
  325. {
  326. return false;
  327. }
  328. ble_data_s ble_data;
  329. ble_data.data_type = BLE_UPLOAD_SLAVE;
  330. ble_data.ins = INS_FIRMWARE;
  331. ble_data.len = 2;
  332. uint8_t data[2] = {SOFTWARE_VERSION, HARDWARE_VERSION};
  333. ble_data.cmd = FIRMWARE_GET;
  334. ble_data.data = data;
  335. Set_ble_data_s_sendData(&ble_data);
  336. return true;
  337. }
  338. static bool Rst_Firmware_Act(uint8_t *test_data)
  339. {
  340. if(*test_data == 0x01)
  341. {
  342. Jump_OTA();
  343. }
  344. else{
  345. return false;
  346. }
  347. ble_data_s ble_data;
  348. ble_data.data_type = BLE_UPLOAD_SLAVE;
  349. ble_data.ins = INS_FIRMWARE;
  350. ble_data.len = 1;
  351. uint8_t data[1] = {0};
  352. ble_data.cmd = FIRMWARE_RST;
  353. data[0] = *test_data;
  354. ble_data.data = data;
  355. Set_ble_data_s_sendData(&ble_data);
  356. return true;
  357. }
  358. static bool Firmware_Data_Act(ble_data_s *test_data)
  359. {
  360. bool stat = false;
  361. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  362. {
  363. return false;
  364. }
  365. switch(test_data->data[0])
  366. {
  367. case FIRMWARE_GET:stat = Get_Firmware_Act(&(test_data->data[1]));break; //获取固件版本号
  368. case FIRMWARE_RST:stat = Rst_Firmware_Act(&(test_data->data[1]));break; //设备重启
  369. default:return false;
  370. }
  371. return stat;
  372. }
  373. bool download_ble_data_callback(uint8_t *data, int len)
  374. {
  375. if(_strstr((char *)data,"rst=1")==0)
  376. {
  377. PRINT("SOFT RST!\n");
  378. ble_action_set_rst();
  379. ble_Return_Stat_Send(true);
  380. return true;
  381. }
  382. else if(_strstr((char *)data,"ENTER OTA")==0)
  383. {
  384. PRINT("ENTER OTA!\n");
  385. Jump_OTA();
  386. ble_Return_Stat_Send(true);
  387. return true;
  388. }
  389. else if(_strstr((char *)data,"configInit")==0)
  390. {
  391. PRINT("CONFIG INIT!\n");
  392. set_user_config_param_init(&user_config_param);
  393. User_Config_Write_Config();
  394. ble_Return_Stat_Send(true);
  395. return true;
  396. }
  397. else if(_strstr((char *)data, "open=") == 0)
  398. {
  399. int value = -1;
  400. if(1 == sscanf((char *)data, "open=%d", &value))
  401. {
  402. if(value < ELECT_COUNT)
  403. {
  404. set_elect_work_stat(value, true);
  405. }
  406. }
  407. ble_Return_Stat_Send(true);
  408. return true;
  409. }
  410. else if(_strstr((char *)data, "close=") == 0)
  411. {
  412. int value = -1;
  413. if(1 == sscanf((char *)data, "close=%d", &value))
  414. {
  415. if(value < ELECT_COUNT)
  416. {
  417. set_elect_work_stat(value, false);
  418. }
  419. }
  420. ble_Return_Stat_Send(true);
  421. return true;
  422. }
  423. #if AES_ENABLE == 1
  424. uint8_t *paradata = device_decrypt(MacAddr, (ble_connected == true)?token:0, data, len);
  425. PRINT("Decrypt:\n");
  426. print_hex(paradata, len);
  427. #else
  428. uint8_t *paradata = data;
  429. #endif
  430. ble_data_s test_data;
  431. test_data.ins = (ble_dev_ins_e)paradata[0];
  432. test_data.data_type = (ble_dev_data_type_e)paradata[1];
  433. if(test_data.data_type == BLE_UPLOAD_SLAVE)
  434. {
  435. #if AES_ENABLE == 1
  436. free(paradata);
  437. #endif
  438. return false;
  439. }
  440. test_data.len = paradata[2];
  441. test_data.data = &paradata[3];
  442. bool stat = false;
  443. switch(test_data.ins)
  444. {
  445. case INS_TOKEN: stat = Get_Token_Act(&test_data);break; //获取token
  446. case INS_PARAM_SET: stat = Set_Param_Set_Act(&test_data);break; //参数设置指令
  447. case INS_PARAM_GET: stat = Get_Param_Set_Act(&test_data);break; //获取设置参数指令
  448. case INS_DATA_GET: stat = Get_Data_Act(&test_data);break; //获取数据指令
  449. case INS_CONTROL: stat = Control_Data_Act(&test_data);break; //控制指令
  450. case INS_FIRMWARE:stat = Firmware_Data_Act(&test_data);break; //固件获取指令
  451. default:{
  452. #if AES_ENABLE == 1
  453. free(paradata);
  454. #endif
  455. }return false;
  456. }
  457. memcpy((uint8_t *)&last_test_data,(uint8_t *)&test_data,sizeof(ble_data_s));
  458. #if AES_ENABLE == 1
  459. free(paradata);
  460. #endif
  461. // if(stat == true)
  462. // {
  463. // net_led_stat_pro(NET_LED_DATA_OK);
  464. // Set_User_Work_Queue(USER_WORK_QUEUE_ONLINE);
  465. // }
  466. // else{
  467. // net_led_stat_pro(NET_LED_DATA_NOK);
  468. // }
  469. return stat;
  470. }
  471. static void ble_action_set_rst(void)
  472. {
  473. vUser_led_set_alarm_view(LED_ALL_ALARM_RST, true);
  474. bStatus_t stat = tmos_start_reload_task(user_server_task_id, (1 << SERVER_BLE_RST), MS1_TO_SYSTEM_TIME(1000));
  475. }
  476. /*******************************************************************************
  477. * @函数名称 vBle_action_init
  478. * @函数说明 初始化
  479. * @输入参数 无
  480. * @输出参数 无
  481. * @返回参数 无
  482. *******************************************************************************/
  483. void vBle_action_init(void)
  484. {
  485. set_token();
  486. }
  487. bool download_ble_file_callback(uint8_t *data, int len)
  488. {
  489. return download_ble_data_callback(data, len);
  490. }
  491. void set_upload_ble_data_func(upload_ble_data_func func)
  492. {
  493. upload_ble_data = func;
  494. }