Smartconfig 简称一键配网技术,运用该技术,可以将WIFI设备便捷快速的连接路由器。 Smartconfig原理:
3 `' m/ {7 [3 ~/ S: G" u- D6 X1. 设备进入初始化状态,开始收听附近的 WiFi 数据包
: X. p1 d Y, q0 Z3 l) g( f2. 手机/平板设置 WiFi 名字和密码后,发送 UDP 广播包。
7 w" w' `# E/ V7 K3. 设备通过 UDP 包(长度)获取配置信息,切换网络模式,连接上家里 WiFi,配置完成。
2 V* T: t) w& z9 T8 W7 ]6 z/ z9 {
3 J; p4 y3 V. v; P+ B+ y- N$ p; d. i- m5 \2 W
. x; d5 [; q% M6 V. r8 D
前面讲到了移植rtthread AT组件和at device 软件包移植https://www.stmcu.org.cn/module/forum/thread-621343-1-1.html,下载我们来讲讲如何用AT 组件和AT device软件包。 AT组件是什么,AT 组件是基于 RT-Thread 系统的 AT Server 和 AT Client 的实现,组件完成 AT 命令的发送、命令格式及参数判断、命令的响应、响应数据的接收、响应数据的解析、URC 数据处理等整个 AT 命令数据交互流程。3 {3 U( ?$ ]$ C$ s: K
主要的AT组件函数:; L" ]4 |* y8 W( U
//创建响应结构体
" Y1 \. |, c# ]5 D0 u+ xat_response_t at_create_resp(rt_size_t buf_size, rt_size_t line_num, rt_int32_t timeout);
2 T: P( X/ ~6 b* X8 N2 b//删除响应结构体4 t8 O) }) L6 H# T! m
void at_delete_resp(at_response_t resp);+ E6 L$ L# j7 y* K. }
//设置响应集体, b$ G: K0 V" M" Y, g7 U
at_response_t at_resp_set_info(at_response_t resp, rt_size_t buf_size, rt_size_t line_num, rt_int32_t timeout);
# Z3 k, _+ L, V4 g4 k//发送响应数据并接受响应
: i" g' U! y' x1 srt_err_t at_exec_cmd(at_response_t resp, const char*cmd_expr, ...);7 O/ ~9 |6 s, J6 _1 m2 b K
//设置期待接收at 设备主动下发信息的响应函数8 g. S y, k% f0 b8 A$ U
void at_set_urc_table(const struct at_urc *table, rt_size_t size);
6 Z" C0 J z$ A7 o! c9 G- void samrt_config(void){
' n9 v' V5 |) O/ v -
" \; }' d- j. B) x -
# S: M4 B8 o# r2 i9 k - at_response_t resp = RT_NULL;& N3 r7 _# g+ L# l1 X4 Y. ]
- rt_err_t result = RT_EOK; ~& @3 k$ Q/ h3 O6 r* R' D! n6 r' P. q
- rt_uint8_t count=0;) J& z. Z: [- O: M3 e
- smart_config=1;//清除标志位
# V: k# p* r, Y& S, @6 q - //创建响应数据
( A% J! G( U7 H3 h9 X - resp = at_create_resp(50, 0, rt_tick_from_millisecond(5000));# c/ d8 ]# z" O5 U* j8 h" q; q5 |
- if (!resp)) K4 z+ R) w" Q2 w8 V
- {
$ o* L- u3 `& o - LOG_E("No memory for response structure!");% X1 C% C& L! k7 z" \2 ?% j9 Y
- result = -RT_ENOMEM;
8 ~9 P( r, s( g- Z u& t - goto __exit;
5 \8 B8 r5 v+ \& U$ X* y+ z0 b - }
+ S4 H% l! A7 Y/ Z4 ~3 M( B -
' q5 z9 r+ s) k6 w3 \7 A. o$ [1 w - //发送智能配网指令
; c! `% `) D6 V; Q/ e - if (at_exec_cmd(at_resp_set_info(resp, 128, 0, 20 * RT_TICK_PER_SECOND),"AT+CWSTARTSMART=3") != RT_EOK)) H* w8 I7 H/ m% l; Q, J; f
- {
: ~* r3 O- ?3 `7 W/ x* I9 _ -
) z( o/ Z3 { @ - result = -RT_ERROR;
0 ?! e8 s1 O+ }5 X$ u - goto __exit;
( L* b2 _' L B: R( x0 B# b - }; o9 J+ \5 f" W0 C, h% m) }% W5 c" {
- rt_kprintf("智能配网配置中 .......");
1 i$ m* }0 D" ~ - do{! I0 h, g( C, A5 t
- count++;- \: V- ~7 V H8 [0 c8 m! O
- rt_thread_delay(100); //1S
% j% c: U; u$ Z& h2 F: g - if(count==30)//30秒超时退出( M4 @8 n. n% q, l; W! p2 R
- {9 r$ @9 z1 b1 m5 F" |' K1 G. G, _
- rt_kprintf("智能配网超时 .......");. `* n7 b! H) j: z0 h% N8 S; W% n3 e
- result = -RT_ERROR;5 S p @- D( V# ? }. n. Q
- break;
3 j" u! D: O2 a ?" i - ! b7 F% t/ k* R U: i1 c
- }
3 f" e; Z3 P7 G# b' t+ V! b - }! g& F- n' {! ]! k( Y& G6 q& u
- while(smart_config==1);//判断配置是否成功
; d; R: u! ^2 \3 B3 X! V -
3 ~! `! @7 v" T! L$ Q8 x - //停止智能配网指令+ q2 l# ?: [( _
- if (at_exec_cmd(at_resp_set_info(resp, 25, 0, 20 * RT_TICK_PER_SECOND),"AT+CWSTOPSMART") != RT_EOK)5 o) i% s4 X& p1 T7 N
- {
0 a. W7 c/ o3 K - 6 y1 L P" n [" k) }
- result = -RT_ERROR;) M' A( `6 @# j7 E
- goto __exit;
# Q- p$ T# t" s0 r2 ? - }9 C0 z/ ?2 T! t4 L
3 Q/ L; O; v! _7 j0 R; Q! F- __exit:0 t4 |& p* E3 \5 G6 T! D3 k
- if (resp)& p" k0 @1 C, b4 f8 S- t
- {6 r6 T5 L2 ]/ {& F' h1 x8 u# m% }
- at_delete_resp(resp);//删除结构体4 T7 G" E8 B+ F& _+ y! S ^
- }% D# E* t' P8 N; t( b
# J4 V8 C7 v. j4 d3 \' Q- if (!result). P2 K" s& Y* M" @7 f) \
- {
, ` o9 M" w( T! t! h9 o# w5 `2 B - rt_kprintf("智能配网成功");* O7 R7 x- ]- i- o9 J
- }
5 Y2 i; C( `+ H! e5 R F7 a - else) A2 o3 w+ h; e2 r* y. A
- {1 B; v& |" d$ w
-
7 v+ B( U3 u! E/ H9 O3 } - ( \$ F3 @6 \: F6 }, B9 a
- rt_kprintf("智能配网失败 .......");
$ {, U9 ~" z0 ^2 Y* B0 t3 G; c - }2 `) ^6 K' ~ l) q
- . i& W R* M3 O2 m5 ]8 v. Q* @
- }
复制代码
# L, z$ S: w6 U$ K2 E2 s
( d$ m/ b$ Y: W/ A, E9 Y
源码参考:https://www.stmcu.org.cn/module/forum/thread-621278-1-1.html里面的资料. b. H! |0 B7 @1 ^( e
! P. x2 h+ H, \1 C
2 }$ K& T5 y7 r: n7 N" m k |
老客户啊,