[经验分享] hi3861智能家居套件wifi控制怎么实现wifi任意切换

数创院刘Sir 显示全部楼层 发表于 2023-11-23 16:28:08

本帖最后由 yeyao 于 2023-11-23 16:45 编辑

大家在学习OpenHarmony设备开发时,应该有用润和Hi3861智能家居套件进行学习的吧 我们在gitee上下载润和提供的代码中有一套示例代码提供手机app和设备wifi控制,代码包名:udpserver_env,学习这个套件的伙伴们应该很熟悉,就是udp的远程控制。这个代码设备上是不是有个问题,一旦设备通过热点获取了wifi配置信息后,就会关闭热点,且再也不能更换第二个wifi连接,相对于一次性代码。 接下来先分析这个获取wifi配置信息后关闭热点这个功能有什么坏处,如果wifi配置信息有点错误,比如密码输错了,它会连接wifi失败,同时关闭热点,这样它就没有进入任何局域网,同时你也没法通过热点进入它自己的局域网重新配网,除了重新刷镜像,设备就只能成为单机设备。 解决这个问题,就是一直让它的热点处于开启状态,这里可能是我不够细心,我没有发现代码里哪里调用了关闭热点这个函数,

void StopHotspot(void)
{
if (g_iface) {
    err_t ret = netifapi_dhcps_stop(g_iface);
    printf("netifapi_dhcps_stop: %d\r\n", ret);
}

WifiErrorCode errCode = UnRegisterWifiEvent(&g_defaultWifiEventListener);
printf("UnRegisterWifiEvent: %d\r\n", errCode);

errCode = DisableHotspot();
printf("EnableHotspot: %d\r\n", errCode);
}
复制

这个函数它在applications/sample/wifi-iot/app/udpserver_env/wifi_starter.c里面定义的。根据手机无法同时开热点和连wifi的机制我猜测是硬件的问题,连wifi这个功能启动的时候是会自动切换AP到STA模式的,然后就关闭热点了,这里我的解决方法是在applications/sample/wifi-iot/app/udpserver_env/demo_entry_cmsis.c里面的主程序

static void NetDemoTask(void *arg)
{
(void)arg;

int result = CheckKvStoreResult();

printf("result is %d\r\n", result);
if (result != true) {
    printf("start hostpot\n");
    int g_netId = StartConfig();
    if (g_netId < 0) {
        printf("start hostpot failed!\r\n");
    }
} else {
    printf("start connect to hostpot\r\n");
    int g_netId = ConnectToWifi(ssidValue, pskKeyValue, WIFI_SEC_TYPE_PSK);
    if (g_netId < 0) {
        printf("connect to hostpot failed\r\n");
    }
    StartConfig();
}

UdpServerTest(PARAM_SERVER_PORT);
NetDemoTest(PARAM_SERVER_PORT, PARAM_SERVER_ADDR);
}
复制

我再它调用连接wifi的函数下面又添加了一遍调用开启热点的函数StartConfig(),然后就可以一直保持开启热点的状态了,不过连接wifi的时候会关闭一小会,设备转化成STA模式会重启设备,这个不影响。 这个问题解决了,伙伴们可能猜测这样就可以直接二次通过热点或wifi改wifi了,由于我们重新开启热点, StartConfig()已经把模式信号量改成AP,在AP模式下code-1.1.0/applications/sample/wifi-iot/app/udpserver_env/udp_server_test.c文件里写的函数确实是可以实现热点和wifi双渠道改wifi,不过由于每次改wifi都会开启AP模式,就无法通过STA模式接收其他信息获取环境监测信息了。 接下来我的解决方法是修改udp_server_test.c的udp信息处理函数,不再通过AP和STA模式的判断决定调用什么json解析数据。 我的方法是通过识别json信息的键值判断是不是改wifi的命令,不是就正常udp通信获取板子数据。 我的方法可能比较投机取巧,因为我也没有想到怎么直接提取键值进行判断,因为网络json数据一般是通过json提前函数提取里面的变量,但是在udp_server_test.c里我们不能直接用cJSONParseAP(message)处理每个json信息,因为键值对格式不匹配会程序崩溃,只能确定了是什么类型的数据调用对应的json处理函数解析,而json处理函数是我们自己封装的键值对,我们知道{"hotspot_psk":"12345678","hotspot_ssid":"xxxx"}这个格式的信息就是改wifi的 所以我从字符串数组里提取字符'h',只要字符串第三个字符是字符串"hotspot_psk"的'h',就进行wifi信息json解析

if(message[2] == 'h') {
        int ret = cJSONParseAP(message);
        if (ret < 0)
        {
            printf("parse message failed\r\n");
        }
        break;
    }
    int ret = cJSONParseSTA(message);
        if (ret < 0) {
            printf("parse message failed\r\n");
        }
复制

把原本的sta模式提取的信息放在外面,不需要判断,因为如果前面的wifi判断通过了会自己跳出程序重启,不会执行后面 cJSONParseSTA(message)代码。这样就完善的实现自由修改wifi,且能双通道接收控制设备监测信息。

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部