如何基于message的方 式,发送执行AT命令
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
如何基于message的方式,发送执行AT命令
[SOLUTION]
需要先申请打开编译选项: __MESSAGE_BASED_AT_SUPPORT__
打开编译选项后,原系统的文件需做如下修改:
修改文件custom\ATCI\src\rMMI_msgbased_at.c
1、#define RMMI_MSG_BASED_CHANNEL_OFFSET 100 // 把这个改大到100
2、手工填写或者在app init时调用kal_mem_set(),把数组 rmmi_msgbased_port[] 的每个元素初始化都为:
RMMI_MSG_BASED_PORT_BEGIN + RMMI_MSG_BASED_CUSTOM_AT_CHANNEL
3、手工填写或者在app init时调用kal_mEMSet(),把数组 rmmi_msgbased_src[] 的每个元素初始化都为:
INVALID_SRC
4、如果是不是从MMI,而是其它module发送AT commad,请将下面的定义:
#define RMMI_MSG_BASED_REQUEST_MODULE MOD_MMI
修改为:
#define RMMI_MSG_BASED_REQUEST_MODULE MOD_XXX //指定module
实现在MMI侧完成发送或接收message的操作(与Message ID同一序号的Local Parameter和Peer Buffer为同一Message的参数),可参考如下:
1、MMI向ATCI申请channels,用作发AT命令,并获取确认。
Message ID:
MSG_ID_RMMI_REGISTER_CHANNEL_REQ
-- MOD_MMI -> MOD_ATCI
MSG_ID_RMMI_REGISTER_CHANNEL_CNF
-- MOD_ATCI -> MOD_MMI
Local Parameter:
rmmi_register_channel_req_struct
-- ch_nums为申请channels的个数。最多申请20个。
rmmi_register_channel_cnf_struct
-- result为申请是否成功;
-- begin_port_id为起始channel ID。其他可用channel ID依次为往后加1,直到ch_nums - 1。
2、MMI向ATCI发送AT命令,并获取确认。
Message ID:
MSG_ID_RMMI_EXE_AT_REQ
-- MOD_MMI -> MOD_ATCI
MSG_ID_RMMI_EXE_AT_CNF
-- MOD_ATCI -> MOD_MMI
Local Parameter:
rmmi_exe_at_req_struct
-- port_id为发送AT命令,使用的channel ID;
(同一个channel,同一时间只能处理一个AT命令。除非前AT命令已处理完或处理超时,否则不能再用其下发AT命令)
-- length为AT命令的数据长度。
rmmi_exe_at_cnf_struct
-- result为ATCI是否成功接收AT命令;
-- port_id为发送AT命令,使用的channel ID。
Peer Buffer:
-- 存放下发的AT命令的字符数据。例如"AT+CREG?"
// 注意:对于可分行输入的,SMS类的AT命令数据末尾,要包含一个<LF>符,也就是0x0a;而其他的AT命令数据末尾要包含一个<CR>符,也就是0x0d
。
// 另外,peer_buffer申请的大小,需要比AT命令的数据长度多一字节,为了系统可以数据末尾可补进一个'\0'。
例如:发送的命令是:"AT"。
则rmmi_exe_at_req_struct中的length赋值为3,申请的peer_buffer的size为4。
传输时 peer_buffer中的内容为 { 'A','T',0x0d,'\0'}
申请及填充peer_buffer的方法如下:
peer_buff_struct *peer_buff_ptr;
kal_uint8 buffer_len;
kal_uint8 *pdu_ptr;
kal_uint8 pdu_len;
// Peer Buffer alloc
buffer_size = 4;
peer_buff_ptr = (peer_buff_struct*)construct_peer_buff(
buffer_size,
0, 0, TD_RESET);
pdu_ptr = get_pdu_ptr(peer_buff_ptr, &pdu_len);
// Data Input
pdu_ptr[0] = 'A';
pdu_ptr[1] = 'T';
pdu_ptr[2] = 0x0d;
pdu_ptr[3] = '\0';
3、MMI获取发送的AT命令的执行结果。
Message ID:
MSG_ID_RMMI_RESPONSE_AT_IND
-- MOD_ATCI -> MOD_MMI
Local Parameter:
rmmi_response_at_ind_struct
-- port_id为AT命令使用的channel ID;
-- length为返回结果的数据长度。
Peer Buffer:
-- 存放AT命令执行结果的字符数据。例如"OK"
// 注意:一般先收到命令执行中返回结果的message:MSG_ID_RMMI_RESPONSE_AT_IND,才收到命令执行完成的确认
message:MSG_ID_RMMI_EXE_AT_CNF
4、MMI获取所有AT命令的URC结果。
Message ID:
MSG_ID_RMMI_URC_AT_IND
-- MOD_ATCI -> MOD_MMI
Local Parameter:
rmmi_urc_at_ind_struct
-- length为返回结果的数据长度。
Peer Buffer:
-- 存放AT命令URC结果的字符数据。例如"+ECSQ: 17, 99, -319"
如何基于message的方式,发送执行AT命令
[SOLUTION]
需要先申请打开编译选项: __MESSAGE_BASED_AT_SUPPORT__
打开编译选项后,原系统的文件需做如下修改:
修改文件custom\ATCI\src\rMMI_msgbased_at.c
1、#define RMMI_MSG_BASED_CHANNEL_OFFSET 100 // 把这个改大到100
2、手工填写或者在app init时调用kal_mem_set(),把数组 rmmi_msgbased_port[] 的每个元素初始化都为:
RMMI_MSG_BASED_PORT_BEGIN + RMMI_MSG_BASED_CUSTOM_AT_CHANNEL
3、手工填写或者在app init时调用kal_mEMSet(),把数组 rmmi_msgbased_src[] 的每个元素初始化都为:
INVALID_SRC
4、如果是不是从MMI,而是其它module发送AT commad,请将下面的定义:
#define RMMI_MSG_BASED_REQUEST_MODULE MOD_MMI
修改为:
#define RMMI_MSG_BASED_REQUEST_MODULE MOD_XXX //指定module
实现在MMI侧完成发送或接收message的操作(与Message ID同一序号的Local Parameter和Peer Buffer为同一Message的参数),可参考如下:
1、MMI向ATCI申请channels,用作发AT命令,并获取确认。
Message ID:
MSG_ID_RMMI_REGISTER_CHANNEL_REQ
-- MOD_MMI -> MOD_ATCI
MSG_ID_RMMI_REGISTER_CHANNEL_CNF
-- MOD_ATCI -> MOD_MMI
Local Parameter:
rmmi_register_channel_req_struct
-- ch_nums为申请channels的个数。最多申请20个。
rmmi_register_channel_cnf_struct
-- result为申请是否成功;
-- begin_port_id为起始channel ID。其他可用channel ID依次为往后加1,直到ch_nums - 1。
2、MMI向ATCI发送AT命令,并获取确认。
Message ID:
MSG_ID_RMMI_EXE_AT_REQ
-- MOD_MMI -> MOD_ATCI
MSG_ID_RMMI_EXE_AT_CNF
-- MOD_ATCI -> MOD_MMI
Local Parameter:
rmmi_exe_at_req_struct
-- port_id为发送AT命令,使用的channel ID;
(同一个channel,同一时间只能处理一个AT命令。除非前AT命令已处理完或处理超时,否则不能再用其下发AT命令)
-- length为AT命令的数据长度。
rmmi_exe_at_cnf_struct
-- result为ATCI是否成功接收AT命令;
-- port_id为发送AT命令,使用的channel ID。
Peer Buffer:
-- 存放下发的AT命令的字符数据。例如"AT+CREG?"
// 注意:对于可分行输入的,SMS类的AT命令数据末尾,要包含一个<LF>符,也就是0x0a;而其他的AT命令数据末尾要包含一个<CR>符,也就是0x0d
。
// 另外,peer_buffer申请的大小,需要比AT命令的数据长度多一字节,为了系统可以数据末尾可补进一个'\0'。
例如:发送的命令是:"AT"。
则rmmi_exe_at_req_struct中的length赋值为3,申请的peer_buffer的size为4。
传输时 peer_buffer中的内容为 { 'A','T',0x0d,'\0'}
申请及填充peer_buffer的方法如下:
peer_buff_struct *peer_buff_ptr;
kal_uint8 buffer_len;
kal_uint8 *pdu_ptr;
kal_uint8 pdu_len;
// Peer Buffer alloc
buffer_size = 4;
peer_buff_ptr = (peer_buff_struct*)construct_peer_buff(
buffer_size,
0, 0, TD_RESET);
pdu_ptr = get_pdu_ptr(peer_buff_ptr, &pdu_len);
// Data Input
pdu_ptr[0] = 'A';
pdu_ptr[1] = 'T';
pdu_ptr[2] = 0x0d;
pdu_ptr[3] = '\0';
3、MMI获取发送的AT命令的执行结果。
Message ID:
MSG_ID_RMMI_RESPONSE_AT_IND
-- MOD_ATCI -> MOD_MMI
Local Parameter:
rmmi_response_at_ind_struct
-- port_id为AT命令使用的channel ID;
-- length为返回结果的数据长度。
Peer Buffer:
-- 存放AT命令执行结果的字符数据。例如"OK"
// 注意:一般先收到命令执行中返回结果的message:MSG_ID_RMMI_RESPONSE_AT_IND,才收到命令执行完成的确认
message:MSG_ID_RMMI_EXE_AT_CNF
4、MMI获取所有AT命令的URC结果。
Message ID:
MSG_ID_RMMI_URC_AT_IND
-- MOD_ATCI -> MOD_MMI
Local Parameter:
rmmi_urc_at_ind_struct
-- length为返回结果的数据长度。
Peer Buffer:
-- 存放AT命令URC结果的字符数据。例如"+ECSQ: 17, 99, -319"
