rzegkly 发表于 2019-5-30 19:31:20

【IoT套件测评】Gravity:阿里云IoT 之智能灯光控制

上一篇介绍了阿里云IoT软件篇:Gravity:阿里云IoT 之温度控制接下来分享物联篇:IGravity:阿里云IoT 之智能灯光控制
一、利用物联网控制灯光思路框架:1、灯设备与移动设备建立网络通信连接2、通过服务器实时转发,被第三方设备调用3、移动控制设备app控制灯的开关实现物联;二、环境1、硬件:阿里云IoT 入门套件x1FireBeetle Board-ESP32 主板,购买地址:https://www.dfrobot.com.cn/goods-1394.html2、软件:1、操作系统:基于 Windows 7操作系统,2、软件:Arduino1.8.0 以上版本下载链接: https://www.arduino.cc/en/main/software?setlang=cn三、物联产品和设备创建1、创建产品:iot智能灯光2、添加设备:2019esp
3、功能定义4、复制设备证书、域名、端口号等连接信息5、设备的Topic列表
四、编写IDE智能灯光控制程序#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include "DFRobot_Aliyun.h"

#define LEDD2
#define BUTTON D3

/*配置WIFI名和密码*/
const char * WIFI_SSID   = "**************";
const char * WIFI_PASSWORD = "********";

/*配置设备证书信息*/
String ProductKey = "*******";
String ClientId = "12345";/*自定义ID*/
String DeviceName = "2019esp";
String DeviceSecret = "****************";

/*配置域名和端口号*/
String ALIYUN_SERVER = "iot-as-mqtt.cn-shanghai.aliyuncs.com";
uint16_t PORT = 1883;

/*需要操作的产品标识符*/
String Identifier = "switch2";

/*需要上报和订阅的两个TOPIC*/
const char * subTopic = "/sys/a1lUufvfvs8/*************";//****set
const char * pubTopic = "/sys/a1lUufvfvs8/************";//******post

DFRobot_Aliyun myAliyun;
WiFiClient espClient;
PubSubClient client(espClient);

/*ButtonState、LEDState用来存储LED灯同BUTTON按钮的当前值*/
uint8_t ButtonState = 0;
uint16_t LEDState = 0;
static void openLight(){
digitalWrite(LED, HIGH);
}

static void closeLight(){
digitalWrite(LED, LOW);
}

void connectWiFi(){
Serial.print("Connecting to ");
Serial.println(WIFI_SSID);
WiFi.begin(WIFI_SSID,WIFI_PASSWORD);
while(WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.print("IP Adderss: ");
Serial.println(WiFi.localIP());
}

void callback(char * topic, byte * payload, unsigned int len){
Serial.print("123");
Serial.print("Recevice [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < len; i++){
    Serial.print((char)payload);
}
Serial.println();
StaticJsonBuffer<300> jsonBuffer;
JsonObject& root = jsonBuffer.parseObject((const char *)payload);
if(!root.success()){
    Serial.println("parseObject() failed");
    return;
}
const uint16_t LightStatus = root["params"];
if(LightStatus == 1){
    openLight();
}else{
    closeLight();
}
/*当LED灯的状态发生改变后,则上报LED灯的当前状态*/
if(LightStatus != LEDState)
{
      LEDState = LightStatus;
      String tempMseg = "{\"id\":"+ClientId+",\"params\":{\""+Identifier+"\":"+(String)LightStatus+"},\"method\":\"thing.event.property.post\"}";
      char sendMseg;
      strcpy(sendMseg,tempMseg.c_str());
      client.publish(pubTopic,sendMseg);
}
}

void ConnectAliyun(){
while(!client.connected()){
    Serial.print("Attempting MQTT connection...");
    /*根据自动计算的用户名和密码连接到Alinyun的设备,不需要更改*/
    if(client.connect(myAliyun.client_id,myAliyun.username,myAliyun.password)){
      Serial.println("connected");
      client.subscribe(subTopic);
    }else{
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
}
}
void setup(){
Serial.begin(115200);
/*将LED(D2)设置为IO输出,BUTTON(D3)设置为IO输入*/
pinMode(LED,OUTPUT);
pinMode(BUTTON,INPUT);
   
/*连接WIFI*/
connectWiFi();
   
/*初始化Alinyun的配置,可自动计算用户名和密码*/
myAliyun.init(ALIYUN_SERVER,ProductKey,ClientId,DeviceName,DeviceSecret);
   
client.setServer(myAliyun.mqtt_server,PORT);
   
/*设置回调函数,当收到订阅信息时会执行回调函数*/
client.setCallback(callback);
   
/*连接到Aliyun*/
ConnectAliyun();
   
/*开机先关灯*/
closeLight();
/*保存BUTTON按钮的初始值状态*/
ButtonState =digitalRead(BUTTON);
//Serial.print("ButtonState:");
//Serial.println(ButtonState);
/*上报关灯信息*/
client.publish(pubTopic,("{\"id\":"+ClientId+",\"params\":{\""+Identifier+"\":0},\"method\":\"thing.event.property.post\"}").c_str());
}

void loop(){
if(!client.connected()){
    ConnectAliyun();
}
uint8_t ButtonValue = digitalRead(BUTTON);
/*如果检测到按钮的状态发生了改变,则发送指令到阿里云平台以更新设备信息*/
if (ButtonValue != ButtonState)
{
    /*保存按钮的当前状态*/
    ButtonState = ButtonValue;
    /*按下:发送开灯指令,阿里云IoT上的相应设备状态变为1;松开:发送关灯指令,阿里云IoT上的相应设备状态值变为0,只需改变Identifier后的值*/
    String tempMseg = "{\"id\":"+ClientId+",\"params\":{\""+Identifier+"\":"+(String)ButtonState+"},\"method\":\"thing.event.property.post\"}";
    char sendMseg;
    strcpy(sendMseg,tempMseg.c_str());
    client.publish(pubTopic,sendMseg);
    delay(1000);
}
client.loop();
}
五、数据测试1、产品管理进入在线调试窗口,功能:led开关(switch2) 方法:设置 ,"switch2": 1;发送指令,



2、通过串口监视器观察串口发送的数据,表示接收数据成功!




六、移动控制设备控制灯的开关
1、创建IoT套件智能灯光,

2、导入产品

3、产品被激活,联产品设备



七、移动应用开发
1、新增可视化应用

2、配置物联智能灯光APP页面

3、预览测试
https://v.youku.com/v_show/id_XNDIwMzA3Njk3Ng==.html?spm=a2h0k.11417342.soresults.dtitle
八、知识拓展
IoT Studio物联网开发服务 (IoT Studio,原 Link Develop),是阿里云针对物联网场景提供的生产力工具,可覆盖各个物联网行业核心应用场景,帮助您高效经济地完成设备、服务及应用开发。物联网开发服务提供了移动可视化开发、Web 可视化开发、服务开发与设备开发等一系列便捷的物联网开发工具,解决物联网开发领域开发链路长、技术栈复杂、协同成本高、方案移植困难的问题,重新定义物联网应用开发。
页: [1]
查看完整版本: 【IoT套件测评】Gravity:阿里云IoT 之智能灯光控制