luat_mobile_pc.c 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. #include "luat_base.h"
  2. #include "luat_sys.h"
  3. #include "luat_mobile.h"
  4. #include "luat_str.h"
  5. #include "luat_mcu.h"
  6. #include "luat_crypto.h"
  7. #ifdef LUAT_USE_LWIP
  8. #include "lwip/ip_addr.h"
  9. #endif
  10. // #define LUAT_LOG_TAG "mobile"
  11. static uint8_t generate_imei_check_digit(const char* imei);
  12. int luat_mobile_get_imei(int sim_id, char* buff, size_t buf_len)
  13. {
  14. size_t mcu_uuid_len = 0;
  15. char md5buff[32] = {0};
  16. char hexbuff[33] = {0};
  17. const char* mcu_uuid = luat_mcu_unique_id(&mcu_uuid_len);
  18. if(mcu_uuid_len > 0) {
  19. luat_crypto_md("MD5", mcu_uuid, mcu_uuid_len, md5buff, NULL, 0);
  20. luat_str_tohex(md5buff, 16, hexbuff);
  21. // 从MD5的十六进制字符串中提取数字,生成9-10位的十进制字符串
  22. // 取前8个字节(16个十六进制字符)转换为64位整数,再取模得到10位数字
  23. unsigned long long num = 0;
  24. for (int i = 0; i < 16 && hexbuff[i]; i++) {
  25. num = num * 16;
  26. if (hexbuff[i] >= '0' && hexbuff[i] <= '9') {
  27. num += hexbuff[i] - '0';
  28. } else if (hexbuff[i] >= 'a' && hexbuff[i] <= 'f') {
  29. num += hexbuff[i] - 'a' + 10;
  30. } else if (hexbuff[i] >= 'A' && hexbuff[i] <= 'F') {
  31. num += hexbuff[i] - 'A' + 10;
  32. }
  33. }
  34. num = (num % 900000000ULL) + 100000000ULL;
  35. snprintf(buff, buf_len, "86228905%llu", num);
  36. buff[15] = 0x00; //确保结束符
  37. buff[14] = '0' + generate_imei_check_digit((const char*)buff);
  38. // TODO imei的最后一位是校验位,这里没有计算
  39. return 1;
  40. }
  41. return -1;
  42. }
  43. int luat_mobile_get_sn(char* buff, size_t buf_len)
  44. {
  45. return 0;
  46. }
  47. int luat_mobile_set_sn(char* buff, uint8_t buf_len)
  48. {
  49. return 0;
  50. }
  51. int luat_mobile_get_muid(char* buff, size_t buf_len)
  52. {
  53. return 0;
  54. }
  55. int luat_mobile_get_iccid(int sim_id, char* buff, size_t buf_len)
  56. {
  57. return 0;
  58. }
  59. int luat_mobile_get_imsi(int sim_id, char* buff, size_t buf_len)
  60. {
  61. return 0;
  62. }
  63. int luat_mobile_get_sim_number(int sim_id, char* buff, size_t buf_len)
  64. {
  65. return 0;
  66. }
  67. int luat_mobile_get_sim_id(int *id)
  68. {
  69. return 0;
  70. }
  71. int luat_mobile_set_sim_id(int id)
  72. {
  73. return 0;
  74. }
  75. int luat_mobile_set_sim_pin(int id, uint8_t operation, char pin1[9], char pin2[9])
  76. {
  77. return 0;
  78. }
  79. uint8_t luat_mobile_get_sim_ready(int id)
  80. {
  81. return 0;
  82. }
  83. void luat_mobile_set_sim_detect_sim0_first(void)
  84. {
  85. }
  86. void luat_mobile_set_default_pdn_ipv6(uint8_t onoff)
  87. {
  88. }
  89. void luat_mobile_set_default_pdn_only_ipv6(uint8_t onoff)
  90. {
  91. }
  92. uint8_t luat_mobile_get_default_pdn_ipv6(void)
  93. {
  94. return 0;
  95. }
  96. int luat_mobile_get_apn(int sim_id, int cid, char* buff, size_t buf_len)
  97. {
  98. return 0;
  99. }
  100. void luat_mobile_user_ctrl_apn(void)
  101. {
  102. }
  103. void luat_mobile_user_ctrl_apn_stop(void)
  104. {
  105. }
  106. int luat_mobile_set_apn_base_info(int sim_id, int cid, uint8_t type, uint8_t* apn_name, uint8_t name_len)
  107. {
  108. return 0;
  109. }
  110. int luat_mobile_active_apn(int sim_id, int cid, uint8_t state)
  111. {
  112. return 0;
  113. }
  114. int luat_mobile_active_netif(int sim_id, int cid)
  115. {
  116. return 0;
  117. }
  118. void luat_mobile_user_apn_auto_active(int sim_id, uint8_t cid,
  119. uint8_t ip_type,
  120. uint8_t protocol_type,
  121. uint8_t *apn_name, uint8_t apn_name_len,
  122. uint8_t *user, uint8_t user_len,
  123. uint8_t *password, uint8_t password_len)
  124. {
  125. }
  126. int luat_mobile_get_default_apn(int sim_id, char* buff, size_t buf_len)
  127. {
  128. return 0;
  129. }
  130. int luat_mobile_del_apn(int sim_id, uint8_t cid, uint8_t is_dedicated)
  131. {
  132. return 0;
  133. }
  134. int luat_mobile_set_flymode(int index, int mode)
  135. {
  136. return 0;
  137. }
  138. int luat_mobile_get_flymode(int index)
  139. {
  140. return 0;
  141. }
  142. #ifdef LUAT_USE_LWIP
  143. int luat_mobile_get_local_ip(int sim_id, int cid, ip_addr_t *ip_v4, ip_addr_t *ip_v6)
  144. {
  145. return 0;
  146. }
  147. #endif
  148. int luat_mobile_get_cell_info(luat_mobile_cell_info_t *info)
  149. {
  150. return 0;
  151. }
  152. int luat_mobile_get_cell_info_async(uint8_t max_time)
  153. {
  154. return 0;
  155. }
  156. int luat_mobile_get_cell_info_async_with_sim_id(uint8_t sim_id)
  157. {
  158. return 0;
  159. }
  160. int luat_mobile_get_last_notify_cell_info(luat_mobile_cell_info_t *info)
  161. {
  162. return 0;
  163. }
  164. int luat_mobile_get_last_notify_cell_info_with_sim_id(uint8_t sim_id, luat_mobile_cell_info_t *info)
  165. {
  166. return 0;
  167. }
  168. void luat_mobile_print_last_notify_cell_info_with_sim_id(uint8_t sim_id)
  169. {
  170. }
  171. uint8_t luat_mobile_rssi_to_csq(int8_t rssi)
  172. {
  173. return 0;
  174. }
  175. int luat_mobile_get_signal_strength_info(luat_mobile_signal_strength_info_t *info)
  176. {
  177. return 0;
  178. }
  179. int luat_mobile_get_signal_strength(uint8_t *csq)
  180. {
  181. return 0;
  182. }
  183. int luat_mobile_get_last_notify_signal_strength_info(luat_mobile_signal_strength_info_t *info)
  184. {
  185. return 0;
  186. }
  187. int luat_mobile_get_last_notify_signal_strength(uint8_t *csq)
  188. {
  189. return 0;
  190. }
  191. int luat_mobile_get_service_cell_identifier(uint32_t *eci)
  192. {
  193. return 0;
  194. }
  195. int luat_mobile_get_service_tac_or_lac(uint16_t *tac)
  196. {
  197. return 0;
  198. }
  199. LUAT_MOBILE_SIM_STATUS_E luat_mobile_get_sim_status(void)
  200. {
  201. return 0;
  202. }
  203. LUAT_MOBILE_REGISTER_STATUS_E luat_mobile_get_register_status(void)
  204. {
  205. return 0;
  206. }
  207. int luat_mobile_event_register_handler(luat_mobile_event_callback_t callback_fun)
  208. {
  209. return 0;
  210. }
  211. int luat_mobile_event_deregister_handler(void)
  212. {
  213. return 0;
  214. }
  215. int luat_mobile_sms_sdk_event_register_handler(luat_mobile_sms_event_callback_t callback_fun)
  216. {
  217. return 0;
  218. }
  219. int luat_mobile_sms_event_register_handler(luat_mobile_sms_event_callback_t callback_fun)
  220. {
  221. return 0;
  222. }
  223. #ifndef __USE_SDK_LWIP__
  224. void net_lwip_check_switch(uint8_t onoff)
  225. {
  226. }
  227. #endif
  228. void luat_mobile_set_rrc_auto_release_time(uint8_t s)
  229. {
  230. }
  231. //实验性质API,请勿使用
  232. void luat_mobile_set_auto_rrc(uint8_t s1, uint32_t s2)
  233. {
  234. }
  235. void luat_mobile_set_auto_rrc_default(void)
  236. {
  237. }
  238. void luat_mobile_rrc_auto_release_pause(uint8_t onoff)
  239. {
  240. }
  241. void luat_mobile_rrc_release_once(void)
  242. {
  243. }
  244. int luat_mobile_reset_stack(void)
  245. {
  246. return 0;
  247. }
  248. void luat_mobile_fatal_error_auto_reset_stack(uint8_t onoff)
  249. {
  250. }
  251. int luat_mobile_set_period_work(uint32_t get_cell_period, uint32_t check_sim_period, uint8_t search_cell_time)
  252. {
  253. return 0;
  254. }
  255. int luat_mobile_set_check_sim(uint32_t check_sim_period)
  256. {
  257. return 0;
  258. }
  259. void luat_mobile_set_check_network_period(uint32_t period)
  260. {
  261. }
  262. void luat_mobile_get_ip_data_traffic(uint64_t *uplink, uint64_t *downlink)
  263. {
  264. }
  265. void luat_mobile_clear_ip_data_traffic(uint8_t clear_uplink, uint8_t clear_downlink)
  266. {
  267. }
  268. int luat_mobile_get_support_band(uint8_t *band, uint8_t *total_num)
  269. {
  270. return 0;
  271. }
  272. int luat_mobile_get_band(uint8_t *band, uint8_t *total_num)
  273. {
  274. return 0;
  275. }
  276. int luat_mobile_set_band(uint8_t *band, uint8_t total_num)
  277. {
  278. return 0;
  279. }
  280. int luat_mobile_config(uint8_t item, uint32_t value)
  281. {
  282. return 0;
  283. }
  284. void luat_mobile_rf_test_mode(uint8_t uart_id, uint8_t on_off)
  285. {
  286. }
  287. void luat_mobile_rf_test_input(char *data, uint32_t data_len)
  288. {
  289. }
  290. uint32_t luat_mobile_sim_write_counter(void)
  291. {
  292. return 0;
  293. }
  294. // int luat_mobile_get_isp_from_plmn(uint16_t mcc, uint8_t mnc)
  295. // {
  296. // return 0;
  297. // }
  298. // int luat_mobile_get_plmn_from_imsi(char *imsi, uint16_t *mcc, uint8_t *mnc)
  299. // {
  300. // return 0;
  301. // }
  302. void luat_mobile_get_last_call_num(char *buf, uint8_t buf_len)
  303. {
  304. }
  305. int luat_mobile_make_call(uint8_t sim_id, char *number, uint8_t len)
  306. {
  307. return 0;
  308. }
  309. void luat_mobile_hangup_call(uint8_t sim_id)
  310. {
  311. }
  312. int luat_mobile_answer_call(uint8_t sim_id)
  313. {
  314. return 0;
  315. }
  316. int luat_mobile_speech_init(uint8_t multimedia_id,void *callback)
  317. {
  318. return 0;
  319. }
  320. int luat_mobile_speech_upload(uint8_t *data, uint32_t len)
  321. {
  322. return 0;
  323. }
  324. void luat_mobile_set_sync_time(uint8_t on_off)
  325. {
  326. }
  327. uint8_t luat_mobile_get_sync_time(void)
  328. {
  329. return 0;
  330. }
  331. int luat_mobile_softsim_onoff(uint8_t on_off)
  332. {
  333. return 0;
  334. }
  335. int luat_mobile_sim_detect_onoff(uint8_t on_off)
  336. {
  337. return 0;
  338. }
  339. void luat_mobile_softsim_init_default(void)
  340. {
  341. }
  342. int luat_mobile_lock_cell(uint32_t op, uint32_t earfcn, uint16_t pci)
  343. {
  344. return 0;
  345. }
  346. int luat_mobile_get_extern_service_cell_info(luat_mobile_scell_extern_info_t *info)
  347. {
  348. return 0;
  349. }
  350. void luat_mobile_vsim_user_heartbeat_once(void)
  351. {
  352. }
  353. uint32_t luat_mobile_get_search_plmn(void)
  354. {
  355. return 0;
  356. }
  357. void luat_mobile_data_ip_mode(uint8_t on_off)
  358. {
  359. }
  360. // void luat_mobile_init_auto_apn_by_plmn(void)
  361. // {
  362. // }
  363. void luat_mobile_init_auto_apn(void)
  364. {
  365. }
  366. // void luat_mobile_add_auto_apn_item(uint16_t mcc, uint16_t mnc, uint8_t ip_type, uint8_t protocol, char *name, uint8_t name_len, char *user, uint8_t user_len, char *password, uint8_t password_len, uint8_t task_safe)
  367. // {
  368. // }
  369. // int luat_mobile_find_apn_by_mcc_mnc(uint16_t mcc, uint16_t mnc, apn_info_t *apn)
  370. // {
  371. // return 0;
  372. // }
  373. // void luat_mobile_print_apn_by_mcc_mnc(uint16_t mcc, uint16_t mnc)
  374. // {
  375. // }
  376. // 补充一个空实现
  377. void luat_mobile_rrc_get_idle_meas_threshold(int16_t *sIntraSearchP, int16_t *sNonIntraSearchP, int16_t *sIntraSearchQ, int16_t *sNonIntraSearchQ) {
  378. *sIntraSearchP = 0;
  379. *sNonIntraSearchP = 0;
  380. *sIntraSearchQ = 0;
  381. *sNonIntraSearchQ = 0;
  382. }
  383. // 辅助函数
  384. // 计算imei的校验位
  385. #include <stdint.h>
  386. #include <ctype.h>
  387. static uint8_t generate_imei_check_digit(const char* imei) {
  388. int sum = 0;
  389. // 遍历前14位数字
  390. for (int i = 0; i < 14; i++) {
  391. // 检查字符是否为数字
  392. if (!isdigit(imei[i])) {
  393. return 0xFF; // 返回错误值
  394. }
  395. int digit = imei[i] - '0';
  396. // 从右向左,偶数位置(从0开始计数)需要特殊处理
  397. if ((13 - i) % 2 == 1) {
  398. digit *= 2;
  399. // 如果结果大于9,则将各位数字相加
  400. if (digit > 9) {
  401. digit = digit / 10 + digit % 10;
  402. }
  403. }
  404. sum += digit;
  405. }
  406. // 计算校验位:使得总和能被10整除的数字
  407. uint8_t check_digit = (10 - (sum % 10)) % 10;
  408. return check_digit;
  409. }