既然要做IOT玩具,当然要能上网,然后用手机控制玩具~
接下来的Note 3和Note 4,来试着用手机控制LED灯。
*题外话: 如果是用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