0
前面帖子【小e物联网试用体验】开发板初步试用(资料/功能/做工/开发环境/演示等评测)介绍了小e开发板开箱试用,本帖就小e开发板的应用流程进行简单描述。
用wifi接入网络的物联网应用,都类似于小e开发板的应用,其基本应用流程主要如下:
l 设备配网
l 设备绑定
l 登录物联网云平台使用应用
以下按照这三个阶段进行说明:
1设备配网
1.1设备配网基本原理
设备配网实际上是局域网配网,即具有wifi模块的设备设置其上网路由的配置过程。传统的配网方法是设备提供一个web界面,对wifi上网路由进行配置,这需要设备具有AP功能并在配置完成后切换为Station,同时要求使用者具有一定的网络基础还涉及一些密码等等,比较麻烦。目前的配网方式是通过已经配置路由的手机APP(或者类似的平板等)进行广播,广播信息中包含了wifi路由器名称和密码;而被配网的设备则将wifi模块的工作模式设定在杂凑模式进行侦听。设备侦听到广播的wifi路由器名称和密码后即可进行wifi路由的设置并接入网络。
关于设备配网,这里只进行简单描述,可以在网上搜索到很多资料。如:
https://cjey.me/archives/289
http://www.aichengxu.com/view/46400
espressif公司的smartconfig,腾信公司的airkiss,都是基于上述原理。
1.2 小e开发板的配网
在帖子【小e物联网试用体验】开发板初步试用(资料/功能/做工/开发环境/演示等评测)中描述到,用微信配网失败,而使用espressif提供的app则可以成功配网。
微信配网是在微信网页中通过javascript调用腾讯提供的API发送广播信息从而实现配网。由于微信配网需要通过微信公众平台进行配置,这里不作进一步的讨论,有条件的读者可以自行阅读微信的airkiss开发文档进行测试。
espressif配网为smartconfig配网。为了进行设备配网,需要建立smartconfig配网的工程。由于基于小e开发板进行,需要先对版本进行配套。
1)建立工程目录: Share/et_iot_source/smart_config。
2)将espressif RTOS_SDK V1.2的examples/smart_config目录拷贝到工程目录Share/et_iot_source目录中。
3)修改Share/et_iot_source/smart_config/gen_misc.sh文件,增加如下配置,以便将smart_config目录纳入工程中:
home_path=${PWD%smart*}
export SDK_PATH=${home_path}
export BIN_PATH=${home_path}"bin"
4)将Share/et_iot_source/et_app/include/et_types.h文件拷贝到Share/et_iot_source/smart_config/include目录。
5)在Share/et_iot_source/smart_config执行gen_misc.sh,针对小e开发板进行参数选择后编译链接生成bin文件。
esp8266@esp8266-VirtualBox:~/Share/et_iot_source/smart_config$ ./gen_misc.sh
gen_misc.sh version 20150826
SDK_PATH:
/home/esp8266/Share/et_iot_source/
BIN_PATH:
/home/esp8266/Share/et_iot_source/bin
Please check SDK_PATH & BIN_PATH, enter (Y/y) to continue:
Y
Please follow below steps(1-5) to generate specific bin(s):
STEP 1: use boot_v1.2+ by default
boot mode: new
STEP 2: choose bin generate(0=eagle.flash.bin+eagle.irom0text.bin, 1=user1.bin, 2=user2.bin)
enter (0/1/2, default 0):
ignore boot
generate bin: eagle.flash.bin+eagle.irom0text.bin
STEP 3: choose spi speed(0=20MHz, 1=26.7MHz, 2=40MHz, 3=80MHz)
enter (0/1/2/3, default 2):
spi speed: 40 MHz
STEP 4: choose spi mode(0=QIO, 1=QOUT, 2=DIO, 3=DOUT)
enter (0/1/2/3, default 0):
spi mode: QIO
STEP 5: choose spi size and map
0= 512KB( 256KB+ 256KB)
2=1024KB( 512KB+ 512KB)
3=2048KB( 512KB+ 512KB)
4=4096KB( 512KB+ 512KB)
5=2048KB(1024KB+1024KB)
6=4096KB(1024KB+1024KB)
enter (0/2/3/4/5/6, default 0):
3
spi size: 2048KB
spi ota map: 512KB + 512KB
start...
make -C user clean;
make[1]: Entering directory `/mnt/Share/et_iot_source/smart_config/user'
rm -f -r .output/eagle/debug
make[1]: Leaving directory `/mnt/Share/et_iot_source/smart_config/user'
rm -f -r .output/eagle/debug
make[1]: Entering directory `/mnt/Share/et_iot_source/smart_config/user'
DEPEND: xtensa-lx106-elf-gcc -M -Os -g -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -ffunction-sections -fdata-sections -DICACHE_FLASH -I include -I ./ -I ../include -I /home/esp8266/Share/et_iot_source//include -I /home/esp8266/Share/et_iot_source//extra_include -I /home/esp8266/Share/et_iot_source//include/lwip -I /home/esp8266/Share/et_iot_source//include/lwip/ipv4 -I /home/esp8266/Share/et_iot_source//include/lwip/ipv6 -I /home/esp8266/Share/et_iot_source//include/espressif user_main.c
make[1]: Leaving directory `/mnt/Share/et_iot_source/smart_config/user'
make[1]: Entering directory `/mnt/Share/et_iot_source/smart_config/user'
make[1]: Warning: File `.output/eagle/debug/obj/user_main.d' has modification time 3.5 s in the future
xtensa-lx106-elf-gcc -Os -g -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -ffunction-sections -fdata-sections -DICACHE_FLASH -I include -I ./ -I ../include -I /home/esp8266/Share/et_iot_source//include -I /home/esp8266/Share/et_iot_source//extra_include -I /home/esp8266/Share/et_iot_source//include/lwip -I /home/esp8266/Share/et_iot_source//include/lwip/ipv4 -I /home/esp8266/Share/et_iot_source//include/lwip/ipv6 -I /home/esp8266/Share/et_iot_source//include/espressif -o .output/eagle/debug/obj/user_main.o -c user_main.c
xtensa-lx106-elf-ar ru .output/eagle/debug/lib/libuser.a .output/eagle/debug/obj/user_main.o
xtensa-lx106-elf-ar: creating .output/eagle/debug/lib/libuser.a
make[1]: warning: Clock skew detected. Your build may be incomplete.
make[1]: Leaving directory `/mnt/Share/et_iot_source/smart_config/user'
make: Warning: File `user/.output/eagle/debug/lib/libuser.a' has modification time 3.5 s in the future
xtensa-lx106-elf-gcc -L/home/esp8266/Share/et_iot_source//lib -Wl,--gc-sections -nostdlib -T/home/esp8266/Share/et_iot_source//ld/eagle.app.v6.ld -Wl,--no-check-sections -u call_user_start -Wl,-static -Wl,--start-group -lminic -lgcc -lhal -lphy -lpp -lnet80211 -lwpa -lmain -lfreertos -llwip -lairkiss_log -lsmartconfig user/.output/eagle/debug/lib/libuser.a -Wl,--end-group -o .output/eagle/debug/image/eagle.app.v6.out
!!!
SDK_PATH: /home/esp8266/Share/et_iot_source/
BIN_PATH: /home/esp8266/Share/et_iot_source/bin
No boot needed.
Generate eagle.flash.bin and eagle.irom0text.bin successully in BIN_PATH
eagle.flash.bin-------->0x00000
eagle.irom0text.bin---->0x40000
!!!
make: warning: Clock skew detected. Your build may be incomplete.
说明:
a.运行gen_misc.sh后,第一个需要确认的是SDK_PATH和BIN_PATH路径是否正确。step1-step4选择缺省配置,step5根据小e开发板的具体硬件选择2MB flash配置。各个step的含义参考espressif的官方文档。
b.采用espressif RTOS_SDK中的smart_config生成的bin文件在如下目录:
BIN_PATH:/home/esp8266/Share/et_iot_source/bin
需要烧录的文件包括:eagle.irom0text.bin,eagle.flash.bin
Generate eagle.flash.bin and eagle.irom0text.bin successully in BIN_PATH
eagle.flash.bin-------->0x00000
eagle.irom0text.bin---->0x40000
注意:与小e开发板自己的工程将bin生成后放到/home/esp8266/Share/et_iot_source/bin/upgrade中不同,烧录的地址也不一样。
6)将bin烧录到设备:
关于烧录文件和地址的选择,请参考espressif文档《99A-ESP8266__Flash_RW_Operation__CN_v0.2.pdf》。
7)用espressif的apk demo进行配置(该demo与小e开发板提供demo一致,显示版本V0.3.3,实际上用V0.3.4.3也可以配套,源码可在espressif官方网站下载。从小e开发板串口输出的信息如下:
ets Jan 8 2013,rst cause:1, boot mode:(3,7)
load 0x40100000, len 24244, room 16
tail 4
chksum 0x30
load 0x3ffe8000, len 1180, room 4
tail 8
chksum 0x0b
load 0x3ffe84a0, len 924, room 0
tail 12
chksum 0xa2
csum 0xa2
pp_task_hdl : 3ffefa50, prio:13, stack:512
pm_task_hdl : 3fff0330, prio:1, stack:176
ApiMsgMutex created
tcpip_task_hdl : 3fff0748, prio:10,stack:512
wdt_task : 3fff1008, prio:14, stack:176
idle_task_hdl : 3fff1b78
tim_task_hdl : 3fff1f70
xPortStartScheduler
frc2_timer_task_hdl:3fff2880, prio:12, stack:512
OS SDK ver: 1.2.0(b900bd2) compiled @ Aug 28 2015 17:18:41
phy ver: 356, pp ver: 9.0
SDK version:1.2.0(b900bd2)
mode : sta(18:fe:34:de:0c:33)
add if0
SC version: V2.4.7
scandone
scandone
scandone
SC_STATUS_FIND_CHANNEL
TYPE: ESPTOUCH
SC_STATUS_GETTING_SSID_PSWD
SC_TYPE:SC_TYPE_ESPTOUCH
F|SCAN SSID: TP-LINK_6FD10A
F|pswd: abcdef
F|ssid: TP-LINK_6FD10A
SC_STATUS_LINK
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 2
cnt
ERRRRRR:256,135,135!!!!ERRRRRR:256,113,113!!!!
connected with TP-LINK_6FD10A, channel 6
dhcp client start...
ip:192.168.1.6,mask:255.255.255.0,gw:192.168.1.1
SC_STATUS_LINK_OVER
<--FreeRTOS版本
<--espressif SDK版本
<--Wifi工作模式
<--smart_config版本
<--回调函数的输出信息
<--回调函数的输出信息
<--回调函数的输出信息
<--回调函数的输出信息
扫描到的路由密码
扫描到的路由器名称
<--回调函数的输出信息
连接到路由器
获得IP地址
<--回调函数的输出信息
配网成功!
通过上面的工程成功进行局域网的配网。之后写回小e开发板的固件,无法登录iLink服务器,在群组中求助没有得到解决。这个问题的解决在后文中描述。
2设备绑定
设备绑定实际上是微信用户与设备建立一种关联。根据设备种类的不同,设备绑定的方式有多种:
第一种方式:用户扫描一机一码,关注厂商公众号,即可绑定设备,此时厂商会接收到微信硬件平台推送的绑定事件。绑定关系即deviceid(设备id)与openid(用户id)的关系。若用户解绑设备,厂商会收到解绑事件。
第二种方式:如果已在公众平台-设备功能-设置中启动并设置服务器配置,设备发送的消息以及开发者需要的设备事件推送,将被微信硬件平台以Json格式转发并只转发到该URL(即应用服务器)。
第三种方式:设备绑定也可以由厂商应用服务器来实现,由厂商来进行绑定。厂商绑定之后将绑定事件通过微信硬件平台的API接口通知微信硬件平台以便微信客户端进行状态更改。
小e开发板采用扫描二维码的方式进行绑定。小e开发板扫描二位码后获得两个重要参数:uid和appkey,这两个参数在登录物联网平台应用服务器时需要用到。
3登录物联网云平台使用应用
小e开发板设备配网后,从flash中读取预写入的uid和appkey(与二维码的信息一致),通过U-SDK登录iLink服务器。iLink服务器通过小e开发板的登录认证后,会通过微信硬件平台的API接口将设备状态信息更新,微信用户的设备状态也就显示为设备在线状态。
小e开发板的应用开发过程,在官方文档《M302I-ESP8266-Developmentguide.pdf》中已经做了详细的说明,本文不进行具体分析。下面描述前面烧录后出现不能登录iLink的问题的解决。
【问题】进行smartconfig工程的烧录后,重新烧回小e的固件,小e开发板联网后无法登录iLink服务器。串口输出信息如下:
ip:192.168.1.4,mask:255.255.255.0,gw:192.168.1.1ip:192.168.1.4,mask:255.255.255.0,gw:192.168.1.1
got ip !!!
ET U-SDK var2.1.0.2
now addr is 192.168.1.4
......
login_cloud fail
......
<----云登录失败
【分析】通过阅读源代码,开发板绑定的uid和appkey是从flash的0xfe扇区读取的。上述问题可能的原因是:在之前烧录其它程序时,将0xfe个扇区中的内容进行了覆盖,而烧回开发快的固件后,这里没有被刷新,因此在get_uid(id)时,读取到的uid和appkey都不正确,自然无法登录到ilink。【解决】在代码中将最初设备注册时留下的uid和appkey直接赋值并登录ilink进行测试。
代码文件为:et_appuseret_user_app.c: et_user_main()函数,将uid和appkey直接赋值给id变量:
memcpy(&id->uid,"uuuuu",UID_LEN);
memcpy(&id->appkey,"xxxxxxxx-yyyy-zzzzzz",APPKEY_LEN);
编译链接,烧录并配网,小e开发板成功登录iLink,设备在微信界面为在线状态,又可以查询温度等信息了。
|
|