luat_lib_mobile.c 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587
  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_mem.h"
  27. #include "luat_rtos.h"
  28. #include "luat_msgbus.h"
  29. #include "luat_mobile.h"
  30. #include "luat_network_adapter.h"
  31. #define LUAT_LOG_TAG "mobile"
  32. #include "luat_log.h"
  33. extern void luat_cc_start_speech(uint32_t param);
  34. extern void luat_cc_play_tone(uint32_t param);
  35. /**
  36. 获取IMEI
  37. @api mobile.imei(index)
  38. @int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
  39. @return string 当前的IMEI值,若失败返回nil
  40. @usgae
  41. -- 注意, 当前所有模块只支持单待,所以IMEI总是同一个
  42. */
  43. static int l_mobile_imei(lua_State* L) {
  44. char buff[24] = {0};
  45. // size_t len = 0;
  46. // size_t wlen = 0;
  47. int ret = 0;
  48. int index = luaL_optinteger(L, 1, 0);
  49. ret = luat_mobile_get_imei(index, buff, 24);
  50. // if (lua_isstring(L, 2)) {
  51. // const char* wbuff = luaL_checklstring(L, 2, &wlen);
  52. // if (wlen >= 15) {
  53. // ret = luat_mobile_set_imei(index, wbuff, wlen);
  54. // LLOGI("IMEI write %d %s ret %d", index, wbuff, ret);
  55. // }
  56. // }
  57. if (ret > 0) {
  58. buff[23] = 0x00; // 确保能结束
  59. lua_pushlstring(L, buff, strlen(buff));
  60. }
  61. else
  62. lua_pushnil(L);
  63. return 1;
  64. }
  65. /**
  66. 获取IMSI
  67. @api mobile.imsi(index)
  68. @int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
  69. @return string 当前的IMSI值,若失败返回nil
  70. @usgae
  71. -- 注意, 当前所有模块只支持单待,所以IMSI总是同一个
  72. */
  73. static int l_mobile_imsi(lua_State* L) {
  74. char buff[24] = {0};
  75. // size_t len = 0;
  76. // size_t wlen = 0;
  77. int ret = 0;
  78. int index = luaL_optinteger(L, 1, 0);
  79. ret = luat_mobile_get_imsi(index, buff, 24);
  80. // if (lua_isstring(L, 2)) {
  81. // const char* wbuff = luaL_checklstring(L, 2, &wlen);
  82. // if (wlen >= 1) {
  83. // ret = luat_mobile_set_imsi(index, wbuff, wlen);
  84. // LLOGI("IMSI write %d %s ret %d", index, wbuff, ret);
  85. // }
  86. // }
  87. if (ret > 0){
  88. buff[23] = 0x00; // 确保能结束
  89. lua_pushlstring(L, buff, strlen(buff));
  90. }
  91. else
  92. lua_pushnil(L);
  93. return 1;
  94. }
  95. /**
  96. 获取SN
  97. @api mobile.sn()
  98. @return string 当前的SN值,若失败返回nil. 注意, SN可能包含不可见字符
  99. @usage
  100. -- 注意, 出厂未必有写SN
  101. -- 一般用途的唯一id, 可以用mobile.imei()代替
  102. -- 如需要真正的唯一ID, 使用 mcu.unique_id()
  103. */
  104. static int l_mobile_sn(lua_State* L) {
  105. char buff[32] = {0};
  106. // size_t len = 0;
  107. // size_t wlen = 0;
  108. int ret = 0;
  109. ret = luat_mobile_get_sn(buff, 32);
  110. // if (lua_isstring(L, 1)) {
  111. // const char* wbuff = luaL_checklstring(L, 1, &wlen);
  112. // if (wlen >= 1) {
  113. // ret = luat_mobile_set_sn(wbuff, wlen);
  114. // LLOGI("SN write %d %s ret %d", index, wbuff, ret);
  115. // }
  116. // }
  117. if (ret > 0) {
  118. //buff[63] = 0x00; // 确保能结束
  119. lua_pushlstring(L, buff, ret);
  120. }
  121. else
  122. lua_pushnil(L);
  123. return 1;
  124. }
  125. /**
  126. 获取MUID
  127. @api mobile.muid()
  128. @return string 当前的MUID值,若失败返回nil
  129. */
  130. static int l_mobile_muid(lua_State* L) {
  131. char buff[33] = {0};
  132. // size_t len = 0;
  133. // size_t wlen = 0;
  134. int ret = 0;
  135. ret = luat_mobile_get_muid(buff, 32);
  136. if (lua_isstring(L, 1)) {
  137. // const char* wbuff = luaL_checklstring(L, 1, &wlen);
  138. // if (wlen >= 15) {
  139. // ret = luat_mobile_set_muid(index, wbuff, wlen);
  140. // LLOGI("SN write %d %s ret %d", index, wbuff, ret);
  141. // }
  142. }
  143. if (ret > 0) {
  144. lua_pushlstring(L, buff, strlen(buff));
  145. }
  146. else
  147. lua_pushnil(L);
  148. return 1;
  149. }
  150. /**
  151. 获取或设置ICCID
  152. @api mobile.iccid(id)
  153. @int SIM卡的编号, 例如0, 1, 默认0
  154. @return string ICCID值,若失败返回nil
  155. */
  156. static int l_mobile_iccid(lua_State* L) {
  157. char buff[24] = {0};
  158. // size_t len = 0;
  159. // size_t wlen = 0;
  160. int ret = 0;
  161. int index = luaL_optinteger(L, 1, 0);
  162. ret = luat_mobile_get_iccid(index, buff, 24);
  163. if (ret > 0) {
  164. buff[23] = 0x00; // 确保能结束
  165. lua_pushlstring(L, buff, strlen(buff));
  166. }
  167. else
  168. lua_pushnil(L);
  169. return 1;
  170. }
  171. /**
  172. 获取手机卡号,注意,只有写入了手机号才能读出,因此有可能读出来是空的
  173. @api mobile.number(id)
  174. @int SIM卡的编号, 例如0, 1, 默认0
  175. @return string number值,若失败返回nil
  176. */
  177. static int l_mobile_number(lua_State* L) {
  178. char buff[24] = {0};
  179. // size_t len = 0;
  180. // size_t wlen = 0;
  181. int ret = 0;
  182. int index = luaL_optinteger(L, 1, 0);
  183. ret = luat_mobile_get_sim_number(index, buff, 24);
  184. if (ret > 0) {
  185. buff[23] = 0x00; // 确保能结束
  186. lua_pushlstring(L, buff, strlen(buff));
  187. }
  188. else
  189. lua_pushnil(L);
  190. return 1;
  191. }
  192. /**
  193. 获取当前SIM卡槽,或者切换卡槽
  194. @api mobile.simid(id)
  195. @int SIM卡的编号, 例如0, 1, 如果支持双卡,比如EC618,可以填2来自适应,但是会占用掉4个IO(gpio4/5/6/23)。如果不填就直接读取当前卡槽
  196. @boolean 是否优先用SIM0,只有SIM卡编号写2自适应才有用!!!。true优先用SIM0,false则由具体平台决定,支持双卡双待SIM0优先,不支持的是上一次检测到的优先,默认是false,必须在开机就配置,否则就无效了
  197. @return int 当前sim卡槽编号,若失败返回-1
  198. @usage
  199. mobile.simid(0) -- 固定使用SIM0
  200. mobile.simid(1) -- 固件使用SIM1
  201. mobile.simid(2) -- 自动识别SIM0, SIM1, 优先级看具体平台
  202. mobile.simid(2, true) -- -- 自动识别SIM0, SIM1, 且SIM0优先
  203. -- 提醒, 自动识别是会增加时间的
  204. */
  205. static int l_mobile_simid(lua_State* L) {
  206. // char buff[24] = {0};
  207. int ret = 0;
  208. int id = 0;
  209. if (lua_isinteger(L, 1)) {
  210. id = luaL_checkinteger(L, 1);
  211. ret = luat_mobile_set_sim_id(id);
  212. LLOGI("sim set to %d , ret %d", id, ret);
  213. }
  214. if (LUA_TBOOLEAN == lua_type(L, 2)) {
  215. if (lua_toboolean(L, 2)) {
  216. luat_mobile_set_sim_detect_sim0_first();
  217. }
  218. }
  219. ret = luat_mobile_get_sim_id(&id);
  220. if (ret == 0) {
  221. lua_pushinteger(L, id);
  222. }
  223. else {
  224. lua_pushinteger(L, -1);
  225. }
  226. return 1;
  227. }
  228. /**
  229. 检测当前SIM卡是否准备好,对SIM卡的PIN码做相关操作
  230. @api mobile.simPin(id,operation,pin1,pin2)
  231. @int SIM卡的编号, 例如0, 1, 支持双卡双待的才需要选择
  232. @int PIN码操作类型,只能是mobile.PIN_XXXX,不操作就留空
  233. @string 更换pin时操作的pin码,或者验证操作的pin码,或者解锁pin码时的PUK,4~8字节
  234. @string 更换pin码操作时的新的pin码,解锁pin码时的新PIN,4~8字节
  235. @return boolean 当无PIN操作时,返回SIM卡是否准备好,有PIN操作时,返回是否成功
  236. @usage
  237. local cpin_is_ready = mobile.simPin() -- 当前sim卡是否准备好,一般返回false就是没卡
  238. local succ = mobile.simPin(0, mobile.PIN_VERIFY, "1234") -- 输入pin码验证
  239. */
  240. static int l_mobile_sim_pin(lua_State* L) {
  241. char old[9] = {0};
  242. char new[9] = {0};
  243. int id = luaL_optinteger(L, 1, 0);
  244. int operation = luaL_optinteger(L, 2, -1);
  245. size_t old_len, new_len;
  246. if (lua_isstring(L, 3))
  247. {
  248. const char *old_pin = lua_tolstring(L, 3, &old_len);
  249. memcpy(old, old_pin, (old_len > 8)?8:old_len);
  250. }
  251. if (lua_isstring(L, 4))
  252. {
  253. const char *new_pin = lua_tolstring(L, 4, &new_len);
  254. memcpy(new, new_pin, (new_len > 8)?8:new_len);
  255. }
  256. if (operation != -1)
  257. {
  258. lua_pushboolean(L, (luat_mobile_set_sim_pin(id, operation, old, new) == 0));
  259. }
  260. else
  261. {
  262. lua_pushboolean(L, (luat_mobile_get_sim_ready(id) == 1));
  263. }
  264. return 1;
  265. }
  266. /**
  267. 设置RRC自动释放时间间隔,当开启时后,遇到极弱信号+频繁数据操作可能会引起网络严重故障,因此需要额外设置自动重启协议栈
  268. @api mobile.rtime(time, auto_reset_stack, data_first)
  269. @int RRC自动释放时间,等同于Air724的AT+RTIME,单位秒,写0或者不写则是停用,不要超过20秒,没有意义
  270. @boolean 网络遇到严重故障时尝试自动恢复,和飞行模式/SIM卡切换冲突,true开启,false关闭,留空时,如果设置了时间则自动开启。本参数于2023年9月14日已废弃
  271. @boolean 是否启用数据传输优化,true启用,false关闭,留空为false,开启后必须等到TCP数据ACK或者超时失败,或者socket CONNECT完成(无论成功或者失败)才允许RRC提前释放,可能会增加功耗。本参数于2024年8月12日启用
  272. @return nil 无返回值
  273. @usage
  274. mobile.rtime(3) --与基站无数据交互3秒后提前释放RRC
  275. mobile.rtime(3,nil,true) --启用数据传输优化,与基站无数据交互3秒后,提前释放RRC
  276. */
  277. extern void net_lwip_check_switch(uint8_t onoff);
  278. static int l_mobile_set_rrc_auto_release_time(lua_State* L) {
  279. uint8_t release_time = luaL_optinteger(L, 1, 0);
  280. if (LUA_TBOOLEAN == lua_type(L, 3)) {
  281. net_lwip_check_switch(lua_toboolean(L, 3));
  282. }
  283. uint32_t idle_time = luaL_optinteger(L, 4, 0);
  284. if (idle_time >= 10)
  285. {
  286. luat_mobile_set_auto_rrc(release_time, idle_time);
  287. }
  288. else
  289. {
  290. luat_mobile_set_rrc_auto_release_time(release_time);
  291. }
  292. return 0;
  293. }
  294. /**
  295. 设置一些辅助周期性或者自动功能,目前支持SIM卡暂时脱离后恢复,周期性获取小区信息,网络遇到严重故障时尝试自动恢复
  296. @api mobile.setAuto(check_sim_period, get_cell_period, search_cell_time, auto_reset_stack, network_check_period)
  297. @int SIM卡自动恢复时间,单位毫秒,建议5000~10000,和飞行模式/SIM卡切换冲突,不能再同一时间使用,必须错开执行。写0或者不写则是关闭功能
  298. @int 周期性获取小区信息的时间间隔,单位毫秒。获取小区信息会增加部分功耗。写0或者不写则是关闭功能
  299. @int 每次搜索小区时最大搜索时间,单位秒。不要超过8秒
  300. @boolean 网络遇到严重故障时尝试自动恢复,和飞行模式/SIM卡切换冲突,true开启,false关闭,开始状态是false,留空则不做改变
  301. @int 设置定时检测网络是否正常并且在检测到长时间无网时通过重启协议栈来恢复,无网恢复时长,单位ms,建议60000以上,为网络搜索网络保留足够的时间,留空则不做更改
  302. @return nil 无返回值
  303. */
  304. static int l_mobile_set_auto_work(lua_State* L) {
  305. luat_mobile_set_period_work(luaL_optinteger(L, 2, 0), luaL_optinteger(L, 1, 0), luaL_optinteger(L, 3, 0));
  306. if (LUA_TBOOLEAN == lua_type(L, 4)) {
  307. luat_mobile_fatal_error_auto_reset_stack(lua_toboolean(L, 4));
  308. }
  309. if (lua_isinteger(L, 5)) {
  310. luat_mobile_set_check_network_period(luaL_optinteger(L, 5, 0));
  311. }
  312. return 0;
  313. }
  314. /**
  315. 获取或设置APN,设置APN必须在入网前就设置好,比如在SIM卡识别完成前就设置好
  316. @api mobile.apn(index, cid, new_apn_name, user_name, password, ip_type, protocol)
  317. @int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
  318. @int cid, 默认0,如果要用非默认APN来激活,必须>0
  319. @string 新的APN,不填就是获取APN, 填了就是设置APN, 是否支持设置取决于底层实现
  320. @string 新的APN的username,如果APN不是空,那必须填写,如果没有留个空字符串""。如果APN是空的,那可以nil
  321. @string 新的APN的password,如果APN不是空,那必须填写,如果没有留个空字符串""。如果APN是空的,那可以nil
  322. @int 激活APN时的IP TYPE,1=IPV4 2=IPV6 3=IPV4V6,默认是1
  323. @int 激活APN时,如果需要username和password,就要写鉴权协议类型,1~3,默认3,代表1和2都尝试一下。不需要鉴权的写0
  324. @boolean 是否删除APN,true是,其他都否,只有参数3新的APN不是string的时候才有效果
  325. @return string 如果网络注册成功,返回注册用的APN值,反之是nil。设置好不会立刻有返回值,需要等网络注册成功
  326. @usage
  327. mobile.apn(0,1,"cmiot","","",nil,0) -- 移动公网卡设置APN为cmiot,一般不用设置
  328. mobile.apn(0,1,"name","user","password",nil,3) -- 专网卡设置的demo,name,user,password联系卡商获取
  329. */
  330. static int l_mobile_apn(lua_State* L) {
  331. char buff[64] = {0};
  332. size_t len = 0;
  333. size_t wlen = 0;
  334. int ret = 0;
  335. int index = luaL_optinteger(L, 1, 0);
  336. int cid = luaL_optinteger(L, 2, 0);
  337. ret = luat_mobile_get_apn(index, cid, buff, sizeof(buff) - 1);
  338. if (lua_isstring(L, 3)) {
  339. const char* wbuff = luaL_checklstring(L, 3, &wlen);
  340. size_t user_name_len = 0;
  341. size_t password_len = 0;
  342. const char* user_name = luaL_checklstring(L, 4, &user_name_len);
  343. const char* password = luaL_checklstring(L, 5, &password_len);
  344. uint8_t ip_type = luaL_optinteger(L, 6, 1);
  345. uint8_t protocol = luaL_optinteger(L, 7, 3);
  346. if (!user_name_len && !password_len)
  347. {
  348. protocol = 0;
  349. }
  350. if (wlen) {
  351. luat_mobile_user_apn_auto_active(index, cid, ip_type, protocol, wbuff, wlen, user_name, user_name_len, password, password_len);
  352. }
  353. else
  354. {
  355. luat_mobile_user_apn_auto_active(index, cid, ip_type, 0xff, NULL, 0, NULL, 0, NULL, 0);
  356. }
  357. }
  358. else
  359. {
  360. if (lua_isboolean(L, 8) && lua_toboolean(L, 8))
  361. {
  362. luat_mobile_del_apn(index, cid, 0);
  363. }
  364. }
  365. if (ret > 0) {
  366. lua_pushlstring(L, buff, strlen(buff));
  367. }
  368. else
  369. lua_pushnil(L);
  370. return 1;
  371. }
  372. /**
  373. 是否默认开启IPV6功能,必须在LTE网络连接前就设置好
  374. @api mobile.ipv6(onff)
  375. @boolean 开关 true开启 false 关闭
  376. @return boolean true 当前是开启的,false 当前是关闭的
  377. @usage
  378. -- 注意, 开启ipv6后, 开机联网会慢2~3秒
  379. */
  380. static int l_mobile_ipv6(lua_State* L) {
  381. // char buff[24] = {0};
  382. // uint8_t onoff;
  383. if (LUA_TBOOLEAN == lua_type(L, 1)) {
  384. luat_mobile_set_default_pdn_ipv6(lua_toboolean(L, 1));
  385. }
  386. lua_pushboolean(L, luat_mobile_get_default_pdn_ipv6());
  387. return 1;
  388. }
  389. /**
  390. 获取csq
  391. @api mobile.csq()
  392. @return int 当前CSQ值, 若失败返回0. 范围 0 - 31, 越大越好
  393. @usage
  394. -- 注意, 4G模块的CSQ值仅供参考, rsrp/rsrq才是真正的信号强度指标
  395. */
  396. static int l_mobile_csq(lua_State* L) {
  397. // luat_mobile_signal_strength_info_t info = {0};
  398. uint8_t csq = 0;
  399. if (luat_mobile_get_signal_strength(&csq) == 0) {
  400. lua_pushinteger(L, (int)csq);
  401. }
  402. else {
  403. lua_pushinteger(L, 0);
  404. }
  405. return 1;
  406. }
  407. /**
  408. 获取rssi
  409. @api mobile.rssi()
  410. @return int 当前rssi值,若失败返回0. 范围 0 到 -114, 越小越好
  411. */
  412. static int l_mobile_rssi(lua_State* L) {
  413. luat_mobile_signal_strength_info_t info = {0};
  414. if (luat_mobile_get_signal_strength_info(&info) == 0) {
  415. lua_pushinteger(L, info.lte_signal_strength.rssi);
  416. }
  417. else {
  418. lua_pushinteger(L, 0);
  419. }
  420. return 1;
  421. }
  422. /**
  423. 获取rsrp,参考信号接收功率
  424. @api mobile.rsrp()
  425. @return int 当前rsrp值,若失败返回0. 取值范围: -44 ~ -140 ,值越大越好
  426. */
  427. static int l_mobile_rsrp(lua_State* L) {
  428. luat_mobile_signal_strength_info_t info = {0};
  429. if (luat_mobile_get_signal_strength_info(&info) == 0) {
  430. lua_pushinteger(L, info.lte_signal_strength.rsrp);
  431. }
  432. else {
  433. lua_pushinteger(L, 0);
  434. }
  435. return 1;
  436. }
  437. /**
  438. 获取rsrq,参考信号发送功率
  439. @api mobile.rsrq()
  440. @return int 当前rsrq值,若失败返回0. 取值范围: -3 ~ -19.5 ,值越大越好
  441. */
  442. static int l_mobile_rsrq(lua_State* L) {
  443. luat_mobile_signal_strength_info_t info = {0};
  444. if (luat_mobile_get_signal_strength_info(&info) == 0) {
  445. lua_pushinteger(L, info.lte_signal_strength.rsrq);
  446. }
  447. else {
  448. lua_pushinteger(L, 0);
  449. }
  450. return 1;
  451. }
  452. /**
  453. 获取snr,信噪比
  454. @api mobile.snr()
  455. @return int 当前snq值,若失败返回0.范围 0 - 30, 越大越好
  456. */
  457. static int l_mobile_snr(lua_State* L) {
  458. luat_mobile_signal_strength_info_t info = {0};
  459. if (luat_mobile_get_signal_strength_info(&info) == 0) {
  460. lua_pushinteger(L, info.lte_signal_strength.snr);
  461. }
  462. else {
  463. lua_pushinteger(L, 0);
  464. }
  465. return 1;
  466. }
  467. /**
  468. 获取当前服务小区的ECI(E-UTRAN Cell Identifier)
  469. @api mobile.eci()
  470. @return int 当前eci值,若失败返回-1
  471. */
  472. static int l_mobile_eci(lua_State* L) {
  473. uint32_t eci;
  474. if (luat_mobile_get_service_cell_identifier(&eci) == 0) {
  475. lua_pushinteger(L, eci);
  476. }
  477. else {
  478. lua_pushinteger(L, -1);
  479. }
  480. return 1;
  481. }
  482. /**
  483. 获取当前服务小区的TAC或者LAC
  484. @api mobile.tac()
  485. @return int 当前eci值,若失败返回-1. 如果尚未注册到网络,会返回0
  486. @usage
  487. -- 本API于 2023.7.9 新增
  488. */
  489. static int l_mobile_tac(lua_State* L) {
  490. uint32_t tac;
  491. if (luat_mobile_get_service_tac_or_lac(&tac) == 0) {
  492. lua_pushinteger(L, tac);
  493. }
  494. else {
  495. lua_pushinteger(L, -1);
  496. }
  497. return 1;
  498. }
  499. /**
  500. 获取当前服务小区的eNBID(eNodeB Identifier)
  501. @api mobile.enbid()
  502. @return int 当前enbid值,若失败返回-1
  503. */
  504. static int l_mobile_enbid(lua_State* L) {
  505. uint32_t eci;
  506. if (luat_mobile_get_service_cell_identifier(&eci) == 0) {
  507. lua_pushinteger(L, eci>>8);
  508. }
  509. else {
  510. lua_pushinteger(L, -1);
  511. }
  512. return 1;
  513. }
  514. static inline uint16_t u162bcd(uint16_t src) {
  515. uint8_t high = (src >> 8) & 0xFF;
  516. uint8_t low = src & 0xFF;
  517. uint16_t dst = 0;
  518. dst += (low & 0x0F) + (low >> 4) * 10;
  519. dst += ((high & 0x0F) + (high >> 4) * 10) * 100;
  520. //LLOGD("src %04X dst %d", src, dst);
  521. return dst;
  522. }
  523. /**
  524. 获取当前服务小区更详细的信息
  525. @api mobile.scell()
  526. @return table 服务小区的信息
  527. @usage
  528. -- 本API于 2024.9.12 新增
  529. log.info("cell", json.encode(mobile.scell()))
  530. -- 返回值示例
  531. {
  532. "mnc": 11,
  533. "mcc": 460,
  534. "rssi": -78,
  535. "pci": 115,
  536. "rsrp": -107,
  537. "tac": 30005,
  538. "eci": 124045360,
  539. "cid": 124045360,
  540. "rsrq": -9,
  541. "snr": 15,
  542. "earfcn": 1850
  543. }
  544. */
  545. static int l_mobile_scell_extern_info(lua_State* L) {
  546. luat_mobile_scell_extern_info_t info = {0};
  547. int ret = 0;
  548. ret = luat_mobile_get_extern_service_cell_info(&info);
  549. if (ret) {
  550. return 0;
  551. }
  552. lua_newtable(L);
  553. // 驻网信息相关
  554. lua_pushinteger(L, u162bcd(info.mcc));
  555. lua_setfield(L, -2, "mcc");
  556. lua_pushinteger(L, u162bcd(info.mnc));
  557. lua_setfield(L, -2, "mnc");
  558. lua_pushinteger(L, info.earfcn);
  559. lua_setfield(L, -2, "earfcn");
  560. lua_pushinteger(L, info.pci);
  561. lua_setfield(L, -2, "pci");
  562. // 基站相关
  563. uint32_t eci = 0;
  564. uint32_t tac = 0;
  565. luat_mobile_get_service_cell_identifier(&eci);
  566. lua_pushinteger(L, eci);
  567. lua_setfield(L, -2, "eci");
  568. lua_pushinteger(L, eci);
  569. lua_setfield(L, -2, "cid");
  570. luat_mobile_get_service_tac_or_lac(&tac);
  571. lua_pushinteger(L, tac);
  572. lua_setfield(L, -2, "tac");
  573. // 信号强度相关的值
  574. luat_mobile_signal_strength_info_t sinfo = {0};
  575. luat_mobile_get_signal_strength_info(&sinfo);
  576. lua_pushinteger(L, sinfo.lte_signal_strength.snr);
  577. lua_setfield(L, -2, "snr");
  578. lua_pushinteger(L, sinfo.lte_signal_strength.rsrp);
  579. lua_setfield(L, -2, "rsrp");
  580. lua_pushinteger(L, sinfo.lte_signal_strength.rsrq);
  581. lua_setfield(L, -2, "rsrq");
  582. lua_pushinteger(L, sinfo.lte_signal_strength.rssi);
  583. lua_setfield(L, -2, "rssi");
  584. return 1;
  585. }
  586. /**
  587. 进出飞行模式
  588. @api mobile.flymode(index, enable)
  589. @int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
  590. @bool 是否设置为飞行模式,true为设置, false为退出,可选
  591. @return bool 原飞行模式的状态
  592. */
  593. static int l_mobile_flymode(lua_State* L) {
  594. int index = luaL_optinteger(L, 1, 0);
  595. int flymode = luat_mobile_get_flymode(index);
  596. if (lua_isboolean(L, 2)) {
  597. luat_mobile_set_flymode(index, lua_toboolean(L, 2));
  598. }
  599. lua_pushboolean(L, flymode == 0 ? 0 : 1);
  600. return 1;
  601. }
  602. /**
  603. 配置基站同步时间开关,默认开启
  604. @api mobile.syncTime(enable)
  605. @bool 开启,true开启, false关闭, nil不设置
  606. @return bool 当前开关状态
  607. @usage
  608. mobile.syncTime() --获取当前开关状态
  609. mobile.syncTime(false) --关闭基站同步时间
  610. */
  611. static int l_mobile_sync_time(lua_State* L) {
  612. if (lua_isboolean(L, 1)) {
  613. luat_mobile_set_sync_time(lua_toboolean(L, 1));
  614. }
  615. lua_pushboolean(L, luat_mobile_get_sync_time());
  616. return 1;
  617. }
  618. /**
  619. 获取网络状态
  620. @api mobile.status()
  621. @return int 当前网络状态
  622. @usage
  623. -- 状态描述
  624. -- 0:网络未注册
  625. -- 1:网络已注册
  626. -- 2:正在搜网中
  627. -- 3:网络注册被拒绝
  628. -- 4:网络状态未知
  629. -- 5:漫游,且已注册
  630. -- 6:仅SMS可用
  631. -- 7:仅SMS可用,且漫游状态
  632. -- 8:仅紧急呼叫. 注意, 国内不支持此状态,模块也不支持紧急呼叫
  633. -- 不推荐使用本API判断联网状态, 建议使用socket.localIP()来判断
  634. */
  635. static int l_mobile_status(lua_State* L) {
  636. int LUAT_MOBILE_REGISTER_STATUS_E = luat_mobile_get_register_status();
  637. lua_pushinteger(L, LUAT_MOBILE_REGISTER_STATUS_E);
  638. return 1;
  639. }
  640. /**
  641. 获取基站信息
  642. @api mobile.getCellInfo()
  643. @return table 包含基站数据的数组
  644. @usage
  645. -- 注意: 从2023.06.20开始, 需要主动请求一次reqCellInfo才会有基站数据.
  646. --示例输出(原始数据是table, 下面是json格式化后的内容)
  647. --[[
  648. [
  649. {"rsrq":-10,"rssi":-55,"cid":124045360,"mnc":17,"pci":115,"earfcn":1850,"snr":15,"rsrp":-85,"mcc":1120,"tdd":0},
  650. {"pci":388,"rsrq":-11,"mnc":17,"earfcn":2452,"snr":5,"rsrp":-67,"mcc":1120,"cid":124045331},
  651. {"pci":100,"rsrq":-9,"mnc":17,"earfcn":75,"snr":17,"rsrp":-109,"mcc":1120,"cid":227096712}
  652. ]
  653. ]]
  654. mobile.reqCellInfo(60)
  655. -- 订阅
  656. sys.subscribe("CELL_INFO_UPDATE", function()
  657. log.info("cell", json.encode(mobile.getCellInfo()))
  658. end)
  659. -- 定期轮训式
  660. sys.taskInit(function()
  661. sys.wait(3000)
  662. while 1 do
  663. mobile.reqCellInfo(15)
  664. sys.waitUntil("CELL_INFO_UPDATE", 15000)
  665. log.info("cell", json.encode(mobile.getCellInfo()))
  666. end
  667. end)
  668. */
  669. static int l_mobile_get_cell_info(lua_State* L) {
  670. lua_newtable(L);
  671. luat_mobile_cell_info_t* info = luat_heap_malloc(sizeof(luat_mobile_cell_info_t));
  672. if (info == NULL) {
  673. LLOGE("out of memory when malloc cell_info");
  674. return 1;
  675. }
  676. int ret = luat_mobile_get_last_notify_cell_info(info);
  677. if (ret != 0) {
  678. LLOGI("none cell info found %d", ret);
  679. goto exit;
  680. }
  681. //LLOGD("cid %d neighbor %d", info->lte_service_info.cid, info->lte_neighbor_info_num);
  682. // 当前仅返回lte信息
  683. if (info->lte_info_valid == 0 || info->lte_service_info.cid == 0) {
  684. if (0 == luat_mobile_get_service_cell_identifier(&info->lte_service_info.cid) && info->lte_service_info.cid) {
  685. LLOGW("请先调用 mobile.reqCellInfo()!!");
  686. }
  687. else {
  688. LLOGI("lte cell info not found");
  689. }
  690. goto exit;
  691. }
  692. lua_newtable(L);
  693. lua_pushinteger(L, info->lte_service_info.pci);
  694. lua_setfield(L, -2, "pci");
  695. lua_pushinteger(L, info->lte_service_info.cid);
  696. lua_setfield(L, -2, "cid");
  697. lua_pushinteger(L, info->lte_service_info.earfcn);
  698. lua_setfield(L, -2, "earfcn");
  699. lua_pushinteger(L, info->lte_service_info.rsrp);
  700. lua_setfield(L, -2, "rsrp");
  701. lua_pushinteger(L, info->lte_service_info.rsrq);
  702. lua_setfield(L, -2, "rsrq");
  703. lua_pushinteger(L, info->lte_service_info.rssi);
  704. lua_setfield(L, -2, "rssi");
  705. lua_pushinteger(L, info->lte_service_info.is_tdd);
  706. lua_setfield(L, -2, "tdd");
  707. lua_pushinteger(L, info->lte_service_info.snr);
  708. lua_setfield(L, -2, "snr");
  709. lua_pushinteger(L, u162bcd(info->lte_service_info.mcc));
  710. lua_setfield(L, -2, "mcc");
  711. lua_pushinteger(L, u162bcd(info->lte_service_info.mnc));
  712. lua_setfield(L, -2, "mnc");
  713. lua_pushinteger(L, info->lte_service_info.tac);
  714. lua_setfield(L, -2, "tac");
  715. lua_pushinteger(L, info->lte_service_info.band);
  716. lua_setfield(L, -2, "band");
  717. lua_pushinteger(L, info->lte_service_info.ulbandwidth);
  718. lua_setfield(L, -2, "ulbandwidth");
  719. lua_pushinteger(L, info->lte_service_info.dlbandwidth);
  720. lua_setfield(L, -2, "dlbandwidth");
  721. lua_seti(L, -2, 1);
  722. if (info->lte_neighbor_info_num > 0) {
  723. for (size_t i = 0; i < info->lte_neighbor_info_num; i++)
  724. {
  725. lua_settop(L, 1);
  726. //LLOGD("add neighbor %d", i);
  727. lua_newtable(L);
  728. lua_pushinteger(L, info->lte_info[i].pci);
  729. lua_setfield(L, -2, "pci");
  730. lua_pushinteger(L, info->lte_info[i].cid);
  731. lua_setfield(L, -2, "cid");
  732. if (0x8850 == info->version)
  733. {
  734. lua_pushinteger(L, info->lte_info[i].rssi);
  735. lua_setfield(L, -2, "rssi");
  736. lua_pushinteger(L, info->lte_info[i].celltype);
  737. lua_setfield(L, -2, "celltype");
  738. lua_pushinteger(L, info->lte_info[i].bandwidth);
  739. lua_setfield(L, -2, "bandwidth");
  740. }
  741. lua_pushinteger(L, info->lte_info[i].earfcn);
  742. lua_setfield(L, -2, "earfcn");
  743. lua_pushinteger(L, info->lte_info[i].rsrp);
  744. lua_setfield(L, -2, "rsrp");
  745. lua_pushinteger(L, info->lte_info[i].rsrq);
  746. lua_setfield(L, -2, "rsrq");
  747. lua_pushinteger(L, u162bcd(info->lte_info[i].mcc));
  748. lua_setfield(L, -2, "mcc");
  749. lua_pushinteger(L, u162bcd(info->lte_info[i].mnc));
  750. lua_setfield(L, -2, "mnc");
  751. lua_pushinteger(L, info->lte_info[i].snr);
  752. lua_setfield(L, -2, "snr");
  753. lua_pushinteger(L, info->lte_info[i].tac);
  754. lua_setfield(L, -2, "tac");
  755. lua_seti(L, -2, i + 2);
  756. }
  757. }
  758. lua_settop(L, 1);
  759. exit:
  760. luat_heap_free(info);
  761. return 1;
  762. }
  763. /**
  764. 发起基站信息查询,含临近小区
  765. @api mobile.reqCellInfo(timeout)
  766. @int 超时时长,单位秒,默认15. 最少5, 最高60
  767. @return nil 无返回值
  768. @usage
  769. -- 参考 mobile.getCellInfo 函数
  770. */
  771. static int l_mobile_request_cell_info(lua_State* L) {
  772. int timeout = luaL_optinteger(L, 1, 15);
  773. if (timeout > 60)
  774. timeout = 60;
  775. else if (timeout < 5)
  776. timeout = 5;
  777. luat_mobile_get_cell_info_async(timeout);
  778. return 0;
  779. }
  780. /**
  781. 锁定/解锁小区,仅用于外场测试,没接触过的,或者生产环境中请勿使用
  782. @api mobile.lockCell(mode, earfcn, pci)
  783. @int 操作码 0删除优先的频点,1设置优先频点,2锁定小区,3解锁小区
  784. @int 下行频点
  785. @int phycellid
  786. @return bool 成功true 失败false
  787. @usage
  788. mobile.lockCell(2,1860,32) --锁定小区
  789. mobile.lockCell(3) --解锁小区
  790. */
  791. static int l_mobile_lock_cell(lua_State* L) {
  792. lua_pushboolean(L, !luat_mobile_lock_cell(luaL_optinteger(L, 1, 4), luaL_optinteger(L, 2, 0), luaL_optinteger(L, 3, 0)));
  793. return 1;
  794. }
  795. /**
  796. 重启协议栈
  797. @api mobile.reset()
  798. @return nil 无返回值
  799. @usage
  800. -- 重启LTE协议栈
  801. mobile.reset()
  802. */
  803. static int l_mobile_reset(lua_State* L) {
  804. luat_mobile_reset_stack();
  805. return 0;
  806. }
  807. /**
  808. 数据量流量处理
  809. @api mobile.dataTraffic(clearUplink, clearDownlink)
  810. @boolean 清空上行流量累计值,true清空,其他忽略
  811. @boolean 清空下行流量累计值,true清空,其他忽略
  812. @return int 上行流量GB
  813. @return int 上行流量B
  814. @return int 下行流量GB
  815. @return int 下行流量B
  816. @usage
  817. -- 获取上下行流量累计值
  818. -- 上行流量值Byte = uplinkGB * 1024 * 1024 * 1024 + uplinkB
  819. -- 下行流量值Byte = downlinkGB * 1024 * 1024 * 1024 + downlinkB
  820. local uplinkGB, uplinkB, downlinkGB, downlinkB = mobile.dataTraffic()
  821. -- 清空上下行流量累计值
  822. mobile.dataTraffic(true, true)
  823. -- 仅记录开机后的流量,复位/重启会归零
  824. */
  825. static int l_mobile_data_traffic(lua_State* L) {
  826. uint64_t uplink;
  827. uint64_t downlink;
  828. uint8_t clear_uplink = 0;
  829. uint8_t clear_downlink = 0;
  830. volatile uint32_t temp;
  831. if (LUA_TBOOLEAN == lua_type(L, 1)) {
  832. clear_uplink = lua_toboolean(L, 1);
  833. }
  834. if (LUA_TBOOLEAN == lua_type(L, 2)) {
  835. clear_downlink = lua_toboolean(L, 2);
  836. }
  837. luat_mobile_get_ip_data_traffic(&uplink, &downlink);
  838. if (clear_uplink || clear_downlink) {
  839. luat_mobile_clear_ip_data_traffic(clear_uplink, clear_downlink);
  840. }
  841. temp = (uint32_t)(uplink >> 30);
  842. lua_pushinteger(L, temp);
  843. temp = (((uint32_t)uplink) & 0x3FFFFFFF);
  844. lua_pushinteger(L, temp);
  845. temp = (uint32_t)(downlink >> 30);
  846. lua_pushinteger(L, temp);
  847. temp = (((uint32_t)downlink) & 0x3FFFFFFF);
  848. lua_pushinteger(L, temp);
  849. return 4;
  850. }
  851. /**
  852. 网络特殊配置
  853. @api mobile.config(item, value)
  854. @int 配置项目,看mobile.CONF_XXX
  855. @int 配置值,根据具体配置的item决定
  856. @return boolean 是否成功
  857. @usage
  858. --针对不同平台有不同的配置,谨慎使用,目前只有EC618/EC718系列
  859. -- EC618配置小区重选信号差值门限,不能大于15dbm,必须在飞行模式下才能用
  860. mobile.flymode(0,true)
  861. mobile.config(mobile.CONF_RESELTOWEAKNCELL, 15)
  862. mobile.config(mobile.CONF_STATICCONFIG, 1) --开启网络静态优化
  863. mobile.flymode(0,false)
  864. -- EC618设置SIM写入次数的统计
  865. -- 关闭统计
  866. mobile.config(mobile.CONF_SIM_WC_MODE, 0)
  867. -- 开启统计, 默认也是开启的.
  868. mobile.config(mobile.CONF_SIM_WC_MODE, 1)
  869. -- 读取统计值,异步, 需要通过系统消息SIM_IND获取
  870. sys.subscribe("SIM_IND", function(stats, value)
  871. log.info("SIM_IND", stats)
  872. if stats == "SIM_WC" then
  873. log.info("sim", "write counter", value)
  874. end
  875. end)
  876. mobile.config(mobile.CONF_SIM_WC_MODE, 2)
  877. -- 清空统计值
  878. mobile.config(mobile.CONF_SIM_WC_MODE, 3)
  879. */
  880. static int l_mobile_config(lua_State* L) {
  881. uint8_t item = luaL_optinteger(L, 1, 0);
  882. uint32_t value = luaL_optinteger(L, 2, 0);
  883. if (!item)
  884. {
  885. lua_pushboolean(L, 0);
  886. }
  887. else
  888. {
  889. lua_pushboolean(L, !luat_mobile_config(item, value));
  890. }
  891. return 1;
  892. }
  893. #include "luat_uart.h"
  894. #include "luat_zbuff.h"
  895. /**
  896. 获取当前使用/支持的band
  897. @api mobile.getBand(band, is_default)
  898. @zbuff 输出band
  899. @boolean true默认支持,false当前支持的,默认是false,当前是预留功能,不要写true
  900. @return boolean 成功返回true,失败放回false
  901. @usage
  902. local buff = zbuff.create(40)
  903. mobile.getBand(buff) --输出当前使用的band,band号放在buff内,buff[0],buff[1],buff[2] .. buff[buff:used() - 1]
  904. */
  905. static int l_mobile_get_band(lua_State* L) {
  906. luat_zbuff_t *buff = ((luat_zbuff_t *)luaL_checkudata(L, 1, LUAT_ZBUFF_TYPE));
  907. uint8_t total_num;
  908. int re;
  909. if (buff->len < 40)
  910. {
  911. __zbuff_resize(buff, 40);
  912. }
  913. if (lua_isboolean(L, 2) && lua_toboolean(L, 2))
  914. {
  915. re = luat_mobile_get_support_band(buff->addr, &total_num);
  916. }
  917. else
  918. {
  919. re = luat_mobile_get_band(buff->addr, &total_num);
  920. }
  921. buff->used = total_num;
  922. lua_pushboolean(L, !re);
  923. return 1;
  924. }
  925. /**
  926. 设置使用的band
  927. @api mobile.setBand(band, num)
  928. @zbuff 输入使用的band
  929. @int band数量
  930. @return boolean 成功返回true,失败放回false
  931. @usage
  932. local buff = zbuff.create(40)
  933. buff[0] = 3
  934. buff[1] = 5
  935. buff[2] = 8
  936. buff[3] = 40
  937. mobile.setBand(buff, 4) --设置使用的band一共4个,为3,5,8,40
  938. */
  939. static int l_mobile_set_band(lua_State* L) {
  940. luat_zbuff_t *buff = ((luat_zbuff_t *)luaL_checkudata(L, 1, LUAT_ZBUFF_TYPE));
  941. int num = luaL_optinteger(L, 2, 1);
  942. lua_pushboolean(L, !luat_mobile_set_band(buff->addr, num));
  943. return 1;
  944. }
  945. /**
  946. RF测试开关和配置
  947. @api mobile.nstOnOff(onoff, uart_id)
  948. @boolean true开启测试模式,false关闭
  949. @int 串口号
  950. @return nil 无返回值
  951. @usage
  952. mobile.nstOnOff(true, uart.VUART_0) --打开测试模式,并且用虚拟串口发送结果
  953. mobile.nstOnOff(false) --关闭测试模式
  954. */
  955. static int l_mobile_nst_test_onoff(lua_State* L) {
  956. luat_mobile_rf_test_mode(luaL_optinteger(L, 2, LUAT_VUART_ID_0), lua_toboolean(L, 1));
  957. return 0;
  958. }
  959. /**
  960. RF测试数据输入
  961. @api mobile.nstInput(data)
  962. @string or zbuff 用户从串口获取的数据,注意,当获取完所有数据后,需要再传一个nil来作为传输结束
  963. @return nil 无返回值
  964. @usage
  965. mobile.nstInput(uart_data)
  966. mobile.nstInput(nil)
  967. */
  968. static int l_mobile_nst_data_input(lua_State* L) {
  969. size_t len = 0;
  970. const char *buf = NULL;
  971. if(lua_isuserdata(L, 1))
  972. {
  973. luat_zbuff_t *buff = ((luat_zbuff_t *)luaL_checkudata(L, 1, LUAT_ZBUFF_TYPE));
  974. len = buff->used;
  975. buf = buff->addr;
  976. }
  977. else if (lua_isstring(L, 1))
  978. {
  979. buf = lua_tolstring(L, 1, &len);//取出字符串数据
  980. }
  981. luat_mobile_rf_test_input(buf, len);
  982. return 0;
  983. }
  984. /**
  985. 初始化内置默认虚拟卡功能(不可用)
  986. @api mobile.vsimInit()
  987. @return nil 无返回值
  988. @usage
  989. mobile.vsimInit()
  990. */
  991. static int l_mobile_init_vsim(lua_State* L) {
  992. luat_mobile_softsim_init_default();
  993. return 0;
  994. }
  995. /**
  996. 切换内置虚拟卡和外置实体卡,2024年8月13日启用,虚拟卡需要固件支持,否则切换后无网络,需要在飞行模式下切换,或者切换后重启协议栈
  997. @api mobile.vsimOnOff(enable)
  998. @bool 开启,true开启, false关闭
  999. @return nil 无返回值
  1000. @usage
  1001. mobile.vsimOnOff(true) --使用内置虚拟卡
  1002. mobile.vsimOnOff(false) --使用外置实体卡
  1003. */
  1004. static int l_mobile_vsim_onoff(lua_State* L) {
  1005. if (lua_isboolean(L, 1)) {
  1006. luat_mobile_softsim_onoff(lua_toboolean(L, 1));
  1007. }
  1008. return 0;
  1009. }
  1010. /**
  1011. 初始化自定义APN列表,主要用于海外SIM卡
  1012. @api mobile.apnTableInit()
  1013. @return nil 无返回值
  1014. @usage
  1015. mobile.apnTableInit()
  1016. */
  1017. static int l_mobile_init_apn_table(lua_State* L) {
  1018. luat_mobile_init_auto_apn_by_plmn();
  1019. return 0;
  1020. }
  1021. /**
  1022. 往自定义APN列表添加一条APN信息,主要用于海外SIM卡
  1023. @api mobile.apnTableAdd(mcc, mnc, ip_type, protocol, apn_name, user_name, password)
  1024. @int MCC码,16进制BCD码
  1025. @int MNC码,16进制BCD码
  1026. @int 激活APN时的IP TYPE,1=IPV4 2=IPV6 3=IPV4V6,默认是1
  1027. @int 激活APN时,如果需要username和password,就要写鉴权协议类型,1~3,默认3,代表1和2都尝试一下。不需要鉴权的写0
  1028. @string APN name,不能为空
  1029. @string APN的username
  1030. @string APN的password
  1031. @return nil 无返回值
  1032. @usage
  1033. mobile.apnTableInit() -- 先初始化,必须放在SIM卡识别完成前加入,最好就是写在开头
  1034. mobile.apnTableAdd(0x460,0x00,3,0,"cmiot","","") -- 单独添加一条APN信息,必须放在SIM卡识别完成前加入,最好就是写在开头,移动公网卡设置APN为cmiot(一般不用设置,这里只是举个例子)
  1035. */
  1036. static int l_mobile_add_apn_table(lua_State* L) {
  1037. size_t name_len = 0;
  1038. size_t user_len = 0;
  1039. size_t password_len = 0;
  1040. uint16_t mcc = luaL_optinteger(L, 1, 0x460);
  1041. uint16_t mnc = luaL_optinteger(L, 2, 0);
  1042. uint8_t ip_type = luaL_optinteger(L, 3, 3);
  1043. uint8_t protocol = luaL_optinteger(L, 4, 3);
  1044. const char* name = luaL_checklstring(L, 5, &name_len);
  1045. const char* user = luaL_optlstring(L, 6, "", &user_len);
  1046. const char* password = luaL_optlstring(L, 7, "", &password_len);
  1047. luat_mobile_add_auto_apn_item(mcc, mnc, ip_type, protocol, name, name_len, user, user_len, password, password_len, 1);
  1048. return 0;
  1049. }
  1050. /**
  1051. 打印自定义APN列表里的一条信息,在没有拿到卡的情况下,测试一下对应的APN信息是否和运营商提供的匹配
  1052. @api mobile.apnTablePrint(mcc, mnc)
  1053. @int MCC码,16进制BCD码
  1054. @int MNC码,16进制BCD码
  1055. @return nil 无返回值
  1056. @usage
  1057. mobile.apnTableInit()
  1058. mobile.apnTablePrint(0x202, 0x01)
  1059. */
  1060. static int l_mobile_print_apn_table(lua_State* L) {
  1061. uint16_t mcc = luaL_optinteger(L, 1, 0x460);
  1062. uint16_t mnc = luaL_optinteger(L, 2, 0);
  1063. luat_mobile_print_apn_by_mcc_mnc(mcc, mnc);
  1064. return 0;
  1065. }
  1066. #include "rotable2.h"
  1067. static const rotable_Reg_t reg_mobile[] = {
  1068. {"status", ROREG_FUNC(l_mobile_status)},
  1069. {"imei", ROREG_FUNC(l_mobile_imei)},
  1070. {"imsi", ROREG_FUNC(l_mobile_imsi)},
  1071. {"sn", ROREG_FUNC(l_mobile_sn)},
  1072. {"iccid", ROREG_FUNC(l_mobile_iccid)},
  1073. {"number", ROREG_FUNC(l_mobile_number)},
  1074. {"muid", ROREG_FUNC(l_mobile_muid)},
  1075. {"apn", ROREG_FUNC(l_mobile_apn)},
  1076. {"ipv6", ROREG_FUNC(l_mobile_ipv6)},
  1077. {"csq", ROREG_FUNC(l_mobile_csq)},
  1078. {"rssi", ROREG_FUNC(l_mobile_rssi)},
  1079. {"rsrq", ROREG_FUNC(l_mobile_rsrq)},
  1080. {"rsrp", ROREG_FUNC(l_mobile_rsrp)},
  1081. {"snr", ROREG_FUNC(l_mobile_snr)},
  1082. {"eci", ROREG_FUNC(l_mobile_eci)},
  1083. {"tac", ROREG_FUNC(l_mobile_tac)},
  1084. {"scell", ROREG_FUNC(l_mobile_scell_extern_info)},
  1085. {"enbid", ROREG_FUNC(l_mobile_enbid)},
  1086. {"flymode", ROREG_FUNC(l_mobile_flymode)},
  1087. {"simid", ROREG_FUNC(l_mobile_simid)},
  1088. {"simPin", ROREG_FUNC(l_mobile_sim_pin)},
  1089. {"rtime", ROREG_FUNC(l_mobile_set_rrc_auto_release_time)},
  1090. {"setAuto", ROREG_FUNC(l_mobile_set_auto_work)},
  1091. {"getCellInfo", ROREG_FUNC(l_mobile_get_cell_info)},
  1092. {"reqCellInfo", ROREG_FUNC(l_mobile_request_cell_info)},
  1093. {"lockCell", ROREG_FUNC(l_mobile_lock_cell)},
  1094. {"reset", ROREG_FUNC(l_mobile_reset)},
  1095. {"dataTraffic", ROREG_FUNC(l_mobile_data_traffic)},
  1096. {"config", ROREG_FUNC(l_mobile_config)},
  1097. {"getBand", ROREG_FUNC(l_mobile_get_band)},
  1098. {"setBand", ROREG_FUNC(l_mobile_set_band)},
  1099. {"nstOnOff", ROREG_FUNC(l_mobile_nst_test_onoff)},
  1100. {"nstInput", ROREG_FUNC(l_mobile_nst_data_input)},
  1101. {"syncTime", ROREG_FUNC(l_mobile_sync_time)},
  1102. {"vsimInit", ROREG_FUNC(l_mobile_init_vsim)},
  1103. {"vsimOnOff", ROREG_FUNC(l_mobile_vsim_onoff)},
  1104. {"apnTableInit", ROREG_FUNC(l_mobile_init_apn_table)},
  1105. {"apnTableAdd", ROREG_FUNC(l_mobile_add_apn_table)},
  1106. {"apnTablePrint", ROREG_FUNC(l_mobile_print_apn_table)},
  1107. //@const UNREGISTER number 未注册
  1108. {"UNREGISTER", ROREG_INT(LUAT_MOBILE_STATUS_UNREGISTER)},
  1109. //@const REGISTERED number 已注册
  1110. {"REGISTERED", ROREG_INT(LUAT_MOBILE_STATUS_REGISTERED)},
  1111. //@const SEARCH number 正在搜索中
  1112. {"SEARCH", ROREG_INT(LUAT_MOBILE_STATUS_SEARCHING)},
  1113. //@const DENIED number 注册被拒绝
  1114. {"DENIED", ROREG_INT(LUAT_MOBILE_STATUS_DENIED)},
  1115. //@const UNKNOW number 未知
  1116. {"UNKNOW", ROREG_INT(LUAT_MOBILE_STATUS_UNKNOW)},
  1117. //@const REGISTERED_ROAMING number 已注册,漫游
  1118. {"REGISTERED_ROAMING", ROREG_INT(LUAT_MOBILE_STATUS_REGISTERED_ROAMING)},
  1119. //@const SMS_ONLY_REGISTERED number 已注册,仅SMS
  1120. {"SMS_ONLY_REGISTERED", ROREG_INT(LUAT_MOBILE_STATUS_SMS_ONLY_REGISTERED)},
  1121. //@const SMS_ONLY_REGISTERED_ROAMING number 已注册,漫游,仅SMS
  1122. {"SMS_ONLY_REGISTERED_ROAMING", ROREG_INT(LUAT_MOBILE_STATUS_SMS_ONLY_REGISTERED_ROAMING)},
  1123. //@const EMERGENCY_REGISTERED number 已注册,紧急服务
  1124. {"EMERGENCY_REGISTERED", ROREG_INT(LUAT_MOBILE_STATUS_EMERGENCY_REGISTERED)},
  1125. //@const CSFB_NOT_PREFERRED_REGISTERED number 已注册,非主要服务
  1126. {"CSFB_NOT_PREFERRED_REGISTERED", ROREG_INT(LUAT_MOBILE_STATUS_CSFB_NOT_PREFERRED_REGISTERED)},
  1127. //@const CSFB_NOT_PREFERRED_REGISTERED_ROAMING number 已注册,非主要服务,漫游
  1128. {"CSFB_NOT_PREFERRED_REGISTERED_ROAMING", ROREG_INT(LUAT_MOBILE_STATUS_CSFB_NOT_PREFERRED_REGISTERED_ROAMING)},
  1129. //@const CONF_RESELTOWEAKNCELL number 小区重选信号差值门限,需要飞行模式设置
  1130. {"CONF_RESELTOWEAKNCELL", ROREG_INT(MOBILE_CONF_RESELTOWEAKNCELL)},
  1131. //@const CONF_STATICCONFIG number 网络静态模式优化,需要飞行模式设置
  1132. {"CONF_STATICCONFIG", ROREG_INT(MOBILE_CONF_STATICCONFIG)},
  1133. //@const CONF_QUALITYFIRST number 网络切换以信号质量优先,需要飞行模式设置,0不开,1开启,2开启并加速切换,功耗会增加
  1134. {"CONF_QUALITYFIRST", ROREG_INT(MOBILE_CONF_QUALITYFIRST)},
  1135. //@const CONF_USERDRXCYCLE number LTE跳paging,需要飞行模式设置,谨慎使用,0是不设置,1~7增大或减小DrxCycle周期倍数,1:1/8倍 2:1/4倍 3:1/2倍 4:2倍 5:4倍 6:8倍 7:16倍,8~12配置固定的DrxCycle周期,仅当该周期大于网络分配的DrxCycle周期时该配置才会生效,8:320ms 9:640ms 10:1280ms 11:2560ms 12:5120ms
  1136. {"CONF_USERDRXCYCLE", ROREG_INT(MOBILE_CONF_USERDRXCYCLE)},
  1137. //@const CONF_T3324MAXVALUE number PSM模式中的T3324时间,单位S
  1138. {"CONF_T3324MAXVALUE", ROREG_INT(MOBILE_CONF_T3324MAXVALUE)},
  1139. //@const CONF_PSM_MODE number PSM模式开关,0关,1开
  1140. {"CONF_PSM_MODE", ROREG_INT(MOBILE_CONF_PSM_MODE)},
  1141. //@const CONF_CE_MODE number attach模式,0为EPS ONLY 2为混合,遇到IMSI detach脱网问题,设置为0,注意设置为EPS ONLY时会取消短信功能
  1142. {"CONF_CE_MODE", ROREG_INT(MOBILE_CONF_CE_MODE)},
  1143. //@const CONF_SIM_WC_MODE number SIM写入次数的配置和读取
  1144. {"CONF_SIM_WC_MODE", ROREG_INT(MOBILE_CONF_SIM_WC_MODE)},
  1145. //@const CONF_FAKE_CELL_BARTIME number 伪基站禁止接入的时间,取值为0时取消,0xffff永久
  1146. {"CONF_FAKE_CELL_BARTIME", ROREG_INT(MOBILE_CONF_FAKE_CELL_BARTIME)},
  1147. //@const CONF_RESET_TO_FACTORY number 删除已保存的协议栈参数,重启后会使用默认配置
  1148. {"CONF_RESET_TO_FACTORY", ROREG_INT(MOBILE_CONF_RESET_TO_FACTORY)},
  1149. //@const CONF_USB_ETHERNET number 蜂窝网络模块的usb以太网卡控制,bit0开关1,开0关,bit1模式1NAT,0独立IP(在usb以太网卡开启前可以修改,开启过就不行),bit2协议1ECM,0RNDIS,飞行模式里设置
  1150. {"CONF_USB_ETHERNET", ROREG_INT(MOBILE_CONF_USB_ETHERNET)},
  1151. //@const CONF_DISABLE_NCELL_MEAS number 关闭邻区测量 1关,0开,除了功耗测试外不建议使用
  1152. {"CONF_DISABLE_NCELL_MEAS", ROREG_INT(MOBILE_CONF_DISABLE_NCELL_MEAS)},
  1153. //@const CONF_MAX_TX_POWER number 设置最大发射功率,0~23,必须在每次RRC=1时调用,RRC=0后会自动清除配置
  1154. {"CONF_MAX_TX_POWER", ROREG_INT(MOBILE_CONF_MAX_TX_POWER)},
  1155. //@const PIN_VERIFY number 验证PIN码操作
  1156. {"PIN_VERIFY", ROREG_INT(LUAT_SIM_PIN_VERIFY)},
  1157. //@const PIN_CHANGE number 更换PIN码操作
  1158. {"PIN_CHANGE", ROREG_INT(LUAT_SIM_PIN_CHANGE)},
  1159. //@const PIN_ENABLE number 使能PIN码验证
  1160. {"PIN_ENABLE", ROREG_INT(LUAT_SIM_PIN_ENABLE)},
  1161. //@const PIN_DISABLE number 关闭PIN码验证
  1162. {"PIN_DISABLE", ROREG_INT(LUAT_SIM_PIN_DISABLE)},
  1163. //@const PIN_UNBLOCK number 解锁PIN码
  1164. {"PIN_UNBLOCK", ROREG_INT(LUAT_SIM_PIN_UNBLOCK)},
  1165. {NULL, ROREG_INT(0)}
  1166. };
  1167. LUAMOD_API int luaopen_mobile( lua_State *L ) {
  1168. luat_newlib2(L, reg_mobile);
  1169. return 1;
  1170. }
  1171. static int l_mobile_event_handle(lua_State* L, void* ptr) {
  1172. LUAT_MOBILE_EVENT_E event;
  1173. uint8_t index;
  1174. uint8_t status;
  1175. int ret;
  1176. rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1);
  1177. event = msg->arg1;
  1178. index = msg->arg2 >> 8;
  1179. status = msg->arg2 & 0xFF;
  1180. // luat_mobile_cell_info_t cell_info;
  1181. // luat_mobile_signal_strength_info_t signal_info;
  1182. // uint8_t csq, i;
  1183. // char imsi[20];
  1184. // char iccid[24] = {0};
  1185. if (lua_getglobal(L, "sys_pub") != LUA_TFUNCTION) {
  1186. return 0;
  1187. };
  1188. switch(event)
  1189. {
  1190. case LUAT_MOBILE_EVENT_CFUN:
  1191. break;
  1192. case LUAT_MOBILE_EVENT_SIM:
  1193. /*
  1194. @sys_pub mobile
  1195. sim卡状态变化
  1196. SIM_IND
  1197. @usage
  1198. sys.subscribe("SIM_IND", function(status, value)
  1199. -- status的取值有:
  1200. -- RDY SIM卡就绪, value为nil
  1201. -- NORDY 无SIM卡, value为nil
  1202. -- SIM_PIN 需要输入PIN, value为nil
  1203. -- GET_NUMBER 获取到电话号码(不一定有值), value为nil
  1204. -- SIM_WC SIM卡的写入次数统计,掉电归0, value为统计值
  1205. log.info("sim status", status, value)
  1206. end)
  1207. */
  1208. switch (status)
  1209. {
  1210. case LUAT_MOBILE_SIM_READY:
  1211. lua_pushstring(L, "SIM_IND");
  1212. lua_pushstring(L, "RDY");
  1213. lua_call(L, 2, 0);
  1214. break;
  1215. case LUAT_MOBILE_NO_SIM:
  1216. lua_pushstring(L, "SIM_IND");
  1217. lua_pushstring(L, "NORDY");
  1218. lua_call(L, 2, 0);
  1219. break;
  1220. case LUAT_MOBILE_SIM_NEED_PIN:
  1221. lua_pushstring(L, "SIM_IND");
  1222. lua_pushstring(L, "SIM_PIN");
  1223. lua_call(L, 2, 0);
  1224. break;
  1225. case LUAT_MOBILE_SIM_NUMBER:
  1226. lua_pushstring(L, "SIM_IND");
  1227. lua_pushstring(L, "GET_NUMBER");
  1228. lua_call(L, 2, 0);
  1229. break;
  1230. case LUAT_MOBILE_SIM_WC:
  1231. lua_pushstring(L, "SIM_IND");
  1232. lua_pushstring(L, "SIM_WC");
  1233. uint32_t tmp = (uint32_t)ptr;
  1234. lua_pushinteger(L, tmp);
  1235. lua_call(L, 3, 0);
  1236. break;
  1237. default:
  1238. break;
  1239. }
  1240. break;
  1241. case LUAT_MOBILE_EVENT_REGISTER_STATUS:
  1242. break;
  1243. case LUAT_MOBILE_EVENT_CELL_INFO:
  1244. switch (status)
  1245. {
  1246. case LUAT_MOBILE_CELL_INFO_UPDATE:
  1247. /*
  1248. @sys_pub mobile
  1249. 基站数据已更新
  1250. CELL_INFO_UPDATE
  1251. @usage
  1252. -- 订阅式
  1253. sys.subscribe("CELL_INFO_UPDATE", function()
  1254. log.info("cell", json.encode(mobile.getCellInfo()))
  1255. end)
  1256. */
  1257. lua_pushstring(L, "CELL_INFO_UPDATE");
  1258. lua_call(L, 1, 0);
  1259. break;
  1260. case LUAT_MOBILE_SERVICE_CELL_UPDATE:
  1261. /*
  1262. @sys_pub mobile
  1263. 服务小区额外信息更新
  1264. SCELL_INFO
  1265. @usage
  1266. -- 订阅式
  1267. sys.subscribe("SCELL_INFO", function()
  1268. log.info("service cell", mobile.scell()))
  1269. end)
  1270. */
  1271. lua_pushstring(L, "SCELL_INFO");
  1272. lua_call(L, 1, 0);
  1273. default:
  1274. break;
  1275. }
  1276. break;
  1277. case LUAT_MOBILE_EVENT_PDP:
  1278. LLOGD("cid%d, state%d", index, status);
  1279. break;
  1280. case LUAT_MOBILE_EVENT_NETIF:
  1281. switch (status)
  1282. {
  1283. case LUAT_MOBILE_NETIF_LINK_ON:
  1284. LLOGD("NETIF_LINK_ON -> IP_READY");
  1285. /*
  1286. @sys_pub mobile
  1287. 已联网
  1288. IP_READY
  1289. @usage
  1290. -- 联网后会发一次这个消息
  1291. sys.subscribe("IP_READY", function(ip, adapter)
  1292. log.info("mobile", "IP_READY", ip, (adapter or -1) == socket.LWIP_GP)
  1293. end)
  1294. */
  1295. lua_pushstring(L, "IP_READY");
  1296. luat_ip_addr_t local_ip, net_mask, gate_way, ipv6;
  1297. #ifdef LUAT_USE_LWIP
  1298. ipv6.type = 0xff;
  1299. int ret = network_get_full_local_ip_info(NULL, NW_ADAPTER_INDEX_LWIP_GPRS, &local_ip, &net_mask, &gate_way, &ipv6);
  1300. #else
  1301. void* userdata = NULL;
  1302. network_adapter_info* info = network_adapter_fetch(NW_ADAPTER_INDEX_LWIP_GPRS, &userdata);
  1303. if (info == NULL)
  1304. ret = -1;
  1305. else
  1306. ret = info->get_local_ip_info(&local_ip, &net_mask, &gate_way, userdata);
  1307. #endif
  1308. if (ret == 0) {
  1309. #ifdef LUAT_USE_LWIP
  1310. lua_pushfstring(L, "%s", ipaddr_ntoa(&local_ip));
  1311. #else
  1312. lua_pushfstring(L, "%d.%d.%d.%d", (local_ip.ipv4 >> 24) & 0xFF, (local_ip.ipv4 >> 16) & 0xFF, (local_ip.ipv4 >> 8) & 0xFF, (local_ip.ipv4 >> 0) & 0xFF);
  1313. #endif
  1314. }
  1315. else {
  1316. lua_pushliteral(L, "0.0.0.0");
  1317. }
  1318. lua_pushinteger(L, NW_ADAPTER_INDEX_LWIP_GPRS);
  1319. lua_call(L, 3, 0);
  1320. break;
  1321. case LUAT_MOBILE_NETIF_LINK_OFF:
  1322. LLOGD("NETIF_LINK_OFF -> IP_LOSE");
  1323. /*
  1324. @sys_pub mobile
  1325. 已断网
  1326. IP_LOSE
  1327. @usage
  1328. -- 断网后会发一次这个消息
  1329. sys.subscribe("IP_LOSE", function(adapter)
  1330. log.info("mobile", "IP_LOSE", (adapter or -1) == socket.LWIP_GP)
  1331. end)
  1332. */
  1333. lua_pushstring(L, "IP_LOSE");
  1334. lua_pushinteger(L, NW_ADAPTER_INDEX_LWIP_GPRS);
  1335. lua_call(L, 2, 0);
  1336. break;
  1337. default:
  1338. break;
  1339. }
  1340. break;
  1341. case LUAT_MOBILE_EVENT_TIME_SYNC:
  1342. /*
  1343. @sys_pub mobile
  1344. 时间已经同步
  1345. NTP_UPDATE
  1346. @usage
  1347. -- 对于电信/移动的卡, 联网后,基站会下发时间,但联通卡不会,务必留意
  1348. sys.subscribe("NTP_UPDATE", function()
  1349. log.info("mobile", "time", os.date())
  1350. end)
  1351. */
  1352. LLOGD("TIME_SYNC %d", status);
  1353. lua_pushstring(L, "NTP_UPDATE");
  1354. lua_call(L, 1, 0);
  1355. break;
  1356. case LUAT_MOBILE_EVENT_CSCON:
  1357. // LLOGD("CSCON %d", status);
  1358. /*
  1359. @sys_pub mobile
  1360. RRC状态
  1361. CSCON
  1362. @usage
  1363. -- state 1 CONNECT 0 IDLE
  1364. sys.subscribe("CSCON", function(state)
  1365. log.info("mobile", "CSCON", state)
  1366. end)
  1367. */
  1368. lua_pushstring(L, "CSCON");
  1369. lua_pushinteger(L, status);
  1370. lua_call(L, 2, 0);
  1371. break;
  1372. case LUAT_MOBILE_EVENT_BEARER:
  1373. LLOGD("bearer act %d, result %d",status, index);
  1374. break;
  1375. case LUAT_MOBILE_EVENT_SMS:
  1376. switch(status)
  1377. {
  1378. case LUAT_MOBILE_SMS_READY:
  1379. LLOGI("sim%d sms ready", index);
  1380. break;
  1381. case LUAT_MOBILE_NEW_SMS:
  1382. break;
  1383. case LUAT_MOBILE_SMS_SEND_DONE:
  1384. break;
  1385. case LUAT_MOBILE_SMS_ACK:
  1386. break;
  1387. }
  1388. break;
  1389. case LUAT_MOBILE_EVENT_IMS_REGISTER_STATUS:
  1390. LLOGD("ims reg state %d", status);
  1391. break;
  1392. case LUAT_MOBILE_EVENT_CC:
  1393. LLOGD("LUAT_MOBILE_EVENT_CC status %d",status);
  1394. /*
  1395. @sys_pub mobile
  1396. 通话状态变化
  1397. CC_IND
  1398. @usage
  1399. sys.subscribe("CC_IND", function(status, value)
  1400. log.info("cc status", status, value)
  1401. end)
  1402. */
  1403. switch(status){
  1404. case LUAT_MOBILE_CC_READY:
  1405. LLOGD("LUAT_MOBILE_CC_READY");
  1406. lua_pushstring(L, "CC_IND");
  1407. lua_pushstring(L, "READY");
  1408. lua_call(L, 2, 0);
  1409. break;
  1410. case LUAT_MOBILE_CC_INCOMINGCALL:
  1411. lua_pushstring(L, "CC_IND");
  1412. lua_pushstring(L, "INCOMINGCALL");
  1413. lua_call(L, 2, 0);
  1414. break;
  1415. case LUAT_MOBILE_CC_CALL_NUMBER:
  1416. // lua_pushstring(L, "CC_IND");
  1417. // lua_pushstring(L, "CALL_NUMBER");
  1418. // lua_call(L, 2, 0);
  1419. break;
  1420. case LUAT_MOBILE_CC_CONNECTED_NUMBER:
  1421. // lua_pushstring(L, "CC_IND");
  1422. // lua_pushstring(L, "CONNECTED_NUMBER");
  1423. // lua_call(L, 2, 0);
  1424. break;
  1425. case LUAT_MOBILE_CC_CONNECTED:
  1426. lua_pushstring(L, "CC_IND");
  1427. lua_pushstring(L, "CONNECTED");
  1428. lua_call(L, 2, 0);
  1429. break;
  1430. case LUAT_MOBILE_CC_DISCONNECTED:
  1431. lua_pushstring(L, "CC_IND");
  1432. lua_pushstring(L, "DISCONNECTED");
  1433. lua_call(L, 2, 0);
  1434. break;
  1435. case LUAT_MOBILE_CC_SPEECH_START:
  1436. lua_pushstring(L, "CC_IND");
  1437. lua_pushstring(L, "SPEECH_START");
  1438. lua_call(L, 2, 0);
  1439. break;
  1440. case LUAT_MOBILE_CC_MAKE_CALL_OK:
  1441. lua_pushstring(L, "CC_IND");
  1442. lua_pushstring(L, "MAKE_CALL_OK");
  1443. lua_call(L, 2, 0);
  1444. break;
  1445. case LUAT_MOBILE_CC_MAKE_CALL_FAILED:
  1446. lua_pushstring(L, "CC_IND");
  1447. lua_pushstring(L, "MAKE_CALL_FAILED");
  1448. lua_call(L, 2, 0);
  1449. break;
  1450. case LUAT_MOBILE_CC_ANSWER_CALL_DONE:
  1451. lua_pushstring(L, "CC_IND");
  1452. lua_pushstring(L, "ANSWER_CALL_DONE");
  1453. lua_call(L, 2, 0);
  1454. break;
  1455. case LUAT_MOBILE_CC_HANGUP_CALL_DONE:
  1456. lua_pushstring(L, "CC_IND");
  1457. lua_pushstring(L, "HANGUP_CALL_DONE");
  1458. lua_call(L, 2, 0);
  1459. break;
  1460. case LUAT_MOBILE_CC_LIST_CALL_RESULT:
  1461. lua_pushstring(L, "CC_IND");
  1462. lua_pushstring(L, "LIST_CALL_RESULT");
  1463. lua_call(L, 2, 0);
  1464. break;
  1465. case LUAT_MOBILE_CC_PLAY:// 最先
  1466. lua_pushstring(L, "CC_IND");
  1467. lua_pushstring(L, "PLAY");
  1468. lua_call(L, 2, 0);
  1469. break;
  1470. }
  1471. break;
  1472. default:
  1473. break;
  1474. }
  1475. return 0;
  1476. }
  1477. void luat_mobile_event_cb(LUAT_MOBILE_EVENT_E event, uint8_t index, uint8_t status, void* ptr) {
  1478. #if defined LUAT_USE_VOLTE
  1479. switch (event){
  1480. case LUAT_MOBILE_EVENT_CC:
  1481. switch(status){
  1482. case LUAT_MOBILE_CC_SPEECH_START:
  1483. luat_cc_start_speech(index+1);
  1484. break;
  1485. case LUAT_MOBILE_CC_PLAY:
  1486. luat_cc_play_tone(index);
  1487. break;
  1488. }
  1489. break;
  1490. default:
  1491. break;
  1492. }
  1493. #endif
  1494. rtos_msg_t msg = {
  1495. .handler = l_mobile_event_handle,
  1496. .arg1 = event,
  1497. .arg2 = (index << 8) + status ,
  1498. .ptr = ptr
  1499. };
  1500. luat_msgbus_put(&msg, 0);
  1501. }