最终要实现的功能:
1、STM32采集温湿度通过串口1发送至AIR800,然后通过AIR800将温湿度上传至阿里云
2、阿里云物联网云平台下发命令通过AIR800控制STM32的LED亮灭(打开或关闭功能,或者定时 自动打开和自动关闭)
3、通过nrf24l01实现点对点通信,阿里云下发数据至air800,STM32(A)串口2接收数据之后进行判断,如果需要控制另一个STM32的LED灯,则会将数据发送至另外一个STM32(B),STM32(B)通过数据判断执行相应的功能
本部分要实现的功能:
(1)Air800接收STM32发送的温湿度并上传至阿里云物联网云平台
(2)阿里云物联网云平台下发控制LED亮灭的指令,和定时开关LED的指令
一、首先进行云端部署
阿里云云端部署前面已经介绍过,这里不再介绍,在阿里云上创建自己的产品和设备,云端创建物模型进行显示云下设备上传数据,以及Air800如何订阅并解析云端数据等请依次打开
在自己的设备下创建四个属性,温湿度,开关值,定时时间
二、修改云下设备代码
1、首先移植串口部分的程序到所编写的程序中
2、打开上面的程序代码后,仿照串口例程把需要的东西进行赋值粘贴到程序中去
3、在顶部添加变量
4、把串口发送函数和接收函数全部复制过来,串口接收函数最后用完注释掉即可
5、编写向云端发布函数
图中串口部接收部分是串口接收函数中的代码,复制过来后,串口接收函数删掉即可
整个发布函数如下
--发布一条QOS为1的消息
function publishTest()
if sConnected then
--注意:在此处自己去控制payload的内容编码,aLiYun库中不会对payload的内容做任何编码转换
while true do
data = uart.read(UART_ID,"*l")
--这一部分放在前面是为字符串搜索和转化提供点时间
local hum1=string.match(data,"%d+",8)
local hum=tonumber(hum1)--这是将字符串转化为数值
basedata["params"]["hum"]=hum --这是赋值湿度数值
if not data or string.len(data) == 0 then break end
if true then
local temp1=string.match(data,"%d+ ")
local temp_data=tonumber(temp1)--这是转化为数值
print(type(temp_data))--打印转换后的数据类型用于判断是否转化成功
basedata["params"]["temp"]=temp_data --上传温度数值
print("temp1",temp1)
print("---------------")
end
jsondata=json.encode(basedata)--进行编码传输
aLiYun.publish("/sys/"..PRODUCT_KEY.."/"..getDeviceName().."/thing/event/property/post",jsondata,1,publishTestCb,"publishTest_"..publishCnt)
end
end
end
6、订阅函数,进行数据解析
将解析到的数据发送至串口1(串口1是连接STM32的串口2的—比特率一定要一致)
数据订阅并解析函数
---数据接收的处理函数
-- @string topic,UTF8编码的消息主题
-- @number qos,消息质量等级
-- @string payload,原始编码的消息负载
local function rcvCbFnc(topic,qos,payload)
log.info("testALiYun.rcvCbFnc",topic,qos,payload)
print("-----------------------------------------")
local tjsondata,result,errinfo = json.decode(payload)
--以下为解析数据
if result then
local switch_rcv=0
switch_rcv=tjsondata["params"]["switch"]--把对应的开关属性值取出来
local time=0
time=tjsondata["params"]["set_time"]--把对应的定时信息数值取出来
print("switch_value",type(switch_rcv),switch_rcv)
print("set_time",type(time),time)
if switch_rcv == 1 then
write("led on")
basedata["params"]["switch"]=1 --上传开关数值
elseif switch_rcv == 0 then
write("ledoff")
basedata["params"]["switch"]=0 --上传开关数值
else
write(time)
basedata["params"]["set_time"]=time--上传定时时间
write(time)
end
else
print("json.decode error",errinfo)
end
print("--------------------------")
end
7、烧写程序进行调试即可,
STM32通过串口1发送温湿度至AIR800接收端
AIR800通过串口发送至STM32串口2接收端
下为air800订阅云端数据解析结果
开关值和定时是通过阿里云产品下的在线调试功能,调试真实设备对设置下达指令后所返回的值,温湿度则是云下设备上传的值
再次调试设备效果如下
这样云端和设备就打通了,设备上报数据至阿里云,阿里云下发指令简单的控制STM32的LED
下一步是在设备端添加nrf24l01,和另外一个STM32点对点通信。
最终要实现的功能:
1、STM32采集温湿度通过串口1发送至AIR800,然后通过AIR800将温湿度上传至阿里云
2、阿里云物联网云平台下发命令通过AIR800控制STM32的LED亮灭(打开或关闭功能,或者定时 自动打开和自动关闭)
3、通过nrf24l01实现点对点通信,阿里云下发数据至air800,STM32(A)串口2接收数据之后进行判断,如果需要控制另一个STM32的LED灯,则会将数据发送至另外一个STM32(B),STM32(B)通过数据判断执行相应的功能
本部分要实现的功能:
(1)Air800接收STM32发送的温湿度并上传至阿里云物联网云平台
(2)阿里云物联网云平台下发控制LED亮灭的指令,和定时开关LED的指令
一、首先进行云端部署
阿里云云端部署前面已经介绍过,这里不再介绍,在阿里云上创建自己的产品和设备,云端创建物模型进行显示云下设备上传数据,以及Air800如何订阅并解析云端数据等请依次打开
在自己的设备下创建四个属性,温湿度,开关值,定时时间
二、修改云下设备代码
1、首先移植串口部分的程序到所编写的程序中
2、打开上面的程序代码后,仿照串口例程把需要的东西进行赋值粘贴到程序中去
3、在顶部添加变量
4、把串口发送函数和接收函数全部复制过来,串口接收函数最后用完注释掉即可
5、编写向云端发布函数
图中串口部接收部分是串口接收函数中的代码,复制过来后,串口接收函数删掉即可
整个发布函数如下
--发布一条QOS为1的消息
function publishTest()
if sConnected then
--注意:在此处自己去控制payload的内容编码,aLiYun库中不会对payload的内容做任何编码转换
while true do
data = uart.read(UART_ID,"*l")
--这一部分放在前面是为字符串搜索和转化提供点时间
local hum1=string.match(data,"%d+",8)
local hum=tonumber(hum1)--这是将字符串转化为数值
basedata["params"]["hum"]=hum --这是赋值湿度数值
if not data or string.len(data) == 0 then break end
if true then
local temp1=string.match(data,"%d+ ")
local temp_data=tonumber(temp1)--这是转化为数值
print(type(temp_data))--打印转换后的数据类型用于判断是否转化成功
basedata["params"]["temp"]=temp_data --上传温度数值
print("temp1",temp1)
print("---------------")
end
jsondata=json.encode(basedata)--进行编码传输
aLiYun.publish("/sys/"..PRODUCT_KEY.."/"..getDeviceName().."/thing/event/property/post",jsondata,1,publishTestCb,"publishTest_"..publishCnt)
end
end
end
6、订阅函数,进行数据解析
将解析到的数据发送至串口1(串口1是连接STM32的串口2的—比特率一定要一致)
数据订阅并解析函数
---数据接收的处理函数
-- @string topic,UTF8编码的消息主题
-- @number qos,消息质量等级
-- @string payload,原始编码的消息负载
local function rcvCbFnc(topic,qos,payload)
log.info("testALiYun.rcvCbFnc",topic,qos,payload)
print("-----------------------------------------")
local tjsondata,result,errinfo = json.decode(payload)
--以下为解析数据
if result then
local switch_rcv=0
switch_rcv=tjsondata["params"]["switch"]--把对应的开关属性值取出来
local time=0
time=tjsondata["params"]["set_time"]--把对应的定时信息数值取出来
print("switch_value",type(switch_rcv),switch_rcv)
print("set_time",type(time),time)
if switch_rcv == 1 then
write("led on")
basedata["params"]["switch"]=1 --上传开关数值
elseif switch_rcv == 0 then
write("ledoff")
basedata["params"]["switch"]=0 --上传开关数值
else
write(time)
basedata["params"]["set_time"]=time--上传定时时间
write(time)
end
else
print("json.decode error",errinfo)
end
print("--------------------------")
end
7、烧写程序进行调试即可,
STM32通过串口1发送温湿度至AIR800接收端
AIR800通过串口发送至STM32串口2接收端
下为air800订阅云端数据解析结果
开关值和定时是通过阿里云产品下的在线调试功能,调试真实设备对设置下达指令后所返回的值,温湿度则是云下设备上传的值
再次调试设备效果如下
这样云端和设备就打通了,设备上报数据至阿里云,阿里云下发指令简单的控制STM32的LED
下一步是在设备端添加nrf24l01,和另外一个STM32点对点通信。
举报