首先祝大家新年快乐
这是本人第一次写博客,希望大家多多支持,以后会尽量写出更好的文章分享给大家,谢谢
下面向大家介绍下如何在STM32平台上基于uCOS-II系统使用乐鑫的Esp8266 wifi模块对接青岛亿联客(Yeelink)物联网平台,旨在和小伙伴们一起学习如何使用基于AT指令的wifi模块对接云服务。日后还会发布基于MiCO SDK的庆科(MXCHIP)模块、乐鑫Esp8266 SDK的Esp8266无线模块的个人项目,不需要外接MCU,直接开发wifi模块内部的MCU固件,大大提高运行效率。
一、平台介绍
硬件平台:STM32F103ZET6、Esp8266
软件平台:uC/OS-II
物联网云平台:Yeelink
开发板:正点原子精英板子
本系统基于Yeelink平台,所以需要开发者先登录Yeelink后台,注册一个用户。该平台的具体使用,可参照平台提供的使用说明,在此不做过多介绍。代码已在阿里云代码托管平台http://code.aliyun.com公开,https地址:https://code.aliyun.com/chuancey/uCOS_Esp8266.git , SSH地址:[email protected]:chuancey/uCOS_Esp8266.git ,欢迎登陆阿里云git搜索查看并下载。
二、系统框架介绍
系统创建了一个启动线程,在启动线程中创建三个主线程。
1. WiFi_Task
该任务中创建了三个子线程:
(1) AirKiss_Task
功能:使用按键触发wifi模块进入AirKiss功能,使用手机配置wifi模块连接手机所接入的路由器,避免了设备上没有用户交互界面时无法让wifi连接路由器的尴尬状况。
使用该功能时,要首先在微信上关注带有AirKiss协议支持的公众号,比如【乐鑫信息科技】、【机智云智能宠物屋】等等,有能力的可以自己将AirKiss协议移植到自己的微信平台上;然后将手机连接至目标路由器上,打开AirKiss功能,输入路由器密码;按下相关按键,设备进入AirKiss配网功能,同时手机打开AirKiss进行配网。
(2) AccessRouter_Task
功能:按下相关按键,wifi模块连接程序中写死的路由器
本线程和上面的AirKiss_Task线程是功能并列的两个线程。
(3) WiFiStatus_Task
功能:指示wifi连接过程。连接中:绿灯快速闪烁;连接成功:绿灯常亮;连接失败:红灯常亮。wifi连接OK后,通知远程任务启动其功能。
由于本人所使用的wifi模块AirKiss功能无法正常执行(单独将模块接入电脑,使用串口助手进行调试,确实不能正常进入AirKiss功能),所以只有在进入AccessRouter_Task线程时,才能指示wifi连接状态。读者下载代码后,可在AirKiss_Task线程中发送本线程所需要的相关信号量,以完善对AirKiss连接wifi时的状态指示功能。
2. Device_Task
功能:
(1) 读取参数存储区,判断是否向后台添加过设备。如果没有,则通知远程任务Remote_Task自动向后台添加设备,使设备一上电就可自动运行,不用再去登陆yeelink后台手动添加设备。向后台添加设备完成后,会自动保存后台用户账号和设备信息相关的参数信息。
(2) 新设备存在后,通知本线程进行周期性的数据采集。由于Yeelink平台要求数据上报的周期至少为10s,否则后台会报错。本系统数据采集和上报的周期为20s。数据采集完成后,通知远程任务将数据上报给后台。
3. Remote_Task
功能:接收wifi正常连接的通知后,实现以下两个功能
(1) 创建子线程AddNewDev_Task,根据需要向后台创建新设备。
(2) 接收Device_Task线程的通知,向后台上报采集的数据。
三、工程目录和简要代码说明
项目工程目录如下:
文件夹App中主要包含了和启动线程、上述三个主线程、中断处理函数、系统初始化等相关的代码文件。主要有App_StartTask.c、device.c、remote_yeelink.c、stm32f10x_it.c、yeelinkDefine.h和其他配置相关的.h文件和.c文件。
文件夹Bsp主要包含了MCU片上外设的驱动代码。
文件夹cJSON包含了设备和后台通信时的JSON格式数据解析的算法,对于JSON格式的初步了解可参考http://www.cnblogs.com/SkySoot/archive/2012/04/17/2453010.html
文件夹HardWare包含了Led、Beep、Key、wifi和传感器DHT11等硬件的驱动代码。
其余文件夹主要是Cortex-M3内核文件、STM32固件库、和uCOS源代码、项目工程等文件夹。
特殊介绍下,yeelinkDefine.h文件定义了和后台通信相关的所有变量的定义,包括后台用户名和密码、主机Host名、端口、各类URL、各类http请求格式化字符串、数据上报的Json格式化字符串等各种定义。此文件只能被工程里的一个文件调用,不能被多个文件同时调用,否则会造成变量重复定义的错误。因为此文件采用的变量定义的形式,不是宏定义的方式。
remote_yeelink.c中定义了和后台通信常用的本地接口,包括获取ApiKey、查看后台设备、向后台增加设备、向后台增加传感器等,yeelink后台提供了大量能够满足用户各种需求的API接口,开发者可根据需要自行实现更多的本地接口,本工程只作为Demo。
单片机和wifi通信的AT指令的发送和响应代码,结合了操作系统的信号量等待方式,而不是一般所用的单纯的延时等待,大大提高了程序运行效率。每发送一条指令,会立马收到wifi回应,然后发送信号量,发送指令的函数请求到信号量后就立马继续向下执行,而不是等待很长时间后再判断是否确实收到回应。
每一个函数的关键功能处都有log输出,可以根据打印的log定位程序运行时哪里出现了错误,极大方便了程序的调试。log打印不仅输出了开发者要求输出的文本内容,同时输出了此log打印语句所在的文件名称、函数名称、代码行数,一眼就能定位到错误出现在哪里,甚至可以省略JLINK工具。
四、结果
下图是设备运行后,自动在后台创建的设备并添加的湿度传感器的数据列表,展示了环境湿度曲线