Kaynağa Gözat

调整 js wlan 功能代码支持 gb2312 编码格式 wifi ap 名称

Signed-off-by: yangfasheng <yangfasheng@rt-thread.com>
yangfasheng 6 yıl önce
ebeveyn
işleme
95e68dfed2

+ 0 - 57
rtthread-port/jerry_buffer.c

@@ -24,63 +24,6 @@
 static jerry_value_t jerry_buffer_prototype;
 static jerry_value_t jerry_buffer_prototype;
 js_buffer_t *jerry_buffer_find(const jerry_value_t obj);
 js_buffer_t *jerry_buffer_find(const jerry_value_t obj);
 
 
-bool is_utf8_string(const void* str, int size)
-{
-    bool ret = true;
-    unsigned char* start = (unsigned char*)str;
-    unsigned char* end = (unsigned char*)str + size;
-
-    while (start < end)
-    {
-        if (*start < 0x80) 				// (10000000): 值小于0x80的为ASCII字符    
-        {
-            start++;
-        }
-        else if (*start < (0xC0)) 		// (11000000): 值介于0x80与0xC0之间的为无效UTF-8字符    
-        {
-            ret = false;
-            break;
-        }
-        else if (*start < (0xE0)) 		// (11100000): 此范围内为2字节UTF-8字符    
-        {
-            if (start >= end - 1)
-            {
-                break;
-            }
-
-            if ((start[1] & (0xC0)) != 0x80)
-            {
-                ret = false;
-                break;
-            }
-
-            start += 2;
-        }
-        else if (*start < (0xF0)) 		// (11110000): 此范围内为3字节UTF-8字符    
-        {
-            if (start >= end - 2)
-            {
-                break;
-            }
-
-            if ((start[1] & (0xC0)) != 0x80 || (start[2] & (0xC0)) != 0x80)
-            {
-                ret = false;
-                break;
-            }
-
-            start += 3;
-        }
-        else
-        {
-            ret = false;
-            break;
-        }
-    }
-
-    return ret;
-}
-
 static void jerry_buffer_callback_free(void *handle)
 static void jerry_buffer_callback_free(void *handle)
 {
 {
     js_buffer_t *item = (js_buffer_t *)handle;
     js_buffer_t *item = (js_buffer_t *)handle;

+ 79 - 0
rtthread-port/jerry_util.c

@@ -7,6 +7,7 @@
 #include "jerry_util.h"
 #include "jerry_util.h"
 #include <jerry_event.h>
 #include <jerry_event.h>
 #include <jerry_message.h>
 #include <jerry_message.h>
+#include <rtgui/gb2312.h>
 
 
 extern int js_console_init(void);
 extern int js_console_init(void);
 extern int js_module_init(void);
 extern int js_module_init(void);
@@ -18,6 +19,63 @@ static void _js_value_dump(jerry_value_t value);
 static rt_mutex_t _util_lock = NULL;
 static rt_mutex_t _util_lock = NULL;
 static js_util_user _user_init = NULL, _user_cleanup = NULL;
 static js_util_user _user_init = NULL, _user_cleanup = NULL;
 
 
+bool is_utf8_string(const void* str, int size)
+{
+    bool ret = true;
+    unsigned char* start = (unsigned char*)str;
+    unsigned char* end = (unsigned char*)str + size;
+
+    while (start < end)
+    {
+        if (*start < 0x80) 				// (10000000): 值小于0x80的为ASCII字符    
+        {
+            start++;
+        }
+        else if (*start < (0xC0)) 		// (11000000): 值介于0x80与0xC0之间的为无效UTF-8字符    
+        {
+            ret = false;
+            break;
+        }
+        else if (*start < (0xE0)) 		// (11100000): 此范围内为2字节UTF-8字符    
+        {
+            if (start >= end - 1)
+            {
+                break;
+            }
+
+            if ((start[1] & (0xC0)) != 0x80)
+            {
+                ret = false;
+                break;
+            }
+
+            start += 2;
+        }
+        else if (*start < (0xF0)) 		// (11110000): 此范围内为3字节UTF-8字符    
+        {
+            if (start >= end - 2)
+            {
+                break;
+            }
+
+            if ((start[1] & (0xC0)) != 0x80 || (start[2] & (0xC0)) != 0x80)
+            {
+                ret = false;
+                break;
+            }
+
+            start += 3;
+        }
+        else
+        {
+            ret = false;
+            break;
+        }
+    }
+
+    return ret;
+}
+
 void js_set_property(const jerry_value_t obj, const char *name,
 void js_set_property(const jerry_value_t obj, const char *name,
                      const jerry_value_t prop)
                      const jerry_value_t prop)
 {
 {
@@ -59,6 +117,27 @@ void js_add_function(const jerry_value_t obj, const char *name,
     jerry_release_value(jfunc);
     jerry_release_value(jfunc);
 }
 }
 
 
+jerry_value_t js_string_to_value(const char *value)
+{
+    jerry_value_t str = 0;
+
+    if (is_utf8_string(value, strlen(value)))
+    {
+        str = jerry_create_string((const jerry_char_t *)value);
+    }
+    else
+    {
+        char *utf8 = NULL;
+		
+        Gb2312ToUtf8((char *)value, strlen(value), &utf8);
+        str = jerry_create_string((const jerry_char_t *)utf8);
+		
+        rt_free(utf8);
+    }
+    
+    return str;
+}
+
 char *js_value_to_string(const jerry_value_t value)
 char *js_value_to_string(const jerry_value_t value)
 {
 {
     int len;
     int len;

+ 3 - 0
rtthread-port/jerry_util.h

@@ -36,6 +36,8 @@ extern "C"
 
 
 typedef void(*js_util_user)(void);
 typedef void(*js_util_user)(void);
 
 
+bool is_utf8_string(const void* str, int size);
+
 void js_set_property(const jerry_value_t obj, const char *name,
 void js_set_property(const jerry_value_t obj, const char *name,
                      const jerry_value_t prop);
                      const jerry_value_t prop);
 void js_set_string_property(const jerry_value_t obj, const char *name,
 void js_set_string_property(const jerry_value_t obj, const char *name,
@@ -50,6 +52,7 @@ jerry_value_t js_call_func_obj(const jerry_value_t func_obj_val, const jerry_val
 jerry_value_t js_call_function(const jerry_value_t obj, const char *name,
 jerry_value_t js_call_function(const jerry_value_t obj, const char *name,
                                const jerry_value_t args[], jerry_size_t args_cnt);
                                const jerry_value_t args[], jerry_size_t args_cnt);
 
 
+jerry_value_t js_string_to_value(const char *value);
 char *js_value_to_string(const jerry_value_t value);
 char *js_value_to_string(const jerry_value_t value);
 
 
 void js_value_dump(const jerry_value_t value);
 void js_value_dump(const jerry_value_t value);

+ 58 - 18
rtthread-port/jerry_wlan.c

@@ -3,6 +3,13 @@
 
 
 #ifdef RT_USING_WIFI
 #ifdef RT_USING_WIFI
 
 
+#include <rtgui/gb2312.h>
+
+#define DBG_ENABLE
+#define DBG_SECTION_NAME    "JS WLAN"
+#define DBG_LEVEL           DBG_LOG
+#include <rtdbg.h>
+
 static void get_wifi_info(void **info, jerry_value_t js_target)
 static void get_wifi_info(void **info, jerry_value_t js_target)
 {
 {
     jerry_value_t js_info = js_get_property(js_target, "info");
     jerry_value_t js_info = js_get_property(js_target, "info");
@@ -55,20 +62,21 @@ static int connect_wifi(struct wifi_info *info, char *ssid, char *password, char
 
 
                 if (bssid)
                 if (bssid)
                 {
                 {
-                    if (rt_strcmp((const char *)ssid, (const char *)info->wifi_list.info[i].ssid.val) == 0 && rt_strcmp((const char *)bssid, (const char *)buffer) == 0)
+                    if (rt_strcmp((const char *)bssid, (const char *)buffer) != 0)
                     {
                     {
-                        ret = rt_wlan_connect_adv(&(info->wifi_list.info[i]), password);
-                        break;
+                        continue;
                     }
                     }
                 }
                 }
-                else
-                {
 
 
-                    if (rt_strcmp((const char *)ssid, (const char *)info->wifi_list.info[i].ssid.val) == 0)
-                    {
-                        ret = rt_wlan_connect_adv(&(info->wifi_list.info[i]), password);
-                        break;
-                    }
+                if (rt_strcmp((const char *)ssid, (const char *)info->wifi_list.info[i].ssid.val) == 0)
+                {
+                    ret = rt_wlan_connect_adv(&(info->wifi_list.info[i]), password);
+                    break;
+                }
+                else if (info->gb_ssid[i].ssid && rt_strcmp((const char *)ssid, (const char *)info->gb_ssid[i].ssid) == 0)
+                {
+                    ret = rt_wlan_connect_adv(&(info->wifi_list.info[info->gb_ssid[i].index]), password);
+                    break;
                 }
                 }
             }
             }
 
 
@@ -79,7 +87,7 @@ static int connect_wifi(struct wifi_info *info, char *ssid, char *password, char
 
 
             if (i >= info->wifi_list.num)
             if (i >= info->wifi_list.num)
             {
             {
-                rt_kprintf("There is no ap in the scanned wifi : %s\n", ssid);
+                LOG_W("The scanned wifi is not included %s", ssid);
                 ret = -2;
                 ret = -2;
             }
             }
         }
         }
@@ -96,20 +104,52 @@ static void scanEvent_handler(int event, struct rt_wlan_buff *buff, void *parame
     get_wifi_info((void**)&info, js_wifi);
     get_wifi_info((void**)&info, js_wifi);
     if (info)
     if (info)
     {
     {
+        int i;
         jerry_value_t js_return = 0;
         jerry_value_t js_return = 0;
         struct rt_wlan_scan_result *temp_result = (struct rt_wlan_scan_result*)buff->data;
         struct rt_wlan_scan_result *temp_result = (struct rt_wlan_scan_result*)buff->data;
 
 
         if (temp_result->num > 0)
         if (temp_result->num > 0)
         {
         {
             if (info->wifi_list.info)
             if (info->wifi_list.info)
+            {
                 free(info->wifi_list.info);
                 free(info->wifi_list.info);
+            }
+
+            if (info->gb_ssid)
+            {
+                for (i = 0; i < info->wifi_list.num; i++)
+                {
+                    if (info->gb_ssid[i].ssid)
+                    {
+                        rt_free(info->gb_ssid[i].ssid);
+                    }
+                }
+                free(info->gb_ssid);
+            }
 
 
             info->wifi_list.num = temp_result->num;
             info->wifi_list.num = temp_result->num;
             info->wifi_list.info = (struct rt_wlan_info*)malloc(sizeof(struct rt_wlan_info) * info->wifi_list.num);
             info->wifi_list.info = (struct rt_wlan_info*)malloc(sizeof(struct rt_wlan_info) * info->wifi_list.num);
+            info->gb_ssid = (struct wifi_ssid*)malloc(sizeof(struct wifi_ssid) * info->wifi_list.num);
             if (info->wifi_list.info)
             if (info->wifi_list.info)
             {
             {
                 memcpy(info->wifi_list.info, temp_result->info, sizeof(struct rt_wlan_info) * info->wifi_list.num);
                 memcpy(info->wifi_list.info, temp_result->info, sizeof(struct rt_wlan_info) * info->wifi_list.num);
 
 
+                if (info->gb_ssid)
+                {
+                    int j = 0;
+                    memset(info->gb_ssid, 0x00, sizeof(struct wifi_ssid) * info->wifi_list.num);
+
+                    for (i = 0; i < info->wifi_list.num; i++)
+                    {
+                        if (!is_utf8_string((void *)info->wifi_list.info[i].ssid.val, strlen((const char *)info->wifi_list.info[i].ssid.val)))
+                        {
+                            info->gb_ssid[j].index = i;
+                            Gb2312ToUtf8((char *)info->wifi_list.info[i].ssid.val, strlen((const char *)info->wifi_list.info[i].ssid.val), &info->gb_ssid[j].ssid);
+                            j ++;
+                        }
+                    }
+                }
+
                 if (info->ssid)
                 if (info->ssid)
                 {
                 {
                     if (connect_wifi(info, info->ssid, info->password, info->bssid) == -2)
                     if (connect_wifi(info, info->ssid, info->password, info->bssid) == -2)
@@ -142,12 +182,12 @@ static void scanEvent_handler(int event, struct rt_wlan_buff *buff, void *parame
 
 
                     js_return = jerry_create_array(info->wifi_list.num);
                     js_return = jerry_create_array(info->wifi_list.num);
 
 
-                    for (int i = 0; i < info->wifi_list.num; i++)
+                    for (i = 0; i < info->wifi_list.num; i++)
                     {
                     {
                         struct rt_wlan_info *wifi_info = &(info->wifi_list.info[i]);
                         struct rt_wlan_info *wifi_info = &(info->wifi_list.info[i]);
                         jerry_value_t js_wifi_info = jerry_create_object();
                         jerry_value_t js_wifi_info = jerry_create_object();
 
 
-                        js_ssid = jerry_create_string(((const jerry_char_t*)wifi_info->ssid.val));
+                        js_ssid = js_string_to_value((const char*)wifi_info->ssid.val);
                         js_set_property(js_wifi_info, "ssid", js_ssid);
                         js_set_property(js_wifi_info, "ssid", js_ssid);
                         jerry_release_value(js_ssid);
                         jerry_release_value(js_ssid);
 
 
@@ -163,7 +203,7 @@ static void scanEvent_handler(int event, struct rt_wlan_buff *buff, void *parame
                                    wifi_info->bssid[4],
                                    wifi_info->bssid[4],
                                    wifi_info->bssid[5]);
                                    wifi_info->bssid[5]);
 
 
-                        js_bssid = jerry_create_string(((const jerry_char_t*)buffer));
+                        js_bssid = jerry_create_string((const jerry_char_t*)buffer);
                         js_set_property(js_wifi_info, "bssid", js_bssid);
                         js_set_property(js_wifi_info, "bssid", js_bssid);
                         jerry_release_value(js_bssid);
                         jerry_release_value(js_bssid);
 
 
@@ -212,7 +252,7 @@ static void connectEvent_handler(int event, struct rt_wlan_buff *buff, void *par
             jerry_value_t js_ssid, js_strength, js_bssid, js_secure;
             jerry_value_t js_ssid, js_strength, js_bssid, js_secure;
             js_return = jerry_create_object();
             js_return = jerry_create_object();
 
 
-            js_ssid = jerry_create_string(((const jerry_char_t*)wifi_info->ssid.val));
+            js_ssid = js_string_to_value((const char*)wifi_info->ssid.val);
             js_set_property(js_return, "ssid", js_ssid);
             js_set_property(js_return, "ssid", js_ssid);
             jerry_release_value(js_ssid);
             jerry_release_value(js_ssid);
 
 
@@ -228,7 +268,7 @@ static void connectEvent_handler(int event, struct rt_wlan_buff *buff, void *par
                        wifi_info->bssid[4],
                        wifi_info->bssid[4],
                        wifi_info->bssid[5]);
                        wifi_info->bssid[5]);
 
 
-            js_bssid = jerry_create_string(((const jerry_char_t*)buffer));
+            js_bssid = jerry_create_string((const jerry_char_t*)buffer);
             js_set_property(js_return, "bssid", js_bssid);
             js_set_property(js_return, "bssid", js_bssid);
             jerry_release_value(js_bssid);
             jerry_release_value(js_bssid);
 
 
@@ -487,7 +527,7 @@ DECLARE_HANDLER(getConnectedWifi)
             {
             {
                 char bssid[32];
                 char bssid[32];
 
 
-                js_ssid = jerry_create_string(((const jerry_char_t*)info.ssid.val));
+                js_ssid = js_string_to_value((const char*)info.ssid.val);
                 js_set_property(js_wifi_info, "ssid", js_ssid);
                 js_set_property(js_wifi_info, "ssid", js_ssid);
                 jerry_release_value(js_ssid);
                 jerry_release_value(js_ssid);
 
 
@@ -503,7 +543,7 @@ DECLARE_HANDLER(getConnectedWifi)
                            info.bssid[4],
                            info.bssid[4],
                            info.bssid[5]);
                            info.bssid[5]);
 
 
-                js_bssid = jerry_create_string(((const jerry_char_t*)bssid));
+                js_bssid = jerry_create_string((const jerry_char_t*)bssid);
                 js_set_property(js_wifi_info, "bssid", js_bssid);
                 js_set_property(js_wifi_info, "bssid", js_bssid);
                 jerry_release_value(js_bssid);
                 jerry_release_value(js_bssid);
 
 

+ 7 - 0
rtthread-port/jerry_wlan.h

@@ -16,11 +16,18 @@
 #include <jerry_buffer.h>
 #include <jerry_buffer.h>
 #include <wlan_mgnt.h>
 #include <wlan_mgnt.h>
 
 
+struct wifi_ssid
+{
+    char *ssid;
+    int index;
+};
+
 struct wifi_info
 struct wifi_info
 {
 {
     jerry_value_t this_value;
     jerry_value_t this_value;
     struct js_callback *event_callback;
     struct js_callback *event_callback;
     struct rt_wlan_scan_result wifi_list;
     struct rt_wlan_scan_result wifi_list;
+    struct wifi_ssid *gb_ssid;
     char *ssid;
     char *ssid;
     char *password;
     char *password;
     char *bssid;
     char *bssid;