1. 项目概述与核心价值
在嵌入式物联网项目里,让设备“上网”是第一步,也是最关键的一步。无论是智能家居中的传感器需要将数据上报到云端,还是一个临时的配置热点让手机可以快速配网,其底层都离不开Wi-Fi模块的两种基本工作模式:STA(站点)模式和AP(接入点)模式。我过去在多个基于TI SimpleLink平台(如CC3220、CC3235)的项目中,深刻体会到,仅仅让设备连上网是远远不够的,如何让它连得快、连得稳、功耗低,才是真正考验开发者功力的地方。
SimpleLink Wi-Fi SDK提供了一套非常灵活的API,允许我们对这两种模式进行深度定制。这不仅仅是设置一个SSID和密码那么简单,它涉及到从射频参数(如发射功率、国家码)、连接行为逻辑(如自动连接策略),到高级的网络维护功能(如基于信号强度的漫游)等一系列配置。理解并合理运用这些配置,意味着你能让设备在复杂的无线环境中保持最佳状态,避免那些“时好时坏”、“偶尔掉线”的玄学问题。例如,在电池供电的传感器中,你可能需要精细控制扫描行为和发射功率以节省每一毫安时的电量;而在需要快速恢复连接的工业网关中,你又需要利用“Fast”连接策略来跳过耗时的扫描过程。
本文将以TI SimpleLink Wi-Fi为例,深入拆解STA和AP模式的配置精髓。我不会只停留在API用法的罗列上,而是会结合我实际踩过的坑和调试经验,告诉你每个参数背后的设计逻辑、不同配置组合会产生什么影响,以及在实际项目中如何权衡和选择。无论你是刚开始接触嵌入式Wi-Fi,还是希望优化现有设备的网络性能,相信这些从实战中总结出的细节都能给你带来直接的帮助。
2. STA模式深度配置与连接策略
STA模式,即站点模式,是设备作为客户端去连接外部无线网络(如家庭路由器)的模式。这是物联网设备最常用、也最复杂的工作模式。
2.1 模式设置与基础参数调优
默认情况下,SimpleLink设备上电后的初始角色并非STA模式。你需要主动调用sl_WlanSetMode(ROLE_STA)来设置,并且这个操作会触发设备重启。这是一个需要特别注意的“坑”:模式切换不是一个轻量级的软件配置,而是一个涉及底层驱动和网络协议栈重新初始化的硬操作。因此,在你的应用初始化流程中,应该尽早且一次性地确定设备的工作模式,避免在运行时频繁切换。
_i16 Status; _i16 Role; /* 设置设备为STA模式 */ Status = sl_WlanSetMode(ROLE_STA); if (Status != 0) { // 处理错误:可能是内存不足或内部状态错误 } /* 设置模式后必须重启设备 */ Status = sl_Stop(0); // 停止网络服务,参数0表示阻塞式等待停止完成 Role = sl_Start(NULL, NULL, NULL); // 重启并获取当前角色 if (Role != ROLE_STA) { // 角色设置失败,需要检查启动流程或镜像配置 }实操心得:务必在sl_Start()之后检查返回的角色值。我曾遇到过因为NVM(非易失性存储器)中残留的配置导致角色设置不生效的情况,这时需要检查是否在之前的开发中设置了持久化配置。
设备进入STA模式后,会加载一套默认参数。虽然可以直接使用,但为了最佳性能,我们通常需要根据实际场景进行调整。
1. 发射功率(TX Power): 这个参数直接决定了设备的信号覆盖范围和功耗。值从0到15,代表从最大功率开始的衰减步进(0为最大功率)。在TI的文档中,你会看到一张输出功率与设置值的对应曲线图。
_u8 StaPower = 3; // 例如,设置为3,代表相对于最大功率有一个衰减 Status = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, SL_WLAN_GENERAL_PARAM_OPT_STA_TX_POWER, 1, (_u8 *)&StaPower);注意:发射功率调整仅对2.4GHz频段生效。如果你的设备同时支持5GHz(如CC3235),在5GHz频段上的功率策略是固件内部管理的。降低功率可以显著减少功耗,尤其适合电池设备,但会缩小有效连接范围。我的经验是,在室内环境,将功率设置为3或4(即衰减几dBm)通常能在功耗和信号强度间取得很好的平衡,且对连接稳定性影响微乎其微。
2. 国家码(Country Code): 这绝不是一个简单的地区标识。它决定了设备可以扫描和使用的无线信道集合,直接关系到产品的合规性。例如,“US”码允许使用信道1-11,“EU”码允许1-13,“JP”码也是1-13。如果你的产品销往全球,必须在启动时根据销售地动态设置此参数,或者使用一个兼容性最广的默认设置(如“EU”),并确保硬件射频认证覆盖这些信道。
_u8 countryCode[] = “US”; Status = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, SL_WLAN_GENERAL_PARAM_OPT_COUNTRY_CODE, strlen((char*)countryCode), countryCode);3. 5GHz信道开关: 对于CC3135/CC3235等支持5GHz的设备,你可以选择禁用5GHz扫描。默认是开启的,这会让扫描过程变长(因为要扫更多信道),功耗也略高。如果你的目标网络全是2.4GHz,果断关掉它。
_u8 disable5G = 1; // 1: 启用, 0: 禁用。这里设为0以禁用 Status = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, SL_WLAN_GENERAL_PARAM_OPT_ENABLE_5G, 1, (_u8 *)&disable5G);4. PS-Poll模式: 这是省电策略中的一个细节。STA设备在休眠时,数据帧由AP暂存。唤醒后,标准做法是STA发送一个PS-Poll控制帧来“索取”这些缓存帧。但有些非标准的AP可能对PS-Poll支持不好。如果你的设备在某些特定AP下出现数据收发异常,可以尝试启用“No PS-Poll”模式,让设备通过发送空数据帧来宣告激活,以此兼容有问题的AP。
SlWlanNoPSPollMode_t noPsPollMode; noPsPollMode.Enable = 1; // 启用 No PS-Poll 模式 Status = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, SL_WLAN_GENERAL_PARAM_OPT_NO_PS_POLL_MODE, sizeof(SlWlanNoPSPollMode_t), (_u8 *)&noPsPollMode);2.2 连接策略:智能联网的核心逻辑
SimpleLink提供了四种连接策略,它们定义了设备在启动、断线后如何尝试连接网络。策略通过一个宏SL_WLAN_CONNECTION_POLICY(Auto, Fast, AnyP2P, AutoProv)来组合设置,每个参数为0或1。
1. Auto(自动连接): 这是最常用的策略。设备会扫描环境,并尝试连接存储在“偏好网络”(Profile)列表中的网络。关键在于优先级(Priority)。你可以存储最多7个网络配置(Profile),每个都有1-7的优先级(7最高)。设备会先尝试连接优先级最高的网络。如果优先级相同,则按安全类型排序(WPA3 > WPA2+PMF > WPA/WPA2 > WEP > OPEN),安全等级越高越优先。如果连安全类型都一样,最后才看信号强度(RSSI)。
2. Fast(快速连接): 这个策略旨在实现“秒连”。设备会尝试连接上一次成功连接的那个AP,并且跳过扫描和探测请求(Probe Request),直接发送认证请求,因为SSID和信道都是已知的。这能极大缩短连接时间。
- 与Auto结合(Auto & Fast):这是最常见的组合。设备先尝试“Fast”连接上次的AP。如果失败(比如AP关机了),则回退到“Auto”模式,开始按优先级扫描Profile列表。
- 单独使用Fast:如果Fast连接失败,设备就停止了,不会尝试其他网络。这适用于对特定AP有强依赖的场景。
3. Auto Provisioning(自动配网): 这个功能非常有用。如果设备启动后2秒内没有收到任何主机命令,且没有保存任何网络Profile,它会自动开启配网模式(如SmartConfig或AP配网)。另一种情况是,如果设备已保存Profile但连续2分钟无法连接任何网络,它也会自动开启配网,让用户有机会配置新网络。
策略设置示例与持久化: 连接策略可以设置为持久化(掉电保存)或非持久化(仅本次运行有效)。
_i16 Status; // 设置持久化策略:Auto + Fast + Auto Provisioning Status = sl_WlanPolicySet(SL_WLAN_POLICY_CONNECTION, SL_WLAN_CONNECTION_POLICY(1, 1, 0, 1), NULL, 0); // 设置非持久化策略:仅Auto uint32_t flags = 0; flags |= SL_WLAN_CONN_POLICY_NON_PERSISTENT_FLAG; Status = sl_WlanPolicySet(SL_WLAN_POLICY_CONNECTION, SL_WLAN_CONNECTION_POLICY(1, 0, 0, 0), &flags, sizeof(flags));踩坑记录:关于“Fast”策略有一个大坑。如果上一次连接是使用WPA2-PMF或WPA3安全协议正常断开的(即调用了sl_Stop并等待超时),那么Fast重连可以成功。因为AP期待收到一个加密的解除认证帧。但如果设备是突然断电(没有调用sl_Stop),那么下次Fast连接时,AP可能会拒绝关联,导致连接失败。在这种情况下,设备会依赖组合策略中的“Auto”部分去重新扫描并连接。因此,在产品设计中,确保设备有执行正常关机流程的机会(如电容维持几毫秒供电)非常重要。
2.3 偏好网络(Profile)管理
Profile是设备记住的无线网络配置。管理好Profile列表是实现智能、自动连接的基础。
添加一个WPA2网络Profile:
_u8 bssid[] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}; // 可选,指定具体AP的MAC地址 SlWlanSecParams_t secParams; _i16 profileIndex; secParams.Type = SL_WLAN_SEC_TYPE_WPA_WPA2; secParams.Key = “MySecurePassword123”; secParams.KeyLen = strlen(secParams.Key); // 添加Profile,优先级设为5(范围1-7) profileIndex = sl_WlanProfileAdd(“MyHomeWiFi”, strlen(“MyHomeWiFi”), bssid, // 如果为NULL,则连接任何同名SSID的AP &secParams, NULL, // 企业级安全参数,普通网络填NULL 5, // 优先级 0); // 标志位,通常为0 if (profileIndex < 0) { // 添加失败,错误码可能是SL_ERROR_WLAN_PREFERRED_NETWORK_LIST_FULL(列表已满) }Profile的“隐身”与“复活”: 除了删除,你还可以临时“挂起”一个Profile。这在你想让设备暂时忽略某个已知但信号不好的网络时很有用。挂起状态在设备重启后会失效。
_u32 suspendMask = 0; // 假设我们想挂起索引为1和3的Profile(索引从0开始) suspendMask |= (1 << 1); // INDEX1 suspendMask |= (1 << 3); // INDEX3 Status = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, SL_WLAN_GENERAL_PARAM_OPT_SUSPEND_PROFILES, sizeof(suspendMask), (_u8*)&suspendMask);更新Profile优先级: 这是动态优化连接顺序的关键。例如,当设备移动到办公室,你可以将办公室Wi-Fi的Profile优先级调高。
SlWlanSecParams_t secParams; _u32 newPriority = 7; // 最高优先级 _u32 indexToUpdate = 2; // 要更新的Profile索引 // 对于不需要更新的字段,使用SL_WLAN_DONT_UPDATE secParams.Key = “”; secParams.KeyLen = 0; secParams.Type = SL_WLAN_DONT_UPDATE; Status = sl_WlanProfileUpdate(indexToUpdate, NULL, 0, // 不更新SSID NULL, // 不更新BSSID &secParams, NULL, // 不更新扩展安全参数 newPriority);2.4 手动连接与事件处理
除了自动策略,你也可以随时发起一次手动连接。这在需要强制切换到特定网络时非常有用。手动连接的优先级高于任何自动连接过程。
SlWlanSecParams_t secParams; secParams.Type = SL_WLAN_SEC_TYPE_WPA_WPA2; secParams.Key = “GuestPassword”; secParams.KeyLen = strlen(secParams.Key); Status = sl_WlanConnect(“Guest-WiFi”, strlen(“Guest-WiFi”), NULL, // BSSID,填NULL表示连接任意同名AP &secParams, 0); // 保留参数,填0 // sl_WlanConnect会立即返回,连接结果通过异步事件通知连接状态的事件驱动: 所有Wi-Fi事件(连接成功、断开、扫描完成等)都是通过异步事件回调通知应用的。你必须在应用层实现并注册这个事件处理函数。
// 在 user.h 或类似文件中注册事件处理函数 #define SL_DEVICE_EVENT (_u32)(1 << 0) #define SL_WLAN_EVENT (_u32)(1 << 1) ... sl_EventMask = SL_DEVICE_EVENT | SL_WLAN_EVENT; sl_IfRegIntHdlr(SimpleLinkNetAppRequestHandler, SimpleLinkWlanEventHandler, ...); // 实现WLAN事件处理函数 void SimpleLinkWlanEventHandler(SlWlanEvent_t *pSlWlanEvent) { switch (pSlWlanEvent->Event) { case SL_WLAN_EVENT_CONNECT: // 连接成功 printf(“[WLAN] Connected to SSID: %.*s, BSSID: %02x:%02x:%02x:%02x:%02x:%02x, Channel: %d\n”, pSlWlanEvent->EventData.Connect.SsidLen, pSlWlanEvent->EventData.Connect.SsidName, pSlWlanEvent->EventData.Connect.Bssid[0], pSlWlanEvent->EventData.Connect.Bssid[1], // ... 打印其余BSSID字节 pSlWlanEvent->EventData.Connect.Channel); // 可以在这里启动网络应用(如Socket通信) break; case SL_WLAN_EVENT_DISCONNECT: // 连接断开 printf(“[WLAN] Disconnected. Reason: %d\n”, pSlWlanEvent->EventData.Disconnect.ReasonCode); // 根据断开原因决定重连策略 break; // ... 处理其他事件 } }常见错误码解析: 当API调用返回错误时,以下是一些需要特别关注的错误码及其含义:
| 错误码宏定义 | 值 | 含义与常见原因 |
|---|---|---|
SL_ERROR_WLAN_PREFERRED_NETWORK_LIST_FULL | -2062 | Profile列表已满(最多7个)。需要先删除不用的Profile。 |
SL_ERROR_WLAN_KEY_ERROR | -2049 | 安全参数或SSID错误。检查密码长度、格式(如WEP要求HEX或特定ASCII长度)、SSID长度是否超限。 |
SL_ERROR_WLAN_GET_NETWORK_LIST_EAGAIN | -2073 | 请求网络扫描列表时,扫描未启用或未完成。需要先触发扫描,稍后再获取结果。 |
SL_ERROR_WLAN_WIFI_ALREADY_DISCONNECTED | -2071 | 在已经断开连接的状态下,再次调用断开连接命令。 |
3. 高级功能:RSSI触发与智能漫游
对于需要移动或在信号复杂环境中工作的设备,仅仅建立连接是不够的,维持高质量、稳定的连接更为重要。SimpleLink提供了基于RSSI(接收信号强度指示)的智能触发和漫游机制。
3.1 RSSI触发:主动感知链路质量
RSSI触发允许你设置一个信号强度阈值。当链路质量(以RSSI衡量)变化并跨越这个阈值时,设备会向主机发送一个异步事件。你可以利用这个事件来提前预警连接质量下降,或者触发一些应用层行为(如降低数据上报频率、本地缓存数据等)。
其配置属性较为丰富,不同型号(CC3x20 vs CC3x35)支持度不同:
| 属性 | 描述 | CC3x20 | CC3x35 | 取值说明 |
|---|---|---|---|---|
| Threshold | 触发事件的RSSI阈值 | 支持 | 支持 | 单位:dBm,范围:-100 到 100 |
| Pacing | 连续事件间的最小延迟 | 支持 | 支持 | 单位:毫秒,防止事件风暴 |
| Metric | 质量度量方式 | 固定为0 | 支持 | 0: 信标RSSI,1: 数据包RSSI |
| Type | 触发类型 | 固定为0 | 支持 | 0: 电平型(每次跨越都触发),1: 边沿型(仅触发一次) |
| Direction | 触发方向 | 固定为0 | 支持 | 0: 低于阈值,1: 高于阈值,2: 双向 |
| Hysteresis | 迟滞 | 支持 | 支持 | 单位:dB,防止在阈值附近抖动触发 |
| TriggerId | 触发器索引 | 固定为0 | 支持 | 0: 主机用RSSI触发器,1: 软漫游触发器 |
| Enable | 使能开关 | 支持 | 支持 | 0: 禁用,1: 启用 |
配置示例:设置一个当RSSI低于-75dBm时触发的事件,并带有3dB的迟滞,防止信号在-75dBm附近波动时频繁触发。
SlWlanRegisterLinkQualityEvents_t rssiTrigger; rssiTrigger.Enable = 1; rssiTrigger.TriggerId = 0; // 给主机应用使用的触发器 rssiTrigger.Metric = SL_WLAN_METRIC_EVENT_RSSI_BEACON; rssiTrigger.Direction = SL_WLAN_RSSI_EVENT_DIR_LOW; // 低于阈值时触发 rssiTrigger.Threshold = -75; // 阈值 -75dBm rssiTrigger.Hysteresis = 3; // 迟滞 3dB,即RSSI降到-78dBm才触发,升回-72dBm才解除 rssiTrigger.Type = SL_WLAN_RX_QUALITY_EVENT_EDGE; // 边沿触发(仅一次) rssiTrigger.Pacing = 0; // 不限制事件间隔 Status = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, SL_WLAN_GENERAL_PARAM_REGISTER_LINK_QUALITY_EVENT, sizeof(SlWlanRegisterLinkQualityEvents_t), (_u8 *)&rssiTrigger);在事件处理函数中,你需要增加对SL_WLAN_RX_QUALITY_EVENT_ID事件的处理,从中解析出当前的RSSI值。
3.2 软漫游(Soft-Roaming):无缝切换更优网络
软漫游功能是RSSI触发的一个高级应用。当设备检测到当前连接的AP信号变弱(低于设定阈值),而环境中存在同一个网络内(相同SSID)信号更强的AP时,会自动断开当前连接并连接到更好的那个AP。这对于在大型商场、工厂等部署了多个AP的环境下保持设备移动时的连接稳定性至关重要。
实现原理:软漫游使用了索引为1的RSSI触发器(TriggerId = 1)。当触发条件满足时,设备会在后台扫描寻找相同SSID的、信号更强的AP。
关键配置与注意事项:
- 与Fast策略冲突:软漫游功能仅在Fast连接策略被禁用时才有效。因为Fast策略试图固定连接上一个AP,这与漫游的目标相悖。
- 阈值设置:官方建议阈值设为-75dBm左右。因为当RSSI低至-85dBm左右时,设备可能已经要断开了,-75dBm给了漫游足够的反应时间。
- 扫描间隔:通过
Type和Pacing配合控制。如果Type设为LEVEL,那么每当条件满足时,都会以Pacing定义的间隔周期性地执行后台扫描,直到找到更优AP或条件不再满足。如果设为EDGE,则只触发一次扫描。
SlWlanRegisterLinkQualityEvents_t softRoamingConfig; softRoamingConfig.Enable = 1; softRoamingConfig.TriggerId = 1; // **关键:必须为1,表示软漫游触发器** softRoamingConfig.Metric = SL_WLAN_METRIC_EVENT_RSSI_BEACON; softRoamingConfig.Direction = SL_WLAN_RSSI_EVENT_DIR_LOW; softRoamingConfig.Threshold = -75; softRoamingConfig.Hysteresis = 3; softRoamingConfig.Type = SL_WLAN_RX_QUALITY_EVENT_LEVEL; // 电平型,持续监测 softRoamingConfig.Pacing = 15000; // 每15秒扫描一次(如果条件持续满足) Status = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, SL_WLAN_GENERAL_PARAM_REGISTER_LINK_QUALITY_EVENT, sizeof(SlWlanRegisterLinkQualityEvents_t), (_u8 *)&softRoamingConfig);3.3 触发式漫游与敏捷多频段
这是两种更先进的漫游技术,需要AP端的配合。
触发式漫游(Triggered Roaming): 可以看作是软漫游的增强版。它同样基于RSSI触发,但选择目标AP的机制更智能:
- 邻居列表优先:如果当前服务的AP向设备发送了“邻居AP列表”,设备只会在该列表中的AP里选择信号更强的进行漫游。这减少了盲目扫描,速度更快,且由网络控制器(如企业级AC)智能决策。
- 同SSID扫描:如果没有邻居列表,则退化为软漫游行为,扫描相同SSID的AP。
敏捷多频段(Agile Multiband): 这依赖于802.11k/v协议。当设备启用此功能且连接的AP支持时,AP可以主动请求设备漫游到网络中的另一个AP(可能是不同频段,如从2.4G切换到5G),以实现网络负载均衡和整体稳定性优化。这是一个完全由AP主导的漫游过程。
启用示例:
// 启用触发式漫游 SlWlanNetworkAssistedRoaming_t triggeredRoaming; triggeredRoaming.Enable = 1; triggeredRoaming.rssiThreshold = -63; // 触发阈值 sl_WlanSet(SL_WLAN_STA_NETWORK_ASSISTED_ROAMING, SL_WLAN_ROAMING_TRIGGERING_ENABLE, sizeof(SlWlanNetworkAssistedRoaming_t), (_u8 *)&triggeredRoaming); // 启用敏捷多频段(网络辅助漫游) SlWlanNetworkAssistedRoaming_t assistedRoaming; assistedRoaming.Enable = 1; sl_WlanSet(SL_WLAN_STA_NETWORK_ASSISTED_ROAMING, SL_WLAN_AP_TRANSITION_ENABLE, sizeof(SlWlanNetworkAssistedRoaming_t), (_u8 *)&assistedRoaming);重要提示:触发式漫游和敏捷多频段功能并非所有SimpleLink型号都支持。通常,CC3135/CC3235等较新的型号才支持。在选用功能前,务必查阅你所使用芯片的具体数据手册和SDK版本说明。
4. AP模式配置详解与实战
AP模式让设备自身成为一个无线热点。这在设备初次配网(SmartConfig)、作为局域网数据汇聚点,或创建临时点对点网络时非常有用。SimpleLink设备在AP模式下默认最多支持4个STA连接。
4.1 AP模式基础配置
与STA模式类似,首先需要设置模式。AP模式是设备上电后的默认初始模式。如果你之前切换到过STA模式,需要再切回来。
_i16 Status; _i16 Role; Status = sl_WlanSetMode(ROLE_AP); if (Status != 0) { /* 处理错误 */ } Status = sl_Stop(0); Role = sl_Start(NULL, NULL, NULL); if (Role != ROLE_AP) { /* 角色错误 */ }AP模式有一系列可配置参数,大部分需要在设置后重启生效。
1. SSID与隐藏SSID: 默认SSID是mysimplelink-xxyyzz(后六位为MAC地址)。你可以自定义一个更友好的名字。隐藏SSID可以不广播网络名称,增加一点隐蔽性,但会增加STA连接的复杂度(需要手动输入SSID)。
_u8 ssid[] = “MyDevice_AP”; _u8 isHidden = 1; // 1: 隐藏, 0: 广播(默认) sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_SSID, strlen((char*)ssid), ssid); sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_HIDDEN_SSID, 1, &isHidden);2. 信道与安全: 信道需符合国家码规定。安全类型支持OPEN、WEP、WPA/WPA2。强烈建议至少使用WPA2。OPEN模式在配网场景下可用,但配网完成后应尽快关闭或切换到安全模式。
_u8 channel = 11; // 选择一个干扰较小的信道,如1, 6, 11 _u8 securityType = SL_WLAN_SEC_TYPE_WPA_WPA2; _u8 password[] = “AP_Password123”; sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_CHANNEL, 1, &channel); sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_SECURITY_TYPE, 1, &securityType); sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_PASSWORD, strlen((char*)password), password);3. 连接管理与功耗: 你可以限制最大连接数,并设置STA老化时间。如果一个连接的STA在设定的老化时间内没有任何数据交互,AP会将其踢下线以释放资源。
_u8 maxStations = 2; // 最多允许2个设备连接 _u16 staAgingTime = 120; // STA无活动120秒后断开 sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_MAX_STATIONS, 1, &maxStations); sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_MAX_STA_AGING, 2, (_u8*)&staAgingTime); // 注意参数长度是2字节4.2 AP模式下的网络服务与信息元素
SimpleLink设备在AP模式下默认开启了几项重要的网络服务,这使得它不仅仅是一个简单的热点:
- DHCP服务器:自动为连接的STA分配IP地址(默认网段:10.123.45.x)。
- HTTP服务器:用于内部网页配置界面(例如,通过
http://10.123.45.1访问)。 - mDNS响应器:设备可以响应
mysimplelink-xxyyzz.local这样的域名查询。 - DNS服务器/中继:处理DNS请求。
这些服务在大多数情况下是自动运行的,你无需额外配置。但了解它们的存在,有助于你理解为什么手机连上设备热点后,能自动获取IP并可能弹出配置页面。
自定义信息元素(Info Elements): 这是一个高级功能,允许你在AP发出的信标帧(Beacon)或探测响应帧中加入自定义的数据块。这常用于厂商特定的功能,比如传递设备的型号、版本号或其他自定义信息,方便周围的专用STA识别。
SlWlanSetInfoElement_t infoElem; _u8 customData[] = {0x01, 0x02, 0x03, 0x04}; // 你的自定义数据 infoElem.Index = 0; // 使用第一个IE索引(0-3) infoElem.Role = SL_WLAN_INFO_ELEMENT_AP_ROLE; // 用于AP模式 infoElem.IE.Id = SL_WLAN_INFO_ELEMENT_DEFAULT_ID; // ID设为221(厂商自定义) infoElem.IE.Oui[0] = 0x00; // 组织唯一标识符 (OUI),全0则使用TI默认OUI infoElem.IE.Oui[1] = 0x00; infoElem.IE.Oui[2] = 0x00; memcpy(infoElem.IE.Data, customData, sizeof(customData)); infoElem.IE.Length = sizeof(customData); Status = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, SL_WLAN_GENERAL_PARAM_OPT_SET_INFO_ELEMENT, sizeof(SlWlanSetInfoElement_t), (_u8 *)&infoElem);要删除一个信息元素,只需将对应索引的IE长度(Length)设置为0再次调用即可。
5. 混合模式与实战场景策略
在实际项目中,设备的工作模式并非一成不变。一个经典的用例是配网流程:设备上电后首先处于AP模式,创建一个配置热点;手机连接此热点后,通过HTTP服务器或Socket发送目标家庭Wi-Fi的SSID和密码;设备获取凭证后,切换为STA模式去连接家庭路由器,并关闭自己的AP。
模式切换的挑战: 模式切换(sl_WlanSetMode)伴随着设备重启,这会中断所有现有网络连接。因此,在设计中需要处理好状态保存和恢复。通常的流程是:
- 在AP模式下完成配网,将获取到的Wi-Fi凭证保存到NVM(非易失性存储器)的Profile中。
- 调用
sl_WlanSetMode(ROLE_STA)并重启。 - 设备重启后,以STA模式启动,利用“Auto”或“Fast+Auto”策略自动连接家庭网络。
- 连接成功后,关闭配网相关的服务(如内部HTTP服务器),进入主业务逻辑。
连接策略组合推荐: 根据不同的产品需求,我通常会采用以下几种策略组合:
智能家居传感器(电池供电,需稳定长连):
- 策略:
Auto+Auto Provisioning - 理由:
Auto用于连接已知网络。Auto Provisioning确保在无法连接任何已知网络2分钟后自动打开配网,给用户补救机会。不启用Fast,因为传感器可能被移动到不同位置,固定连接上次AP可能导致无法联网。 - 附加配置:适当降低TX Power,延长扫描间隔(通过连接策略外的参数配置),禁用5GHz以省电。
- 策略:
工业固定网关(有线供电,要求快速恢复):
- 策略:
Auto+Fast - 理由:设备位置和网络环境固定。
Fast策略能实现毫秒级重连,极大提高网络故障恢复速度。Auto作为Fast失败后的保障。 - 附加配置:启用软漫游(如果部署了多个AP),设置合理的RSSI阈值。启用触发式漫游或敏捷多频段(如果网络环境支持)。
- 策略:
需要频繁配网的消费类设备(如智能灯):
- 初始策略:仅
Auto Provisioning(或默认AP模式) - 配网后策略:通过代码动态切换为
Auto+Fast - 理由:首次启动时无Profile,
Auto Provisioning能快速进入配网状态。配网成功后,写入Profile并动态设置Auto+Fast策略,实现后续快速连接。
- 初始策略:仅
调试与问题排查实录:
设备无法保存Profile:
- 现象:调用
sl_WlanProfileAdd成功,但重启后Profile丢失。 - 排查:检查NVM存储空间是否已满。确认在调用
sl_WlanProfileAdd后,是否有调用sl_WlanPolicySet设置持久化策略?Profile本身是持久化的,但连接策略的持久化是独立的配置。
- 现象:调用
STA模式扫描不到任何网络:
- 现象:手动连接或自动连接失败,日志显示扫描结果为空。
- 排查:
- 首先检查国家码设置是否正确。如果设为“US”,在信道12/13的AP将不会被扫描到。
- 检查天线连接是否可靠。
- 使用频谱分析仪或手机Wi-Fi扫描工具,确认环境中确实存在目标AP且信号正常。
- 尝试在代码中强制进行一次扫描并打印结果,确认是硬件问题还是配置问题。
AP模式手机搜不到热点:
- 现象:设备设置为AP模式,但手机Wi-Fi列表里看不到。
- 排查:
- 确认
sl_WlanSetMode(ROLE_AP)和sl_Start成功,并且返回的角色是ROLE_AP。 - 检查是否误开启了“隐藏SSID”功能。
- 检查信道设置是否合法。某些国家的手机可能无法扫描到非常用信道。
- AP模式默认IP是
10.123.45.1,可以尝试让手机手动设置IP到同一网段,然后Ping一下,看链路层是否其实已连通。
- 确认
软漫游不生效:
- 现象:设备信号很弱也不切换AP。
- 排查:
- 首要检查:是否启用了
Fast连接策略?两者冲突,必须禁用Fast。 - 检查RSSI阈值是否设置得太低(如-85dBm),可能未达到触发条件。
- 确认环境中是否存在相同SSID且信号更强的AP。漫游只在同SSID网络内进行。
- 检查设备型号是否支持此功能(CC3x35系列支持)。
- 首要检查:是否启用了
通过对STA和AP模式的深入配置,以及对连接策略、漫游等高级功能的灵活运用,你可以让基于SimpleLink Wi-Fi的嵌入式设备在各种复杂网络环境中游刃有余。记住,没有一套配置是放之四海而皆准的,最好的配置源于对应用场景的深刻理解和对无线网络特性的持续测试与调优。