【修改】通过关键字搜索解析行信息;

【完善】M26 模块网络初始化;

Signed-off-by: chenyong <1521761801@qq.com>
This commit is contained in:
chenyong 2018-07-23 19:13:46 +08:00
parent 3409194356
commit a8b504b874
2 changed files with 64 additions and 48 deletions

View File

@ -350,8 +350,7 @@ static int esp8266_domain_resolve(const char *name, char ip[16])
} }
/* parse the third line of response data, get the IP address */ /* parse the third line of response data, get the IP address */
if(at_resp_parse_line_args(resp, at_resp_get_line_num_by_kw(resp, "+CIPDOMAIN:"), if(at_resp_parse_line_args_by_kw(resp, "+CIPDOMAIN:", "+CIPDOMAIN:%s", recv_ip) < 0)
"+CIPDOMAIN:%s", recv_ip) < 0)
{ {
rt_thread_delay(rt_tick_from_millisecond(100)); rt_thread_delay(rt_tick_from_millisecond(100));
/* resolve failed, maybe receive an URC CRLF */ /* resolve failed, maybe receive an URC CRLF */
@ -636,8 +635,7 @@ int esp8266_ping(int argc, char **argv)
return -RT_ERROR; return -RT_ERROR;
} }
if(at_resp_parse_line_args(resp, at_resp_get_line_num_by_kw(resp, "+"), if(at_resp_parse_line_args_by_kw(resp, "+", "+%d", &req_time) < 0)
"+%d", &req_time) < 0)
{ {
continue; continue;
} }

View File

