فهرست منبع

[bc28] Modified base on comments

luhuadong 6 سال پیش
والد
کامیت
4765eebdc1
2فایلهای تغییر یافته به همراه113 افزوده شده و 98 حذف شده
  1. 93 61
      class/bc28/at_device_bc28.c
  2. 20 37
      class/bc28/at_socket_bc28.c

+ 93 - 61
class/bc28/at_device_bc28.c

@@ -36,16 +36,6 @@
 #define BC28_THREAD_STACK_SIZE          2048
 #define BC28_THREAD_PRIORITY            (RT_THREAD_PRIORITY_MAX/2)
 
-static int bc28_power_on(struct at_device *device)
-{
-    return(RT_EOK);
-}
-
-static int bc28_power_off(struct at_device *device)
-{
-    return(RT_EOK);
-}
-
 static int bc28_sleep(struct at_device *device)
 {
     return(RT_EOK);
@@ -64,6 +54,7 @@ static int bc28_reset(struct at_device *device)
     rt_pin_write(bc28->power_pin, PIN_HIGH);
     rt_thread_mdelay(300);
     rt_pin_write(bc28->power_pin, PIN_LOW);
+    bc28->power_status = 1;
 
     return(RT_EOK);
 }
@@ -77,7 +68,7 @@ static int bc28_check_link_status(struct at_device *device)
     bc28 = (struct at_device_bc28 *)device->user_data;
     if ( ! bc28->power_status) // power off
     {
-        LOG_D("the power is off.");
+        LOG_E("the power is off.");
         return(-RT_ERROR);
     }
     if (bc28->sleep_status)    // is sleep status
@@ -94,7 +85,7 @@ static int bc28_check_link_status(struct at_device *device)
     resp = at_create_resp(64, 0, rt_tick_from_millisecond(300));
     if (resp == RT_NULL)
     {
-        LOG_D("no memory for resp create.");
+        LOG_E("no memory for resp create.");
         return(-RT_ERROR);
     }
 
@@ -110,17 +101,8 @@ static int bc28_check_link_status(struct at_device *device)
             }
         }
     }
-#if 0
-    if (bc28->sleep_status)  // is sleep status
-    {
-        if (at_obj_exec_cmd(device->client, resp, "AT+QRELLOCK") != RT_EOK)
-        {
-            LOG_D("startup entry into sleep fail.");
-        }
-    }
-#endif
-    at_delete_resp(resp);
-    
+
+    at_delete_resp(resp);    
     return(result);
 }
 
