HarmonyOS鸿蒙Next中hi3861智能家居套件wifi控制怎么实现wifi任意切换
HarmonyOS鸿蒙Next中hi3861智能家居套件wifi控制怎么实现wifi任意切换 大家在学习鸿蒙设备开发时,应该有用润和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,且能双通道接收控制设备监测信息。
更多关于HarmonyOS鸿蒙Next中hi3861智能家居套件wifi控制怎么实现wifi任意切换的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,hi3861智能家居套件实现WiFi任意切换可以通过以下步骤完成:
-
WiFi模块初始化:首先,确保hi3861的WiFi模块已正确初始化。使用
hi_wifi_init
函数进行初始化,并配置WiFi模式为STA(Station)模式。 -
扫描可用网络:使用
hi_wifi_scan
函数扫描周围的WiFi网络,获取可用的SSID列表。 -
连接目标网络:通过
hi_wifi_connect
函数连接到目标WiFi网络。需要提供目标网络的SSID和密码。 -
网络切换逻辑:在代码中实现网络切换逻辑。可以通过监听网络状态变化(如信号强度、连接稳定性等),在满足条件时触发切换到另一个WiFi网络。
-
断开当前连接:在切换网络前,使用
hi_wifi_disconnect
函数断开当前连接的WiFi网络。 -
重新连接:重复步骤3,连接到新的目标WiFi网络。
-
错误处理:在网络切换过程中,处理可能出现的错误,如连接失败、认证失败等,确保系统的稳定性。
-
测试与验证:在实际环境中测试WiFi切换功能,确保在不同网络环境下都能正常切换。
通过以上步骤,可以在hi3861智能家居套件中实现WiFi的任意切换功能。
更多关于HarmonyOS鸿蒙Next中hi3861智能家居套件wifi控制怎么实现wifi任意切换的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,使用hi3861智能家居套件实现WiFi任意切换,可以通过以下步骤进行:
- 初始化WiFi模块:使用
hi_wifi_init()
函数初始化WiFi模块。 - 扫描可用网络:调用
hi_wifi_scan()
函数扫描周围的WiFi网络,获取SSID列表。 - 选择目标网络:从扫描结果中选择目标WiFi网络,获取其SSID和密码。
- 连接目标网络:使用
hi_wifi_connect()
函数,传入目标SSID和密码进行连接。 - 处理切换逻辑:在需要切换时,重复步骤2-4,选择新的目标网络进行连接。