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事件
备注

特殊情况下,异步执行期间页面切换需要禁止,防止异步执行结果处理错误。