iT邦幫忙

0

[IoT自製玩具][Ameba Z2][Note 3] 手機控制LED(1)- 開機自動連wifi上網

既然要做IOT玩具,當然要能上網,然後用手機控制玩具~
接下來的Note 3和Note 4,來試著用手機控制LED燈。
/images/emoticon/emoticon50.gif

*題外話: 如果是用Arduino的話,就可以用美美的Blynk APP了,且號稱5分鐘可透過手機控制板子LED。Amebaz2似乎也有Arduino SDK,但我沒有裝過。目前不裝Arduino,先用最古老的方法...

1. 開機自動連wifi上網

要是每一次開機都要手動設定wifi上網,就太麻煩了,所以要把wifi資訊存進firmware裡。
首先開啟這個檔案 component/common/example/wlan_fast_connect/example_wlan_fast_connect.c
找到以下function(此function在boot的過程中會執行到,所以直接改這邊最快)。

int wlan_init_done_callback(void)
{
// ...
// 中間略
// ...
     data = (struct wlan_fast_reconnect *)malloc(sizeof(struct wlan_fast_reconnect));
     if(data){
         device_mutex_lock(RT_DEV_LOCK_FLASH);
         // wlan fast reconnect資訊是存在FAST_RECONNECT_DATA裡面,而這個變數是一塊在flash offset(0x200000 - 0x1000)的空間
         flash_stream_read(&flash, FAST_RECONNECT_DATA, sizeof(struct wlan_fast_reconnect), (uint8_t *)data);                     
         device_mutex_unlock(RT_DEV_LOCK_FLASH);

正常情況下,FAST_RECONNECT_DATA裡面是沒有東西的,所以正解就是,在build firmware時先做一個struct wlan_fast_reconnect物件,把它一起包進firmware binary中。燒完firmware重開機之後,物件就會存在flash中了。
但這個方法有點麻煩,必須要去trace build firmware的code,有點懶惰.......
所以決定先用一個偷吃步就好(看看就好不要學,可能會有不預期的bug)。

// 一樣在wlan_init_done_callback(void)這個function
// 既然data物件讀出來是空的,那我只好塞值給他了,而且只塞必要的值

    printf("[HANA] set config - wlan fast connect - start\n");
    
    // 家裡AP的SSID
    strcpy(data->psk_essid, "HANA_HOME_WIFI");
    
    // 家裡AP的密碼(直接明碼很危險,不過先這樣)
    strcpy(data->psk_passphrase, "12345678");
    
    // 參考家裡AP的加密方法
    data->security_type = RTW_SECURITY_WPA2_AES_PSK;
    
    // 先建立一個全域變數static u8 pscan_channel_list[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14};
    // 代表要掃描所有的channel
    data->channel = &pscan_channel_list;  
    printf("[HANA] set config - wlan fast connect - end\n");

// 因為我們只有指定data物件一部分的值而已,其他沒用到的地方需要註解掉,以免crash,例如
// offer_ip = data->offer_ip;


// wifi_connect()是連接wifi上網的主要function,所以只要把wifi物件搞定就好
// 而wifi物件又是從data來的,所以改data物件是可行的
    ret = wifi_connect((char*)wifi.ssid.val, wifi.security_type, (char*)wifi.password, wifi.ssid.len,
    wifi.password_len, wifi.key_id, NULL);

燒完firmware重開機,就會看到UART log印出以下文字,代表要到IP囉!!!

Interface 0 IP address : 192.168.1.105  

/images/emoticon/emoticon12.gif


尚未有邦友留言

立即登入留言