@ -222,7 +222,7 @@ static int at_get_send_size(int socket, size_t *size, size_t *acked, size_t *nac
goto __exit; goto __exit;
} }
if (at_resp_parse_line_args(resp, 2, "+QISACK: %d, %d, %d", size, acked, nacked) <= 0) if (at_resp_parse_line_args_by_kw(resp, "+QISACK:", "+QISACK: %d, %d, %d", size, acked, nacked) <= 0)
{ {
result = -RT_ERROR; result = -RT_ERROR;
goto __exit; goto __exit;
@ -239,6 +239,7 @@ __exit:
static int at_wait_send_finish(int socket, size_t settings_size) static int at_wait_send_finish(int socket, size_t settings_size)
{ {
/* get the timeout by the input data size */
rt_tick_t timeout = rt_tick_from_millisecond(settings_size); rt_tick_t timeout = rt_tick_from_millisecond(settings_size);
rt_tick_t last_time = rt_tick_get(); rt_tick_t last_time = rt_tick_get();
size_t size = 0, acked = 0, nacked = 0xFFFF; size_t size = 0, acked = 0, nacked = 0xFFFF;
@ -377,7 +378,9 @@ __exit:
*/ */
static int m26_domain_resolve(const char *name, char ip[16]) static int m26_domain_resolve(const char *name, char ip[16])
{ {
int result = 0; #define RESOLVE_RETRY 5
int i, result = RT_EOK;
char recv_ip[16] = { 0 }; char recv_ip[16] = { 0 };
at_response_t resp = RT_NULL; at_response_t resp = RT_NULL;
@ -394,26 +397,36 @@ static int m26_domain_resolve(const char *name, char ip[16])
rt_mutex_take(at_event_lock, RT_WAITING_FOREVER); rt_mutex_take(at_event_lock, RT_WAITING_FOREVER);
__restart: for(i = 0; i < RESOLVE_RETRY; i++)
if (at_exec_cmd(resp, "AT+QIDNSGIP=\"%s\"", name) < 0)
{ {
result = -RT_ERROR; if (at_exec_cmd(resp, "AT+QIDNSGIP=\"%s\"", name) < 0)
goto __exit; {
result = -RT_ERROR;
goto __exit;
}
/* parse the third line of response data, get the IP address */
if(at_resp_parse_line_args_by_kw(resp, ".", "%s", recv_ip) < 0)
{
rt_thread_delay(rt_tick_from_millisecond(100));
/* resolve failed, maybe receive an URC CRLF */
continue;
}
if (strlen(recv_ip) < 8)
{
rt_thread_delay(rt_tick_from_millisecond(100));
/* resolve failed, maybe receive an URC CRLF */
continue;
}
else
{
strncpy(ip, recv_ip, 15);
ip[15] = '\0';
break;
}
} }
/* parse the third line of response data, get the IP address */
at_resp_parse_line_args(resp, 4, "%s", recv_ip);
if (strlen(recv_ip) < 8)
{
rt_thread_delay(rt_tick_from_millisecond(100));
/* resolve failed, maybe receive an URC CRLF */
goto __restart;
}
strncpy(ip, recv_ip, 15);
ip[15] = '\0';
__exit: __exit:
rt_mutex_release(at_event_lock); rt_mutex_release(at_event_lock);
@ -623,10 +636,10 @@ int at_client_port_init(void)
return RT_EOK; return RT_EOK;
} }
#define AT_SEND_CMD(resp, resp_line, cmd) \ #define AT_SEND_CMD(resp, resp_line, timeout, cmd) \
do \ do \
{ \ { \
if (at_exec_cmd(at_resp_set_info(resp, 64, resp_line, rt_tick_from_millisecond(5000)), cmd) < 0) \ if (at_exec_cmd(at_resp_set_info(resp, 64, resp_line, rt_tick_from_millisecond(timeout)), cmd) < 0) \
{ \ { \
return -RT_ERROR; \ return -RT_ERROR; \
} \ } \
@ -642,7 +655,7 @@ int m26_net_init(void)
int i, qimux, qimode; int i, qimux, qimode;
char parsed_data[10]; char parsed_data[10];
resp = at_create_resp(64, 0, rt_tick_from_millisecond(5000)); resp = at_create_resp(64, 0, rt_tick_from_millisecond(300));
if (!resp) if (!resp)
{ {
LOG_E("No memory for response structure!"); LOG_E("No memory for response structure!");
@ -652,16 +665,16 @@ int m26_net_init(void)
/* wait M26 startup finish */ /* wait M26 startup finish */
rt_thread_delay(rt_tick_from_millisecond(8000)); rt_thread_delay(rt_tick_from_millisecond(8000));
/* disable echo */ /* disable echo */
AT_SEND_CMD(resp, 0, "ATE0"); AT_SEND_CMD(resp, 0, 300, "ATE0");
/* get module version */ /* get module version */
AT_SEND_CMD(resp, 0, "ATI"); AT_SEND_CMD(resp, 0, 300, "ATI");
/* show module version */ /* show module version */
for (i = 0; i < resp->line_counts - 1; i++) for (i = 0; i < (int) resp->line_counts - 1; i++)
{ {
LOG_D("%s", at_resp_get_line(resp, i + 1)) LOG_D("%s", at_resp_get_line(resp, i + 1))
} }
/* check SIM card */ /* check SIM card */
AT_SEND_CMD(resp, 2, "AT+CPIN?"); AT_SEND_CMD(resp, 2, 5 * 1000, "AT+CPIN?");
if (!at_resp_get_line_by_kw(resp, "READY")) if (!at_resp_get_line_by_kw(resp, "READY"))
{ {
LOG_E("SIM card detection failed"); LOG_E("SIM card detection failed");
@ -672,8 +685,8 @@ int m26_net_init(void)
/* check signal strength */ /* check signal strength */
for (i = 0; i < CSQ_RETRY; i++) for (i = 0; i < CSQ_RETRY; i++)
{ {
AT_SEND_CMD(resp, 0, "AT+CSQ"); AT_SEND_CMD(resp, 0, 300, "AT+CSQ");
at_resp_parse_line_args(resp, 2, "+CSQ: %s", &parsed_data); at_resp_parse_line_args_by_kw(resp, "+CSQ:", "+CSQ: %s", &parsed_data);
if (strncmp(parsed_data, "99,99", sizeof(parsed_data))) if (strncmp(parsed_data, "99,99", sizeof(parsed_data)))
{ {
LOG_D("Signal strength: %s", parsed_data); LOG_D("Signal strength: %s", parsed_data);
@ -689,8 +702,8 @@ int m26_net_init(void)
/* check the GSM network is registered */ /* check the GSM network is registered */
for (i = 0; i < CREG_RETRY; i++) for (i = 0; i < CREG_RETRY; i++)
{ {
AT_SEND_CMD(resp, 0, "AT+CREG?"); AT_SEND_CMD(resp, 0, 300, "AT+CREG?");
at_resp_parse_line_args(resp, 2, "+CREG: %s", &parsed_data); at_resp_parse_line_args_by_kw(resp, "+CREG:", "+CREG: %s", &parsed_data);
if (!strncmp(parsed_data, "0,1", sizeof(parsed_data)) || !strncmp(parsed_data, "0,5", sizeof(parsed_data))) if (!strncmp(parsed_data, "0,1", sizeof(parsed_data)) || !strncmp(parsed_data, "0,5", sizeof(parsed_data)))
{ {
LOG_D("GSM network is registered (%s)", parsed_data); LOG_D("GSM network is registered (%s)", parsed_data);
@ -706,8 +719,8 @@ int m26_net_init(void)
/* check the GPRS network is registered */ /* check the GPRS network is registered */
for (i = 0; i < CGREG_RETRY; i++) for (i = 0; i < CGREG_RETRY; i++)
{ {
AT_SEND_CMD(resp, 0, "AT+CGREG?"); AT_SEND_CMD(resp, 0, 300, "AT+CGREG?");
at_resp_parse_line_args(resp, 2, "+CGREG: %s", &parsed_data); at_resp_parse_line_args_by_kw(resp, "+CGREG:", "+CGREG: %s", &parsed_data);
if (!strncmp(parsed_data, "0,1", sizeof(parsed_data)) || !strncmp(parsed_data, "0,5", sizeof(parsed_data))) if (!strncmp(parsed_data, "0,1", sizeof(parsed_data)) || !strncmp(parsed_data, "0,5", sizeof(parsed_data)))
{ {
LOG_D("GPRS network is registered (%s)", parsed_data); LOG_D("GPRS network is registered (%s)", parsed_data);
@ -721,27 +734,32 @@ int m26_net_init(void)
return -RT_ERROR; return -RT_ERROR;
} }
AT_SEND_CMD(resp, 0, "AT+QIFGCNT=0"); AT_SEND_CMD(resp, 0, 300, "AT+QIFGCNT=0");
AT_SEND_CMD(resp, 0, "AT+QICSGP=1, \"CMNET\""); AT_SEND_CMD(resp, 0, 300, "AT+QICSGP=1, \"CMNET\"");
AT_SEND_CMD(resp, 0, "AT+QIMODE?"); AT_SEND_CMD(resp, 0, 300, "AT+QIMODE?");
at_resp_parse_line_args(resp, 2, "+QIMODE: %d", &qimode); at_resp_parse_line_args_by_kw(resp, "+QIMODE:", "+QIMODE: %d", &qimode);
if (qimode == 1) if (qimode == 1)
{ {
AT_SEND_CMD(resp, 0, "AT+QIMODE=0"); AT_SEND_CMD(resp, 0, 300, "AT+QIMODE=0");
} }
/* Set to multiple connections */ /* Set to multiple connections */
AT_SEND_CMD(resp, 0, "AT+QIMUX?"); AT_SEND_CMD(resp, 0, 300, "AT+QIMUX?");
at_resp_parse_line_args(resp, 2, "+QIMUX: %d", &qimux); at_resp_parse_line_args_by_kw(resp, "+QIMUX:", "+QIMUX: %d", &qimux);
if (qimux == 0) if (qimux == 0)
{ {
AT_SEND_CMD(resp, 0, "AT+QIMUX=1"); AT_SEND_CMD(resp, 0, 300, "AT+QIMUX=1");
} }
AT_SEND_CMD(resp, 2, "AT+QIDEACT"); /* the device default response timeout is 40 seconds, but it set to 15 seconds is convenient to use. */
AT_SEND_CMD(resp, 0, "AT+QIREGAPP"); AT_SEND_CMD(resp, 2, 20 * 1000, "AT+QIDEACT");
AT_SEND_CMD(resp, 0, "AT+QIACT");
AT_SEND_CMD(resp, 2, "AT+QILOCIP"); AT_SEND_CMD(resp, 0, 300, "AT+QIREGAPP");
/* the device default response timeout is 150 seconds, but it set to 20 seconds is convenient to use. */
AT_SEND_CMD(resp, 0, 20 * 1000, "AT+QIACT");
AT_SEND_CMD(resp, 2, 300, "AT+QILOCIP");
if (resp) if (resp)
{ {