return ERRCODE_SUCC;
}
+static uint32_t AT_cat1_reset_network(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
+{
+ UNUSED(strCommonCmd);
+ printf("CAT1TEST ATCMD cat1 reset\n");
+ cat1_reset_network();
+ return ERRCODE_SUCC;
+}
static const at_cmd_table_t g_cat1_cmd[] = {
{ (char *)"AT^CAT1POWER", cat1_power, (char *)"1" },
{ (char *)"AT^CAT1DIAL", at_cat1_dial, (char *)"1" },
{ (char *)"AT^PING", cat1_ping, (char *)"1" },
{ (char *)"AT^IFCONFIG", cat1_ifconfig, (char *)"1" },
{ (char *)"AT^CAT1GETVER", at_cat1_getver, (char *)"1" },
- { (char *)"AT^CALL_1", AT_CALL_ifconfig, (char *)"1" },
+ { (char *)"AT^CAT1RESETNETWORK", AT_cat1_reset_network, (char *)"1" },
+ { (char *)"AT^CALL_1", AT_CALL_ifconfig, (char *)"1" },
};
UDP_CMD_CAT1_OTA_UPDATE = '4', // 触发Cat1 OTA升级,mcu提供url
UDP_CMD_SEND_SMS = '5', // 发送SMS短信,mcu提供电话号及短信内容
UDP_CMD_GET_TIME = '6', // 获取Cat1 时间 ,YYYYMMDD HHmmss zone
- UDP_CMD_GET_NETWORKSTAT = '7', //获取Cat1 信号信息,VOLTE信息,信号强度,SIM卡状态
+ UDP_CMD_GET_RECV_NETWORKSTAT = '7', //获取Cat1 信号信息,VOLTE信息,信号强度,SIM卡状态 // 内容同UDP_CMD_GET_NETWORKSTAT,CAT主动发给MCU
UDP_MSG_SMS = '8', // CAT1接收到的SMS信息给MCU,包含电话号及短信内容
- UDP_MSG_NETWORKSTAT = '9', // 内容同UDP_CMD_GET_NETWORKSTAT,CAT主动发给MCU
+ UDP_CMD_RESET_NETWORKSTAT = '9', // 重置网络
UDP_MSG_CALL_CONNECTED = 'A', // CAT1 电话接听消息
UDP_MSG_CALL_DISCONNECTED = 'B', // CAT1 电话挂断消息
UDP_MSG_COMMING_CALL = 'C' , // CAT1 来电消息,包含电话号
- UDP_MSG_TIMESYNC = 'D' , // CAT1 来电消息,包含电话号
- UDP_MSG_VERSION = 'E',
- UDP_MSG_MAX = 'F' //
+ // UDP_MSG_TIMESYNC = 'D' , // CAT1 来电消息,包含电话号
+ // UDP_MSG_VERSION = 'E',
+ UDP_MSG_REPLY = 'F' // 返回值
};
// static char *msg_wifi_resp[] =
udp_send_msg_toCat1(UDP_CMD_DIAL_NUMB,phonenum);
}
+void cat1_reset_network(void)
+{
+ udp_send_msg_toCat1(UDP_CMD_RESET_NETWORKSTAT,"0");
+}
+
void cat1_getsignal(void)
{
- udp_send_msg_toCat1(UDP_CMD_GET_NETWORKSTAT,"0");
+ udp_send_msg_toCat1(UDP_CMD_GET_RECV_NETWORKSTAT,"0");
}
void cat1_gettime(void)
{
case UDP_MSG_COMMING_CALL:
index = cat1_handle_call_incomming(msg);
break;
- case UDP_MSG_NETWORKSTAT:
+ case UDP_CMD_GET_RECV_NETWORKSTAT:
index = cat1_handle_networ_msg(msg);
break;
case UDP_MSG_SMS:
index = cat1_handle_sms(msg);
break;
- case UDP_MSG_TIMESYNC:
+ case UDP_CMD_GET_TIME:
index = cat1_handle_timesync(msg);
break;
case UDP_MSG_CALL_CONNECTED:
break;
case UDP_MSG_CALL_DISCONNECTED:
index = cat1_handle_call_disconnected(msg);
+ break;
+ case UDP_MSG_REPLY:
+
break;
default:
printf("error message: %s\n", rx_buffer);
index = 1;
break;
}
- if (index > 0) //需要反馈的指令才返回OK
- udp_send_msg_toCat1( msg->head[1], "OK");
+ // if (index > 0) //需要反馈的指令才返回OK
+ // udp_send_msg_toCat1( msg->head[1], "OK");
} else {
printf("wrong format msg and exit\n");
index = 1;
void cat1_gettime(void);
void cat1_getver(void);
void restart_time_sync(void);
+void cat1_reset_network(void);
errcode_t cat1_server_init(void);
# See the License for the specific language governing permissions and
# limitations under the License.
#
-# UDP_CMD_GET_CAT1VER = '0', // 获取 Cat1 版本号
-# UDP_CMD_DIAL_NUMB = '1', // 拨打电话
-# UDP_CMD_HUNGUP = '2', // 挂断电话
-# UDP_CMD_ANSWER = '3', // 接听电话
-# UDP_CMD_CAT1_OTA_UPDATE = '4', // 触发Cat1 OTA升级,mcu提供url
-# UDP_CMD_SEND_SMS = '5', // 发送SMS短信,mcu提供电话号及短信内容
-# UDP_CMD_GET_TIME = '6', // 获取Cat1 时间 ,YYYYMMDD HHmmss zone
-# UDP_CMD_GET_NETWORKSTAT = '7', //获取Cat1 信号信息,VOLTE信息,信号强度,SIM卡状态
-# UDP_MSG_SMS = '8', // CAT1接收到的SMS信息给MCU,包含电话号及短信内容
-# UDP_MSG_NETWORKSTAT = '9', // 内容同UDP_CMD_GET_NETWORKSTAT,CAT主动发给MCU
-# UDP_MSG_CALL_CONNECTED = 'A', // CAT1 电话接听消息
-# UDP_MSG_CALL_DISCONNECTED = 'B', // CAT1 电话挂断消息
-# UDP_MSG_COMMING_CALL = 'C' , // CAT1 来电消息,包含电话号
-# UDP_MSG_TIMESYNC = 'D' , // CAT1 来电消息,包含电话号
-# UDP_MSG_MAX = 'F' //
+
# net.getNetMode()
# (0, '460', '11', 7)
import sim
import modem
import utime
-
+import checkNet
+import atcmd
+
+
PROJECT_NAME = "Cat1SlipUDPService"
PROJECT_VERSION = "V2"
# 设置引脚电平
# gpioWakeBT.write(1)
+UDP_CMD_GET_CAT1VER = '0' #获取 Cat1 版本号
+UDP_CMD_DIAL_NUMB = '1' #拨打电话
+UDP_CMD_HUNGUP = '2' #挂断电话
+UDP_CMD_ANSWER = '3' #接听电话
+UDP_CMD_CAT1_OTA_UPDATE = '4' #触发Cat1 OTA升级,mcu提供url
+UDP_CMD_SEND_SMS = '5' #发送SMS短信,mcu提供电话号及短信内容
+UDP_CMD_GET_TIME = '6' #获取Cat1 时间 ,YYYYMMDD HHmmss zone
+UDP_CMD_GET_RECV_NETWORKSTAT = '7' #获取Cat1 信号信息,VOLTE信息,信号强度,SIM卡状态 // 内容同UDP_CMD_GET_NETWORKSTAT,CAT主动发给MCU
+UDP_MSG_SMS = '8' # CAT1接收到的SMS信息给MCU,包含电话号及短信内容
+UDP_CMD_RESET_NETWORKSTAT = '9' # 重置网络
+UDP_MSG_CALL_CONNECTED = 'A' # CAT1 电话接听消息
+UDP_MSG_CALL_DISCONNECTED = 'B' # CAT1 电话挂断消息
+UDP_MSG_COMMING_CALL = 'C' # CAT1 来电消息,包含电话号
+UDP_MSG_REPLY = 'F' # 返回值
+
class Cat1Service:
AP = 0 # SLIP_INNER
STA = 1 # SLIP_OUTER
- def __init__(self, uart=UART.UART4, mode=AP, callback=None):
+ def __init__(self, uart=UART.UART4, mode=AP):
self.__uart = uart
self.__mode = mode
self.__message = ''
self.__err = 0
- self.__callback = callback
+ self.__net_connected = 0
self.__value = None
self.__wait_resp = 0
slip.destroy()
if cmd == "F0":
print(cmd)
# UDP_CMD_GET_CAT1VER
- self.reply_cmd('FE',PROJECT_VERSION)
+ self.reply_cmd('F0',PROJECT_VERSION)
elif cmd == "F1":
print("{}{}".format(cmd,parm))
# UDP_CMD_DIAL_NUMB
time=utime.localtime()
zone=utime.getTimeZone()
#(2024, 3, 2, 18, 31, 32, 5, 62),8
- self.reply_cmd('FD',"{0},{1}".format(time,zone))
+ self.reply_cmd('F6',"{0},{1}".format(time,zone))
elif cmd == "F7":
print(cmd)
- # UDP_CMD_GET_NETWORKSTAT
+ # UDP_CMD_GET_RECV_NETWORKSTAT
simstat = sim.getStatus()
imei = modem.getDevImei()
netstat = net.getSignal(1)
operator = net.operatorName()
- print("imei:{0},sim:{1},oper:{2},net:{3}".format(imei,simstat,operator,netstat))
- self.reply_cmd('F9',"imei:{0},sim:{1},oper:{2},net:{3}".format(imei,simstat,operator,netstat))
+ signal = net.csqQueryPoll()
+ print("imei:{0},sim:{1},oper:{2},signal:{3},net:{4}".format(imei,simstat,operator,signal,netstat))
+ self.reply_cmd('F7',"imei:{0},sim:{1},oper:{2},signal:{3},net:{4}".format(imei,simstat,operator,signal,netstat))
+ elif cmd == "F9":
+ print(cmd)
+ # UDP_CMD_RESET_NETWORKSTAT
+ net.setModemFun(0)
+ net.setModemFun(1)
+ # resp=bytearray(50)
+ # ret=atcmd.sendSync('AT+CFUN=1?\r\n',resp,'',20)
+ # print("reply:{},ret:{}".format(resp,ret))
+ # self.reply_cmd('F9',"ret:{}".format(ret))
+
+
# 来电提醒
def notifyIncomingcall(self, incomming_numb):
self.clear_remain()
# if self.__err == 1 or self.__value[2] != 'OK':
# return -1
return 0
-
+ def wait_network_ready(self):
+ stage, state = checkNet.waitNetworkReady(1)
+ if stage == 3 and state == 1:
+ print('Network connection successful.')
+ self.set_network_config()
+ self.__net_connected = 1
+ return 0
+ else:
+ print('Network connection failed, stage={}, state={}'.format(stage, state))
+ self.reset_network_config()
+ self.__net_connected = 0
+ return -1
# 查询网卡状态
def timesync(self,_timesync):
self.ip_str = ip_str
return slip.set_default_netif(self.ip_str)
+ def reset_network_config(self):
+ if (self.__net_connected == 0):
+ print("skip reset_network_config")
+ return 0
+ Info = dataCall.getInfo(1,0)
+ print("Info{}".format(Info))
+ default_NIC_ip = Info[2][2] # 假设默认网卡ip地址为10.10.1.1,请根据实际情况更改
+ segment_ip = '172.16.4.0' # 假设ap模式网段范围是[192.168.4.0 ~ 192.168.4.255],请根据实际情况更改
+ mask = '255.255.255.0' # 假设子网掩码为255.255.255.0,请根据实际情况更改
+ # 配置默认网卡,通过默认网卡进行网络转发
+ cat1service.set_default_NIC(default_NIC_ip)
+ print("default_NIC_ip {0} segment_ip {1}".format(default_NIC_ip,segment_ip))
+ #添加路由规则,只有该网段IP才进行转发
+ cat1service.router_add(segment_ip, mask)
+
+ pri_dns = '8.8.8.8' # 假设DNS首选地址为8.8.8.8,请根据实际情况更改
+ sec_dns = '114.114.114.114' # 假设DNS备选地址为114.114.114.114,请根据实际情况更改
+ # 配置网卡DNS服务器
+ cat1service.set_dns(pri_dns, sec_dns)
+ # 网卡IP信息查询
+ cat1service.ipconfig()
+
+ def set_network_config(self):
+ if (self.__net_connected == 1) :
+ print("skip set_network_config")
+ return 0
+ Info = dataCall.getInfo(1,0)
+ print("Info{}".format(Info))
+ default_NIC_ip = Info[2][2] # 假设默认网卡ip地址为10.10.1.1,请根据实际情况更改
+ segment_ip = '172.16.1.0' # 假设ap模式网段范围是[192.168.4.0 ~ 192.168.4.255],请根据实际情况更改
+ mask = '255.255.255.0' # 假设子网掩码为255.255.255.0,请根据实际情况更改
+ # 配置默认网卡,通过默认网卡进行网络转发
+ cat1service.set_default_NIC(default_NIC_ip)
+ print("default_NIC_ip {0} segment_ip {1}".format(default_NIC_ip,segment_ip))
+ #添加路由规则,只有该网段IP才进行转发
+ cat1service.router_add(segment_ip, mask)
+
+ pri_dns = '8.8.8.8' # 假设DNS首选地址为8.8.8.8,请根据实际情况更改
+ sec_dns = '114.114.114.114' # 假设DNS备选地址为114.114.114.114,请根据实际情况更改
+ # 配置网卡DNS服务器
+ cat1service.set_dns(pri_dns, sec_dns)
+ # 网卡IP信息查询
+ cat1service.ipconfig()
+
# 释放slip网卡
def stop(self):
slip.destroy()
print("Cat1Service start")
cat1service = Cat1Service()
-Info = dataCall.getInfo(1,0)
-print("Info{}".format(Info))
-default_NIC_ip = Info[2][2] # 假设默认网卡ip地址为10.10.1.1,请根据实际情况更改
-segment_ip = '172.16.1.0' # 假设ap模式网段范围是[192.168.4.0 ~ 192.168.4.255],请根据实际情况更改
-mask = '255.255.255.0' # 假设子网掩码为255.255.255.0,请根据实际情况更改
-# 配置默认网卡,通过默认网卡进行网络转发
-cat1service.set_default_NIC(default_NIC_ip)
-print("default_NIC_ip {0} segment_ip {1}".format(default_NIC_ip,segment_ip))
-#添加路由规则,只有该网段IP才进行转发
-cat1service.router_add(segment_ip, mask)
-
-pri_dns = '8.8.8.8' # 假设DNS首选地址为8.8.8.8,请根据实际情况更改
-sec_dns = '114.114.114.114' # 假设DNS备选地址为114.114.114.114,请根据实际情况更改
-# 配置网卡DNS服务器
-cat1service.set_dns(pri_dns, sec_dns)
-# 网卡IP信息查询
-cat1service.ipconfig()
+
#voice call callback function
def checknet_cb(arg):
print("start checktime!!")
- time=utime.localtime()
- zone=utime.getTimeZone()
+ cat1service.wait_network_ready()
+ # time=utime.localtime()
+ # zone=utime.getTimeZone()
#(2024, 3, 2, 18, 31, 32, 5, 62),8
- cat1service.timesync("{0},{1}".format(time,zone))
+ # cat1service.timesync("{0},{1}".format(time,zone))
-timer.start(200000,1,checknet_cb)
+timer.start(10000,1,checknet_cb)
# while True:
import ujson
import request
import ql_fs
+import checkNet
+import sys
-fota = app_fota.new()
-imei = modem.getDevImei()
-if ql_fs.path_exists("/usr/system_config.json") == True:
- config = ql_fs.read_json("/usr/system_config.json")
- haskey = str("pythonVersion") in config.keys()
- if haskey == True:
- pythonversion = config['pythonVersion']
+def do_fota_update():
+ fota = app_fota.new()
+ imei = modem.getDevImei()
+ if ql_fs.path_exists("/usr/system_config.json") == True:
+ config = ql_fs.read_json("/usr/system_config.json")
+ haskey = str("pythonVersion") in config.keys()
+ if haskey == True:
+ pythonversion = config['pythonVersion']
+ else:
+ pythonversion = "V1"
else:
pythonversion = "V1"
-else:
- pythonversion = "V1"
-url = "http://icfota.snicker.com.cn:8089/fd230ota.jsp?product=FD230&pkgver={0}&imei={1}".format(pythonversion,imei)
-response = request.get(url)
-print(url)
-data = response.json()
-if(data['UptoDate'] == False):
- print("Need update python application")
- srcurl = data['url']
- targetpyname = data['OtaPackageName']
- version = data['OtaPackageVersion']
- print("download {0} to /usr/{1}".format(srcurl,targetpyname))
- ret = fota.download(srcurl,targetpyname)
- if ret == 0 :
- print("ota success")
- ql_fs.file_copy("/usr/{}".format(targetpyname), "/usr/.updater/{}".format(targetpyname))
- data = {"pythonVersion":version}
- print(data)
- ql_fs.touch("/usr/system_config.json", data)
- # fota.set_update_flag() # 设置升级标志
- # Power.powerRestart() # 重启
+ url = "http://icfota.snicker.com.cn:8089/fd230ota.jsp?product=FD230&pkgver={0}&imei={1}".format(pythonversion,imei)
+ response = request.get(url)
+ print(url)
+ data = response.json()
+ if(data['UptoDate'] == False):
+ print("Need update python application")
+ srcurl = data['url']
+ targetpyname = data['OtaPackageName']
+ version = data['OtaPackageVersion']
+ print("download {0} to /usr/{1}".format(srcurl,targetpyname))
+ ret = fota.download(srcurl,targetpyname)
+ if ret == 0 :
+ print("ota success")
+ ql_fs.file_copy("/usr/{}".format(targetpyname), "/usr/.updater/{}".format(targetpyname))
+ data = {"pythonVersion":version}
+ print(data)
+ ql_fs.touch("/usr/system_config.json", data)
+ # fota.set_update_flag() # 设置升级标志
+ # Power.powerRestart() # 重启
+ else:
+ print("ota failed")
else:
- print("ota failed")
-else:
- print("No need update python application")
+ print("No need update python application")
+stage, state = checkNet.waitNetworkReady(1)
+if stage == 3 and state == 1:
+ print('Network connection successful.')
+ do_fota_update()
+else:
+ print('Network connection failed, stage={}, state={}'.format(stage, state))
# res = uos.statvfs("/usr")
#define UART_SLIP_CMD_MSG_READ_DATA 0x01
#define UART_SLIP_CMD_MSG_FLUSH_DATA 0x02
static unsigned long g_slip_cmd_queue;
-#define MAX_BUFFER_SIZE (64)
+#define MAX_BUFFER_SIZE (128)
typedef struct {
uint8_t cmd;
uint32_t size;
memcpy_s(mail.buffer,MAX_BUFFER_SIZE,buffer,size);
mail.cmd = cmd;
mail.size = size;
+ // unsigned int quesize=osal_msg_queue_get_msg_num(g_slip_cmd_queue);
+ // WEARABLE_LOGE(WEARABLE_LOG_MODULE_MAIN_SERVICE,"do_uart_slip_cmd quesize %d\n",quesize);
ret = osal_msg_queue_write_copy(g_slip_cmd_queue, (void *)&mail,
sizeof(slip_uart_cmd_t), 0);
if (ret != OSAL_SUCCESS) {
do_uart_slip_cmd(UART_SLIP_CMD_MSG_READ_DATA,buffer,size);
}
-#define SLIP_CMD_TASK_MSG_COUNT 16
-#define SLIP_CMD_TASK_SIZE 0x100
-#define SLIP_CMD_TASK_PRIO 5
+#define SLIP_CMD_TASK_MSG_COUNT 512
+#define SLIP_CMD_TASK_SIZE (0x800*2)
+#define SLIP_CMD_TASK_PRIO 4
int slip_uart_init(void)
{
settimeofday(&tv, &tz);
- time_t rawtime;
- struct tm* timeinfo;
- time(&rawtime);
- timeinfo = localtime(&rawtime);
-
- printf("set time success %04d-%02d-%02d %02d:%02d:%02d %d\n",
- timeinfo->tm_year + 1900,
- timeinfo->tm_mon + 1,
- timeinfo->tm_mday,
- timeinfo->tm_hour,
- timeinfo->tm_min,
- timeinfo->tm_sec,zone);
+
}else{
printf("convert to time failed ret %d!\n",ret);
}
+ time_t rawtime;
+ struct tm* timeinfo;
+ time(&rawtime);
+ timeinfo = localtime(&rawtime);
+
+ printf("set time success %04d-%02d-%02d %02d:%02d:%02d %d\n",
+ timeinfo->tm_year + 1900,
+ timeinfo->tm_mon + 1,
+ timeinfo->tm_mday,
+ timeinfo->tm_hour,
+ timeinfo->tm_min,
+ timeinfo->tm_sec,zone);
+
+ if (timeinfo->tm_year+1900 < 2024)
+ return ERRCODE_FAIL;
return ERRCODE_SUCC;
}
PRINT("get sn len %d , %s , ret = 0x%X\r\n",len,sn_buf,ret);
return 0;
}
+
+
+#include "lwip/apps/http_client.h"
+void httpc_download_result(void *arg, httpc_result_t httpc_result, u32_t rx_content_len, u32_t srv_res, err_t err)
+{
+ PRINT("httpc_download_result , httpc_result_t %d, rx_content_len %d , srv_res %d, err %d\n",
+ httpc_result,rx_content_len,srv_res,err);
+ return ;
+}
+
+err_t httpc_download_headers_done(httpc_state_t *connection, void *arg, struct pbuf *hdr, u16_t hdr_len, u32_t content_len)
+{
+ PRINT("httpc_download_headers_done , hdr_len %d ,content_len %d\n",hdr_len,content_len);
+ return 0;
+}
+
+static uint32_t custom_start_ota_download(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
+{
+ UNUSED(strCommonCmd);
+
+ uint8_t argv[CUSTOM_UTILS_MAX_ARGC][CUSTOM_UTILS_MAX_ARGV_LEN] = { 0 };
+ uint32_t argc = 0;
+
+ int ret = ConvertCmdToParam(para, paraLen, argv, &argc);
+ if (ret != CUSTOM_UTILS_SUCCESS) {
+ PRINT("CUSTOM_UTILSTEST ATCMD Convert Command Failed\n");
+ return ERRCODE_FAIL;
+ }
+
+ if (argc != 2) {
+ PRINT("CUSTOM_UTILSTEST ATCMD Set Parameter Failed argc %d\n",argc);
+ return ERRCODE_FAIL;
+ }
+
+
+ uint8_t *uri = (uint8_t*)argv[0];
+ uint8_t *otadatapath = (uint8_t*)argv[1];
+ PRINT("custom_start_ota_download %s to %s\r\n",uri,otadatapath);
+ httpc_connection_t settings = {0};
+ settings.result_fn=httpc_download_result;
+ settings.headers_done_fn=httpc_download_headers_done;
+ httpc_state_t* connection=NULL;
+ err_t rett = httpc_get_file_dns_to_disk(
+ (const char*) "icfota.snicker.com.cn",
+ 8089,
+ (const char*) uri,
+ (const httpc_connection_t *)&settings,
+ NULL,
+ (const char*) otadatapath,
+ &connection);
+
+ PRINT("custom_start_ota_download %d \r\n",rett);
+ return ERRCODE_SUCC;
+}
+
+
static const at_cmd_table_t g_custom_utils_cmd[] = {
{ (char *)"AT^CUSTOM_SN", custom_utils_setsn, (char *)"123456789ABCDEF2345678" },
{ (char *)"AT^CUSTOM_SN_REQ", custom_utils_getsn, (char *)" " },
+ { (char *)"AT^DOWNLOADOTA", custom_start_ota_download, (char *)" " },
{ (char *)"AT^STARTOTA", custom_start_ota, (char *)" " },
};
${lwipcore6_SRCS}
${lwipsntp_SRCS}
${lwipmbedtls_SRCS}
- # ${lwiphttp_SRCS}
${lwiphttp_SRCS}
${lwipport_SRCS}
${lwiptest_SRCS}
#define LWIP_SOCKET_IOCTL 0
#define LWIP_SOCKET_FCNTL 0
+#define LWIP_HTTPC_HAVE_FILE_IO 1
+
#endif /* _LWIP_PORTING_LWIPOPTS_H_ */
#define HTTPC_DEBUG_SERIOUS (HTTPC_DEBUG | LWIP_DBG_LEVEL_SERIOUS)
#define HTTPC_POLL_INTERVAL 1
-#define HTTPC_POLL_TIMEOUT 30 /* 15 seconds */
+#define HTTPC_POLL_TIMEOUT 60 /* 15 seconds */
#define HTTPC_CONTENT_LEN_INVALID 0xFFFFFFFF