8 l3 x& T1 o8 s去年腾讯为了宣传自己针对物联网的开源操作系统TencentOS tiny,举办了一场试用活动,当时幸运获得一块,但是当时公司任务较重,一直吃灰。! b& T; J `$ y b' \
1 c3 X$ C$ K7 y4 E2 s
板子实物就这样,没啥好介绍的,都是基础的外设,如今闲来无事,再加上众多大神完善了git库,使开发变得容易,所以索性掏出来玩一下。这次主要实现以下几个功能:
6 K* F9 ?& ? t/ ~# C1 y) i, r在腾讯物联网平台创建项目和产品(此处为智能灯)
p* L( u6 w! a: G通过平台控制灯6 Q( u1 Y3 Y2 C1 O
使用腾讯连连微信小程序控制灯 一.上手体验helloworld, ]; b& w8 C `1 ?0 M
腾讯物联网终端操作系统(TencentOS tiny)是腾讯面向物联网领域开发的实时操作系统,具有低功耗,低资源占用,模块化,安全可靠等特点,可有效提升物联网终端产品开发效率。TencentOS tiny 提供精简的 RTOS 内核,内核组件可裁剪可配置,可快速移植到多种主流 MCU 及模组芯片上。而且,基于RTOS内核提供了丰富的物联网组件,内部集成主流物联网协议栈(如 CoAP/MQTT/TLS/DTLS/LoRaWAN/NB-IoT 等),可助力物联网终端设备及业务快速接入腾讯云物联网平台。
* E: G4 Z2 ^/ \! ]) {+ t' l2 F! f, c& H- L9 b+ V! b8 H: [
从仓库拉取下来后文件夹目录如下: 
这里简单介绍几个主要的文件夹:+ g ?. e/ [- w" M& J
board文件夹
7 ~( }, e- L2 o. M6 I h: }0 U0 n这个文件夹中包含了目前为止TencentOS tiny 适配的开发板合集,在测试学习的时候非常好用,基本上热门的开发板均有适配。如果自己适配了新的开发板可以在开发完成后提交合并上去,为后续的开发者提供便利,到手即用。目前已适配很多。
: {% K/ s3 f8 D" T0 W: j! I 



device文件夹5 ~# x9 j- P5 ^+ Y; y
该文件夹为TencentOS tiny支持的通信模组,包括了NB-IOT,wifi,2G,4G,lora。基本满足开发需求,使用很方便。 components文件夹
3 w; E0 |9 N7 c D( `, p8 [+ [; I( g组件文件夹,包括上云组件,文件系统,安全组件,其中上云组件集合了各种常用的上云方式: 测试第一个代码:# w3 I1 m& {7 ?& C* Q
根据自己的开发板在encentOS-tiny\board文件夹下寻找相对应的开发板,我这里选择TencentOS_tiny_EVB_MX_Plus,进入文件夹,打开KEIL文件,打开hello_world工程。
- K% o. ^8 p6 k$ H# t- z工程结构: 主函数中初始化了开发板的外设和任务的创建启动 board_init();初始化了系统的时钟,UART,定时器和OLED的显示,所以编译烧录后可以在屏幕上显示相关信息。 hello_world.c文件主要是创建任务,以及任务之间的调用。可以在串口观察任务运行情况
4 O0 M0 t8 B3 g: b4 k8 v+ `( S9 f9 {: Y/ z
- #define TASK1_STK_SIZE 10241 [3 {- o E9 b2 R- n9 B g
- 2 t6 N- ]' W7 S! ]- U
- void task1(void *arg);
1 r/ i$ @. E0 \
) k. R1 m8 x* O, K9 R. B- osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);5 k( p& m9 t; A1 Q' ^: W4 m H
: o1 V: h% r* X- #define TASK2_STK_SIZE 1024
6 \2 X# z1 b# S5 T" [( y - 6 h9 }# L% K5 b# T+ K
- void task2(void *arg);
# @1 p9 p% m! ]( f a - . V4 W# y# x+ _6 o7 m% g
- osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);
4 b$ S7 _+ }% w5 r' i
; v! R2 t, m+ L3 H4 r7 o- #if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u1 q5 Y" V2 r+ Y+ p6 f
- 0 o$ @& w: m* m/ e4 u+ F
- #define TASK3_STK_SIZE 512* n# s5 _3 M+ A4 r9 ^9 Q
. n* b: Y2 ?+ E# k$ L; O- void task3(void *arg);" J4 @) G; m0 ~! r* ^1 _9 z
- , z& n# s4 `# h' I! S* ?
- #endif
* b: E! V' B1 W4 l7 W! K1 N) I9 o - ; g; Y5 X X6 G8 a; b
- void task1(void *arg)
& o7 A% k0 V0 K - 6 }/ g. m' S2 P
- {
8 }, c) y" z/ {3 c. m4 {4 Q: B& R
" {" f; s6 h4 G2 v2 n# _- ?- #if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u
$ z" f2 F9 T( g0 ]
3 F) m( C4 |, l9 n" ~5 D- osThreadId task_dyn_created;
" t; X1 {" m$ s8 v0 M - 0 E5 A8 T5 I( ]* Z1 Q5 q7 U
- osThreadDynamicDef(task3, osPriorityNormal, 1, TASK3_STK_SIZE);
% d! G# J b5 l0 \0 d; I - 8 @! B) o6 e, t& t4 T" D1 X8 V
- task_dyn_created = osThreadCreate(osThread(task3), NULL);; a1 \) W2 v7 t
- * [! ^3 S" c) V6 K" D
- int count = 0;
4 U1 X( S _6 O$ S+ D n( B
$ g6 r3 F* G& A _( C3 V9 a; J- #endif1 |2 i! u; c- J7 x' o7 w X
- * s% I+ N0 k/ H& r
- while (1) {
2 }! K9 h- L/ G# w `- w1 M- ~
( w+ W& s7 y7 i! a, I- printf("###I am task1\r\n");6 s7 ^1 j0 o+ o2 [" \1 H3 F$ {
5 g7 {5 f0 t7 G: f. \- osDelay(2000);5 o5 T `1 W* J2 O7 K$ V t0 T6 L
2 q! i% _- o9 P* l; H0 z9 Q- #if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u, ]: H0 X# t3 T& d' }
( t, T: M: A! f( ^$ t2 | v- if (count++ == 3) {; m' @) d' t* }2 v4 [
2 q5 U' H# [, s; f1 E- printf("###I am task1, kill the task3(dynamic created)\r\n");4 R* n$ c6 F4 T9 U) b" G
" E0 J& R$ L& i2 v- osThreadTerminate(task_dyn_created);
" p0 \3 V3 @ p* T - $ ]) N+ Z0 V, y/ c. K- d
- }: y; r+ s+ \0 @0 a$ D5 U: }* Y I8 A
- * W* U8 ~/ k( q: V* c0 L
- #endif
1 j) t7 E- d! O
7 W% ~, ^5 N7 M! g9 q9 v0 V5 n4 p- }
$ U4 b0 w& C" S7 i- L: f9 X - 4 X$ H6 C5 ~; P% i
- }$ f y0 m5 @! Z* d( y) w
- ) `* c, ]5 X* B' v. W
- void task2(void *arg)" r4 ]7 O5 V4 Z+ O# p9 `- E
% l) G! d; s9 L* g% g: h6 C* r- {: f3 |/ \% [; l) r- q5 `$ f+ O
- ) a' F9 [9 c' J- H% b
- while (1) {6 S M' i8 f- V0 e- X. I& d1 r
+ b& o; k- {2 S- #if TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN > 0u
, Q4 x2 {. d" H T
) @4 s+ I+ H( M6 r5 }- k_err_t rc;
" l, ?0 p8 Z) a1 f# l- n3 u( z2 T: E
0 m0 s; k( @( U0 i$ U! z U- int depth;7 l0 D" K, `: Z/ J: R" C. v( X
, t" C, f! V5 k; N1 S/ H( y- rc = tos_task_stack_draught_depth(K_NULL, &depth);+ y/ Y, ^1 i- \) r6 i$ D8 ?
$ m' Z* j6 N2 x) E! x7 \4 O6 o- printf("%d %d\n", rc, depth);
+ r; w% H! B* ^2 _( c
# Y' @$ Z6 i/ h7 |1 p( q- #endif
' U& h: v5 v4 a! H3 n6 l+ [ - $ C1 O d5 }; A6 I3 z9 q9 H7 S
- printf("***I am task2\r\n");+ t% [# U9 k& G+ Z2 Q
- 7 l/ u b# A' u4 T, Q3 w
- osDelay(1000);9 Y! O% ^, R+ c7 D" o
- 5 R) _% u0 H; h
- }
! I, P6 P" v8 ^! E( R$ ~( d$ l
+ C6 X8 L$ W* W- }
" Y: |, i( g+ c8 u8 G4 [
5 H' U$ E4 s" P- c* ? g+ s5 C" D- #if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u* S: ~% f; b& k; O+ S
- 7 P. m5 T2 t& x: D
- void task3(void *arg)% V' t. v5 p" I4 \9 }% K( N: @. t" }
- ! ]* v- s9 W$ }- ~6 n; f0 i; z, I
- { A$ @4 ]' l k/ ]/ R: \- ]# A
- l8 D3 s7 c+ c. K- while (1) {
# q( D7 H! F3 G) ~: X3 ~
2 h7 T: _( A0 |- printf("$I am task3(dynamic created)\r\n");
( S/ N. ^/ A! E$ X: c% P/ X
( y- L. o4 i" h ]& r! f8 m- osDelay(2000);9 }! |+ M" W5 V" w
- 3 ]& j% o% f' }6 T5 G1 ^' e
- }; f% h* w# F4 R
- t# H/ a- j$ D. H7 Y# y- }. T) A7 w: T- G
9 z/ g# r" z: `- #endif( d4 E- C. d x4 q
$ w- U: N1 z5 j% ^. n: S- void application_entry(void *arg)0 {1 r( J4 V/ n
- 8 B B! s. M. l
- {
$ f& A' A- L4 d# \# R/ @8 _% P3 d( }
) f, S# `5 s7 w; O- printf("***I am task\r\n");& e0 ^$ D' [: p) g3 w8 E
; h. ?5 s+ L0 X) y% O5 o6 w- osThreadCreate(osThread(task1), NULL); // Create task1
* W* W/ k9 B9 P- f$ N - 4 c7 n6 m( p/ y3 C1 x# |
- osThreadCreate(osThread(task2), NULL); // Create task2
0 i S& Y( e( x/ [7 o& m: j - - {: g) D: d$ u+ Z X
- }
复制代码 # s" X& f- _0 j) ]
( }5 n. N. P/ E$ x+ G$ Z! V% C( L
二.上云!
5 a1 l6 G4 _3 v0 e* q/ z4 s6 n: k既然是物联网操作系统,不联网那不就是耍流氓嘛!
: u: ^+ F! K6 C6 r- N因为是腾讯的物联网平台,那么针对自家的平台适配性肯定是最好的,我们就上腾讯云IoT Explorer平台。9 {, A3 K7 l: ~9 d4 W* g
1.云端配置& @* c. \' L8 x* T
登录腾讯云物联网开发平台,登陆后点击立即使用进入产品开发界面。 * @+ H5 Q0 _7 a: }" a8 y
1.1 新建项目
' R; y9 n5 R6 W/ W/ `1 ]选择【公共实例】或您购买的【标准企业实例】。 进入项目列表页面,单击【新建项目】。0 Y# S( v$ C7 I- g% l# ^
项目名称:输入“智能灯演示”或其他名称。
1 Y& D! C; M* y) L- x项目描述:按照实际需求填写项目描述。 项目基本信息填写完成后,单击【保存】,即可完成新建项目。
$ }7 P; W0 O0 ]1 l2 E" h项目新建成功后,即可新建产品。
; b( J) X+ W4 J$ @) w1.2 产品开发
$ y$ N( Y# u% f* F8 {# P' S1 _1.2.1 新建产品进入该项目的产品列表页面,单击【新建产品】。
; M" y3 l2 ?1 G; G# i8 W% _; G在新建产品页面,填写产品基本信息。
& G$ @" K& P+ z; L* e& r* B& n, o9 v产品名称:输入“智能灯”或其他产品名称。. F7 c9 v) v" {
产品品类:选择“智慧城市”>“公共事业”>“路灯照明”。
2 }9 t7 @- M% `# d: X t设备类型:选择“设备”。( e5 K9 ^% A9 f* f" ~
认证方式:选择“密钥认证”。1 o ?+ D: C' ^
通信方式:这里选择其他。: y. J: J9 S, \
其他都为默认选项。
产品创建成功后便可在产品列表里面看到“智能灯” 9 O. O' ~# {, t4 F* f
1.2.2 完善产品
& H3 l$ |+ x& M点击产品名称进入产品配置页面8 W! X7 r1 V' D( O2 {
在数据模板页面系统会自动推介了标准功能,如果有需要可自行添加 数据模板是一个 JSON 格式的文件,使用数据模板协议,用户的设备需按数据模板定义要求传输设备数据到云端,并可使用基于数据模板的诸多业务功能,点击查看json可以看到上面创建功能的json格式:* M3 K- j0 D- n' |& e
R5 ]1 `9 ]' T9 g9 t% T
- {+ C& N' R3 ]' X W6 w* \
% b4 q; G, c, Z' \3 G- "version": "1.0",
3 m; m0 `8 c# C, b
/ U9 H9 r5 w! G! p6 J2 i- "properties": [( L% B" f/ `$ K& d. Y. l
$ S9 T9 I2 e4 ]# I" \4 a, H- {3 b5 D( n0 @( u1 [7 r
: W& p. @, l# f; f/ h1 {; F- "id": "power_switch",: h. K, a6 F* U* y, i9 m/ [9 v9 o
- O1 l8 D, m3 p" \1 r- H: K Y& }
- "name": "电灯开关",
M' U( l: F/ b: I* a
5 }7 Y! W5 r' Z! x! J( Q3 P- "desc": "控制电灯开灭",7 r2 y, N$ n+ B8 T1 T' N8 L+ v& Y" S
- 0 J* m: j" n, {; ?. A( W9 N1 M
- "required": true,7 d! P( V1 q7 m |4 I% s Y2 q1 k
- * y* v1 E! g5 S+ ^1 K$ ~: y
- "mode": "rw",0 a: e, `: [$ w( \5 u
- 2 @, X- _/ g' y" n
- "define": {" h( Y1 _( M9 }! n3 K
4 r/ s- i3 h7 _5 m6 @6 Y- "type": "bool",
) m5 R' t9 H. L - 4 [* D2 G% _3 m; i* k
- "mapping": { r" U B0 i7 l6 w; m0 D4 t
- & N% S8 C6 X3 u- {* `8 M! h6 r
- "0": "关",+ _/ ?, M$ P3 h5 R+ G9 `
& {( Q7 j1 n. L) p& e* g- "1": "开"
$ `. y! O3 P4 e6 K' T - 7 C) S/ H+ i) f( y: X K4 [
- }& _$ k& j' q1 u5 n- d
! r8 i5 h( Q% ?5 M, i6 Z2 M, Y9 I- }4 f% _( c; o# m, v7 [4 F9 z2 ]
- % k/ `3 ]% Y! K S1 V: T8 T
- },
4 D% u- ?( E8 e, B) n3 Z
e5 ^# ~ E# A- {9 m8 h( s) b' U# g$ }
4 k# X( ^+ q- H/ G7 c9 L2 X. k2 ~- "id": "brightness",
) u& m5 K- o8 U( @- Z! E) q - " I/ ^! A0 D# c, F+ W" T
- "name": "亮度",
/ D9 V6 h& H9 V - ' p& C3 u& X+ t4 Q8 Y! W
- "desc": "灯光亮度",
- R5 [, n/ _2 G9 W - # P5 g' n7 U5 J1 Y/ U
- "mode": "rw",
+ B& Z3 O0 r, z9 n+ u
. d2 S4 u( J- a- o" q- "define": {
5 s9 h. @/ o2 U8 L
$ R% A- H; O0 Z" d: M- "type": "int",1 l2 l8 y3 ?% T
- / Y6 R7 L7 V* e' \; Q5 l% h4 h/ C: |* @
- "unit": "%",
/ ^) h- r1 P6 k1 o" Y/ D- c
( M }) Y p, \ J. @& Z( @- "step": "1",1 Y9 U% P: y7 R S" [
- - [; T+ G+ B: d
- "min": "0",
. X1 H4 `9 c! C( Z/ Y - # a% d' t* Q, Z: _% j, E8 u
- "max": "100",
$ j0 o& m+ D; M0 z; d - 5 _6 ~4 `+ s( h" e) M: [
- "start": "1"0 k& _& k/ f8 u* k+ g
- - e1 v0 R( C. a* r
- }
, }1 Y4 z k% L j* ]) U) x& { - , h9 k3 n# [4 }0 V! ~4 a: p0 b
- },8 k9 n) B$ I8 B$ Y
0 Z* t7 _- k% \ J6 O4 {( ~- r6 k6 ~- {
4 l+ x% g3 |9 E5 ~/ Q H - 2 f ~$ ^! r" U* \2 I/ E" b
- "id": "color",
) R8 m5 a4 @( q
" q: j; b1 q* G$ q9 i8 L2 i9 q6 h( h5 D- "name": "颜色",' x+ v9 j/ S( H2 o$ {0 ^1 S" Q
* ^2 L, P5 I# \1 u! [- "desc": "灯光颜色",
( a, k! r# C9 r# h% p/ F
0 }, N" c* L4 m, e# i% M8 M- "mode": "rw",, ^9 M; j/ H) S6 d S# L8 _8 Z8 k
- 8 @9 R: e. x' a- x
- "define": {2 p& ?8 r1 I! J7 X. [ K( u# H
: S) |2 ?3 \8 G% ^$ t- "type": "enum",4 t# v# @5 C7 J( v
- q/ Z+ l4 G# s. Q
- "mapping": {
6 M5 e8 S2 S( f O5 G - 7 n' W% E0 X) N! G+ r3 T" D
- "0": "Red",3 `. L) H, E( ]
7 T0 Q* x$ D+ r" x; }- "1": "Green",
% Z$ m8 `, _- ~, L
' ~- s0 b8 ]2 o- "2": "Blue"1 {, k6 A6 A% u/ @7 P+ E
- ! _+ x( Q. j* t
- }
3 Z" G$ Q1 e6 ^, \0 d; l1 i - 4 s/ S* L4 R7 g% n- g- }4 [
- }
. e% {0 k9 m/ o! ^) Q) j. a! O
( `: ^; X/ u5 x4 Z3 y. d$ V- ?- },
# Q7 p0 U- U1 X- y; x
6 U3 i3 ^: t& e7 v ^- {1 R8 v- Z2 L% v2 p: m
; B! D9 [& M' U7 I2 l3 Q- }+ \( P- "id": "color_temp",
( s* S8 j+ L" o* ^: y - . r# @7 U7 |& I; _/ c
- "name": "色温",6 F7 M4 j; R* q1 ?1 V
- ! a2 J9 g! U: | e
- "desc": "灯光冷暖",
! C' g& c: _6 B5 s+ f8 Z4 {4 E w - $ h! V1 \' `) q& y/ h6 w
- "mode": "rw",
5 ?' C- C* k/ V2 m( G$ Y0 ]6 I2 e
4 `- D0 K1 J1 j; V, V- "define": {1 V% i( H) I1 q T9 b7 Q
3 ~# _8 f6 M3 C1 i$ k0 I; ?! p- "type": "int",# J. g- u* x+ u6 A. v: t# A( d$ S+ n
- c0 Y$ V' \( q3 G1 y) q, R- "min": "0",
. I8 H3 Y) B1 u5 K
, Z6 d: O, U2 T+ w% f- "max": "100",
) U7 h- I s0 r: s) H0 I' S. R# E - + ?8 y3 g% _; f" F" Q4 Y: \
- "start": "0",$ K9 B1 a8 R- C, g
7 U# E6 z1 s ? ?( r J- "step": "10",6 x+ X! C/ o$ @ F
/ H0 j# B. T$ a6 `- "unit": "%"9 }3 [* U* Z: i1 K8 h6 K- ?0 F
9 h/ i5 P5 B. `1 }- }
; S+ d2 g" J! z- g! e - # O, o& ]/ [' N& d" |, Q7 H' F
- },
4 O) S( O9 i9 w4 p" H; V7 R
3 R: x6 {: K! h! e: Q+ v4 \- {5 W8 a3 m1 Q- p9 B) A( \
- 5 |# N% F% k8 D1 ~ S3 S
- "id": "name",
[2 i- |2 ~5 @' l p9 o; F1 ?
& r! }- v1 |5 B F$ P& D& C. P- "name": "灯位置名称",
# o8 H5 z- I X - * ~0 ]' ]+ i$ N. Y) X. b
- "desc": "灯位置名称:书房、客厅等",/ p: x. I& Y4 @2 o. j
Q* [( T) U a- "mode": "rw",& ^% F: x' @) W
; I- d" Q9 V- ^1 ^& H6 r- "required": false,/ d& t% l. V- P0 w
- : P& y6 |' [9 S$ e3 F$ R5 H
- "define": {' X. f: M$ s o& d0 A
: C3 ^& B/ u! H- "type": "string",$ I4 T/ k4 @! H7 e, G
8 `0 i9 x) \- q& D9 K& Y2 s- "min": "0",
7 [+ b% |4 @5 S! z% Q" T
2 T* S' ~# b- I$ l+ q" ?- "max": "64"" Z. W0 U/ W0 n' X2 E) a
9 W& ?' Y: w F' w+ q! k# Y- }
+ p6 e) d- l% U/ N: ^) y9 O5 q7 \) r
R) y9 b$ @ `6 C C- }* t! s$ s! d5 f8 W
- & S# R3 p' X& [. {6 x9 l
- ],
/ I0 ~6 X! Z+ G( ~% ?( T; L, T - ' U% F2 X$ |/ X$ a$ ^1 M9 A
- "events": [0 l' s) ]: H) i
! h! B/ s$ v* O( _/ W6 x- {5 ^7 h6 W3 ?8 y j) K0 g0 g( ]# }
2 @* E' j8 N1 L& `- "id": "status_report",( n0 U) x8 L0 `4 w( r M
- ! o( r! D" q2 W9 Y! F" Y
- "name": "DeviceStatus",! n2 Y; L$ v% @$ c2 l+ u
7 Y E) h2 H6 o( K; C- "desc": "Report the device status",9 r1 B2 N2 O. u4 V( k- i
1 _% }' ?: C8 Y: a6 A- "type": "info",
/ }2 {+ s8 Y# x& C5 m! h9 o
$ g: ~. N! B8 t) P+ @" l& h- "required": false,
6 m! y7 [& O) M
_8 s: j9 W* R0 g+ I! g- "params": [" U6 q, x, F7 F. {# f3 M" E) D
- / Z6 `) r5 j. p; d" |: K
- {' X9 c7 D$ |2 k1 H- @
/ }4 H5 J$ b" Y3 c" l( ]- "id": "status",
1 Z) z ?5 v4 A! y/ I" z9 e - 5 F m, S3 n x
- "name": "running_state",* X. i9 B6 }- [5 I
) c' [8 G9 y4 w7 c3 C- "desc": "Report current device running state",2 i( Y0 }! x2 h; f1 j3 L7 U
$ @3 q( F0 g. h7 |5 M* b" X/ ?- "define": {' ]- J: Z# s& u" Z" z9 T2 {
- 2 @) M) _* B7 p" x- V& r* J
- "type": "bool",
, S9 F& F* ]$ _, k! X$ p: {0 c - " d/ j0 [! x( w0 p/ Q1 n& S2 I
- "mapping": {
. h- ?) Q( H& ~* \: n2 C) {0 S" _0 U
" Q2 B+ `4 X9 c8 v t3 b$ H2 q- "0": "normal",# l! Y( b Y$ _% D7 w- o2 R) t
- {6 B7 @+ |5 p& F
- "1": "fault"3 j4 [0 w( S/ O* |# |' _
- # V; V N; P# g0 z. O
- }
% }. s+ q }" q1 H - G) |& Y: `8 k7 {
- }
; @$ ]! b3 h) ]4 j
: [8 s& h5 l& V/ L- },
e* B# H L; L$ C- K
# o6 T$ F/ o7 Y$ F7 j- {
# O9 C3 \1 h9 E" _ - , K$ u. d# N! N0 W( m1 g6 E- H- n, M8 c
- "id": "message",$ Z; A5 D0 q3 W3 S
- 0 e3 M: K" x( N
- "name": "Message",
. C w- K4 L$ N4 J$ ?
$ g/ Y7 C0 _/ t4 m8 r$ [+ F. j3 c- "desc": "Some extra message",
8 _. F1 c8 V5 R7 n: a7 N - 9 F2 i0 T/ ]9 e) X" q
- "define": {
9 H4 [# w4 f4 C - # M" E; Y/ b, \+ H: ?& h
- "type": "string",# h' v9 D' X; j! T) a+ C! u0 R
$ B6 h4 _ }0 \' c% e- "min": "0",
4 ?5 ?$ J' ^0 M- h - 3 m+ @, o0 Y6 B
- "max": "64"
) V0 j) ~. N" y: \# D" V( { - : E$ ]% Z9 J+ G* d4 Q, E& j9 A
- }
. P; V& A, W& a: b - 0 o; f/ H( E4 E# q# W
- }* X+ s0 V/ h- b: U: ]" U) ~4 E: A/ X
0 x( T) E. d N4 q0 @! {- & k; _ q: g! O# a
- },
2 }6 U* ]# g U - 8 g3 {' I" j8 a) E
- {
# @( A: O* G) O4 S1 Q
; L8 \9 Y1 c, l: |! U- "id": "low_voltage",
7 q5 j5 a; n3 f+ r3 p9 g
) v, `4 ~7 F7 o) L- "name": "LowVoltage",
, u. j% O4 [: ]: J7 i3 x
. q8 u; a( Q8 @5 t/ s+ n* Y, B- "desc": "Alert for device voltage is low",
& d& F0 X9 G5 L( c/ c - 2 o( P0 k: }/ w2 A- s6 q1 Z. u2 f
- "type": "alert",' H" G' h! [& q6 U( U" l
, u: U7 u5 e5 c5 I8 U6 c! |: D- "required": false," w3 a2 D5 ^3 C* B( _* k: p
) t1 {0 W3 P+ o( f- "params": [
8 O6 G1 L* |9 `9 E6 l - 4 ?0 G, y* d& D8 l7 M/ R
- {
+ Y7 X. W1 b5 V- O' F - 0 i! u$ X6 D1 [9 q6 }1 S
- "id": "voltage",
c. \' H2 s- C8 ? - . C7 S+ ~! V, z. t% e) g( B
- "name": "Voltage",; Z1 F$ h3 Y Z/ T
2 u" |% z( A, J: g# S" k9 o1 g7 s- "desc": "Current voltage",
( E y/ I* ~6 I: W( d
# d6 b& p1 X# u6 Y2 o- "define": {! L$ H1 X+ T V4 u
$ C7 g# w9 I2 y4 A- "type": "float",
2 V3 o% B D# V Q+ W1 R - 8 H% V- a1 f. K7 q! E' e8 q4 b
- "unit": "V",
7 Q- \9 J- o3 S* j, E6 J - " ?- l) e* d7 P
- "step": "1",/ M! Q6 A1 ^& @+ I* a2 M
- * I' u8 _" u" T
- "min": "0.0"," y# z9 e$ R+ @0 ?% I- H8 _
- , s, I) o: T) \: M/ a% _) b
- "max": "24.0",5 c0 M6 P2 m0 r3 X3 w) O
- 5 d1 d; ^# o, P! c
- "start": "1"
8 c5 V. M u- Y u5 ?5 R/ D4 O2 W - + v# h2 j; w6 j4 U) p
- }# |8 Y9 P- X: q8 Z% g) e
`( I2 j: Y1 r, c" o7 Q8 Y! r- }
. H" J& E2 n6 o( D: c1 h0 q
. D+ O3 X. n& q* r- & K% c7 b3 [0 U1 F! D* p
- },6 {1 |, {# G% ^8 y( r( d
9 x0 C8 \! H% ^- {( c3 @0 t V! J, n, c1 I
- 7 i( Z" V$ n$ Q* G- @. \0 o: U
- "id": "hardware_fault",
. Y5 I2 k" \7 c- ]" }4 U \ - 2 g; N+ J5 A6 ^
- "name": "Hardware_fault",$ U6 o) M' \4 {7 ]# T
* {. O8 r! U0 `: b- "desc": "Report hardware fault",
- B) C9 w; G0 N - ! h2 s# @3 N$ }, A/ X
- "type": "fault",
4 v. X8 M o/ t1 o0 G' \4 U
3 _6 k1 k( N, M- "required": false,
: x1 K+ G" c8 u. B
; }! g f% i4 o/ z% L- "params": [
' t7 I3 R4 h8 c& Y% S6 O5 a
/ L5 I9 f; F) H- {
* F2 y8 j/ m/ R - 3 ?' i) T% e' c8 {. S/ C
- "id": "name",
& p6 g' M$ z+ t2 o( P- y3 D- N - ! O' B' T( y4 [% z
- "name": "Name",
5 m& F5 {5 d5 D1 v" u2 c
$ R+ D1 O/ ~5 y: h- "desc": "Name like: memory,tf card, censors ...",
& }% R# \* b; v$ e% U
# q' R& P6 g d8 ]5 J9 l- "define": {
, h% p/ {* R+ M; X8 Q3 q+ ? - 4 m2 }1 q _1 }6 G; P
- "type": "string",
8 J0 ?5 d( Z8 y$ ~: N* Q7 w% x
2 M. @/ ?- c0 W# ^, ^- "min": "0",
* ~4 d- C+ _6 p3 _, U; N
8 x$ N1 p6 O( H9 y8 O6 V) M- "max": "64"
. y- W' }+ k+ e
5 e% z p7 G) [3 L( p- }& s. Z! T; {. i
. R" s1 n4 ~6 z0 `: ]- },3 e, ~: P6 W3 E
" g5 M4 e" x; V: q+ E+ H& I2 F, a- {$ D+ C, ^; i1 ^& `. a: ~
- ; C# h, n8 o$ x n" s
- "id": "error_code",
# K. m& r0 }9 T* v7 S - : G8 h) w# @+ F+ a) \
- "name": "Error_Code",9 w# x# C! w$ `
- 1 P$ |8 n* l/ I( o
- "desc": "Error code for fault",
% P: Z' o. d( U+ x; d - ) [6 d5 j' k! c& p' b8 S
- "define": {- G. f2 ^% y; p2 f8 Z6 b; E
- ' M& X# S9 y! Q8 l/ O
- "type": "int",: ^# E8 Z2 S" _5 w; u
- u% h4 n" `$ ^: _5 J9 A- "unit": "",
3 S$ R3 V# j: j) ]. |% r. y - ! Q7 w) ^0 Z% y& w; \7 n
- "step": "1",
: o# }0 M! O1 T' l: c. u
. Z: o, C! {! K i( d- "min": "0",
6 R# w6 Y- @- a; n$ E- ?
7 ]# s" \+ Z4 |1 r+ f1 d, p# O- "max": "2000",: J% ]" K+ X$ K* J
- / a$ h3 D9 g7 Q/ o: j( l
- "start": "1"( T- ~4 Q" ~* F) A% d$ h! C: M
- 0 X& y- ~" y4 l' t9 ?
- }. ?3 T1 ?" r. F
+ o! F( S* N& w- }
$ B% L' [ Y0 t& V - ( j# H5 P# \7 b. G! f6 h
- c; E& B" @% k& D
- }
' Y; a; t1 c' n0 j - 8 W8 x+ ^' l* P: _2 I0 m5 U
- ],/ _! Z2 h9 ^: N( G5 _
- . `: A& u7 O; }
- "actions": [
& X4 }1 v: `. F5 k9 `. Q% C
5 G4 K5 Q* m5 M+ p3 L- {) q% v) a- M* Y3 y7 C: L" p
2 R+ a& K) Y$ l. I- "id": "light_blink",2 @$ h$ d0 }9 C* z; s, y& F( X0 r$ Q
- 8 a' z% E! a7 h! i
- "name": "行为测试",
3 g& k/ s$ `: E- n0 y8 i
$ W, I+ i% Y+ S1 T- "desc": "",
) j( H5 _- m3 o: d# Y w
0 k: ?3 X$ L7 B& H7 m) }' A- "input": [; `' N! c" D% _1 ]
^3 c" `% U( I1 K( {( V- {: B5 T5 n% s% d
- * q0 v& s" A' r: C) c% B
- "id": "time",
/ W9 h( d3 \; S7 n/ {$ B/ X6 x" s [ - 0 h2 J. }3 x6 I e& X4 d
- "name": "time",, H2 r6 g. n; A( c7 o8 p- c; t
6 Q! a4 Q5 G: l- "define": {& j/ n$ P9 n! z, ~ f* ?2 M
. I/ K7 A4 q& f: ~0 C" p7 Q' j' m2 G$ C- "type": "int",
. Z6 Y! }! Y7 B5 R - 9 J/ K9 R* y, M2 q' Z2 F
- "min": "0",
/ e- n1 X; L5 M1 f5 G& c/ [7 D$ c% j
6 h. R6 J! j+ ?6 \# t3 Y* ]- "max": "100",
- p! [4 X! i! |) f% Z" ?
/ ~, _8 [! _6 k8 g8 o- "start": "0",
* j0 W' y) R4 y
. t& V8 X9 H. N9 I- "step": "1",
: X3 K- @/ A3 |7 s5 e! K' k& i
6 O! E: B' C; Z: |9 D- "unit": ""
6 U' L8 V+ r- [# c - 7 q- ^9 N( F0 c- a! o: t
- }: q: K2 s+ j- B* N5 D
) o5 i! h0 H; D' F% ~" Z- },
$ @4 c( N+ C$ p1 L1 j& ~
$ \; m% D' P) V- {% Z7 L# L' D1 G% U
0 R( {$ T8 N1 H- "id": "color",+ m9 k7 n7 W" S5 {6 i/ `) M
9 }5 \; X" d v# w: l' x E- e: R- "name": "color",
8 \' B" @# g: _6 L7 e: `
, {8 X( f- _% X" m+ R3 u- "define": {6 N' v9 h' g$ L* r6 @
Q* u, o$ a7 `+ O+ P- "type": "enum",+ t) Z9 U( |8 J" Q+ J
- 8 T" D# _7 X8 G' u O* i$ R" n
- "mapping": {
+ ]+ I4 e! ?9 t! P" m- ` g - ! i0 w7 m* s+ B( |7 o8 J3 d# ^
- "0": "red",0 p, J# U6 @ K# n; l6 {1 x
- i1 r% ]3 @8 w$ f- U" p- "1": "yellow"
+ K1 j9 P8 s. X: g% i - - O; R/ w' q1 w c
- }
2 m+ D2 G- M' V) F - 3 N# a( U# p6 h& |' b" q% W
- }) [: v3 |. W- L- ]& O8 q: Q5 L, n9 n( \
- * l! z4 [8 Q& e7 l. V- `
- },
$ g; E* g" X6 ]
2 Q/ K1 c0 n/ G; u- {8 V+ D/ D5 B9 E* D7 ?
- " ?% K$ d- Q, P0 N$ k$ S# [4 t
- "id": "total_time", s+ L: t7 S$ v. r; ~% z/ C
- 0 ` Z: d: |4 q
- "name": "total_time",, [4 F) f) V& I6 f g, B' ^
( N, M; Y8 P. d% X% k- "define": {9 {# G! T" z3 [: c% k
- 5 s, k/ @5 y V/ D5 j0 t7 w$ R
- "type": "int",9 F5 k( X% q. d! q1 J# Q
" m5 }- P5 T, X( V* g/ @6 F1 b* w3 x) T- "min": "0",6 z+ _# B! f \9 j
9 q1 E: F9 F6 U! B1 e- "max": "100",
/ E) _: L5 b+ S! }
. d1 `3 A/ M+ a$ K2 {9 e$ y6 k7 i- "start": "100",% g- N, q" d- ?( t: F* E
- 3 _+ }" D8 m5 \1 s; k
- "step": "1",) c# T- ?* H) o/ ^! Z& Y2 ]
- 9 B" F" E& q Y! U) J# H
- "unit": ""
+ D1 t) c2 T# P* p1 N) [ - " u; l5 }8 x7 o8 v$ ~& d
- }3 O2 q6 m7 {# ^% v3 X5 d
- * J& h1 K) \2 `( a$ \0 F
- },, u( M3 M n# t8 s6 S7 y6 M
- # p8 R6 [/ _) }: V7 o- `3 x
- {$ C4 y! Z, u3 d( J5 [! F
- ( N1 P. i8 }4 T# H1 s, \+ `' c
- "id": "switch",
! T; S9 L5 G: q3 ?9 s - : `! v6 g( W U; }1 b. [* u7 J
- "name": "switch",
6 v1 C! u* a' H9 c8 n; a - ) X+ Q* O! {0 |
- "define": {0 ~, E3 W A! |/ O5 P: t
6 R6 i' `, L1 }- "type": "bool",8 ?* I8 M- d. Q: m/ |. m7 c: F6 ]* V
- ) i! T' J+ V P5 d! [' G$ ]
- "mapping": {
; A' _% {! ]% O, C. `: i; D/ R - - |& n) ^) F; r( |- @) K0 c4 u
- "0": "关",) D2 }3 c2 k) \) C
- % N% X* B1 L: [8 K5 o i5 M! K1 \9 ~2 _
- "1": "开"9 l9 r3 w4 e+ C7 f" z2 Z
- " Z9 h6 r" t3 `$ w
- }6 i* B x- b7 a1 X* B9 ]; `
- 2 p5 x% l2 h* n" `7 E
- }
8 i2 Q% F* H3 c; H0 p) `/ {* T2 F, V - * k. E @) \# P( I6 ]* @* }$ k
- }( d9 f: M0 s% Z: V \+ e
- # M4 _1 r8 o, X
- ],
Q* f4 b( k% M, K# p
/ N' \+ M" n9 m; @) `- "output": [) G4 ?0 O4 @* x0 i& k$ E6 Z; E
- ( C# B" g7 p. Q
- {
0 ~; ^: Q! Y9 i$ H! @ - 6 u+ k. l8 N" z- k A7 B- |
- "id": "err_code",4 W# r" u! Q' Y+ y4 Q8 v U
- & J3 l) u% N* T7 S0 x) _# u1 C" b( ^
- "name": "err_code",
! l6 V% Y$ {, O4 _. ^ - ! R w R! b+ M3 n- S2 ~# y
- "define": {
- P/ U8 P6 W* C6 l9 O
$ Y2 {4 Z9 b3 S* o) z6 [' U- "type": "bool",
% h# H2 y4 V# K* m+ l
1 N: z1 F5 N0 F8 b- "mapping": {3 r' M1 C) p0 ~- o* z6 L" q
& Z2 {4 _: s4 e5 G+ r9 D- "0": "ok",7 r$ R; W. O' [% Z7 n% f
8 ]" m3 S, K/ }( Y/ B- "1": "error"0 h3 C9 y5 {. k
- " V3 w# s2 ^ Q. y7 ^/ @
- }4 Y( B& O, a0 @% D0 @, e; v, u* F
1 N5 }( c5 U( e3 x( v, a- T- }
5 N5 {! B7 d' r- g m
* v' b* |# \) k; A- }: y0 E$ {9 p, p0 D
- 5 I' C; P% s0 c
- ],
7 |, p, l5 y0 t5 [# ` - ( `& P& a3 u6 E4 ]2 S
- "required": false, u/ g6 t9 e- q' v7 y6 M' L: p
3 P5 L! z/ q# N4 w' o! T- }. h5 Y- N6 H: C
: Q& y/ o% l2 t; d; i; p- ],8 n9 D& v/ W- B* t4 E; m
- 8 \% x' ]9 O2 `6 G5 j1 e/ e4 c
- "profile": {
6 }. p8 Z5 a. e
4 j+ z- W# R% R; x6 G7 B- "ProductId": "4JE4PTXVC7",5 Y: u$ B! S2 c6 u
, u) {# [! `8 n% j- "CategoryId": "141"7 D I8 B* Z1 V
4 R$ e% I& K# v% D: X: D- }
3 e% r0 g% |% M$ H X: V' m" ^ - 6 ^* K V( o6 k( P
- }
复制代码 2 k0 m/ m0 O2 \% z3 x
# j! l* n9 V1 z0 H8 r9 Y: w% h1.3 创建测试设备* m$ j, H& ? m$ P1 @3 y9 s
完成数据模板后直接进入设备调试,其他的功能暂时用不到。
2 ~4 k" R; D7 x5 R. R; Y7 B" ]2 q在【设备调试】页面中,单击【新建设备】,设备名为 dev001:
三、开发板代码烧录
1 t' u7 G+ ~ U0 ~, }9 aTencentOS tiny项目工程中包含了explorer的demo工程,进入该目录:- F0 Z/ [9 Y9 p% H/ Q8 f2 @; G
复制1 e, S* r/ v; V! \! `
D:\TencentOS-tiny\board\TencentOS_tiny_EVB_MX_Plus\KEIL\qcloud_iot_explorer_sdk_data_template
) l" s$ [& i" b' b' y. ]% E( c用keil打开工程,修改以下代码: 这三个数据信息在产品dev001详情页中,点击蓝色dev001字样便可进入: ) M! Q" g- R# d" g+ d. N* ?$ l1 D
产品 ID: 将控制台的产品 ID ,复制到上图 sg_product_id。
6 @& k+ J( G6 q! u" O+ W$ S( G2 B设备名称: 将控制台的设备名称,复制到上图 sg_device_name。
$ K, d* C4 a7 L# i! g% W0 K8 \设备密钥:将控制台的设备密钥,复制到上图sg_device_secret。
" v, t& d: e( @7 I 配置wifi信息 将此处的wifi信息替换为自己的wifi信息,注意:wifi应是2.4G的wifi信号,因为ESP8266不支持5G。0 n8 J, H' _% ]& n& _2 E
编译下载到开发板。% @# [& N* H( N1 O6 H, {
查看设备状态
& K/ K- Q& |( K( Y0 N. M* t烧录完成后保证程序处于运行状态。进入【控制台】>【产品开发】>【设备调试】,可查看到设备 “dev001” 的状态为“上线”状态,表示 Demo 程序已成功连接上开发平台。 查看设备属性 云端控制设备
8 ?3 L8 t" l+ g Q1 g6 S) V: S, s串口助手可看到设备一直等待平台的指令下发。 在云端平台进入设备在线调试,下发控制指令: 右侧通信日志窗口可查看指令的下发与开发板的回应。在串口助手同样可以看到收到的数据: 为了方便观察到设备受控,这里控制开发板上的灯,因为该灯只受高低电平控制,所以无法显示颜色,亮度的受控结果,这里会使用OLED来替代。7 k5 V4 O: U# }( r+ y
在gpio.c中先初始化PB9 在data_template_sample.c中添加控制代码:7 P5 b$ R7 _6 h
- static void light_change_brightness(TYPE_DEF_TEMPLATE_INT brightness)
" ]: ]2 i3 T3 I% E - " H* H3 N" @% F6 q5 d- y$ \
- {
" `" M5 U3 o( t% ?+ J. @! P
6 ^- }* E' W* c2 E( x9 W! k- // 作为demo,这里用oled屏字符显示来模拟灯颜色的切换2 [) P# B" D% v; s8 W! A
- & W# C5 `) Q+ g& I8 ?7 |% e
- // 这里应该由用户实现硬件操作代码,来改变智能灯的颜色$ I5 p8 p C5 g+ v+ O7 q
; k& f" g, O- N) r- // 此处demo,在开发板显示屏上显示具体的颜色9 n: n5 P3 C3 W: L5 V3 ^& k, a
9 ]" o! F0 A% |/ U2 n; \) o- char brightness_str[12];! I6 g+ G( O; O8 [
- " m! `; z! `1 B8 l ^9 p! j' n( h
- snprintf(brightness_str, sizeof(brightness_str), "%d", brightness);/ k& [4 ~1 n( w6 F' O8 s1 s
# m0 J. o1 K. p# ]5 M+ p, s* m, Y- brightness_str[sizeof(brightness_str) - 1] = '\0';
4 O" O# \1 S9 o8 K+ ^: c; G
9 q# T3 o* W' {% Z; H J& B- OLED_ShowString(0, 2, (uint8_t *)brightness_str, 8);# D, x5 \: C- j' l
- : z5 [! F% y5 r' w" q- a9 V* D
- }
$ z6 q1 T& H* w# T: I7 M4 h- a# ^
8 N, Z9 K" M% Q- static void light_power_on(void)4 t# U! N* p' D6 H
: R% e: D. `; V- L( F2 {" V9 E- {0 F; x1 v) c, @8 {
! Z8 y- E' z4 D, `- // 作为demo,这里用oled屏字符显示来模拟灯颜色的切换$ l/ B1 f9 P& t- b
3 t, C* k7 {# e! o- OLED_Clear();7 @7 l- {# [) L* T
4 @& D R0 y7 [4 q6 x) \! X- HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9, GPIO_PIN_SET);
% G2 q; \+ g; `6 j" C/ t8 `
" Y. l6 a8 h' t( P3 [- }- a% J" g* q- H
; [! _1 O$ E+ {/ @2 h/ I- static void light_power_off(void)
+ @% Y. ~/ S1 t; i( |( o
! @( w$ W4 t9 ^1 ~6 F- {
! f% x6 [/ f+ g+ e5 M
3 L6 Q3 y* _- l$ {" B- // 作为demo,这里用oled屏字符显示来模拟灯颜色的切换
" p/ }9 \* l: z- b) M/ z" A0 D# L - % U8 H5 x2 V) h6 G# M
- char *info = "light off";! c8 a6 }* h* O R& J
1 A" u N" b" h% N3 ?0 G8 S. U- HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9, GPIO_PIN_RESET); : |% N7 {% n- e" U# O0 A6 L4 O' A
- 9 f" R+ ?, x# T3 V/ {4 G. l
- OLED_Clear();6 Y9 b- P5 I' J( h5 @
* t1 |7 m& u% @% w( C0 `- OLED_ShowString(0, 0, (uint8_t *)info, 16);0 T! Z+ u5 D) V
- i) G6 s) u$ p+ G9 g+ a- o3 j- }
复制代码 7 c% l V% \& B0 d
2 _) M0 ?/ A# ~5 p" i7 S3 M
定义三个控制函数,用来在接收到云端数据处理后控制硬件。 - void deal_down_stream_user_logic(void *client, ProductDataDefine * pData)6 Q& k7 a- T, _6 H! K2 W
0 b) Q' I7 A" ?! }' r- {0 M# D$ A) z5 f
- Log_d("someting about your own product logic wait to be done");; G# G4 t& d0 i% M
- * f6 a, o2 k5 o% j9 i/ k R" G
- /
! k7 q- f& C/ C0 ^/ K c, A - 4 Q% T0 T) U8 c* Z; P
- char *color_name;
, h( O' J, }% A+ \! J. S' f
# `0 d( ` y# j( f- /* 灯光颜色 */
) c1 O4 ~& D, j+ m5 S! }+ c - 2 s/ {* Y4 s3 p# w; _8 c
- switch (sg_ProductData.m_color) {
" I5 [2 j) _* b; N( }7 `0 u - case 0:
5 V; R! X3 |( S" }% r8 i @* k - , s+ |0 D5 f" c# N( q+ ~% {8 v! Z: T! I$ D
- color_name = " RED ";
: O. I2 k0 w7 P3 p R( v - % e& r0 L+ ?! k& J
- break;' T1 C% Y9 z' z+ T4 R
- 5 ]& _) R6 X. G
- case 1:* K5 i0 L: E8 y' j6 E
1 @, Y9 M: }' b$ F. v! J* e" `) m- color_name = "GREEN";
: z( Y3 K- u; c1 V5 B# K
_7 `0 y$ D8 ~" h1 [1 {1 O- break; w8 m. ]% W5 P% m/ h( ~; M. ?
) J: k1 a! l2 j# O' o7 s( u- case 2:
/ q* {2 l0 ^: a8 r- R* N7 H
& D& u" I- ]& x5 l$ X- color_name = "BLUE";
( W1 E6 ^& R( }8 i6 @+ t
; V. y3 K3 a1 W' l% k' ^- break;4 q% }1 @- j+ Q' V
- ' j2 I- V5 I0 ^' Q
- }& A# P" W3 Z+ |
- & s/ O. S% l9 V( B( l d; b2 e: c3 p
- if (sg_ProductData.m_power_switch == 1) {5 V: Z4 J; d3 k+ x9 S0 g1 V/ H2 M0 v3 Z
- /* 灯光开启式,按照控制参数展示 */7 _' G* G+ t3 W$ E
- 5 g" a, s- b* H* f
- light_power_on();3 }& Z. D% P S( A A
) R* R& Y" c& W0 w- light_change_color(color_name);, e, A% m8 q! k
4 `% ?# ~6 w# s" u K, t- light_change_brightness(sg_ProductData.m_brightness);; s( t) ], C7 k0 S' g7 B
- 5 z: f# ?* y: R+ h# \# x; O9 ?9 I
- } else {
; _) g7 \* ]3 U5 Y - /* 灯光关闭展示 */
/ k4 s. z' [7 o: o. ^$ E - " ~6 \) b' j2 [+ J- [7 N$ S9 _7 X6 O
- light_power_off();
. [1 J$ V. \. m. Y$ }7 G& b: J - % @, [0 v9 T. i. d/ E4 S
- }
6 a' X6 O' W- M, t% K' T - 5 u" J9 Y A/ g( g' o$ G
- }
复制代码
% h/ _0 I5 [) M1 D- m; a
+ J* w# S$ b" a- k {& r在该函数中处理逻辑与硬件控制,当接收到云端的消息,数据已经处理封装在pdata。
! }- r/ W& M" V. Q2 {此时我们在控制台发送新的指令: 此时状态已改变: 四、使用微信连连小程序控制:; e# H8 r' n3 \7 g
既然是物联网设备,使用网页控制显然是不符合使用习惯的,但是腾讯自己有腾讯连连小程序,那我们就体验一番:; b$ h& }$ s& ^0 l: L' f i6 b
1.进入交互开发页面; 2.进入产品展示配置,我这里使用默认的图片,点击保存。 3.面板配置,如果没有特殊要求,直接默认,点击保存。 4.保存后进入设备调试,点击二维码: 微信搜索“腾讯连连”,打开微信连连小程序,授权后在主页面点击屏幕中间的“+”图标,使用扫一扫 扫描弹出的二维码即可绑定我们的智能灯。: E4 Q# y$ W7 ?' i' ^" R9 E. u- I
- \8 c+ C& P4 R6 W: ?* J% Y" w. `/ o进入智能灯,更改灯的状态,下发指令,可以看到开发板的OLED已经更新。
9 `5 u, g) ?, Q. o7 ~! k/ `8 E作者:woai32lala |