Просмотр исходного кода

add: 添加实用版的mobile库,对接Air780E

Wendal Chen 3 лет назад
Родитель
Сommit
36776ffa90
2 измененных файлов с 647 добавлено и 116 удалено
  1. 246 93
      components/mobile/luat_lib_mobile.c
  2. 401 23
      components/mobile/luat_mobile.h

+ 246 - 93
components/mobile/luat_lib_mobile.c

@@ -14,85 +14,183 @@
 #include "luat_log.h"
 
 /**
-获取或设置IMEI
-@api mobile.imei(index, newvalue)
+获取IMEI
+@api mobile.imei(index)
 @int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
-@string 新的IMEI. 不填就是获取IMEI, 填了就是设置IMEI, 是否支持设置取决于底层实现.
-@return string 当前的IMEI值
+@return string 当前的IMEI值,若失败返回nil
  */
 static int l_mobile_imei(lua_State* L) {
     char buff[24] = {0};
-    size_t len = 0;
-    size_t wlen = 0;
+    // size_t len = 0;
+    // size_t wlen = 0;
     int ret = 0;
     int index = luaL_optinteger(L, 1, 0);
-    luat_mobile_get_imei(index, buff, &len);
-    if (lua_isstring(L, 2)) {
-        const char* wbuff = luaL_checklstring(L, 2, &wlen);
-        if (wlen >= 15) {
-            ret = luat_mobile_set_imei(index, wbuff, wlen);
-            LLOGI("IMEI write %d %s ret %d", index, wbuff, ret);
-        }
-    }
-    if (len > 0)
-        lua_pushlstring(L, buff, len);
+    ret = luat_mobile_get_imei(index, buff, 24);
+    // if (lua_isstring(L, 2)) {
+    //     const char* wbuff = luaL_checklstring(L, 2, &wlen);
+    //     if (wlen >= 15) {
+    //         ret = luat_mobile_set_imei(index, wbuff, wlen);
+    //         LLOGI("IMEI write %d %s ret %d", index, wbuff, ret);
+    //     }
+    // }
+    if (ret > 0)
+        lua_pushlstring(L, buff, ret);
     else
         lua_pushnil(L);
     return 1;
 }
 
 /**
-获取或设置IMSI
-@api mobile.imsi(index, newvalue)
+获取IMSI
+@api mobile.imsi(index)
 @int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
-@string 新的IMSI. 不填就是获取IMSI, 填了就是设置IMSI, 是否支持设置取决于底层实现.
-@return string 当前的IMSI值
+@return string 当前的IMSI值,若失败返回nil
  */
 static int l_mobile_imsi(lua_State* L) {
     char buff[24] = {0};
-    size_t len = 0;
-    size_t wlen = 0;
+    // size_t len = 0;
+    // size_t wlen = 0;
     int ret = 0;
     int index = luaL_optinteger(L, 1, 0);
-    luat_mobile_get_imsi(index, buff, &len);
-    if (lua_isstring(L, 2)) {
-        const char* wbuff = luaL_checklstring(L, 2, &wlen);
-        if (wlen >= 15) {
-            ret = luat_mobile_set_imsi(index, wbuff, wlen);
-            LLOGI("IMSI write %d %s ret %d", index, wbuff, ret);
-        }
+    ret = luat_mobile_get_imsi(index, buff, 24);
+    // if (lua_isstring(L, 2)) {
+    //     const char* wbuff = luaL_checklstring(L, 2, &wlen);
+    //     if (wlen >= 1) {
+    //         ret = luat_mobile_set_imsi(index, wbuff, wlen);
+    //         LLOGI("IMSI write %d %s ret %d", index, wbuff, ret);
+    //     }
+    // }
+    if (ret > 0)
+        lua_pushlstring(L, buff, ret);
+    else
+        lua_pushnil(L);
+    return 1;
+}
+
+
+
+/**
+获取SN
+@api mobile.sn()
+@return string 当前的SN值,若失败返回nil
+ */
+static int l_mobile_sn(lua_State* L) {
+    char buff[24] = {0};
+    // size_t len = 0;
+    // size_t wlen = 0;
+    int ret = 0;
+    ret = luat_mobile_get_sn(buff, 24);
+    // if (lua_isstring(L, 1)) {
+    //     const char* wbuff = luaL_checklstring(L, 1, &wlen);
+    //     if (wlen >= 1) {
+    //         ret = luat_mobile_set_sn(wbuff, wlen);
+    //         LLOGI("SN write %d %s ret %d", index, wbuff, ret);
+    //     }
+    // }
+    if (ret > 0)
+        lua_pushlstring(L, buff, ret);
+    else
+        lua_pushnil(L);
+    return 1;
+}
+
+
+/**
+获取MUID
+@api mobile.muid()
+@return string 当前的MUID值,若失败返回nil
+ */
+static int l_mobile_muid(lua_State* L) {
+    char buff[24] = {0};
+    // size_t len = 0;
+    // size_t wlen = 0;
+    int ret = 0;
+    ret = luat_mobile_get_muid(buff, 24);
+    if (lua_isstring(L, 1)) {
+        // const char* wbuff = luaL_checklstring(L, 1, &wlen);
+        // if (wlen >= 15) {
+        //     ret = luat_mobile_set_muid(index, wbuff, wlen);
+        //     LLOGI("SN write %d %s ret %d", index, wbuff, ret);
+        // }
     }
-    if (len > 0)
-        lua_pushlstring(L, buff, len);
+    if (ret > 0)
+        lua_pushlstring(L, buff, ret);
+    else
+        lua_pushnil(L);
+    return 1;
+}
+
+
+/**
+获取或设置ICCID
+@api mobile.iccid(id)
+@int SIM卡的编号, 例如0, 1, 默认0
+@return string ICCID值,若失败返回nil
+ */
+static int l_mobile_iccid(lua_State* L) {
+    char buff[24] = {0};
+    // size_t len = 0;
+    // size_t wlen = 0;
+    int ret = 0;
+    int index = luaL_optinteger(L, 1, 0);
+    ret = luat_mobile_get_iccid(index, buff, 24);
+    if (ret > 0)
+        lua_pushlstring(L, buff, ret);
     else
         lua_pushnil(L);
     return 1;
 }
 
 
+/**
+获取当前SIM卡槽,或者切换卡槽
+@api mobile.simid(id)
+@int SIM卡的编号, 例如0, 1. 可选
+@return int 当前sim卡槽编号,若失败返回-1
+ */
+static int l_mobile_simid(lua_State* L) {
+    // char buff[24] = {0};
+    int ret = 0;
+    int id = 0;
+    if (lua_isinteger(L, 1)) {
+        ret = luat_mobile_set_sim_id(lua_tointeger(L, 1));
+        LLOGI("sim set to %d , ret %d", id, ret);
+    }
+    ret = luat_mobile_get_sim_id(&id);
+    if (ret == 0) {
+        lua_pushinteger(L, id);
+    }
+    else {
+        lua_pushinteger(L, -1);
+    }
+    return 1;
+}
+
 /**
 获取或设置APN
 @api mobile.apn(index, newvalue)
 @int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
-@string 新的APN. 不填就是获取APN, 填了就是设置IMSI, 是否支持设置取决于底层实现.
-@return string 当前的APN值
+@int cid, 默认0
+@string 新的APN. 不填就是获取APN, 填了就是设置APN, 是否支持设置取决于底层实现.
+@return string 当前的APN值,若失败返回nil
  */
 static int l_mobile_apn(lua_State* L) {
-    char buff[24] = {0};
-    size_t len = 0;
-    size_t wlen = 0;
+    char buff[36] = {0};
+    // size_t len = 0;
+    // size_t wlen = 0;
     int ret = 0;
     int index = luaL_optinteger(L, 1, 0);
-    luat_mobile_get_apn(index, buff, &len);
-    if (lua_isstring(L, 2)) {
-        const char* wbuff = luaL_checklstring(L, 2, &wlen);
-        if (wlen >= 15) {
-            ret = luat_mobile_set_apn(index, wbuff, wlen);
-            LLOGI("APN write %d %s ret %d", index, wbuff, ret);
-        }
-    }
-    if (len > 0)
-        lua_pushlstring(L, buff, len);
+    int cid = luaL_optinteger(L, 2, 0);
+    ret = luat_mobile_get_apn(index, cid, buff, 36);
+    // if (lua_isstring(L, 3)) {
+    //     const char* wbuff = luaL_checklstring(L, 3, &wlen);
+    //     if (wlen >= 15) {
+    //         ret = luat_mobile_set_apn(index, wbuff, wlen);
+    //         LLOGI("APN write %d %s ret %d", index, wbuff, ret);
+    //     }
+    // }
+    if (ret > 0)
+        lua_pushlstring(L, buff, ret);
     else
         lua_pushnil(L);
     return 1;
@@ -100,66 +198,81 @@ static int l_mobile_apn(lua_State* L) {
 
 /**
 获取csq
-@api mobile.csq(index)
-@int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
-@return int 当前CSQ值
+@return int 当前CSQ值, 若失败返回0
  */
 static int l_mobile_csq(lua_State* L) {
-    int index = luaL_optinteger(L, 1, 0);
-    int ret = luat_mobile_get_csq(index);
-    lua_pushinteger(L, ret);
+    // luat_mobile_signal_strength_info_t info = {0};
+    uint8_t csq = 0;
+    if (luat_mobile_get_signal_strength(&csq) == 0) {
+        lua_pushinteger(L, (int)csq);
+    }
+    else {
+        lua_pushinteger(L, 0);
+    }
     return 1;
 }
 
 /**
 获取rssi
-@api mobile.rssi(index)
-@int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
-@return int 当前rssi值
+@api mobile.rssi()
+@return int 当前rssi值,若失败返回0
  */
 static int l_mobile_rssi(lua_State* L) {
-    int index = luaL_optinteger(L, 1, 0);
-    int ret = luat_mobile_get_rssi(index);
-    lua_pushinteger(L, ret);
+    luat_mobile_signal_strength_info_t info = {0};
+    if (luat_mobile_get_signal_strength_info(&info) == 0) {
+        lua_pushinteger(L, info.lte_signal_strength.rssi);
+    }
+    else {
+        lua_pushinteger(L, 0);
+    }
     return 1;
 }
 
 /**
 获取rsrp
-@api mobile.rsrp(index)
-@int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
-@return int 当前rsrp值
+@api mobile.rsrp()
+@return int 当前rsrp值,若失败返回0
  */
 static int l_mobile_rsrp(lua_State* L) {
-    int index = luaL_optinteger(L, 1, 0);
-    int ret = luat_mobile_get_rsrp(index);
-    lua_pushinteger(L, ret);
+    luat_mobile_signal_strength_info_t info = {0};
+    if (luat_mobile_get_signal_strength_info(&info) == 0) {
+        lua_pushinteger(L, info.lte_signal_strength.rsrp);
+    }
+    else {
+        lua_pushinteger(L, 0);
+    }
     return 1;
 }
 
 /**
 获取rsrq
-@api mobile.rsrq(index)
-@int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
-@return int 当前rsrq值
+@api mobile.rsrq()
+@return int 当前rsrq值,若失败返回0
  */
 static int l_mobile_rsrq(lua_State* L) {
-    int index = luaL_optinteger(L, 1, 0);
-    int ret = luat_mobile_get_rsrp(index);
-    lua_pushinteger(L, ret);
+    luat_mobile_signal_strength_info_t info = {0};
+    if (luat_mobile_get_signal_strength_info(&info) == 0) {
+        lua_pushinteger(L, info.lte_signal_strength.rsrq);
+    }
+    else {
+        lua_pushinteger(L, 0);
+    }
     return 1;
 }
 
 /**
-获取snq
-@api mobile.snq(index)
-@int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
-@return int 当前snq值
+获取snr
+@api mobile.snr()
+@return int 当前snq值,若失败返回0
  */
-static int l_mobile_snq(lua_State* L) {
-    int index = luaL_optinteger(L, 1, 0);
-    int ret = luat_mobile_get_snq(index);
-    lua_pushinteger(L, ret);
+static int l_mobile_snr(lua_State* L) {
+    luat_mobile_signal_strength_info_t info = {0};
+    if (luat_mobile_get_signal_strength_info(&info) == 0) {
+        lua_pushinteger(L, info.lte_signal_strength.snr);
+    }
+    else {
+        lua_pushinteger(L, 0);
+    }
     return 1;
 }
 
@@ -167,30 +280,70 @@ static int l_mobile_snq(lua_State* L) {
 进出飞行模式
 @api mobile.flymode(index, enable)
 @int 编号,默认0. 在支持双卡的模块上才会出现0或1的情况
-@bool 是否设置为飞行模式,true为设置, false为退出
+@bool 是否设置为飞行模式,true为设置, false为退出,可选
 @return bool 原飞行模式的状态
  */
 static int l_mobile_flymode(lua_State* L) {
     int index = luaL_optinteger(L, 1, 0);
     int flymode = luat_mobile_get_flymode(index);
-    int mode = lua_toboolean(L, 2);
-    LLOGW("set flymode %s", mode == 0 ? "exit" : "entry");
-    luat_mobile_set_flymode(index, mode);
-    return 0;
+    if (lua_isboolean(L, 2)) {
+        luat_mobile_set_flymode(index, lua_toboolean(L, 2));
+    }
+    lua_pushboolean(L, flymode == 0 ? 0 : 1);
+    return 1;
+}
+
+/**
+获取网络状态
+@api mobile.status()
+@return int 当前网络状态
+ */
+static int l_mobile_status(lua_State* L) {
+    int LUAT_MOBILE_REGISTER_STATUS_E = luat_mobile_get_register_status();
+    lua_pushinteger(L, LUAT_MOBILE_REGISTER_STATUS_E);
+    return 1;
 }
 
 #include "rotable2.h"
 static const rotable_Reg_t reg_mobile[] = {
-    {"imei", ROREG_FUNC(l_mobile_imei)},
-    {"imsi", ROREG_FUNC(l_mobile_imsi)},
-    {"apn", ROREG_FUNC(l_mobile_apn)},
-    {"csq", ROREG_FUNC(l_mobile_csq)},
-    {"rssi", ROREG_FUNC(l_mobile_rssi)},
-    {"rsrq", ROREG_FUNC(l_mobile_rsrq)},
-    {"rsrp", ROREG_FUNC(l_mobile_rsrp)},
-    {"snq", ROREG_FUNC(l_mobile_snq)},
-    {"flymode", ROREG_FUNC(l_mobile_flymode)},
-    {NULL, ROREG_INT(0)}
+    {"status",      ROREG_FUNC(l_mobile_status)},
+    {"imei",        ROREG_FUNC(l_mobile_imei)},
+    {"imsi",        ROREG_FUNC(l_mobile_imsi)},
+    {"sn",          ROREG_FUNC(l_mobile_sn)},
+    {"iccid",       ROREG_FUNC(l_mobile_iccid)},
+    {"muid",        ROREG_FUNC(l_mobile_muid)},
+    {"apn",         ROREG_FUNC(l_mobile_apn)},
+    {"csq",         ROREG_FUNC(l_mobile_csq)},
+    {"rssi",        ROREG_FUNC(l_mobile_rssi)},
+    {"rsrq",        ROREG_FUNC(l_mobile_rsrq)},
+    {"rsrp",        ROREG_FUNC(l_mobile_rsrp)},
+    {"snr",         ROREG_FUNC(l_mobile_snr)},
+    {"flymode",     ROREG_FUNC(l_mobile_flymode)},
+    {"simid",       ROREG_FUNC(l_mobile_simid)},
+
+    // const UNREGISTER 未注册
+    {"UNREGISTER",                  ROREG_INT(LUAT_MOBILE_STATUS_UNREGISTER)},
+    // const REGISTERED 已注册
+    {"REGISTERED",                  ROREG_INT(LUAT_MOBILE_STATUS_REGISTERED)},
+    // const DENIED 注册被拒绝
+    {"DENIED",                      ROREG_INT(LUAT_MOBILE_STATUS_DENIED)},
+    // const UNKNOW 未知
+    {"UNKNOW",                      ROREG_INT(LUAT_MOBILE_STATUS_UNKNOW)},
+    // const REGISTERED_ROAMING 已注册,漫游
+    {"REGISTERED_ROAMING",          ROREG_INT(LUAT_MOBILE_STATUS_REGISTERED_ROAMING)},
+    // const SMS_ONLY_REGISTERED 已注册,仅SMS
+    {"SMS_ONLY_REGISTERED",         ROREG_INT(LUAT_MOBILE_STATUS_SMS_ONLY_REGISTERED)},
+    // const SMS_ONLY_REGISTERED_ROAMING 已注册,漫游,仅SMS
+    {"SMS_ONLY_REGISTERED_ROAMING", ROREG_INT(LUAT_MOBILE_STATUS_SMS_ONLY_REGISTERED_ROAMING)},
+    // const EMERGENCY_REGISTERED 已注册,紧急服务
+    {"EMERGENCY_REGISTERED",        ROREG_INT(LUAT_MOBILE_STATUS_EMERGENCY_REGISTERED)},
+    // const CSFB_NOT_PREFERRED_REGISTERED 已注册,非主要服务
+    {"CSFB_NOT_PREFERRED_REGISTERED",  ROREG_INT(LUAT_MOBILE_STATUS_CSFB_NOT_PREFERRED_REGISTERED)},
+    // const CSFB_NOT_PREFERRED_REGISTERED_ROAMING 已注册,非主要服务,漫游
+    {"CSFB_NOT_PREFERRED_REGISTERED_ROAMING",  ROREG_INT(LUAT_MOBILE_STATUS_CSFB_NOT_PREFERRED_REGISTERED_ROAMING)},
+    // const REGISTERED 已注册
+
+    {NULL,          ROREG_INT(0)}
 };
 
 LUAMOD_API int luaopen_mobile( lua_State *L ) {

+ 401 - 23
components/mobile/luat_mobile.h

@@ -1,28 +1,406 @@
-#pragma once
+/*
+ * Copyright (c) 2022 OpenLuat & AirM2M
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef __LUAT_MOBILE_H__
+#define __LUAT_MOBILE_H__
 
 #include "luat_base.h"
+/**
+ * @defgroup luatos_mobile 移动网络相关接口
+ * @{
+ */
+/**
+ * @brief 获取IMEI
+ * 
+ * @param sim_id sim位置,对于双卡双待的设备,选0或者1,其他设备随意
+ * @param buff[OUT] IMEI数据
+ * @param buf_len 用户传入缓存的大小,如果底层数据量大于buf_len,只会传出buf_len大小的数据
+ * @return int <= 0错误 >0实际传出的大小
+ */
+int luat_mobile_get_imei(int sim_id, char* buff, size_t buf_len);
+
+/**
+ * @brief 获取SN,并不一定存在
+ * 
+ * @param buff[OUT] SN数据
+ * @param buf_len 用户传入缓存的大小,如果底层数据量大于buf_len,只会传出buf_len大小的数据
+ * @return int <= 0错误 >0实际传出的大小
+ */
+int luat_mobile_get_sn(char* buff, size_t buf_len);
+
+/**
+ * @brief 获取MUID,并不一定存在
+ * 
+ * @param buff[OUT] MUID数据
+ * @param buf_len 用户传入缓存的大小,如果底层数据量大于buf_len,只会传出buf_len大小的数据
+ * @return int <= 0错误 >0实际传出的大小
+ */
+int luat_mobile_get_muid(char* buff, size_t buf_len);
+
+/**
+ * @brief 获取SIM卡的ICCID
+ * 
+ * @param sim_id sim位置,对于双卡双待的设备,选0或者1,其他设备随意
+ * @param buff[OUT] ICCID数据
+ * @param buf_len 用户传入缓存的大小,如果底层数据量大于buf_len,只会传出buf_len大小的数据
+ * @return int <= 0错误 >0实际传出的大小
+ */
+int luat_mobile_get_iccid(int sim_id, char* buff, size_t buf_len);
+
+/**
+ * @brief 获取SIM卡的IMSI
+ * 
+ * @param sim_id sim位置,对于双卡双待的设备,选0或者1,其他设备随意
+ * @param buff[OUT] IMSI数据
+ * @param buf_len 用户传入缓存的大小,如果底层数据量大于buf_len,只会传出buf_len大小的数据
+ * @return int <= 0错误 >0实际传出的大小
+ */
+int luat_mobile_get_imsi(int sim_id, char* buff, size_t buf_len);
+
+/**
+ * @brief 当前使用的SIM卡的位置,并不一定支持
+ * 
+ * @param id[OUT] sim位置,对于双卡双待的设备,输出0或者1,其他设备输出0
+ * @return int =0成功,其他失败
+ */
+int luat_mobile_get_sim_id(int *id);
 
-// 标识符, id类, 可读可写
-int luat_mobile_get_imei(int index, char* buff, size_t* len);
-int luat_mobile_get_muid(int index, char* buff, size_t* len);
-int luat_mobile_get_imsi(int index, char* buff, size_t* len);
-// int luat_mobile_get_sn(int index, char* buff, size_t* len);
-int luat_mobile_get_apn(int index, char* buff, size_t* len);
-
-int luat_mobile_set_imei(int index, const char* buff, size_t len);
-int luat_mobile_set_muid(int index, const char* buff, size_t len);
-int luat_mobile_set_imsi(int index, const char* buff, size_t len);
-// int luat_mobile_set_sn(int index, const char* buff, *size_t len);
-int luat_mobile_set_apn(int index, const char* buff, size_t len);
-
-// 信号,基站类, 基本上是可读不可写
-int luat_mobile_get_csq(int index);
-int luat_mobile_get_rssi(int index);
-int luat_mobile_get_rsrp(int index);
-int luat_mobile_get_rsrq(int index);
-int luat_mobile_get_snq(int index);
-// 更复杂的基站信息, 还是结构体吧, TODO
-
-// 进出飞行模式
+/**
+ * @brief 改变使用的SIM卡的位置,并不一定支持
+ * 
+ * @param id sim位置,对于双卡双待的设备,选0或者1,其他设备不支持
+ * @return int =0成功,其他失败
+ */
+int luat_mobile_set_sim_id(int id);
+
+/**
+ * @brief 获取配置的apn name,并不一定支持
+ * 
+ * @param sim_id sim位置,对于双卡双待的设备,选0或者1,其他设备随意
+ * @param cid cid位置 1~6
+ * @param buff[OUT] apn name
+ * @param buf_len 用户传入缓存的大小,如果底层数据量大于buf_len,只会传出buf_len大小的数据
+ * @return int <= 0错误 >0实际传出的大小
+ */
+int luat_mobile_get_apn(int sim_id, int cid, char* buff, size_t buf_len);
+
+/**
+ * @brief 获取默认CID的apn name,并不一定支持
+ * 
+ * @param sim_id sim位置,对于双卡双待的设备,选0或者1,其他设备随意
+ * @param buff[OUT] apn name 
+ * @param buf_len 用户传入缓存的大小,如果底层数据量大于buf_len,只会传出buf_len大小的数据
+ * @return int <= 0错误 >0实际传出的大小
+ */
+int luat_mobile_get_default_apn(int sim_id, char* buff, size_t buf_len);
+
+
+/**
+ * @brief 进出飞行模式
+ * 
+ * @param index sim位置,对于双卡双待的设备,选0或者1,其他设备随意
+ * @param mode 飞行模式,0进入,1退出
+ * @return int =0成功,其他失败
+ */
 int luat_mobile_set_flymode(int index, int mode);
+
+/**
+ * @brief 飞行模式当前状态
+ * 
+ * @param index sim位置,对于双卡双待的设备,选0或者1,其他设备随意
+ * @return int <0 异常 =0飞行模式 =1正常工作 =4射频关闭
+ */
 int luat_mobile_get_flymode(int index);
+
+/* -------------------------------------------------- cell info begin -------------------------------------------------- */
+#define LUAT_MOBILE_CELL_MAX_NUM 9
+
+typedef struct luat_mobile_gsm_service_cell_info
+{
+    int cid;        /**< Cell ID, (0 indicates information is not represent).*/
+    int mcc;        /**< This field should be ignored when cid is not present*/
+    int mnc;        /**< This field should be ignored when cid is not present*/
+    int lac;        /**< Location area code.(This field should be ignord when cid is not present). */
+    int arfcn;      /**< Absolute RF channel number. */
+    int bsic;       /**< Base station identity code. (0 indicates information is not present). */
+	int rssi;		/**< Receive signal strength, Value range: rxlev-111 for dbm format */
+}luat_mobile_gsm_service_cell_info_t;
+
+typedef struct luat_mobile_gsm_cell_info
+{
+    int cid;        /**Cell ID, (0 indicates information is not represent).*/
+    int mcc;        /**This field should be ignored when cid is not present*/
+    int mnc;        /**This field should be ignored when cid is not present*/
+    int lac;        /**Location area code.(This field should be ignord when cid is not present). */
+    int arfcn;      /**Absolute RF channel number. */
+    int bsic;       /**Base station identity code. (0 indicates information is not present). */
+	int rssi;		/**< Receive signal strength, Value range: rxlev-111 for dbm format */
+}luat_mobile_gsm_cell_info_t;
+
+typedef struct luat_mobile_lte_service_cell_info
+{
+    uint32_t cid;           /**<Cell ID, (0 indicates information is not represent).*/
+    uint16_t mcc;           /**This field should be ignored when cid is not present*/
+    uint16_t mnc;           /**This field should be ignored when cid is not present*/
+    uint16_t tac;           /**Tracing area code (This field should be ignored when cid is not present). */
+    uint16_t pci;           /**Physical cell ID. Range: 0 to 503. */
+    uint32_t earfcn;        /**E-UTRA absolute radio frequency channel number of the cell. RANGE: 0 TO 65535. */
+    int16_t rssi;		   /**< Receive signal strength, Value range: rsrp-140 for dbm format */
+	int16_t rsrp;
+	int16_t rsrq;
+	int16_t snr;
+	uint8_t is_tdd;
+	uint8_t band;
+	uint8_t ulbandwidth;
+	uint8_t dlbandwidth;
+}luat_mobile_lte_service_cell_info_t;
+
+typedef struct luat_mobile_lte_cell_info
+{
+	uint32_t cid;           /**<Cell ID, (0 indicates information is not represent).*/
+	uint16_t mcc;           /**This field should be ignored when cid is not present*/
+	uint16_t mnc;           /**This field should be ignored when cid is not present*/
+	uint16_t tac;           /**Tracing area code (This field should be ignored when cid is not present). */
+	uint16_t pci;           /**Physical cell ID. Range: 0 to 503. */
+    uint32_t earfcn;        /**E-UTRA absolute radio frequency channel number of the cell. RANGE: 0 TO 65535. */
+    int16_t rsrp;
+	int16_t rsrq;
+	int16_t snr;
+}luat_mobile_lte_cell_info_t;
+
+typedef struct luat_mobile_cell_info
+{
+    luat_mobile_gsm_service_cell_info_t gsm_service_info;
+    luat_mobile_gsm_cell_info_t    gsm_info[LUAT_MOBILE_CELL_MAX_NUM];    /**<   GSM cell information (Serving and neighbor. */
+    luat_mobile_lte_service_cell_info_t lte_service_info;
+    luat_mobile_lte_cell_info_t    lte_info[LUAT_MOBILE_CELL_MAX_NUM];    /**<   LTE cell information (Serving and neighbor). */
+    uint8_t                         gsm_info_valid;                         /**< Must be set to TRUE if gsm_info is being passed. */
+    uint8_t                         gsm_neighbor_info_num;                           /**< Must be set to the number of elements in entry*/
+    uint8_t                         lte_info_valid;                         /**< Must be set to TRUE if lte_info is being passed. */
+    uint8_t                     	lte_neighbor_info_num;                           /**< Must be set to the number of elements in entry*/
+}luat_mobile_cell_info_t;
+
+int luat_mobile_get_cell_info(luat_mobile_cell_info_t  *info);
+int luat_mobile_get_last_notify_cell_info(luat_mobile_cell_info_t  *info);
+
+
+typedef struct luat_mobile_gw_signal_strength_info
+{
+    int rssi;
+    int bitErrorRate;
+    int rscp;
+    int ecno;
+}luat_mobile_gw_signal_strength_info_t;
+
+typedef struct luat_mobile_lte_signal_strength_info
+{
+    int16_t rssi;		   /**< Receive signal strength, Value range: rsrp-140 for dbm format */
+	int16_t rsrp;
+	int16_t rsrq;
+	int16_t snr;
+}luat_mobile_lte_signal_strength_info_t;
+
+typedef struct luat_mobile_signal_strength_info
+{
+    luat_mobile_gw_signal_strength_info_t   gw_signal_strength;
+    luat_mobile_lte_signal_strength_info_t  lte_signal_strength;
+    uint8_t luat_mobile_gw_signal_strength_vaild;
+    uint8_t luat_mobile_lte_signal_strength_vaild;
+}luat_mobile_signal_strength_info_t;
+
+/**
+ * @brief 从RSSI转换到CSQ,RSSI只能作为天线口状态的一个参考,而不能作为LTE网络信号状态的参考
+ * 
+ * @param rssi RSSI值
+ * @return uint8_t CSQ值
+ */
+uint8_t luat_mobile_rssi_to_csq(int8_t rssi);
+
+/**
+ * @brief 获取当前移动网络信号状态详细信息
+ * 
+ * @param info 当前移动网络信号状态详细信息
+ * @return int =0成功,其他失败
+ */
+int luat_mobile_get_signal_strength_info(luat_mobile_signal_strength_info_t *info);
+
+/**
+ * @brief 获取CSQ值 CSQ从RSSI转换而来,只能作为天线口状态的一个参考,而不能作为LTE网络信号状态的参考
+ * 
+ * @param csq CSQ值
+ * @return int =0成功,其他失败
+ */
+int luat_mobile_get_signal_strength(uint8_t *csq);
+
+/**
+ * @brief 获取最近一次网络信号状态更新通知后的网络信号状态详细信息
+ * 
+ * @param info 网络信号状态详细信息
+ * @return int =0成功,其他失败
+ */
+int luat_mobile_get_last_notify_signal_strength_info(luat_mobile_signal_strength_info_t *info);
+
+/**
+ * @brief 获取最近一次网络信号状态更新通知后的CSQ值
+ * 
+ * @param info CSQ值
+ * @return int =0成功,其他失败
+ */
+int luat_mobile_get_last_notify_signal_strength(uint8_t *csq);
+/* --------------------------------------------------- cell info end --------------------------------------------------- */
+
+
+/* ------------------------------------------------ mobile status begin ----------------------------------------------- */
+/**
+ * @brief 网络状态及相关功能状态发生更换的消息
+ * 
+ */
+typedef enum LUAT_MOBILE_EVENT
+{
+	LUAT_MOBILE_EVENT_CFUN = 0, /**< CFUN消息 */
+	LUAT_MOBILE_EVENT_SIM, /**< SIM卡消息*/
+	LUAT_MOBILE_EVENT_REGISTER_STATUS,     /**< 移动网络注册消息*/
+	LUAT_MOBILE_EVENT_CELL_INFO, 	/**< 小区基站信息和网络信号变更消息*/
+	LUAT_MOBILE_EVENT_PDP, 	/**< PDP状态消息*/
+	LUAT_MOBILE_EVENT_NETIF, 	/**< internet状态*/
+	LUAT_MOBILE_EVENT_TIME_SYNC, 	/**< 通过基站同步时间完成*/
+	LUAT_MOBILE_EVENT_SMS, 	/**< 新短信消息*/
+	LUAT_MOBILE_EVENT_CSCON, /**< RRC状态,0 idle 1 active*/
+}LUAT_MOBILE_EVENT_E;
+
+typedef enum LUAT_MOBILE_CFUN_STATUS
+{
+	LUAT_MOBILE_CFUN_OFF = 0,
+	LUAT_MOBILE_CFUN_ON,
+	LUAT_MOBILE_CFUN_NO_RF = 4,
+}LUAT_MOBILE_CFUN_STATUS_E;
+
+typedef enum LUAT_MOBILE_SIM_STATUS
+{
+	LUAT_MOBILE_SIM_READY = 0,
+	LUAT_MOBILE_NO_SIM,
+	LUAT_MOBILE_SIM_NEED_PIN,
+}LUAT_MOBILE_SIM_STATUS_E;
+
+typedef enum LUAT_MOBILE_REGISTER_STATUS
+{
+	LUAT_MOBILE_STATUS_UNREGISTER,  /**< 网络未注册*/
+	LUAT_MOBILE_STATUS_REGISTERED,  /**< 网络已注册*/
+	LUAT_MOBILE_STATUS_DENIED,  	/**< 网络注册被拒绝,或者正在搜网中*/
+	LUAT_MOBILE_STATUS_UNKNOW,		/**< 网络状态未知*/
+	LUAT_MOBILE_STATUS_REGISTERED_ROAMING, 	/**< 网络已注册,漫游*/
+	LUAT_MOBILE_STATUS_SMS_ONLY_REGISTERED,
+	LUAT_MOBILE_STATUS_SMS_ONLY_REGISTERED_ROAMING,
+	LUAT_MOBILE_STATUS_EMERGENCY_REGISTERED,
+	LUAT_MOBILE_STATUS_CSFB_NOT_PREFERRED_REGISTERED,
+	LUAT_MOBILE_STATUS_CSFB_NOT_PREFERRED_REGISTERED_ROAMING,
+}LUAT_MOBILE_REGISTER_STATUS_E;
+
+typedef enum LUAT_MOBILE_CELL_INFO_STATUS
+{
+	LUAT_MOBILE_CELL_INFO_UPDATE = 0,	/**< 小区基站信息变更,只有设置了周期性搜索小区基站时才会有*/
+	LUAT_MOBILE_SIGNAL_UPDATE,			/**< 网络信号状态变更,但是不一定是有变化*/
+}LUAT_MOBILE_CELL_INFO_STATUS_E;
+
+typedef enum LUAT_MOBILE_PDP_STATUS
+{
+	LUAT_MOBILE_PDP_ACTIVED = 0,
+	LUAT_MOBILE_PDP_DEACTIVING,
+	LUAT_MOBILE_PDP_DEACTIVED,
+}LUAT_MOBILE_PDP_STATUS_E;
+
+typedef enum LUAT_MOBILE_NETIF_STATUS
+{
+	LUAT_MOBILE_NETIF_LINK_ON = 0, /**< 已联网*/
+	LUAT_MOBILE_NETIF_LINK_OFF,	/**< 断网*/
+	LUAT_MOBILE_NETIF_LINK_OOS,	/**< 失去网络连接,尝试恢复中,等同于LUAT_MOBILE_NETIF_LINK_OFF*/
+}LUAT_MOBILE_NETIF_STATUS_E;
+
+/**
+ * @brief 获取当前移动网络注册状态
+ * 
+ * @return 见@enum LUAT_MOBILE_REGISTER_STATUS_E
+ */
+LUAT_MOBILE_REGISTER_STATUS_E luat_mobile_get_register_status(void);
+
+/**
+ * @brief 网络状态及相关功能状态发生更换时的回调函数,event是消息,index是CID,SIM卡号之类的序号,status是变更后的状态或者更具体的ENUM
+ * 
+ */
+typedef void (*luat_mobile_event_callback_t)(LUAT_MOBILE_EVENT_E event, uint8_t index, uint8_t status);
+
+/**
+ * @brief 注册网络状态及相关功能状态发生更换时的回调函数
+ * 
+ * @param callback_fun 网络状态及相关功能状态发生更换时的回调函数
+ * @return int =0成功,其他失败
+ */
+int luat_mobile_event_register_handler(luat_mobile_event_callback_t callback_fun);
+
+/**
+ * @brief 注销网络状态及相关功能状态发生更换时的回调函数
+ * 
+ * @return int =0成功,其他失败
+ */
+int luat_mobile_event_deregister_handler(void);
+/* ------------------------------------------------- mobile status end ------------------------------------------------ */
+
+/**
+ * @brief 设置RRC自动释放时间,在RRC active(见LUAT_MOBILE_EVENT_CSCON)后经过一段时间在适当的时机释放RRC
+ * 
+ * @param s 超时时间,单位秒,如果为0则是关闭功能
+ * @note 没有在Air724上使用过AT*RTIME的,或者不明白RRC的含义,请不要使用RRC相关API
+ */
+void luat_mobile_set_rrc_auto_release_time(uint8_t s);
+
+/**
+ * @brief RRC自动释放暂停/恢复
+ * 
+ * @param onoff 1暂停 0恢复
+ * @note 没有在Air724上使用过AT*RTIME的,或者不明白RRC的含义,请不要使用RRC相关API
+ */
+void luat_mobile_rrc_auto_release_pause(uint8_t onoff);
+
+
+/**
+ * @brief RRC立刻释放一次,不能在luat_mobile_event_callback里使用
+ * @note 没有在Air724上使用过AT*RTIME的,或者不明白RRC的含义,请不要使用RRC相关API
+ */
+void luat_mobile_rrc_release_once(void);
+
+/**
+ * @brief 重新底层网络协议栈,本质是快速的进出飞行模式,注意和设置飞行模式是冲突的,一定时间内只能用一个。
+ * 
+ * @return int =0成功,其他失败
+ */
+int luat_mobile_reset_stack(void);
+
+/**
+ * @brief 设置周期性辅助工作,包括周期性搜索小区基站,SIM卡短时间脱离卡槽后周期性尝试恢复,这个功能和luat_mobile_reset_stack是有可能冲突的。所有功能默认都是关闭的
+ * 
+ * @param get_cell_period 周期性搜索小区基站的时间间隔,单位ms,这个会增加低功耗,尽量的长,或者写0关闭这个功能,用上面的手段搜索
+ * @param check_sim_period SIM卡短时间脱离卡槽后尝试恢复的时间间隔,单位ms,建议在5000~10000,或者写0,当SIM卡移除的消息上来后手动重启协议栈
+ * @param serach_cell_time 启动周期性搜索小区基站后,每次搜索的最大时间,单位s,1~8
+ * @return int 
+ */
+int luat_mobile_set_period_work(uint32_t get_cell_period, uint32_t check_sim_period, uint8_t serach_cell_time);
+/** @}*/
+#endif