OpenHarmony开发者论坛
标题:
hi3861智能家居套件wifi控制怎么实现wifi任意切换
[打印本页]
作者:
数创院刘Sir
时间:
2023-11-23 16:28
标题:
hi3861智能家居套件wifi控制怎么实现wifi任意切换
本帖最后由 yeyao 于 2023-11-23 16:45 编辑
[md]大家在学习OpenHarmony设备开发时,应该有用润和Hi3861智能家居套件进行学习的吧 我们在gitee上下载润和提供的代码中有一套示例代码提供手机app和设备wifi控制,代码包名:udpserver\_env,学习这个套件的伙伴们应该很熟悉,就是udp的远程控制。这个代码设备上是不是有个问题,一旦设备通过热点获取了wifi配置信息后,就会关闭热点,且再也不能更换第二个wifi连接,相对于一次性代码。 接下来先分析这个获取wifi配置信息后关闭热点这个功能有什么坏处,如果wifi配置信息有点错误,比如密码输错了,它会连接wifi失败,同时关闭热点,这样它就没有进入任何局域网,同时你也没法通过热点进入它自己的局域网重新配网,除了重新刷镜像,设备就只能成为单机设备。 解决这个问题,就是一直让它的热点处于开启状态,这里可能是我不够细心,我没有发现代码里哪里调用了关闭热点这个函数,
```cpp
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里面的主程序
```cpp
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解析
```cpp
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,且能双通道接收控制设备监测信息。
[/md]
欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/)
Powered by Discuz! X3.5