wifi/ble combo配网获取不了有效ip问题分析
问题背景:
根据applications_sample_iot_connect_samples/wifi_ble_combo/hi3863/README.md · ohos-oneconnect/applications_sample_iot_connect_samples - AtomGit文档,在OH master底座上配置wifi/ble combo配网功能demo,编译hi3863遇到配网阶段,获取不了ip问题。
定位过程&根因分析:
初步分析日志,是成功连接了wifi,状态机0推进到了2,WiFi 就绪后,开始创建 TCP 连接通道,云状态机进入连接中状态。然后就卡在了这个阶段,直至超时。

从此处应该排查为什么连接wifi后,没有成功接连到云端。wifi是经过确认是有网络的。那么影响连接的就是ip和DNS了。
连接wifi后,是否成功获取了ip,获取ip后,DNS是否成功解析的域名
查看代码,在iot_connect中,是通过调用GetLinkedInfo方法获取的ip。而GetLinkedInfo方法是调用的ws63v100 sdk中的。


最终调用到device/soc/hisilicon/ws63v100/adapter/hals/communication/wifi_lite/wifiservice/source/wifi_device.c的GetLocalWifiIp函数。

在此函数中添加日志,抓取日志发现,确实没有获取到有效ip。
@lfq@ ===== netif info =====
@lfq@ name=wlan num=0
@lfq@ flags=0x1af
@lfq@ mtu=1500
@lfq@ hwaddr_len=6 hwaddr=aa:00:73:9d:c4:c9
@lfq@ link_layer_type=801
@lfq@ ip_addr=0.0.0.0
@lfq@ netmask=0.0.0.0
@lfq@ gw=0.0.0.0
@lfq@ ======================
日志中可以看出,设备的网口名,mac地址都获取到了。就是ip地址获取到的是0。那么获取ip依赖的是dhcp。下面就需要排查是否启动了dhcp服务。
WifiErrorCode ConnectTo(int networkId) {
if (networkId >= WIFI_MAX_CONFIG_SIZE || networkId < 0) {
return ERROR_WIFI_INVALID_ARGS;
}
if (LockWifiGlobalLock() != WIFI_SUCCESS) {
return ERROR_WIFI_UNKNOWN;
}
if (g_wifiConfigs[networkId].netId != networkId) {
if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
return ERROR_WIFI_UNKNOWN;
}
return ERROR_WIFI_UNKNOWN;
}
g_networkId = networkId;
wifi_sta_config_stru assocReq = {0};
assocReq.security_type = g_wifiConfigs[networkId].securityType;
int cpyErr = memcpy_s(assocReq.ssid, sizeof(assocReq.ssid),
g_wifiConfigs[networkId].ssid, sizeof(g_wifiConfigs[networkId].ssid));
cpyErr += memcpy_s(assocReq.pre_shared_key, sizeof(assocReq.pre_shared_key),
g_wifiConfigs[networkId].preSharedKey, sizeof(g_wifiConfigs[networkId].preSharedKey));
cpyErr += memcpy_s(assocReq.bssid, sizeof(assocReq.bssid),
g_wifiConfigs[networkId].bssid, sizeof(g_wifiConfigs[networkId].bssid));
if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
return ERROR_WIFI_UNKNOWN;
}
if (cpyErr != EOK) {
printf("[wifi_service]:ConnectTo memcpy failed, err = %d\n", cpyErr);
return ERROR_WIFI_UNKNOWN;
}
unsigned int chan = g_wifiConfigs[networkId].freq;
if (LockWifiEventLock() != WIFI_SUCCESS) {
return ERROR_WIFI_UNKNOWN;
}
if (StaConnect(0, &assocReq, g_wifiConfigs[networkId].wapiPskType) != WIFI_SUCCESS) {
if (UnlockWifiEventLock() != WIFI_SUCCESS) {
return ERROR_WIFI_UNKNOWN;
}
return ERROR_WIFI_UNKNOWN;
}
if (UnlockWifiEventLock() != WIFI_SUCCESS) {
return ERROR_WIFI_UNKNOWN;
}
return WIFI_SUCCESS;
}
通过查看连接wifi的方法中,发现在wifi成功连接后,没有启动dhcp的步骤,这样自然就没办法获取到ip了。那么最终根因也找到了,问题就出在这里。
解决方案:
既然根因是在wifi成功连接后,没有启动dhcp去获取ip,那么增加启动dhcp的流程就可以了。
修改如下:

重新编译镜像,查看日志。
@lfq@ ===== netif info =====
@lfq@ name=wlan num=0
@lfq@ flags=0x1af
@lfq@ mtu=1500
@lfq@ hwaddr_len=6 hwaddr=aa:00:73:9d:c4:c9
@lfq@ link_layer_type=801
@lfq@ ip_addr=0.0.0.0
@lfq@ netmask=0.0.0.0
@lfq@ gw=0.0.0.0
@lfq@ ======================
@lfq@ ===== netif info =====
@lfq@ name=wlan num=0
@lfq@ flags=0x1af
@lfq@ mtu=1500
@lfq@ hwaddr_len=6 hwaddr=aa:00:73:9d:c4:c9
@lfq@ link_layer_type=801
@lfq@ ip_addr=192.168.43.30
@lfq@ netmask=255.255.255.0
@lfq@ gw=192.168.43.1
@lfq@ ======================
@lfq@ ===== netif info =====
@lfq@ name=wlan num=0
@lfq@ flags=0x1af
@lfq@ mtu=1500
@lfq@ hwaddr_len=6 hwaddr=aa:00:73:9d:c4:c9
@lfq@ link_layer_type=801
@lfq@ ip_addr=192.168.43.30
@lfq@ netmask=255.255.255.0
@lfq@ gw=192.168.43.1
@lfq@ ======================
IC_DEBUG:iotc_socket.c:212,
get addinfo connect.harmonytsc.comIC_INFO:trans_link.c:118,
link[CLOUD_TCP] connect okIC_DEBUG:event_source_fd.c:289,
watch fd 256/1IC_DEBUG:coap_endpoint_client.c:251,
endpoint client send CSM packetIC_DEBUG:coap_codec_utils.c:185,
成功获取到了ip,并且与云端成功建立了tcp连接,问题解决。
更多推荐
所有评论(0)