wifi使用的基础框架:
鉴于单片机的内存有限,我们没有启用多个线程来完成通信,因此同一时间只允许一个下载线程,这样也可以减少多句柄和多状态对用户的理解,减少难度;
另外,对于通信最好采用异步模式,这样可以很好的利用系统资源;尤其是在ESP32这种双核芯片;
因此,我们设计的WIFI语句全部是非堵塞模式,语句执行后立即完成,直接到下一条语句,这样不会影响界面的刷新和响应动作;等WIFI语句执行有结果时,会自动调用app.onWIFI32()事件来告知用户系统;因此需要按照下面步骤来调用WIFI功能;
另外,由于app.onWIFI32()事件处理过程中,wifi设备在状态上是被标注成busy状态,因此在app.onWIFI32()函数内部不能再调用WIFI函数(如果调用,会因为busy状态直接退出,不运行),而实际情况下这种需求很常见,比如wifi_connect之后需要调用wifi_sntp同步时间,因此我们构建了异步运行体系app.onASYNC()函数,调用后也是非阻塞模式直接运行下一条语句,而在合适的时间(退出onWIFI32事件并将Busy清空后)由系统调用onASYNC事件,这时在onASYNC事件中就可以再次调用WIFI语句。
步骤一:appbase添加对应事件
上位机菜单:控件-->编辑全局控件appbase的源码
在源码中添加以下事件代码:
void onWIFI32(int m){} //WIFI基础事件,需页面继承
void onASYNC(int m){} //异步执行代码,需页面继承
在全局控件中添加对应事件,可以让页面中对WIFI处理的代码用以继承;
步骤二:页面代码中添加处理结构
void app.onASYNC(int m){
if (m==1){
//在此书写异步编号1的代码
}
//.......
}
void app.onWIFI32(int m){
//在此书写有关m对应的wifi异步执行结果的处理代码;
//本函数中不可再调用wifi语句,如需调用,则需要调用async异步函数,在onASYNC异步事件中调用wifi函数
if (m==1){
//wifi_scan获取ssid列表后调用
}
if(m==2){
//wifi_connect之后调用
}
......
super.onWIFI32(m); //调用原appbase的onWIFI32函数,用于处理mqtt和httpser等全局事件
}
//wifi_connect(ssid,pwd); //调用wifi函数后,系统自动向下执行,待有结果后,系统会自动调用onWIFI32事件
备注
特殊情况下,异步执行期间页面切换需要禁止,防止异步执行结果处理错误。