问题

如何在设备上进行 Wifi 编程?

LwIp (Light Weight IP) 简介

LwIp 是轻量化的 TCP/IP,是一个小型开源的 TCP/IP 协议栈

LwIp 的设计目标是用较少的资源实现较完整的 TCP/IP 协议栈

LwIp 能在操作系统中运行,也能在无操作系统的情况下独立运行

LwIp 提供了 Socket API 和 Netconn API

LwIp 的主要特性

支持 ARP,ICMP,IGMP

支持 UDP,TCP,IP (可移植网络通信框架)

支持 DNS,PPP,SNMP

支持 DHCP,可动态分配 IP 地址 (WIFI 支持)

BearPi-Nano 联网能力

BearPi-Nano 基于 Hi3861 芯片构造,而 Hi3861 自身具备 Wifi 能力

AP 模式

  • 工作于 Wifi 热点模式,可被其他设备以 Wifi 方式连接

STA 模式

  • 工作于 Wifi 连接模式,可连接到指定 Wifi 热点

Wifi 模块接口设计

涉及的 OH 系统接口

Wifi 热点连接流程

Wifi 联网关键函数实现

Wifi 模块实现

wifi_connect.h

#ifndef WIFI_CONNECT_H
#define WIFI_CONNTCE_Hint Wifi_Init(void);
int Wifi_Connect(const char* ssid, const char* password);
int Wifi_Start(void);
void Wifi_Stop(void);
int Wifi_IsOk(void);
char* Wifi_IpAddr(void);#endif

wifi_connect.c

#include <stdio.h>
#include <string.h>
#include <unistd.h>#include "wifi_connect.h"
#include "wifi_device.h"
#include "lwip/netif.h"
#include "lwip/netifapi.h"
#include "lwip/ip4_addr.h"
#include "lwip/api_shell.h"
#include "lwip/dhcp.h"#define WIFI_TIMMEOUT  20
#define WLAN_PORT      "wlan0"static WifiEvent g_WifiEventHandler = {0};
static int g_WaitResult = 0;
static struct netif* g_LwipNeif = NULL;void ClearWaitResult(void)
{g_WaitResult = 0;
}void SetWaitResult(int result)
{g_WaitResult = result;
}int GetWaitResult(void)
{return g_WaitResult;
}void ToWait(int timeout)
{while((GetWaitResult() == 0) && timeout--){sleep(1);}
}void OnWifiConnectionChanged(int state, WifiLinkedInfo* info)
{(void)info;g_WaitResult = state;
}void OnWifiScanStateChanged(int state, int size)
{(void)state;(void)size;
}void OnHotspotStateChanged(int state)
{(void)state;
}void OnHotspotStaJoin(StationInfo* info)
{(void)info;
}void OnHotspotStaLeave(StationInfo* info)
{(void)info;
}int Wifi_Init(void)
{g_WifiEventHandler.OnWifiScanStateChanged = OnWifiScanStateChanged;g_WifiEventHandler.OnWifiConnectionChanged = OnWifiConnectionChanged;g_WifiEventHandler.OnHotspotStaJoin = OnHotspotStaJoin;g_WifiEventHandler.OnHotspotStaLeave = OnHotspotStaLeave;g_WifiEventHandler.OnHotspotStateChanged = OnHotspotStateChanged;return RegisterWifiEvent(&g_WifiEventHandler);}int Wifi_Connect(const char* ssid, const char* password)
{int ret = WIFI_SUCCESS;if(!Wifi_IsOk()){ret = (ssid && password) ? EnableWifi() : ERROR_WIFI_UNKNOWN;if(ret == WIFI_SUCCESS){WifiDeviceConfig config = {0};int result = 0;config.securityType = WIFI_SEC_TYPE_PSK;strcpy(config.ssid, ssid);strcpy(config.preSharedKey, password);ret += AddDeviceConfig(&config, &result);ret += ConnectTo(result);if(ret == WIFI_SUCCESS){ClearWaitResult();ToWait(WIFI_TIMMEOUT);ret = (GetWaitResult() != 0) ? WIFI_SUCCESS : ERROR_WIFI_UNKNOWN;}else{ret = ERROR_WIFI_UNKNOWN;}}}return ret;
}int Wifi_Start(void)
{int ret = WIFI_SUCCESS;if(!Wifi_IsOk()){g_LwipNeif = netifapi_netif_find(WLAN_PORT);if(g_LwipNeif != NULL){if(dhcp_start(g_LwipNeif) == ERR_OK){int i = WIFI_TIMMEOUT;while(((ret = dhcp_is_bound(g_LwipNeif)) != ERR_OK) && i--){usleep(200 * 1000);}}if(ret != WIFI_SUCCESS){Wifi_Stop();}}else{ret = ERROR_WIFI_UNKNOWN;}}return ret;
}void Wifi_Stop(void)
{dhcp_stop(g_LwipNeif);g_LwipNeif = NULL;
}int Wifi_IsOk(void)
{return !!g_LwipNeif;
}char* Wifi_IpAddr(void)
{char* ret = NULL;if(Wifi_IsOk()){ip4_addr_t addr = {0};ip4_addr_t mask = {0};ip4_addr_t gw = {0};netif_get_addr(g_LwipNeif, &addr, &mask, &gw);if((addr.addr != 0) && (addr.addr != -1)){ret = ip4addr_ntoa(&addr);}else{Wifi_Stop();}}return ret;
}

