阿里云物联网通信的两种方式,一个是物模型(分为服务,事件,属性),一个是自定义topic(要另外设置数据流转)
1.使用产品内的功能定义,(其实也就是Topic中定义好的物模型主题),功能定义中有事件,属性,服务三种类型
进入产品的功能定义中,选择编辑草稿
添加自定义功能,
功能类型可以按照需求选择服务(调用比如开关灯,亮度调节等),属性(显示数据等),事件,其中标识符是代码识别此功能的重要标识,另外参数一定要与代码中调用的参数数据类型一致
一定要发布上线才有效
服务colorset和属性color调用的代码不同
首先小程序控制端,如果是通过按钮调用服务,使用aliSDK中的Action: "InvokeThingService",完整函数代码如下
//发送信息给阿里云,页面设置了一个亮度调节器(进度条),绑定以下函数,data里面x初始值x:{'light':12},
c
changeDeviceLight: function (e) {
var DeviceName = this.options.deviceName
var that = this
console.log(`携带值为`, e.detail.value)
console.log("x",typeof that.data.x) //x为对象格式object
that.data.x.light=e.detail.value //将x里的数值替换成当前调节器的值
var str = JSON.stringify(that.data.x); //将对象转换成字符串,
//var Obj = JSON.parse(str); 如果需要字符串转换成对象
console.log("str",typeof str) //此处可以校验是否已是字符串
console.log("str",str)
console.log("lightvalue",that.data.x)
//防止重复点击
that.setData({
buttonDisabled: true
})
aliSdk.request({
Action: "InvokeThingService",
//IotInstanceId:"iot-",//实例ID
ProductKey: app.globalData.productKey,
DeviceName: DeviceName,
Identifier: "light",
//Args: "{'light':51}"
//传送参数时,格式为{'Identifier':数值},传入格式必须有引号,也就是对象转换成字符串格式,数值也必须符合当时阿里云内设置的数据类型,无参数的时候传空 Args:"{}"
Args: str //此处获取的亮度值会被传给阿里云
}, {
method: "POST"
},
(res) => {
console.log("success")
console.log(res) //查看返回response数据
that.setData({
openedDevice: !that.data.openedDevice
})
},
(res) => {
console.log("fail")
wx.showToast({
title: '网络连接失败',
icon: 'none',
duration: 1000,
complete: () => {}
})
},
(res) => {
console.log("complete")
that.setData({
buttonDisabled: false
})
})
},
阿里云收到消息转给esp8266,arduino串口监视器显示{"method":"thing.service.light","id":"173255894","params":{"light":114},"version":"1.0.0"}
arduino端的代码将params里的light取出来
c
String method =jsonBuffer["method"];
int key1 = jsonBuffer["params"]["light"];
Serial.println("method");
Serial.println(method);
Serial.println(key1);
如果是调用属性,则使用Action: "SetDeviceProperty"
c
radioChangeColor: function (e) {
var DeviceName = this.options.deviceName
var that = this
console.log(e.detail.value)
//防止重复点击
that.setData({
buttonDisabled: true
})
var str1 = "{\"color\":"
str1 += "\""+e.detail.value+"\""
//"\""+变量+"\""可以在双引号里调用变量,而不被识别成字符串
str1 += "}"
console.log('str1')
console.log(str1) //str1此时为字符串{"color":"yellow"}
console.log("str1",typeof str1)
aliSdk.request({
Action: "SetDeviceProperty",
//IotInstanceId:"iot-",//实例ID
ProductKey: app.globalData.productKey,
DeviceName: DeviceName,
Identifier: "color",
Items: '{"color":"red"}'//属性调用也可使用Items:str1,将str1传给阿里云
}, {
method: "POST"
},
(res) => {
console.log("success")
console.log(res) //查看返回response数据
that.setData({
openedDevice: !that.data.openedDevice
})
},
(res) => {
console.log("fail")
wx.showToast({
title: '网络连接失败',
icon: 'none',
duration: 1000,
complete: () => {}
})
},
(res) => {
console.log("complete")
that.setData({
buttonDisabled: false
})
})
},
阿里云收到消息后转给esp8266,串口监视器显示{"method":"thing.service.colorset","id":"921010594","params":{"colorset":"green"},"version":"1.0.0"}
arduino端的代码将params里的colorset取出来
c
String method =jsonBuffer["method"];
String key1 = jsonBuffer["params"]["colorset"];
Serial.println("method");
Serial.println(method);
Serial.println(key1);