luat_lib_mobile.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755
  1. /*
  2. @module mobile
  3. @summary 蜂窝网络
  4. @version 1.0
  5. @date 2022.8.9
  6. @demo mobile
  7. @tag LUAT_USE_MOBILE
  8. @usage
  9. -- 简单演示
  10. log.info("imei", mobile.imei())
  11. log.info("imsi", mobile.imsi())
  12. local sn = mobile.sn()
  13. if sn then
  14. log.info("sn", sn:toHex())
  15. end
  16. log.info("muid", mobile.muid())
  17. log.info("iccid", mobile.iccid())
  18. log.info("csq", mobile.csq())
  19. log.info("rssi", mobile.rssi())
  20. log.info("rsrq", mobile.rsrq())
  21. log.info("rsrp", mobile.rsrp())
  22. log.info("snr", mobile.snr())
  23. log.info("simid", mobile.simid())
  24. */
  25. #include "luat_base.h"
  26. #include "luat_malloc.h"
  27. #include "luat_rtos.h"
  28. #include "luat_msgbus.h"
  29. #include "luat_mobile.h"
  30. #define LUAT_LOG_TAG "mobile"
  31. #include "luat_log.h"
  32. /**
  33. 获取IMEI
  34. @api mobile.imei(index)
  35. @int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
  36. @return string 当前的IMEI值,若失败返回nil
  37. */
  38. static int l_mobile_imei(lua_State* L) {
  39. char buff[24] = {0};
  40. // size_t len = 0;
  41. // size_t wlen = 0;
  42. int ret = 0;
  43. int index = luaL_optinteger(L, 1, 0);
  44. ret = luat_mobile_get_imei(index, buff, 24);
  45. // if (lua_isstring(L, 2)) {
  46. // const char* wbuff = luaL_checklstring(L, 2, &wlen);
  47. // if (wlen >= 15) {
  48. // ret = luat_mobile_set_imei(index, wbuff, wlen);
  49. // LLOGI("IMEI write %d %s ret %d", index, wbuff, ret);
  50. // }
  51. // }
  52. if (ret > 0) {
  53. buff[23] = 0x00; // 确保能结束
  54. lua_pushlstring(L, buff, strlen(buff));
  55. }
  56. else
  57. lua_pushnil(L);
  58. return 1;
  59. }
  60. /**
  61. 获取IMSI
  62. @api mobile.imsi(index)
  63. @int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
  64. @return string 当前的IMSI值,若失败返回nil
  65. */
  66. static int l_mobile_imsi(lua_State* L) {
  67. char buff[24] = {0};
  68. // size_t len = 0;
  69. // size_t wlen = 0;
  70. int ret = 0;
  71. int index = luaL_optinteger(L, 1, 0);
  72. ret = luat_mobile_get_imsi(index, buff, 24);
  73. // if (lua_isstring(L, 2)) {
  74. // const char* wbuff = luaL_checklstring(L, 2, &wlen);
  75. // if (wlen >= 1) {
  76. // ret = luat_mobile_set_imsi(index, wbuff, wlen);
  77. // LLOGI("IMSI write %d %s ret %d", index, wbuff, ret);
  78. // }
  79. // }
  80. if (ret > 0){
  81. buff[23] = 0x00; // 确保能结束
  82. lua_pushlstring(L, buff, strlen(buff));
  83. }
  84. else
  85. lua_pushnil(L);
  86. return 1;
  87. }
  88. /**
  89. 获取SN
  90. @api mobile.sn()
  91. @return string 当前的SN值,若失败返回nil. 注意, SN可能包含不可见字符
  92. */
  93. static int l_mobile_sn(lua_State* L) {
  94. char buff[32] = {0};
  95. // size_t len = 0;
  96. // size_t wlen = 0;
  97. int ret = 0;
  98. ret = luat_mobile_get_sn(buff, 32);
  99. // if (lua_isstring(L, 1)) {
  100. // const char* wbuff = luaL_checklstring(L, 1, &wlen);
  101. // if (wlen >= 1) {
  102. // ret = luat_mobile_set_sn(wbuff, wlen);
  103. // LLOGI("SN write %d %s ret %d", index, wbuff, ret);
  104. // }
  105. // }
  106. if (ret > 0) {
  107. //buff[63] = 0x00; // 确保能结束
  108. lua_pushlstring(L, buff, ret);
  109. }
  110. else
  111. lua_pushnil(L);
  112. return 1;
  113. }
  114. /**
  115. 获取MUID
  116. @api mobile.muid()
  117. @return string 当前的MUID值,若失败返回nil
  118. */
  119. static int l_mobile_muid(lua_State* L) {
  120. char buff[33] = {0};
  121. // size_t len = 0;
  122. // size_t wlen = 0;
  123. int ret = 0;
  124. ret = luat_mobile_get_muid(buff, 32);
  125. if (lua_isstring(L, 1)) {
  126. // const char* wbuff = luaL_checklstring(L, 1, &wlen);
  127. // if (wlen >= 15) {
  128. // ret = luat_mobile_set_muid(index, wbuff, wlen);
  129. // LLOGI("SN write %d %s ret %d", index, wbuff, ret);
  130. // }
  131. }
  132. if (ret > 0) {
  133. lua_pushlstring(L, buff, strlen(buff));
  134. }
  135. else
  136. lua_pushnil(L);
  137. return 1;
  138. }
  139. /**
  140. 获取或设置ICCID
  141. @api mobile.iccid(id)
  142. @int SIM卡的编号, 例如0, 1, 默认0
  143. @return string ICCID值,若失败返回nil
  144. */
  145. static int l_mobile_iccid(lua_State* L) {
  146. char buff[24] = {0};
  147. // size_t len = 0;
  148. // size_t wlen = 0;
  149. int ret = 0;
  150. int index = luaL_optinteger(L, 1, 0);
  151. ret = luat_mobile_get_iccid(index, buff, 24);
  152. if (ret > 0) {
  153. buff[23] = 0x00; // 确保能结束
  154. lua_pushlstring(L, buff, strlen(buff));
  155. }
  156. else
  157. lua_pushnil(L);
  158. return 1;
  159. }
  160. /**
  161. 获取手机卡号,注意,只有写入了手机号才能读出,因此有可能读出来是空的
  162. @api mobile.number(id)
  163. @int SIM卡的编号, 例如0, 1, 默认0
  164. @return string number值,若失败返回nil
  165. */
  166. static int l_mobile_number(lua_State* L) {
  167. char buff[24] = {0};
  168. // size_t len = 0;
  169. // size_t wlen = 0;
  170. int ret = 0;
  171. int index = luaL_optinteger(L, 1, 0);
  172. ret = luat_mobile_get_sim_number(index, buff, 24);
  173. if (ret > 0) {
  174. buff[23] = 0x00; // 确保能结束
  175. lua_pushlstring(L, buff, strlen(buff));
  176. }
  177. else
  178. lua_pushnil(L);
  179. return 1;
  180. }
  181. /**
  182. 获取当前SIM卡槽,或者切换卡槽
  183. @api mobile.simid(id)
  184. @int SIM卡的编号, 例如0, 1,如果支持双卡,比如EC618,可以填2来自适应,但是会占用掉4个IO。如果不填就直接读取当前卡槽
  185. @return int 当前sim卡槽编号,若失败返回-1
  186. */
  187. static int l_mobile_simid(lua_State* L) {
  188. // char buff[24] = {0};
  189. int ret = 0;
  190. int id = 0;
  191. if (lua_isinteger(L, 1)) {
  192. ret = luat_mobile_set_sim_id(lua_tointeger(L, 1));
  193. LLOGI("sim set to %d , ret %d", lua_tointeger(L, 1), ret);
  194. }
  195. ret = luat_mobile_get_sim_id(&id);
  196. if (ret == 0) {
  197. lua_pushinteger(L, id);
  198. }
  199. else {
  200. lua_pushinteger(L, -1);
  201. }
  202. return 1;
  203. }
  204. /**
  205. 设置RRC自动释放时间间隔
  206. @api mobile.rtime(time)
  207. @int RRC自动释放时间,等同于Air724的AT+RTIME,单位秒,写0或者不写则是停用,不要超过20秒,没有意义
  208. @return nil 无返回值
  209. */
  210. static int l_mobile_set_rrc_auto_release_time(lua_State* L) {
  211. luat_mobile_set_rrc_auto_release_time(luaL_optinteger(L, 1, 0));
  212. return 0;
  213. }
  214. /**
  215. 设置一些辅助周期性功能,目前支持SIM卡暂时脱离后恢复和周期性获取小区信息
  216. @api mobile.setAuto(check_sim_period, get_cell_period, search_cell_time)
  217. @int SIM卡自动恢复时间,单位毫秒,建议5000~10000,和飞行模式/SIM卡切换冲突,不能再同一时间使用,必须错开执行。写0或者不写则是关闭功能
  218. @int 周期性获取小区信息的时间间隔,单位毫秒。获取小区信息会增加部分功耗。写0或者不写则是关闭功能
  219. @int 每次搜索小区时最大搜索时间,单位秒。不要超过8秒
  220. @return nil 无返回值
  221. */
  222. static int l_mobile_set_auto_work(lua_State* L) {
  223. luat_mobile_set_period_work(luaL_optinteger(L, 2, 0), luaL_optinteger(L, 1, 0), luaL_optinteger(L, 3, 0));
  224. return 0;
  225. }
  226. /**
  227. 获取或设置APN
  228. @api mobile.apn(index, cid, newvalue)
  229. @int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
  230. @int cid, 默认0
  231. @string 新的APN. 不填就是获取APN, 填了就是设置APN, 是否支持设置取决于底层实现.
  232. @return string 获取到的默认APN值,失败返回nil
  233. */
  234. static int l_mobile_apn(lua_State* L) {
  235. char buff[64] = {0};
  236. size_t len = 0;
  237. size_t wlen = 0;
  238. int ret = 0;
  239. int index = luaL_optinteger(L, 1, 0);
  240. int cid = luaL_optinteger(L, 2, 0);
  241. ret = luat_mobile_get_apn(index, cid, buff, sizeof(buff) - 1);
  242. if (lua_isstring(L, 3)) {
  243. const char* wbuff = luaL_checklstring(L, 3, &wlen);
  244. if (wlen) {
  245. luat_mobile_user_apn_auto_active(index, cid, 3, 0xff, wbuff, wlen, NULL, 0, NULL, 0);
  246. LLOGI("APN write %d %s ret %d", index, wbuff, ret);
  247. }
  248. else
  249. {
  250. luat_mobile_user_apn_auto_active(index, cid, 3, 0xff, NULL, 0, NULL, 0, NULL, 0);
  251. }
  252. }
  253. if (ret > 0) {
  254. lua_pushlstring(L, buff, strlen(buff));
  255. }
  256. else
  257. lua_pushnil(L);
  258. return 1;
  259. }
  260. /**
  261. 是否默认开启IPV6功能,必须在LTE网络连接前就设置好
  262. @api mobile.ipv6(onff)
  263. @boolean 开关 true开启 false 关闭
  264. @return boolean true 当前是开启的,false 当前是关闭的
  265. */
  266. static int l_mobile_ipv6(lua_State* L) {
  267. // char buff[24] = {0};
  268. uint8_t onoff;
  269. if (LUA_TBOOLEAN == lua_type(L, 1)) {
  270. luat_mobile_set_default_pdn_ipv6(lua_toboolean(L, 1));
  271. }
  272. lua_pushboolean(L, luat_mobile_get_default_pdn_ipv6());
  273. return 1;
  274. }
  275. /**
  276. 获取csq
  277. @return int 当前CSQ值, 若失败返回0
  278. */
  279. static int l_mobile_csq(lua_State* L) {
  280. // luat_mobile_signal_strength_info_t info = {0};
  281. uint8_t csq = 0;
  282. if (luat_mobile_get_signal_strength(&csq) == 0) {
  283. lua_pushinteger(L, (int)csq);
  284. }
  285. else {
  286. lua_pushinteger(L, 0);
  287. }
  288. return 1;
  289. }
  290. /**
  291. 获取rssi
  292. @api mobile.rssi()
  293. @return int 当前rssi值,若失败返回0
  294. */
  295. static int l_mobile_rssi(lua_State* L) {
  296. luat_mobile_signal_strength_info_t info = {0};
  297. if (luat_mobile_get_signal_strength_info(&info) == 0) {
  298. lua_pushinteger(L, info.lte_signal_strength.rssi);
  299. }
  300. else {
  301. lua_pushinteger(L, 0);
  302. }
  303. return 1;
  304. }
  305. /**
  306. 获取rsrp
  307. @api mobile.rsrp()
  308. @return int 当前rsrp值,若失败返回0
  309. */
  310. static int l_mobile_rsrp(lua_State* L) {
  311. luat_mobile_signal_strength_info_t info = {0};
  312. if (luat_mobile_get_signal_strength_info(&info) == 0) {
  313. lua_pushinteger(L, info.lte_signal_strength.rsrp);
  314. }
  315. else {
  316. lua_pushinteger(L, 0);
  317. }
  318. return 1;
  319. }
  320. /**
  321. 获取rsrq
  322. @api mobile.rsrq()
  323. @return int 当前rsrq值,若失败返回0
  324. */
  325. static int l_mobile_rsrq(lua_State* L) {
  326. luat_mobile_signal_strength_info_t info = {0};
  327. if (luat_mobile_get_signal_strength_info(&info) == 0) {
  328. lua_pushinteger(L, info.lte_signal_strength.rsrq);
  329. }
  330. else {
  331. lua_pushinteger(L, 0);
  332. }
  333. return 1;
  334. }
  335. /**
  336. 获取snr
  337. @api mobile.snr()
  338. @return int 当前snq值,若失败返回0
  339. */
  340. static int l_mobile_snr(lua_State* L) {
  341. luat_mobile_signal_strength_info_t info = {0};
  342. if (luat_mobile_get_signal_strength_info(&info) == 0) {
  343. lua_pushinteger(L, info.lte_signal_strength.snr);
  344. }
  345. else {
  346. lua_pushinteger(L, 0);
  347. }
  348. return 1;
  349. }
  350. /**
  351. 进出飞行模式
  352. @api mobile.flymode(index, enable)
  353. @int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
  354. @bool 是否设置为飞行模式,true为设置, false为退出,可选
  355. @return bool 原飞行模式的状态
  356. */
  357. static int l_mobile_flymode(lua_State* L) {
  358. int index = luaL_optinteger(L, 1, 0);
  359. int flymode = luat_mobile_get_flymode(index);
  360. if (lua_isboolean(L, 2)) {
  361. luat_mobile_set_flymode(index, lua_toboolean(L, 2));
  362. }
  363. lua_pushboolean(L, flymode == 0 ? 0 : 1);
  364. return 1;
  365. }
  366. /**
  367. 获取网络状态
  368. @api mobile.status()
  369. @return int 当前网络状态,0:网络未注册;1:网络已注册;2:网络注册被拒绝,或者正在搜网中
  370. */
  371. static int l_mobile_status(lua_State* L) {
  372. int LUAT_MOBILE_REGISTER_STATUS_E = luat_mobile_get_register_status();
  373. lua_pushinteger(L, LUAT_MOBILE_REGISTER_STATUS_E);
  374. return 1;
  375. }
  376. static inline uint16_t u162bcd(uint16_t src) {
  377. uint8_t high = (src >> 8) & 0xFF;
  378. uint8_t low = src & 0xFF;
  379. uint16_t dst = 0;
  380. dst += (low & 0x0F) + (low >> 4) * 10;
  381. dst += ((high & 0x0F) + (high >> 4) * 10) * 100;
  382. //LLOGD("src %04X dst %d", src, dst);
  383. return dst;
  384. }
  385. /**
  386. 获取机制信息
  387. @api mobile.getCellInfo()
  388. @return table 包含基站数据的数组
  389. @usage
  390. --示例输出
  391. --[[
  392. [
  393. {"rsrq":-10,"rssi":-55,"cid":124045360,"mnc":17,"pci":115,"earfcn":1850,"snr":15,"rsrp":-85,"mcc":1120,"tdd":0},
  394. {"pci":388,"rsrq":-11,"mnc":17,"earfcn":2452,"snr":5,"rsrp":-67,"mcc":1120,"cid":124045331},
  395. {"pci":100,"rsrq":-9,"mnc":17,"earfcn":75,"snr":17,"rsrp":-109,"mcc":1120,"cid":227096712}
  396. ]
  397. ]]
  398. -- 订阅式
  399. sys.subscribe("CELL_INFO_UPDATE", function()
  400. log.info("cell", json.encode(mobile.getCellInfo()))
  401. end)
  402. -- 定期轮训式
  403. sys.taskInit(function()
  404. sys.wait(3000)
  405. while 1 do
  406. mobile.reqCellInfo(15)
  407. sys.waitUntil("CELL_INFO_UPDATE", 15000)
  408. log.info("cell", json.encode(mobile.getCellInfo()))
  409. end
  410. end)
  411. */
  412. static int l_mobile_get_cell_info(lua_State* L) {
  413. lua_newtable(L);
  414. luat_mobile_cell_info_t* info = luat_heap_malloc(sizeof(luat_mobile_cell_info_t));
  415. if (info == NULL) {
  416. LLOGE("out of memory when malloc cell_info");
  417. return 1;
  418. }
  419. int ret = luat_mobile_get_last_notify_cell_info(info);
  420. if (ret != 0) {
  421. LLOGI("none cell info found %d", ret);
  422. goto exit;
  423. }
  424. //LLOGD("cid %d neighbor %d", info->lte_service_info.cid, info->lte_neighbor_info_num);
  425. // 当前仅返回lte信息
  426. if (info->lte_info_valid == 0 && info->lte_service_info.cid == 0) {
  427. LLOGI("lte cell info not found");
  428. goto exit;
  429. }
  430. lua_newtable(L);
  431. lua_pushinteger(L, info->lte_service_info.pci);
  432. lua_setfield(L, -2, "pci");
  433. lua_pushinteger(L, info->lte_service_info.cid);
  434. lua_setfield(L, -2, "cid");
  435. lua_pushinteger(L, info->lte_service_info.earfcn);
  436. lua_setfield(L, -2, "earfcn");
  437. lua_pushinteger(L, info->lte_service_info.rsrp);
  438. lua_setfield(L, -2, "rsrp");
  439. lua_pushinteger(L, info->lte_service_info.rsrq);
  440. lua_setfield(L, -2, "rsrq");
  441. lua_pushinteger(L, info->lte_service_info.rssi);
  442. lua_setfield(L, -2, "rssi");
  443. lua_pushinteger(L, info->lte_service_info.is_tdd);
  444. lua_setfield(L, -2, "tdd");
  445. lua_pushinteger(L, info->lte_service_info.snr);
  446. lua_setfield(L, -2, "snr");
  447. lua_pushinteger(L, u162bcd(info->lte_service_info.mcc));
  448. lua_setfield(L, -2, "mcc");
  449. lua_pushinteger(L, u162bcd(info->lte_service_info.mnc));
  450. lua_setfield(L, -2, "mnc");
  451. lua_pushinteger(L, info->lte_service_info.tac);
  452. lua_setfield(L, -2, "tac");
  453. lua_pushinteger(L, info->lte_service_info.band);
  454. lua_setfield(L, -2, "band");
  455. lua_seti(L, -2, 1);
  456. if (info->lte_neighbor_info_num > 0) {
  457. for (size_t i = 0; i < info->lte_neighbor_info_num; i++)
  458. {
  459. lua_settop(L, 1);
  460. //LLOGD("add neighbor %d", i);
  461. lua_newtable(L);
  462. lua_pushinteger(L, info->lte_info[i].pci);
  463. lua_setfield(L, -2, "pci");
  464. lua_pushinteger(L, info->lte_info[i].cid);
  465. lua_setfield(L, -2, "cid");
  466. lua_pushinteger(L, info->lte_info[i].earfcn);
  467. lua_setfield(L, -2, "earfcn");
  468. lua_pushinteger(L, info->lte_info[i].rsrp);
  469. lua_setfield(L, -2, "rsrp");
  470. lua_pushinteger(L, info->lte_info[i].rsrq);
  471. lua_setfield(L, -2, "rsrq");
  472. lua_pushinteger(L, u162bcd(info->lte_info[i].mcc));
  473. lua_setfield(L, -2, "mcc");
  474. lua_pushinteger(L, u162bcd(info->lte_info[i].mnc));
  475. lua_setfield(L, -2, "mnc");
  476. lua_pushinteger(L, info->lte_info[i].snr);
  477. lua_setfield(L, -2, "snr");
  478. lua_pushinteger(L, info->lte_info[i].tac);
  479. lua_setfield(L, -2, "tac");
  480. lua_seti(L, -2, i + 2);
  481. }
  482. }
  483. lua_settop(L, 1);
  484. exit:
  485. luat_heap_free(info);
  486. return 1;
  487. }
  488. /**
  489. 发起基站信息查询,含临近小区
  490. @api mobile.reqCellInfo(timeout)
  491. @int 超时时长,单位秒,默认15. 最少5, 最高60
  492. @return nil 无返回值
  493. @usage
  494. -- 参考 mobile.getCellInfo 函数
  495. */
  496. static int l_mobile_request_cell_info(lua_State* L) {
  497. int timeout = luaL_optinteger(L, 1, 15);
  498. if (timeout > 60)
  499. timeout = 60;
  500. else if (timeout < 5)
  501. timeout = 5;
  502. luat_mobile_get_cell_info_async(timeout);
  503. return 0;
  504. }
  505. #include "rotable2.h"
  506. static const rotable_Reg_t reg_mobile[] = {
  507. {"status", ROREG_FUNC(l_mobile_status)},
  508. {"imei", ROREG_FUNC(l_mobile_imei)},
  509. {"imsi", ROREG_FUNC(l_mobile_imsi)},
  510. {"sn", ROREG_FUNC(l_mobile_sn)},
  511. {"iccid", ROREG_FUNC(l_mobile_iccid)},
  512. {"number", ROREG_FUNC(l_mobile_number)},
  513. {"muid", ROREG_FUNC(l_mobile_muid)},
  514. {"apn", ROREG_FUNC(l_mobile_apn)},
  515. {"ipv6", ROREG_FUNC(l_mobile_ipv6)},
  516. {"csq", ROREG_FUNC(l_mobile_csq)},
  517. {"rssi", ROREG_FUNC(l_mobile_rssi)},
  518. {"rsrq", ROREG_FUNC(l_mobile_rsrq)},
  519. {"rsrp", ROREG_FUNC(l_mobile_rsrp)},
  520. {"snr", ROREG_FUNC(l_mobile_snr)},
  521. {"flymode", ROREG_FUNC(l_mobile_flymode)},
  522. {"simid", ROREG_FUNC(l_mobile_simid)},
  523. {"rtime", ROREG_FUNC(l_mobile_set_rrc_auto_release_time)},
  524. {"setAuto", ROREG_FUNC(l_mobile_set_auto_work)},
  525. {"getCellInfo", ROREG_FUNC(l_mobile_get_cell_info)},
  526. {"reqCellInfo", ROREG_FUNC(l_mobile_request_cell_info)},
  527. // const UNREGISTER 未注册
  528. {"UNREGISTER", ROREG_INT(LUAT_MOBILE_STATUS_UNREGISTER)},
  529. // const REGISTERED 已注册
  530. {"REGISTERED", ROREG_INT(LUAT_MOBILE_STATUS_REGISTERED)},
  531. // const DENIED 注册被拒绝
  532. {"DENIED", ROREG_INT(LUAT_MOBILE_STATUS_DENIED)},
  533. // const UNKNOW 未知
  534. {"UNKNOW", ROREG_INT(LUAT_MOBILE_STATUS_UNKNOW)},
  535. // const REGISTERED_ROAMING 已注册,漫游
  536. {"REGISTERED_ROAMING", ROREG_INT(LUAT_MOBILE_STATUS_REGISTERED_ROAMING)},
  537. // const SMS_ONLY_REGISTERED 已注册,仅SMS
  538. {"SMS_ONLY_REGISTERED", ROREG_INT(LUAT_MOBILE_STATUS_SMS_ONLY_REGISTERED)},
  539. // const SMS_ONLY_REGISTERED_ROAMING 已注册,漫游,仅SMS
  540. {"SMS_ONLY_REGISTERED_ROAMING", ROREG_INT(LUAT_MOBILE_STATUS_SMS_ONLY_REGISTERED_ROAMING)},
  541. // const EMERGENCY_REGISTERED 已注册,紧急服务
  542. {"EMERGENCY_REGISTERED", ROREG_INT(LUAT_MOBILE_STATUS_EMERGENCY_REGISTERED)},
  543. // const CSFB_NOT_PREFERRED_REGISTERED 已注册,非主要服务
  544. {"CSFB_NOT_PREFERRED_REGISTERED", ROREG_INT(LUAT_MOBILE_STATUS_CSFB_NOT_PREFERRED_REGISTERED)},
  545. // const CSFB_NOT_PREFERRED_REGISTERED_ROAMING 已注册,非主要服务,漫游
  546. {"CSFB_NOT_PREFERRED_REGISTERED_ROAMING", ROREG_INT(LUAT_MOBILE_STATUS_CSFB_NOT_PREFERRED_REGISTERED_ROAMING)},
  547. {NULL, ROREG_INT(0)}
  548. };
  549. LUAMOD_API int luaopen_mobile( lua_State *L ) {
  550. luat_newlib2(L, reg_mobile);
  551. return 1;
  552. }
  553. static int l_mobile_event_handle(lua_State* L, void* ptr) {
  554. LUAT_MOBILE_EVENT_E event;
  555. uint8_t index;
  556. uint8_t status;
  557. rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1);
  558. event = msg->arg1;
  559. index = msg->arg2 >> 8;
  560. status = msg->arg2 & 0xFF;
  561. // luat_mobile_cell_info_t cell_info;
  562. // luat_mobile_signal_strength_info_t signal_info;
  563. // uint8_t csq, i;
  564. // char imsi[20];
  565. // char iccid[24] = {0};
  566. if (lua_getglobal(L, "sys_pub") != LUA_TFUNCTION) {
  567. return 0;
  568. };
  569. switch(event)
  570. {
  571. case LUAT_MOBILE_EVENT_CFUN:
  572. break;
  573. case LUAT_MOBILE_EVENT_SIM:
  574. /*
  575. @sys_pub mobile
  576. sim卡状态变化
  577. SIM_IND
  578. @usage
  579. sys.subscribe("SIM_IND", function(status)
  580. -- status的取值有:
  581. -- RDY SIM卡就绪
  582. -- NORDY 无SIM卡
  583. -- SIM_PIN 需要输入PIN
  584. -- GET_NUMBER 获取到电话号码(不一定有值)
  585. log.info("sim status", status)
  586. end)
  587. */
  588. switch (status)
  589. {
  590. case LUAT_MOBILE_SIM_READY:
  591. lua_pushstring(L, "SIM_IND");
  592. lua_pushstring(L, "RDY");
  593. lua_call(L, 2, 0);
  594. break;
  595. case LUAT_MOBILE_NO_SIM:
  596. lua_pushstring(L, "SIM_IND");
  597. lua_pushstring(L, "NORDY");
  598. lua_call(L, 2, 0);
  599. break;
  600. case LUAT_MOBILE_SIM_NEED_PIN:
  601. lua_pushstring(L, "SIM_IND");
  602. lua_pushstring(L, "SIM_PIN");
  603. lua_call(L, 2, 0);
  604. break;
  605. case LUAT_MOBILE_SIM_NUMBER:
  606. lua_pushstring(L, "SIM_IND");
  607. lua_pushstring(L, "GET_NUMBER");
  608. lua_call(L, 2, 0);
  609. break;
  610. default:
  611. break;
  612. }
  613. break;
  614. case LUAT_MOBILE_EVENT_REGISTER_STATUS:
  615. break;
  616. case LUAT_MOBILE_EVENT_CELL_INFO:
  617. switch (status)
  618. {
  619. case LUAT_MOBILE_CELL_INFO_UPDATE:
  620. /*
  621. @sys_pub mobile
  622. 基站数据已更新
  623. CELL_INFO_UPDATE
  624. @usage
  625. -- 订阅式, 模块本身会周期性查询基站信息,但通常不包含临近小区
  626. sys.subscribe("CELL_INFO_UPDATE", function()
  627. log.info("cell", json.encode(mobile.getCellInfo()))
  628. end)
  629. */
  630. lua_pushstring(L, "CELL_INFO_UPDATE");
  631. lua_call(L, 1, 0);
  632. break;
  633. default:
  634. break;
  635. }
  636. break;
  637. case LUAT_MOBILE_EVENT_PDP:
  638. break;
  639. case LUAT_MOBILE_EVENT_NETIF:
  640. switch (status)
  641. {
  642. case LUAT_MOBILE_NETIF_LINK_ON:
  643. LLOGD("NETIF_LINK_ON -> IP_READY");
  644. /*
  645. @sys_pub mobile
  646. 已联网
  647. IP_READY
  648. @usage
  649. -- 联网后会发一次这个消息
  650. -- 与wlan库不同, 本消息不带ip地址
  651. sys.subscribe("IP_READY", function()
  652. log.info("mobile", "IP_READY")
  653. end)
  654. */
  655. lua_pushstring(L, "IP_READY");
  656. lua_call(L, 1, 0);
  657. break;
  658. case LUAT_MOBILE_NETIF_LINK_OFF:
  659. LLOGD("NETIF_LINK_OFF -> IP_LOSE");
  660. /*
  661. @sys_pub mobile
  662. 已断网
  663. IP_LOSE
  664. @usage
  665. -- 断网后会发一次这个消息
  666. sys.subscribe("IP_LOSE", function()
  667. log.info("mobile", "IP_LOSE")
  668. end)
  669. */
  670. lua_pushstring(L, "IP_LOSE");
  671. lua_call(L, 1, 0);
  672. break;
  673. default:
  674. break;
  675. }
  676. break;
  677. case LUAT_MOBILE_EVENT_TIME_SYNC:
  678. /*
  679. @sys_pub mobile
  680. 时间已经同步
  681. NTP_UPDATE
  682. @usage
  683. -- 对于电信/移动的卡, 联网后,基站会下发时间,但联通卡不会,务必留意
  684. sys.subscribe("NTP_UPDATE", function()
  685. log.info("mobile", "time", os.date())
  686. end)
  687. */
  688. LLOGD("TIME_SYNC %d", status);
  689. lua_pushstring(L, "NTP_UPDATE");
  690. lua_call(L, 1, 0);
  691. break;
  692. case LUAT_MOBILE_EVENT_CSCON:
  693. LLOGD("CSCON %d", status);
  694. break;
  695. default:
  696. break;
  697. }
  698. return 0;
  699. }
  700. // 给luat_mobile_event_register_handler 注册用, 给lua层发消息
  701. void luat_mobile_event_cb(LUAT_MOBILE_EVENT_E event, uint8_t index, uint8_t status) {
  702. rtos_msg_t msg = {
  703. .handler = l_mobile_event_handle,
  704. .arg1 = event,
  705. .arg2 = (index << 8) + status ,
  706. .ptr = NULL
  707. };
  708. luat_msgbus_put(&msg, 0);
  709. }