main_entry.c

#include <stdio.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifi_connect.h"static void* Task_Iniit(const char* arg)
{Wifi_Init();Wifi_Connect("wifi_test", "12345678");Wifi_Start();if(Wifi_IsOk){printf("addr = %s\n", Wifi_IpAddr());}return arg;
}static void Main_Entry(void)
{osThreadAttr_t attr = {0};attr.name = "Task_Iniit";attr.stack_size = 4 * 1024;attr.priority = 20;if(osThreadNew((osThreadFunc_t)Task_Iniit, NULL, &attr) == NULL){printf("failed to create task!\n");}
}SYS_RUN(Main_Entry);

测试结果如下图所示

Hi3861成功连上 Wifi, IP 为192.168.137.48

课后思考

有了 Wifi 模块后,接下来应该干啥?

物联网设备WIFI模块实现相关推荐

  1. WiFi选型_主设备WiFi模块,从设备WiFi模块功能介绍

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.主设备WiFi模块 主设备WiFi模块功能介绍 二.从设备WiFi模块 从设备WiFi模块功能介绍 前言 在物联网 ...

  2. lpb.wifi index.php,5.0V供电物联网无线wifi模块LPB105

    产品简介: HF-LPB105低功耗嵌入式Wi-Fi模组提供了一种将用户的物理设备连接到Wi-Fi无线网络上,并提供UART串口等接口传输数据的解决方案.该模块硬件上集成了MAC,基频芯片,射频收发单 ...

  3. 每日新闻丨中国人工智能专利申请量百度腾讯微软浪潮居前四;物联网设备Wi-Fi 6试用测试成功...

    趋势洞察 中国人工智能专利申请量排行:百度腾讯微软浪潮居前四 近日,国家工业信息安全发展研究中心发布<人工智能中国专利技术分析报告>,百度.腾讯.微软.浪潮位居前四.报告针对人工智能下基础 ...

  4. 物联网常用模块_工业级SPI接口WiFi模块WG228助力工业物联网数据传输

    工业物联网简单来说就是工业领域的物联网技术,物联网架构可分为三层:感知层.网络层和应用层,主要涵盖了数据的采集.传输及分析应用.物联网应用都有一个共同点:收集数据并将其发送到服务器或其他系统中,在数据 ...

  5. 智能物联网有哪些应用场景?_串口WiFi模块,蓝牙模块,WiFi+蓝牙组合模块

    文章目录 前言 一.智能家居 二.智能交通 三.智慧农业 四.智能制造 五.智慧物流 六.智慧能源 七.智能医疗 八.智能安防 九.智慧建筑 十.智能零售 无线模块及应用方案 前言 物联网从萌芽到彷徨 ...

  6. 物联网无线串口WiFi模块,智能生活无线应用,无线WiFi模组技术

    随着5G商用步伐的加快,各个行业领域的物联网应用也呈现几何式增长.在成本可控的前提下,目前市场中主流的物联网无线模块还是以串口WiFi模块.串口蓝牙模块为主. 串口WiFi模块是基于UART接口的符合 ...

  7. 【图解】物联网设备的N种Wi-Fi配网方式

    1 背景介绍 物联网时代,各种各样的智能物联网设备正走进我们我们的生活,智能门锁.摄像头.猫眼门铃.扫地机.智能音箱.空气净化器.体脂秤等等. 这些物联网设备都有一个共同的特征,就是可以联网,通过配套 ...

  8. 介绍一款小尺寸高通方案无线路由WiFi模块SKW103_支持无线中继,视频传输,智能网关

    WiFi模块根据工作频段分为2.4GHz单频WiFi模块和2.4/5GHz双频WiFi模块:根据工作模式,分为主设备WiFi模块.从设备WiFi模块:根据应用类型分为AP/Router WiFi模块. ...

  9. direct wifi 芯片_介绍一款支持WiFi Direct的SPI接口WiFi模块

    从定义上来看,WiFi Direct是一个标准,WiFi Direct标准是指允许无线网络中的设备无需通过无线路由器即可相互连接.与蓝牙技术类似,这种标准允许无线设备以点对点形式互连,不过在传输速度与 ...

