10a7ce71fSopenharmony_ci# HiSpark WiFi-IoT 套件样例开发--wificonnect(STA模式)                    
20a7ce71fSopenharmony_ci
30a7ce71fSopenharmony_ci![hihope_illustration](https://gitee.com/hihopeorg/hispark-hm-pegasus/raw/master/docs/figures/hihope_illustration.png)
40a7ce71fSopenharmony_ci
50a7ce71fSopenharmony_ci[HiSpark WiFi-IoT开发套件](https://item.taobao.com/item.htm?id=622343426064&scene=taobao_shop) 首发于HDC 2020,是首批支持OpenHarmony 2.0的开发套件,亦是官方推荐套件,由润和软件HiHope量身打造,已在OpenHarmony社区和广大OpenHarmony开发者中得到广泛应用。
60a7ce71fSopenharmony_ci
70a7ce71fSopenharmony_ci![wifi_iot](https://gitee.com/hihopeorg/hispark-hm-pegasus/raw/master/docs/figures/2.png)
80a7ce71fSopenharmony_ci
90a7ce71fSopenharmony_ci##  一、Wifi STA API
100a7ce71fSopenharmony_ci
110a7ce71fSopenharmony_ci使用原始WiFI API接口进行编程,STA模式需要使用原始STA接口以及一些DHCP客户端接口。
120a7ce71fSopenharmony_ci
130a7ce71fSopenharmony_ci#### WiFi STA模式相关的API接口文件路径
140a7ce71fSopenharmony_ci
150a7ce71fSopenharmony_ci**foundation/communication/interfaces/kits/wifi_lite/wifiservice/wifi_device.h**
160a7ce71fSopenharmony_ci所使用的API接口有:
170a7ce71fSopenharmony_ci
180a7ce71fSopenharmony_ci
190a7ce71fSopenharmony_ci| API                                                          | 接口说明                                |
200a7ce71fSopenharmony_ci| ------------------------------------------------------------ | --------------------------------------- |
210a7ce71fSopenharmony_ci| WifiErrorCode EnableWifi(void);                              | 开启STA                                 |
220a7ce71fSopenharmony_ci| WifiErrorCode DisableWifi(void);                             | 关闭STA                                 |
230a7ce71fSopenharmony_ci| int IsWifiActive(void);                                      | 查询STA是否已开启                       |
240a7ce71fSopenharmony_ci| WifiErrorCode Scan(void);                                    | 触发扫描                                |
250a7ce71fSopenharmony_ci| WifiErrorCode GetScanInfoList(WifiScanInfo* result, unsigned int* size); | 获取扫描结果                            |
260a7ce71fSopenharmony_ci| WifiErrorCode AddDeviceConfig(const WifiDeviceConfig* config, int* result); | 添加热点配置,成功会通过result传出netld |
270a7ce71fSopenharmony_ci| WifiErrorCode GetDeviceConfigs(WifiDeviceConfig* result, unsigned int* size); | 获取本机所有热点配置                    |
280a7ce71fSopenharmony_ci| WifiErrorCode RemoveDevice(int networkId);                   | 删除热点配置                            |
290a7ce71fSopenharmony_ci| WifiErrorCode ConnectTo(int networkId);                      | 连接到热点                              |
300a7ce71fSopenharmony_ci| WifiErrorCode Disconnect(void);                              | 断开热点连接                            |
310a7ce71fSopenharmony_ci| WifiErrorCode GetLinkedInfo(WifiLinkedInfo* result);         | 获取当前连接热点信息                    |
320a7ce71fSopenharmony_ci| WifiErrorCode RegisterWifiEvent(WifiEvent* event);           | 注册事件监听                            |
330a7ce71fSopenharmony_ci| WifiErrorCode UnRegisterWifiEvent(const WifiEvent* event);   | 解除事件监听                            |
340a7ce71fSopenharmony_ci| WifiErrorCode GetDeviceMacAddress(unsigned char* result);    | 获取Mac地址                             |
350a7ce71fSopenharmony_ci| WifiErrorCode AdvanceScan(WifiScanParams *params);           | 高级搜索                                |
360a7ce71fSopenharmony_ci
370a7ce71fSopenharmony_ci#### Hi3861 SDK的DHCP客户端接口:
380a7ce71fSopenharmony_ci
390a7ce71fSopenharmony_ci| API                 | 描述               |
400a7ce71fSopenharmony_ci| ------------------- | ------------------ |
410a7ce71fSopenharmony_ci| netifapi_netif_find | 按名称查找网络接口 |
420a7ce71fSopenharmony_ci| netifapi_dhcp_start | 启动DHCP客户端     |
430a7ce71fSopenharmony_ci| netifapi_dhcp_stop  | 停止DHCP客户端     |
440a7ce71fSopenharmony_ci
450a7ce71fSopenharmony_ci## 二、代码分析
460a7ce71fSopenharmony_ci
470a7ce71fSopenharmony_ci```c
480a7ce71fSopenharmony_ci//wifi connect task
490a7ce71fSopenharmony_cistatic void WifiConnectTask(void *arg)
500a7ce71fSopenharmony_ci{
510a7ce71fSopenharmony_ci    (void)arg;
520a7ce71fSopenharmony_ci    WifiErrorCode errCode;
530a7ce71fSopenharmony_ci    WifiEvent eventListener = {
540a7ce71fSopenharmony_ci        .OnWifiConnectionChanged = OnWifiConnectionChanged,
550a7ce71fSopenharmony_ci        .OnWifiScanStateChanged = OnWifiScanStateChanged
560a7ce71fSopenharmony_ci    };
570a7ce71fSopenharmony_ci    WifiDeviceConfig apConfig = {};
580a7ce71fSopenharmony_ci    int netId = -1;
590a7ce71fSopenharmony_ci
600a7ce71fSopenharmony_ci    osDelay(10);
610a7ce71fSopenharmony_ci    errCode = RegisterWifiEvent(&eventListener);
620a7ce71fSopenharmony_ci    printf("RegisterWifiEvent: %d\r\n", errCode);
630a7ce71fSopenharmony_ci
640a7ce71fSopenharmony_ci    // 配置要连接的热点的账号密码
650a7ce71fSopenharmony_ci    strcpy(apConfig.ssid, "ABCD");
660a7ce71fSopenharmony_ci    strcpy(apConfig.preSharedKey, "12345678");
670a7ce71fSopenharmony_ci    apConfig.securityType = WIFI_SEC_TYPE_PSK;
680a7ce71fSopenharmony_ci
690a7ce71fSopenharmony_ci    while (1) {
700a7ce71fSopenharmony_ci    	//打开wifi
710a7ce71fSopenharmony_ci        errCode = EnableWifi();
720a7ce71fSopenharmony_ci        printf("EnableWifi: %d\r\n", errCode);
730a7ce71fSopenharmony_ci        osDelay(11);
740a7ce71fSopenharmony_ci		//添加热点配置
750a7ce71fSopenharmony_ci        errCode = AddDeviceConfig(&apConfig, &netId);
760a7ce71fSopenharmony_ci        printf("AddDeviceConfig: %d\r\n", errCode);
770a7ce71fSopenharmony_ci
780a7ce71fSopenharmony_ci        g_connected = 0;
790a7ce71fSopenharmony_ci        //连接热点
800a7ce71fSopenharmony_ci        errCode = ConnectTo(netId);
810a7ce71fSopenharmony_ci        printf("ConnectTo(%d): %d\r\n", netId, errCode);
820a7ce71fSopenharmony_ci		//等待wifi连接
830a7ce71fSopenharmony_ci        while (!g_connected) {
840a7ce71fSopenharmony_ci            osDelay(10);
850a7ce71fSopenharmony_ci        }
860a7ce71fSopenharmony_ci        printf("g_connected: %d\r\n", g_connected);
870a7ce71fSopenharmony_ci        osDelay(50);
880a7ce71fSopenharmony_ci
890a7ce71fSopenharmony_ci
900a7ce71fSopenharmony_ci        // 联网业务开始
910a7ce71fSopenharmony_ci        struct netif* iface = netifapi_netif_find("wlan0");
920a7ce71fSopenharmony_ci        if (iface) {
930a7ce71fSopenharmony_ci            err_t ret = netifapi_dhcp_start(iface);
940a7ce71fSopenharmony_ci            printf("netifapi_dhcp_start: %d\r\n", ret);
950a7ce71fSopenharmony_ci
960a7ce71fSopenharmony_ci            osDelay(200); // wait DHCP server give me IP
970a7ce71fSopenharmony_ci            ret = netifapi_netif_common(iface, dhcp_clients_info_show, NULL);
980a7ce71fSopenharmony_ci            printf("netifapi_netif_common: %d\r\n", ret);
990a7ce71fSopenharmony_ci        }
1000a7ce71fSopenharmony_ci
1010a7ce71fSopenharmony_ci        // 模拟一段时间的联网业务
1020a7ce71fSopenharmony_ci        int timeout = 60;
1030a7ce71fSopenharmony_ci        while (timeout--) {
1040a7ce71fSopenharmony_ci            osDelay(100);
1050a7ce71fSopenharmony_ci            printf("after %d seconds, I'll disconnect WiFi!\n", timeout);
1060a7ce71fSopenharmony_ci        }
1070a7ce71fSopenharmony_ci
1080a7ce71fSopenharmony_ci        // 联网业务结束
1090a7ce71fSopenharmony_ci        err_t ret = netifapi_dhcp_stop(iface);
1100a7ce71fSopenharmony_ci        printf("netifapi_dhcp_stop: %d\r\n", ret);
1110a7ce71fSopenharmony_ci
1120a7ce71fSopenharmony_ci        Disconnect(); // disconnect with your AP
1130a7ce71fSopenharmony_ci
1140a7ce71fSopenharmony_ci        RemoveDevice(netId); // remove AP config
1150a7ce71fSopenharmony_ci		
1160a7ce71fSopenharmony_ci        errCode = DisableWifi(); //close wifi
1170a7ce71fSopenharmony_ci        printf("DisableWifi: %d\r\n", errCode);
1180a7ce71fSopenharmony_ci        osDelay(200);
1190a7ce71fSopenharmony_ci    }
1200a7ce71fSopenharmony_ci}
1210a7ce71fSopenharmony_ci
1220a7ce71fSopenharmony_ci```
1230a7ce71fSopenharmony_ci
1240a7ce71fSopenharmony_ci
1250a7ce71fSopenharmony_ci
1260a7ce71fSopenharmony_ci## 三、如何编译
1270a7ce71fSopenharmony_ci
1280a7ce71fSopenharmony_ci1. 将此目录下的 `wifi_connect_demo.c` 和 `BUILD.gn` 复制到openharmony源码的`applications\sample\wifi-iot\app\iothardware`目录下,
1290a7ce71fSopenharmony_ci2. 修改openharmony源码的`applications\sample\wifi-iot\app\BUILD.gn`文件,将其中的 `features` 改为:
1300a7ce71fSopenharmony_ci
1310a7ce71fSopenharmony_ci```
1320a7ce71fSopenharmony_ci    features = [
1330a7ce71fSopenharmony_ci        "iothardware:wifi_demo",
1340a7ce71fSopenharmony_ci    ]
1350a7ce71fSopenharmony_ci```
1360a7ce71fSopenharmony_ci
1370a7ce71fSopenharmony_ci3. 在openharmony源码顶层目录执行:`python build.py wifiiot`
1380a7ce71fSopenharmony_ci
1390a7ce71fSopenharmony_ci## 四、运行结果
1400a7ce71fSopenharmony_ci
1410a7ce71fSopenharmony_ci```
1420a7ce71fSopenharmony_ci
1430a7ce71fSopenharmony_ciready to OS start
1440a7ce71fSopenharmony_cisdk ver:Hi3861V100R001C00SPC025 2020-09-03 18:10:00
1450a7ce71fSopenharmony_ciFileSystem mount ok.
1460a7ce71fSopenharmony_ciwifi init success!
1470a7ce71fSopenharmony_ci
1480a7ce71fSopenharmony_ci00 00:00:00 0 132 D 0/HIVIEW: hilog init success.
1490a7ce71fSopenharmony_ci00 00:00:00 0 132 D 0/HIVIEW: log limit init success.
1500a7ce71fSopenharmony_ci00 00:00:00 0 132 I 1/SAMGR: Bootstrap core services(count:3).
1510a7ce71fSopenharmony_ci00 00:00:00 0 132 I 1/SAMGR: Init service:0x4af3e8 TaskPool:0xe4f38
1520a7ce71fSopenharmony_ci00 00:00:00 0 132 I 1/SAMGR: Init service:0x4af3f4 TaskPool:0xe4f58
1530a7ce71fSopenharmony_ci00 00:00:00 0 132 I 1/SAMGR: Init service:0x4af51c TaskPool:0xe4f78
1540a7ce71fSopenharmony_ci00 00:00:00 0 164 I 1/SAMGR: Init service 0x4af3f4 <time: 0ms> success!
1550a7ce71fSopenharmony_ci00 00:00:00 0 64 I 1/SAMGR: Init service 0x4af3e8 <time: 0ms> success!
1560a7ce71fSopenharmony_ci00 00:00:00 0 8 D 0/HIVIEW: hiview init success.
1570a7ce71fSopenharmony_ci00 00:00:00 0 8 I 1/SAMGR: Init service 0x4af51c <time: 0ms> success!
1580a7ce71fSopenharmony_ci00 00:00:00 0 8 I 1/SAMGR: Initialized all core system services!
1590a7ce71fSopenharmony_ci00 00:00:00 0 64 I 1/SAMGR: Bootstrap system and application services(count:0).
1600a7ce71fSopenharmony_ci00 00:00:00 0 64 I 1/SAMGR: Initialized all system and application services!
1610a7ce71fSopenharmony_ci00 00:00:00 0 64 I 1/SAMGR: Bootstrap dynamic registered services(count:0).
1620a7ce71fSopenharmony_ciRegisterWifiEvent: 0
1630a7ce71fSopenharmony_ciEnableWifi: 0
1640a7ce71fSopenharmony_ciAddDeviceConfig: 0
1650a7ce71fSopenharmony_ciConnectTo(0): 0
1660a7ce71fSopenharmony_ci+NOTICE:SCANFINISH
1670a7ce71fSopenharmony_ci+NOTICE:CONNECTED
1680a7ce71fSopenharmony_ciOnWifiConnectionChanged 58, state = 1, info = 
1690a7ce71fSopenharmony_cibssid: 08:1F:71:24:B8:29, rssi: 0, connState: 0, reason: 0, ssid: ABCD
1700a7ce71fSopenharmony_cig_connected: 1
1710a7ce71fSopenharmony_cinetifapi_dhcp_start: 0
1720a7ce71fSopenharmony_ciserver :
1730a7ce71fSopenharmony_ci	server_id : 192.168.0.1
1740a7ce71fSopenharmony_ci	mask : 255.255.255.0, 1
1750a7ce71fSopenharmony_ci	gw : 192.168.0.1
1760a7ce71fSopenharmony_ci	T0 : 7200
1770a7ce71fSopenharmony_ci	T1 : 3600
1780a7ce71fSopenharmony_ci	T2 : 6300
1790a7ce71fSopenharmony_ciclients <1> :
1800a7ce71fSopenharmony_ci	mac_idx mac             addr            state   lease   tries   rto     
1810a7ce71fSopenharmony_ci	0       b4c9b96199d6    192.168.0.107   10      0       1       2       
1820a7ce71fSopenharmony_cinetifapi_netif_common: 0
1830a7ce71fSopenharmony_ciafter 59 seconds, I'll disconnect WiFi!
1840a7ce71fSopenharmony_ciafter 58 seconds, I'll disconnect WiFi!
1850a7ce71fSopenharmony_ciafter 57 seconds, I'll disconnect WiFi!
1860a7ce71fSopenharmony_ci...
1870a7ce71fSopenharmony_ci...
1880a7ce71fSopenharmony_ci...
1890a7ce71fSopenharmony_ciafter 3 seconds, I'll disconnect WiFi!
1900a7ce71fSopenharmony_ciafter 2 seconds, I'll disconnect WiFi!
1910a7ce71fSopenharmony_ciafter 1 seconds, I'll disconnect WiFi!
1920a7ce71fSopenharmony_ciafter 0 seconds, I'll disconnect WiFi!
1930a7ce71fSopenharmony_cinetifapi_dhcp_stop: 0
1940a7ce71fSopenharmony_ci+NOTICE:DISCONNECTED
1950a7ce71fSopenharmony_ciOnWifiConnectionChanged 58, state = 0, info = 
1960a7ce71fSopenharmony_cibssid: 08:1F:71:24:B8:29, rssi: 0, connState: 0, reason: 3, ssid: 
1970a7ce71fSopenharmony_ciDisableWifi: 0
1980a7ce71fSopenharmony_ci
1990a7ce71fSopenharmony_ci```
2000a7ce71fSopenharmony_ci
2010a7ce71fSopenharmony_ci
2020a7ce71fSopenharmony_ci
2030a7ce71fSopenharmony_ci
2040a7ce71fSopenharmony_ci
2050a7ce71fSopenharmony_ci### 【套件支持】
2060a7ce71fSopenharmony_ci
2070a7ce71fSopenharmony_ci##### 1. 套件介绍  http://www.hihope.org/pro/pro1.aspx?mtt=8
2080a7ce71fSopenharmony_ci
2090a7ce71fSopenharmony_ci##### 2. 套件购买  https://item.taobao.com/item.htm?id=622343426064&scene=taobao_shop
2100a7ce71fSopenharmony_ci
2110a7ce71fSopenharmony_ci##### 3. 技术资料
2120a7ce71fSopenharmony_ci
2130a7ce71fSopenharmony_ci- Gitee码云网站(OpenHarmony Sample Code等) **https://gitee.com/hihopeorg**
2140a7ce71fSopenharmony_ci
2150a7ce71fSopenharmony_ci- HiHope官网-资源中心(SDK包、技术文档下载)**http://www.hihope.org/**
2160a7ce71fSopenharmony_ci
2170a7ce71fSopenharmony_ci##### 4. 互动交流
2180a7ce71fSopenharmony_ci
2190a7ce71fSopenharmony_ci- 润和HiHope技术交流-微信群(加群管理员微信13605188699,发送文字#申请加入润和官方群#,予以邀请入群)
2200a7ce71fSopenharmony_ci- HiHope开发者社区-论坛 **https://bbs.elecfans.com/group_1429**
2210a7ce71fSopenharmony_ci- 润和HiHope售后服务群(QQ:980599547)
2220a7ce71fSopenharmony_ci- 售后服务电话(025-52668590)
223