1. 程式人生 > >AliOS-Things--ESP8266-linkkitapp-配網(一)

AliOS-Things--ESP8266-linkkitapp-配網(一)

linkkitapp例程中,主要有兩個c檔案

  • linkkit_entry.c
  • linkkit_sample_solo.c
     可以這麼理解,整個工程編譯後,程式執行時,linkkit_entry.c中的檔案將會呼叫linkkit_sample_solo.c中的函式。
    linkkitapp.mk
    linkkit_entry.c
    linkkit_sample_solo.c
    make.settings
    ucube.py

一、修改四元組

在工程下的linkkit_sample_solo.c中修改。具體怎麼獲取,省略。

二、下載程式–配網

1、第一個坑:原以為上電就可以掃碼配網的,原來還要進入配網模式才可以!

 把程式下載到ESP8266上面之後,復位開始執行,波特率921600,串列埠除錯助手裡面是這個樣子的:

empty
Wifi init success!!
mode : softAP(ce:50:e3:04:d4:16)
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
add if1
bcn 100
trace should have cli to control!!!
[000110]<V> aos framework init.
[000110]<V> ============free heap size =39528==========
Hello liefyuan
[000120]<V> IOTX_AWSS_START
awss version: smarthome-bd18d6d<DEBUG> [zconfig_init#2115] : awss lib smarthome-bd18d6d

bcn 0
del if1
usl
sul 0 0
mode : sta(cc:50:e3:04:d4:16)
add if0
chan 1
[1] ssid:沉迷於上班無法自拔, mac:488ad29ead62, chn:1, auth:wpa2-psk, aes, aes, rssi:-84, adha:0
[2] ssid:1318, mac:34967240f2d8, chn:1, auth:wpa2-psk, aes, aes, rssi:-65, adha:0
[3] ssid:ChinaNet-VcEF, mac:cc90e83a23b7, chn:1, auth:wpa2-psk, aes, tkip, rssi:-83, adha:0
[4] ssid:iTV-7903, mac:38e595d60f49, chn:1, auth:wpa2-psk, aes, tkip, rssi:-76, adha:0
[5] ssid:ChinaNet-7903, mac:38e595d60f48, chn:1, auth:wpa2-psk, aes, tkip, rssi:-76, adha:0
chan 6
[6] ssid:AFFCOOL, mac:8c2505d70cc0, chn:6, auth:wpa2-psk, aes, aes, rssi:-73, adha:0
[7] ssid:Mellerio, mac:b0958eaf568b, chn:6, auth:wpa2-psk, aes, tkip, rssi:-80, adha:0
[8] ssid:360鍏嶈垂WiFi-BD, mac:00367657ecbd, chn:6, auth:wpa2-psk, aes, aes, rssi:-82, adha:0
[9] ssid:meilele1, mac:dcfe187ecdfe, chn:6, auth:wpa2-psk, aes, aes, rssi:-82, adha:0
[10] ssid:DSJ, mac:d076e75e20dd, chn:7, auth:wpa2-psk, aes, tkip, rssi:-74, adha:0
[11] ssid:CMCC-WEB, mac:5866ba6f6220, chn:6, auth:open, none, none, rssi:-83, adha:0
[12] ssid:joyce0725, mac:b0d59d47cf9d, chn:6, auth:wpa2-psk, aes, aes, rssi:-79, adha:0
chan 11
[13] ssid:ChinaNet-yWMh, mac:f092b41b7929, chn:10, auth:wpa2-psk, aes, tkip, rssi:-56, adha:0
[14] ssid:mei5, mac:282cb2ff49ae, chn:11, auth:wpa2-psk, aes, aes, rssi:-63, adha:0
[15] ssid:DIRECT-KFDESKTOP-E35402EmsMJ, mac:24fd52933a9a, chn:11, auth:wpa2-psk, aes, aes, rssi:-54, adha:0
[16] ssid:BIHEE, mac:0c4b544944b9, chn:11, auth:wpa2-psk, aes, aes, rssi:-81, adha:0
[17] ssid:CMCC, mac:5866ba6f5f11, chn:11, auth:wpa2-8021x, aes, aes, rssi:-84, adha:0
[18] ssid:and-Business, mac:5866ba6f5f12, chn:11, auth:open, none, none, rssi:-82, adha:0
chan 1
chan 2

以上資訊代表模組正處於一種“無所適從的掃描SSID的狀態”掃到最後,什麼結果都沒有。如果嘗試現在給它使用APP掃二維碼、配網,你會發現模組毫無反應,它還是在掃描SSID。

2、進入配網模式才可以掃描配網

在linkkit_entry.c中的int application_start(int argc, char **argv)函式中
有這樣一行:

aos_register_event_filter(EV_KEY, linkkit_key_process, NULL);

從函式名上看,這是一個註冊事件過濾器的,過濾的目標是按鍵點選事件,並處理按鍵點選事件的,“linkket按鍵處理”。

同一個C檔案下有它的定義:

  • 需要知道AliOS定義的按鍵對應,自己的板子上的哪個引腳。
  • 點選了AliOS配置的VALUE_KEY_CLICK按鍵將進入awss配網模式
  • 點選了AliOS配置的VALUE_KEY_LTCLICK按鍵將進行awss復位操作
void linkkit_key_process(input_event_t *eventinfo, void *priv_data)
{
    if (eventinfo->type != EV_KEY) {  // 事件型別過濾處理按鍵事件:EV_KEY
        return;
    }
    LOG("awss config press %d\n", eventinfo->value); // 傳入引數事件值

    if (eventinfo->code == CODE_BOOT) {  // 根據傳入引數判斷是否點選了 CODE_BOOT這一個型別的引腳
        if (eventinfo->value == VALUE_KEY_CLICK) { // 如果點選了VALUE_KEY_CLICK這個按鍵就進入awss配網模式
            do_awss_active();
        } else if (eventinfo->value == VALUE_KEY_LTCLICK) { // 否則如果點選了VALUE_KEY_LTCLICK這個按鍵就進入awss復位模式
            do_awss_reset();
        }
    }
}

函式中的第一個傳入引數的定義是這樣的:

typedef struct {
    /* The time event is generated, auto filled by aos event system */
    uint32_t time;
    /* Event type, value < 0x1000 are used by aos system */
    uint16_t type;
    /* Defined according to type */
    uint16_t code;
    /* Defined according to type/code */
    unsigned long value;
    /* Defined according to type/code */
    unsigned long extra;
} input_event_t;

從命名上看:輸入事件,在配網的過程中是按鍵輸入事件。
再看看按鍵定義的如何,嗯,很簡潔!

/** General key define */
#define  EV_KEY              0x0201
#define  CODE_RECORD           1
#define  CODE_VOLUME           2 /* Reserve */
#define  CODE_VOLUME_INC       3
#define  CODE_VOLUME_DEC       4
#define  CODE_PLAY_PAUSE       5
#define  CODE_MUTE             6
#define  CODE_CHANNEL          7
#define  CODE_NEXT             8
#define  CODE_RECORD_PRE       9
#define  CODE_RESET          0x1001
#define  CODE_STATUS           11
#define  CODE_ELINK            12
#define  CODE_BOOT             13
/** General key value */
#define  VALUE_KEY_UP          0
#define  VALUE_KEY_DOWN        1
#define  VALUE_KEY_CLICK       2
#define  VALUE_KEY_LTCLICK     3
#define  VALUE_KEY_LLTCLICK    4
#define  VALUE_KEY_DBCLICK     5
/** General channel value */
#define  VALUE_SYS_CHN_CONNECTED    0
#define  VALUE_SYS_CHN_CONNECTING   1
#define  VALUE_SYS_CHN_DISCONNECTED 2

沒有眉目,那就只能在板子上試了!引腳都試了,除了GPIO14是有反應外其他的都沒反應(復位引腳除外:=)。
所以可以確定了

ESP8266的GPIO14是awss的配置引腳

使用一個跳線,先把GPIO14接GND,再接V3.3,打印出以下資訊:

  • 由這段程式碼可以知道: LOG("awss config press %d\n", eventinfo->value);
  • 當我按下連線GPIO14引腳的按鍵是,觸發按鍵事件,並且事件值為:3
  • 由定義:#define VALUE_KEY_LTCLICK 3和函式void linkkit_key_process(input_event_t *eventinfo, void *priv_data)可以知道將執行awss復位操作!由列印資訊確實可以確認是執行了復位操作。
chan 3
chan 4
chan 6
chan 7
chan 11
[051960]<V> awss config press 3

<DEBUG> [awss_report_reset_to_cloud#362] : report reset:{"id":"0", "version":"1.0", "method":"thing.reset", "params":{}}

chan 13
chan 1
chan 6
chan 11
chan 1
chan 2
chan 3
chan 4
chan 5
reboot!
??????????????????????

當我再次在GPIO14上模擬一個按鍵點選操作時,它卻如下所示:

  • 再次點選GPIO14,點選事件值變成了:2
  • 由定義:#define VALUE_KEY_CLICK 2和函式void linkkit_key_process(input_event_t *eventinfo, void *priv_data)可以知道將執行awss配網操作!由列印資訊確實可以確認
chan 7
chan 8
chan 9
chan 10
chan 11
chan 12
chan 13
[068100]<V> awss config press 2

[068100]<V> do_awss_active 1

enable awss
[068100]<V> IOTX_AWSS_ENABLE
chan 1
chan 2
chan 3
chan 4
chan 6

3、終於配網成功了

chan 8
chan 9
chan 10
chan 11
chan 12
chan 13
chan 1
[008370]<V> awss config press 2

[008370]<V> do_awss_active 0

enable awss
[008370]<V> IOTX_AWSS_ENABLE
chan 2
chan 3
chan 6
[24] ssid:CMCC, mac:5866ba6f6221, chn:6, auth:wpa2-8021x, aes, aes, rssi:-79, adha:0
[25] ssid:and-Business, mac:5866ba6f6222, chn:6, auth:open, none, none, rssi:-77, adha:0
chan 7
chan 10
chan 11
chan 13
chan 1
[010020]<V> ============free heap size =29200==========
<DEBUG> [aes_decrypt_string#109] : security level: 3
<DEBUG> [zconfig_callback_channel_locked#1209] : channel lock @ 1

[010080]<V> IOTX_AWSS_LOCK_CHAN
[010080]<V> IOTX_AWSS_GOT_SSID_PASSWD
<DEBUG> [aws_main_thread_func#410] : [channel scanning] 10090 ms

<DEBUG> [aws_main_thread_func#416] : final channel 1

<DEBUG> [aws_main_thread_func#434] : [channel recving] 10090 ms

[010130]<V> IOTX_AWSS_CONNECT_ROUTER
scandone
state: 0 -> 2 (b0)
[016010]<V> ============free heap size =35304==========
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 20
pm open phy_2,type:2 0 0
cnt 

connected with 1318, channel 1
dhcp client start...
[WiFi] event 1
ip:192.168.0.127,mask:255.255.255.0,gw:192.168.0.1
[WiFi] event 4
[017090]<I> Got ip : 192.168.0.127, gw : 192.168.0.1, mask : 255.255.255.0
[017090]<I> Let's post GOT_IP event.
smart_config_stop 545
[017090]<V> wifi_service_event config.ssid 1318
[017090]<V> ============free heap size =34328==========
linkkit_main|1024 :: start!

linkkit_example|915 :: linkkit start
[dbg] _dm_mgr_search_dev_by_devid(52): Device Not Found, devid: 0
[inf] iotx_cm_init(77): cm verstion 0.3
[inf] iotx_device_info_init(39): device_info created successfully!
[dbg] iotx_device_info_set(49): start to set device info!
[dbg] iotx_device_info_set(63): device_info set successfully!
[inf] guider_print_dev_guider_info(279):