更多内容请访问:https://harmonyos.51cto.com,一个与华为官方共建的鸿蒙技术社区),上一篇讲了如何使用wpa_supplicantHi3516连接Wifi热点,本文讲的是如何通过编程实现。1、总体思路首先我们要弄清楚Hi3516中的Wifi相关模块以及它们之间的关系,其实和linux很相似。首先,我们需要运行一个Daemon,也就是上面提到的wpa_supplicant,它负责对网卡进行硬件调用,比如连接wifi、断开wifi、启动热点等等。这个Daemon打开一个socket端口,外部程序可以通过本地连接向它发送指令,实现对wifi的间接调用。这无疑为我们提供了极大的便利,无需从底层重新造轮子。在鸿蒙OS代码中,在//applications/sample/camera/communication/wpa_cli中有一个例子,实现了连接Daemon、扫描热点、连接热点等功能。现在计划很明确了,首先启动Daemon,其次向Daemon发送命令。下面详细分析一下如何实现。2、启动Daemon查看代码//applications/sample/camera/communication/wpa_supplicant/src/wpa_sample.c,找到main函数,发现它只做了一件事情,就是调用pthread_create创建线程,线程执行的函数是ThreadMain。而ThreadMain只做了一件事,就是加载/usr/lib/libwpa.so,然后执行里面的wpa_main函数,同时传入命令行参数。wpa_main函数具体通过hdf框架调用网卡向内核态发送消息,这里不再赘述。staticvoid*ThreadMain(){printf("[WpaSample]initwpa_supplicant.\n");void*handleLibWpa=dlopen("/usr/lib/libwpa.so",RTLD_NOW|RTLD_LOCAL);if(handleLibWpa==NULL){printf([WpaSample]dlopenlibwpafailed.\n");returnNULL;}int(*func)(int,char**)=NULL;func=dlsym(handleLibWpa,"wpa_main");if(func==NULL){dlclose(handleLibWpa);printf([WpaSample]dlsymwpa_mainfailed.\n");returnNULL;}intret=func(g_wpaArgc,g_wpaArg);printf("[WpaSample]runwpa_mainfailed,ret:%d.\n",ret);for(inti=0;i