@@ -129,7 +111,7 @@ static int bc28_check_link_status(struct at_device *device)
 static int bc28_netdev_set_info(struct netdev *netdev)
 {
 #define BC28_INFO_RESP_SIZE        128
-#define BC28_INFO_RESP_TIMOUT      rt_tick_from_millisecond(300)
+#define BC28_INFO_RESP_TIMOUT      rt_tick_from_millisecond(5000)
 
     int result = RT_EOK;
     ip_addr_t addr;
@@ -239,13 +221,13 @@ static int bc28_netdev_set_info(struct netdev *netdev)
         /* parse response data "PrimaryDns:<pri_dns>" 
          *                     "SecondaryDns:<sec_dns>" 
         */
-        if (at_resp_parse_line_args_by_kw(resp, "PrimaryDns:", "PrimaryDns:\"%[^\"]\"", dns_server1) <= 0)
+        if (at_resp_parse_line_args_by_kw(resp, "PrimaryDns:", "PrimaryDns: %s", dns_server1) <= 0)
         {
             LOG_E("%s device prase \"AT+QIDNSCFG?\" cmd error.", device->name);
             result = -RT_ERROR;
             goto __exit;
         }
-        if (at_resp_parse_line_args_by_kw(resp, "SecondaryDns:", "SecondaryDns:\"%[^\"]\"", dns_server2) <= 0)
+        if (at_resp_parse_line_args_by_kw(resp, "SecondaryDns:", "SecondaryDns: %s", dns_server2) <= 0)
         {
             LOG_E("%s device prase \"AT+QIDNSCFG?\" cmd error.", device->name);
             result = -RT_ERROR;
@@ -357,7 +339,7 @@ static int bc28_netdev_set_down(struct netdev *netdev)
 
     if (device->is_init == RT_TRUE)
     {
-        bc28_power_off(device);
+        //bc28_power_off(device);
         device->is_init = RT_FALSE;
 
         netdev_low_level_set_status(netdev, RT_FALSE);
@@ -389,7 +371,7 @@ static int bc28_netdev_set_dns_server(struct netdev *netdev, uint8_t dns_num, ip
     resp = at_create_resp(BC28_DNS_RESP_LEN, 0, BC28_DNS_RESP_TIMEOUT);
     if (resp == RT_NULL)
     {
-        LOG_D("no memory for resp create.");
+        LOG_E("no memory for resp create.");
         result = -RT_ENOMEM;
         goto __exit;
     }
@@ -413,13 +395,16 @@ __exit:
     return result;
 }
 
+#ifdef AT_USING_SOCKET
+    int bc28_domain_resolve(const char *name, char ip[16]);
+#endif
 #ifdef NETDEV_USING_PING
 static int bc28_netdev_ping(struct netdev *netdev, const char *host,
         size_t data_len, uint32_t timeout, struct netdev_ping_resp *ping_resp)
 {
 #define BC28_PING_RESP_SIZE       128
 #define BC28_PING_IP_SIZE         16
-#define BC28_PING_TIMEOUT           (5 * RT_TICK_PER_SECOND)
+#define BC28_PING_TIMEOUT         (10 * RT_TICK_PER_SECOND)
 
     rt_err_t result = RT_EOK;
     int response = -1, recv_data_len, ping_time, ttl;
@@ -445,43 +430,53 @@ static int bc28_netdev_ping(struct netdev *netdev, const char *host,
         return -RT_ENOMEM;
     }
 
-    /* send "AT+NPING=<remote_address>[,<p_size>[,<timeout>]]" commond to send ping request */
-    if (at_obj_exec_cmd(device->client, resp, "AT+NPING=\"%s\",12,%d", host, timeout / RT_TICK_PER_SECOND) < 0)
+    /* DNS resolve */
+    struct in_addr inp;
+    if (inet_aton(host, &inp) > 0)
+    {
+        rt_strncpy(ip_addr, host, BC28_PING_IP_SIZE);
+    }
+#ifdef AT_USING_SOCKET
+    else
+    {
+        bc28_domain_resolve(host, ip_addr);
+    }
+#endif
+    
+    if (at_obj_exec_cmd(device->client, resp, "AT+NPING=%s,%d,%d", 
+                        ip_addr, data_len, timeout*1000/RT_TICK_PER_SECOND) < 0)
     {
         result = -RT_ERROR;
         goto __exit;
     }
-#if 0
-    at_resp_parse_line_args_by_kw(resp, "+NPING:", "+NPING:%d", &response);
-    /* Received the ping response from the server */
-    if (response == 0)
+
+    if (at_resp_parse_line_args_by_kw(resp, "+NPINGERR:", "+NPINGERR:%d", &response) > 0)
     {
-        if (at_resp_parse_line_args_by_kw(resp, "+NPING:", "+NPING:\"%[^\"]\",%d,%d,%d",
-                                          ip_addr, &ttl, &ping_time) <= 0)
+        switch (response)
         {
+        case 1:
+            result = -RT_ETIMEOUT;
+            break;
+        case 2:
+        default:
             result = -RT_ERROR;
-            goto __exit;
+            break;
         }
     }
-
-    /* prase response number */
-    switch (response)
+    else if (at_resp_parse_line_args_by_kw(resp, "+NPING:", "+NPING:%[^,],%d,%d",
+                                            ip_addr, &ttl, &ping_time) > 0 )
     {
-    case 0:
         inet_aton(ip_addr, &(ping_resp->ip_addr));
-        ping_resp->data_len = recv_data_len;
-        ping_resp->ticks = ping_time;
+        ping_resp->data_len = data_len;
+        ping_resp->ticks = rt_tick_from_millisecond(ping_time);
         ping_resp->ttl = ttl;
         result = RT_EOK;
-        break;
-    case 569:
-        result = -RT_ETIMEOUT;
-        break;
-    default:
+    }
+    else
+    {
         result = -RT_ERROR;
-        break;
+        goto __exit;
     }
-#endif
 
 __exit:
     if (resp)
@@ -536,7 +531,7 @@ static struct netdev *bc28_netdev_add(const char *netdev_name)
     return netdev;
 }
 
-/* =============================  bc26 device operations ============================= */
+/* =============================  bc28 device operations ============================= */
 
 /* initialize for bc28 */
 static void bc28_init_thread_entry(void *parameter)
@@ -546,6 +541,7 @@ static void bc28_init_thread_entry(void *parameter)
 #define CSQ_RETRY                      20
 #define CGREG_RETRY                    50
 #define IPADDR_RETRY                   10
+#define AT_DEFAULT_TIMEOUT             5000
 
     int i;
     int retry_num = INIT_RETRY;
@@ -554,7 +550,7 @@ static void bc28_init_thread_entry(void *parameter)
     struct at_device *device = (struct at_device *) parameter;
     struct at_client *client = device->client;
 
-    resp = at_create_resp(128, 0, rt_tick_from_millisecond(300));
+    resp = at_create_resp(128, 0, rt_tick_from_millisecond(AT_DEFAULT_TIMEOUT));
     if (resp == RT_NULL)
     {
         LOG_E("no memory for resp create.");
@@ -580,6 +576,7 @@ static void bc28_init_thread_entry(void *parameter)
         if (at_obj_exec_cmd(device->client, resp, "ATE0") != RT_EOK)
         {
             result = -RT_ERROR;
+            LOG_E("ATE0");
             goto __exit;
         }
 
@@ -587,6 +584,7 @@ static void bc28_init_thread_entry(void *parameter)
         if (at_obj_exec_cmd(device->client, resp, "AT+QREGSWT=2") != RT_EOK)
         {
             result = -RT_ERROR;
+            LOG_E(">> AT+QREGSWT=2");
             goto __exit;
         }
         
@@ -594,13 +592,24 @@ static void bc28_init_thread_entry(void *parameter)
         if (at_obj_exec_cmd(device->client, resp, "AT+NCONFIG=AUTOCONNECT,FALSE") != RT_EOK)
         {
             result = -RT_ERROR;
+            LOG_E(">> AT+NCONFIG=AUTOCONNECT,FALSE");
             goto __exit;
         }
 
+        /* reboot */
+        at_obj_exec_cmd(device->client, resp, "AT+NRB");
+        rt_thread_mdelay(5000);
+
+        while (at_obj_exec_cmd(device->client, resp, "AT") != RT_EOK)
+        {
+            rt_thread_mdelay(1000);
+        }
+
         /* check IMEI */
         if (at_obj_exec_cmd(device->client, resp, "AT+CGSN=1") != RT_EOK)
         {
             result = -RT_ERROR;
+            LOG_E(">> AT+CGSN=1");
             goto __exit;
         }
 
@@ -608,6 +617,7 @@ static void bc28_init_thread_entry(void *parameter)
         if (at_obj_exec_cmd(device->client, resp, "AT+NBAND=8") != RT_EOK)
         {
             result = -RT_ERROR;
+            LOG_E(">> AT+NBAND=8");
             goto __exit;
         }
 
@@ -615,6 +625,7 @@ static void bc28_init_thread_entry(void *parameter)
         if (at_obj_exec_cmd(device->client, resp, "AT+CFUN=1") != RT_EOK)
         {
             result = -RT_ERROR;
+            LOG_E(">> AT+CFUN=1");
             goto __exit;
         }
 
@@ -622,6 +633,7 @@ static void bc28_init_thread_entry(void *parameter)
         if (at_obj_exec_cmd(device->client, resp, "AT+NSONMI=2") != RT_EOK)
         {
             result = -RT_ERROR;
+            LOG_E(">> AT+NSONMI=2");
             goto __exit;
         }
 
@@ -629,6 +641,7 @@ static void bc28_init_thread_entry(void *parameter)
         if (at_obj_exec_cmd(device->client, resp, "AT+CEDRXS=0,5") != RT_EOK)
         {
             result = -RT_ERROR;
+            LOG_E(">> AT+CEDRXS=0,5");
             goto __exit;
         }
         
@@ -636,6 +649,7 @@ static void bc28_init_thread_entry(void *parameter)
         if (at_obj_exec_cmd(device->client, resp, "AT+CPSMS=0") != RT_EOK)
         {
             result = -RT_ERROR;
+            LOG_E(">> AT+CPSMS=0");
             goto __exit;
         }
 
@@ -643,6 +657,7 @@ static void bc28_init_thread_entry(void *parameter)
         if (at_obj_exec_cmd(device->client, resp, "AT+CIMI") != RT_EOK)
         {
             result = -RT_ERROR;
+            LOG_E(">> AT+CIMI");
             goto __exit;
         }
 
@@ -650,6 +665,7 @@ static void bc28_init_thread_entry(void *parameter)
         if (at_obj_exec_cmd(device->client, resp, "AT+CGATT=1") != RT_EOK)
         {
             result = -RT_ERROR;
+            LOG_E(">> AT+CGATT=1");
             goto __exit;
         }
         
@@ -657,6 +673,7 @@ static void bc28_init_thread_entry(void *parameter)
         if (at_obj_exec_cmd(device->client, resp, "AT+NATSPEED?") != RT_EOK)
         {
             result = -RT_ERROR;
+            LOG_E(">> AT+NATSPEED?");
             goto __exit;
         }
         at_resp_parse_line_args_by_kw(resp, "+NATSPEED:", "+NATSPEED:%d", &i);
@@ -666,6 +683,7 @@ static void bc28_init_thread_entry(void *parameter)
         if (at_obj_exec_cmd(device->client, resp, "ATI") != RT_EOK)
         {
             result = -RT_ERROR;
+            LOG_E(">> ATI");
             goto __exit;
         }
         for (i = 0; i < (int) resp->line_counts - 1; i++)
@@ -773,7 +791,7 @@ static void bc28_init_thread_entry(void *parameter)
         if (result != RT_EOK)
         {
             /* power off the bc28 device */
-            bc28_power_off(device);
+            //bc28_power_off(device);
             rt_thread_mdelay(1000);
 
             LOG_I("%s device initialize retry...", device->name);
@@ -845,6 +863,24 @@ static int bc28_init(struct at_device *device)
 #ifdef AT_USING_SOCKET
     bc28_socket_init(device);
 #endif
+
+    /* add bc28 device to the netdev list */
+    device->netdev = bc28_netdev_add(bc28->device_name);
+    if (device->netdev == RT_NULL)
+    {
+        LOG_E("add netdev(%s) failed.", bc28->device_name);
+        return -RT_ERROR;
+    }
+
+    /* initialize bc28 pin configuration */
+    if (bc28->power_pin != -1)
+    {
+        rt_pin_mode(bc28->power_pin, PIN_MODE_OUTPUT);
+        rt_pin_write(bc28->power_pin, PIN_LOW);
+    }
+
+    /* initialize bc28 device network */
+    return bc28_netdev_set_up(device->netdev);
 }
 
 static int bc28_deinit(struct at_device *device)
@@ -862,17 +898,13 @@ static int bc28_control(struct at_device *device, int cmd, void *arg)
 
     switch (cmd)
     {
-    case AT_DEVICE_CTRL_SLEEP:
-        result = bc28_sleep(device);
+    case AT_DEVICE_CTRL_RESET:
+        result = bc28_reset(device);
         break;
+    case AT_DEVICE_CTRL_SLEEP:
     case AT_DEVICE_CTRL_WAKEUP:
-        result = bc28_wakeup(device);
-        break;
     case AT_DEVICE_CTRL_POWER_ON:
     case AT_DEVICE_CTRL_POWER_OFF:
-    case AT_DEVICE_CTRL_RESET:
-        result = bc28_reset(device);
-        break;
     case AT_DEVICE_CTRL_LOW_POWER:
     case AT_DEVICE_CTRL_NET_CONN:
     case AT_DEVICE_CTRL_NET_DISCONN:

+ 20 - 37
class/bc28/at_socket_bc28.c

@@ -130,7 +130,7 @@ static int bc28_socket_close(struct at_socket *socket)
         return -RT_ENOMEM;
     }
     
-    result = at_obj_exec_cmd(device->client, resp, "AT+QICLOSE=%d", device_socket);
+    result = at_obj_exec_cmd(device->client, resp, "AT+NSOCL=%d", device_socket);
 
     at_delete_resp(resp);
 
@@ -154,7 +154,7 @@ static int bc28_socket_close(struct at_socket *socket)
 static int bc28_socket_connect(struct at_socket *socket, char *ip, int32_t port,
     enum at_socket_type type, rt_bool_t is_client)
 {
-    #define CONN_RETRY  2
+#define CONN_RETRY  2
 
     int i = 0;
     const char *type_str = RT_NULL;
@@ -172,17 +172,9 @@ static int bc28_socket_connect(struct at_socket *socket, char *ip, int32_t port,
         return -RT_ERROR;
     }
 
-    switch(type)
+    if (type != AT_SOCKET_TCP)
     {
-        case AT_SOCKET_TCP:
-            type_str = "TCP";
-            break;
-        case AT_SOCKET_UDP:
-            type_str = "UDP";
-            break;
-        default:
-            LOG_E("%s device socket(%d)  connect type error.", device->name, device_socket);
-            return -RT_ERROR;
+        return -RT_ERROR;
     }
 
     resp = at_create_resp(128, 0, rt_tick_from_millisecond(300));
@@ -198,8 +190,8 @@ static int bc28_socket_connect(struct at_socket *socket, char *ip, int32_t port,
         event = SET_EVENT(device_socket, BC28_EVENT_CONN_OK | BC28_EVENT_CONN_FAIL);
         bc28_socket_event_recv(device, event, 0, RT_EVENT_FLAG_OR);
 
-        if (at_obj_exec_cmd(device->client, resp, "AT+QIOPEN=1,%d,\"%s\",\"%s\",%d,0,1", 
-                            device_socket, type_str, ip, port) < 0)
+        if (at_obj_exec_cmd(device->client, resp, "AT+NSOCO=%d,%s,%d", 
+                            device_socket, ip, port) < 0)
         {
             result = -RT_ERROR;
             break;
@@ -439,7 +431,7 @@ __exit:
  *         -2: wait socket event timeout
  *         -5: no memory
  */
-static int bc28_domain_resolve(const char *name, char ip[16])
+int bc28_domain_resolve(const char *name, char ip[16])
 {
     #define RESOLVE_RETRY  3
 
@@ -472,7 +464,7 @@ static int bc28_domain_resolve(const char *name, char ip[16])
     bc28 = (struct at_device_bc28 *) device->user_data;
     bc28->socket_data = ip;
 
-    if (at_obj_exec_cmd(device->client, resp, "AT+QIDNSGIP=1,\"%s\"", name) != RT_EOK)
+    if (at_obj_exec_cmd(device->client, resp, "AT+QDNS=0,%s", name) != RT_EOK)
     {
         result = -RT_ERROR;
         goto __exit;
@@ -704,29 +696,12 @@ static void urc_dnsqip_func(struct at_client *client, const char *data, rt_size_
         return;
     }
 
-    for (i = 0; i < size; i++)
-    {
-        if (*(data + i) == '.')
-            j++;
-    }
-    /* There would be several dns result, we just pickup one */
-    if (j == 3)
-    {
-        sscanf(data, "+QIURC: \"dnsgip\",\"%[^\"]", recv_ip);
-        recv_ip[15] = '\0';
+    sscanf(data, "+QDNS:%s", recv_ip);
+    recv_ip[15] = '\0';
 
-        rt_memcpy(bc28->socket_data, recv_ip, sizeof(recv_ip));
+    rt_memcpy(bc28->socket_data, recv_ip, sizeof(recv_ip));
 
-        bc28_socket_event_send(device, BC28_EVENT_DOMAIN_OK);
-    }
-    else
-    {
-        sscanf(data, "+QIURC: \"dnsgip\",%d,%d,%d", &result, &ip_count, &dns_ttl);
-        if (result)
-        {
-            at_tcp_ip_errcode_parse(result);
-        }
-    }
+    bc28_socket_event_send(device, BC28_EVENT_DOMAIN_OK);
 }
 
 static void urc_func(struct at_client *client, const char *data, rt_size_t size)
@@ -736,6 +711,13 @@ static void urc_func(struct at_client *client, const char *data, rt_size_t size)
     LOG_I("URC data : %.*s", size, data);
 }
 
+static void urc_dns_func(struct at_client *client, const char *data, rt_size_t size)
+{
+    RT_ASSERT(data && size);
+
+    urc_dnsqip_func(client, data, size);
+}
+
 static void urc_qiurc_func(struct at_client *client, const char *data, rt_size_t size)
 {
     RT_ASSERT(data && size);
@@ -755,6 +737,7 @@ static const struct at_urc urc_table[] =
     {"SEND FAIL",   "\r\n",                 urc_send_func},
     {"+QIOPEN:",    "\r\n",                 urc_connect_func},
     {"+QIURC:",     "\r\n",                 urc_qiurc_func},
+    {"+QDNS:",      "\r\n",                 urc_dns_func},
 };
 
 static const struct at_socket_ops bc28_socket_ops =