10a7ce71fSopenharmony_ci# HiSpark WiFi-IoT 套件样例开发--wificonnect(STA模式) 20a7ce71fSopenharmony_ci 30a7ce71fSopenharmony_ci 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 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