最新文章

  1. C语言——第四次作业
  2. Python通过future处理并发
  3. 算法分析中递推式的一般代数解法
  4. Linux突然连不上网,ping不通百度,连不上MobaXterm
  5. linux上安装hackrf_在Linux上安装Kubectl
  6. 【Java】如何较好地将int转化成String
  7. python3.6.5安装tensorflow_Win10下用Anaconda安装TensorFlow(图文教程)
  8. tomcat记录X-Forwarded-For字段中的远程IP
  9. C++堆、栈、自由存储区、全局/静态存储区和常量存储区
  10. SQL Prompt快捷键
  11. 火车头采集器小狗伪原创插件
  12. 忠实履行职责,热忱完成工作,坚持必胜信念,成就辉煌人生——《西点军校的经典法则》
  13. 批发商/分销商会有一波向B2B转型的浪潮
  14. 高颜值挂脖式运动蓝牙耳机盘点,五款3D环绕高音质蓝牙耳机测评分享
  15. 姓名转拼音的几种格式
  16. Nexus的安装和使用
  17. mysql停电_MySQL断电后报错处理
  18. 多家支付机构叫停网络销售POS机 但“POSS机”“破死机”还在
  19. 杭州卧兔专访王彪:打造全新DTC品牌
  20. redis 常用监控指标

热门文章

  1. win7官方原版iso镜像_建议收藏!微软 Win10 版本 2004 正式版官方 ISO 镜像下载大全...
  2. 测开工具:spring boot 实现mock平台
  3. 聊天宝团队解散,老罗的社交梦破碎
  4. python3安装遇到 zipimport.ZipImportError: can't decompress data; zlib not available
  5. Find Any File for Mac,本地文件搜索工具
  6. 民营企业债权融资方式
  7. Exchange 2016批量新建账号
  8. 触摸屏幕签字实现,免汉王等设备SDK对接
  9. 接入微信电子发票java_Android app对接微信电子发票功能
  10. “27”岁二次元爷爷走红,二次元与传统雕刻的完美融合。