Smartconfig 简称一键配网技术,运用该技术,可以将WIFI设备便捷快速的连接路由器。 Smartconfig原理:' Q2 H/ o4 D+ m+ c3 `3 x5 M
1. 设备进入初始化状态,开始收听附近的 WiFi 数据包7 h7 j5 k0 z3 k, M1 X/ k: c: u+ s& M
2. 手机/平板设置 WiFi 名字和密码后,发送 UDP 广播包。6 f# M5 ] y2 j4 w0 h0 _
3. 设备通过 UDP 包(长度)获取配置信息,切换网络模式,连接上家里 WiFi,配置完成。
$ r9 z1 E" N& M9 L. E0 N. {3 U( [
) k( e: A' i2 e% e+ Q
8 y& x" Q2 p- y8 N4 f
# B( x, x$ ]- C' b 前面讲到了移植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 命令数据交互流程。1 o$ g! D3 C7 A8 w+ U( a2 y x: d& o) E
主要的AT组件函数:
5 s6 B* B2 w9 D4 |- j//创建响应结构体: b3 s7 W5 {5 ?9 z% N8 u1 b1 F
at_response_t at_create_resp(rt_size_t buf_size, rt_size_t line_num, rt_int32_t timeout);
|1 Y6 ^& V+ _; F. a' |5 S& `//删除响应结构体
+ t+ @/ D d- l( V" Kvoid at_delete_resp(at_response_t resp);
, |9 p' q' |. e2 u9 A//设置响应集体
3 W" w0 Q* E8 P4 T# j0 I5 l! cat_response_t at_resp_set_info(at_response_t resp, rt_size_t buf_size, rt_size_t line_num, rt_int32_t timeout);
' f; _: Q# B3 T" c' ~0 ?//发送响应数据并接受响应' O6 ^$ a+ P! a" n! {
rt_err_t at_exec_cmd(at_response_t resp, const char*cmd_expr, ...);! k* X( A4 y' s$ L! [" G9 r
//设置期待接收at 设备主动下发信息的响应函数
* P; N" V& P6 J) J/ Z5 X& z5 jvoid at_set_urc_table(const struct at_urc *table, rt_size_t size);* V) a( L9 b7 x% M) z
- void samrt_config(void){
/ c' ^; q* t. ^ - # e8 M) x6 k2 `3 p
- / x R' _5 t9 h$ H' i, M, J
- at_response_t resp = RT_NULL;& F+ Z5 Q' |: C9 d: d
- rt_err_t result = RT_EOK;/ x- j* @% t3 [" ?0 E
- rt_uint8_t count=0; `; {& W4 Z- _! X( b% {5 D. K
- smart_config=1;//清除标志位
8 n! o p6 j( x4 M - //创建响应数据
{; ]/ f: h4 }( |& L - resp = at_create_resp(50, 0, rt_tick_from_millisecond(5000));
% U* a# o4 y4 o% A7 v - if (!resp)) \0 L( `9 ]- h/ r" {3 B5 s
- {
7 g$ V" ]' k* @0 Q& ^ - LOG_E("No memory for response structure!");
! B$ t1 R* k* t - result = -RT_ENOMEM;
# w" ~* {6 V0 a - goto __exit;4 n3 H/ l# Y7 R% v* D. ~& U4 Q
- }
! p' r, w# f1 T( p; F9 h* O - ; J# Y- s& G$ x+ L& i
- //发送智能配网指令4 | U5 w, J8 L, H
- if (at_exec_cmd(at_resp_set_info(resp, 128, 0, 20 * RT_TICK_PER_SECOND),"AT+CWSTARTSMART=3") != RT_EOK)' ]0 H9 h6 H ` n& \/ P" m- ]# y
- { Z, l; u" T! A9 W
-
5 e. X3 D4 N s - result = -RT_ERROR;
) T1 _9 \& I9 A! I1 \! U - goto __exit;
% F& B( Q5 o/ R% H" i8 ^3 J$ I- ] - }3 F( L8 D8 \' t8 [1 S' B, ~' s
- rt_kprintf("智能配网配置中 .......");
1 r1 ^9 s8 w: [0 G - do{
" {* w5 B8 d6 u/ q- w - count++;
: x, Y. V7 C1 \" Y* ]% g7 ]+ s - rt_thread_delay(100); //1S
0 o: x% N \* R4 T, S) ?+ h - if(count==30)//30秒超时退出! F) ~$ j Q" T4 P7 E7 H
- {
; u$ o8 K# H) E# \9 z - rt_kprintf("智能配网超时 .......");
" [1 l# l; U* l: ^ - result = -RT_ERROR;
1 X- L) ?: F# b" K; k - break;6 g5 S% n7 Y0 a+ e( Y
-
Q( `; R$ N* B - }- q$ J* E* q5 Y; j1 X& L
- }
: T. X0 {6 b8 | - while(smart_config==1);//判断配置是否成功
. C' I% b2 a$ j4 S5 s W2 y -
, b9 c' F- B, J - //停止智能配网指令5 o* C- @8 m' N: f& _3 z8 M% Z
- if (at_exec_cmd(at_resp_set_info(resp, 25, 0, 20 * RT_TICK_PER_SECOND),"AT+CWSTOPSMART") != RT_EOK)
' Z+ n8 Z; T0 I - {' @% d" D" q o. B
-
$ j, N. s3 u% F7 v/ o - result = -RT_ERROR;" y, r, A# R' g
- goto __exit;
( y; `7 O2 N; T; U. P7 O4 ` - }, M9 ^$ Z$ ~- k" R8 X3 r
" c! W0 I2 K& \) [) L# C- __exit:- T, {) j" T U1 O. [2 S' [
- if (resp)5 e+ r" E+ P n, A
- {& [# O# g/ @7 A, F7 H0 T
- at_delete_resp(resp);//删除结构体4 l) W8 V8 c6 K I9 w( e
- }
6 U" }' d% ~& G2 {
8 f9 A: j5 O3 k/ {- P- if (!result)
' R Y4 s) J# W: ~( |, Y - {. d7 n& n% h: p- t7 E* e
- rt_kprintf("智能配网成功");( V0 b+ a; l2 H# R- x+ i# Z
- }. b3 X' `1 [" D' J4 H' s' k$ f' S
- else1 A X+ t1 m! Z$ o
- {
; X( x7 v+ ?( o: b! \+ W6 E# b1 s3 ? - - M3 [1 ^1 T* B2 x! v& ?
-
% ~, e1 O+ c- T( \, N$ f' T; v - rt_kprintf("智能配网失败 .......");
& Q& x4 x C5 @. T - }5 { q- a4 K2 s; j
-
8 p: A1 w0 ^- ]+ p - }
复制代码
) k, @7 j: w& s, }$ Q/ u
; d' P0 [: B1 j% P, z( N/ n# g5 K
源码参考:https://www.stmcu.org.cn/module/forum/thread-621278-1-1.html里面的资料
- O8 \0 R7 |! N' z B) \
/ d1 A& h( e+ s- }" F
/ k/ M) o$ H' g/ r |
老客户啊,