nodeMCU的固件当时被编译成MQTT支持,BG6CQ老师的程序代码里也写了MQTT,但不是针对阿里云的,需要修改。
我先说一个结论:如果你不用别人的程序,代码很多,真的还是自己写比较好(lua的熟练程度真的和arduino没什么区别)。经过几天的修改,逻辑改的乱七八糟,实际上工作正常。太神奇了。
阿里云有很多SDK之类的,但是我没有用。我还是用nodeMCU的Lua来改他们。毕竟有现成的代码。
让我们做个笔记。
1.阿里云
网上有很多现成的关于云部分的文章,但是都太复杂了,我自己简单整理了一下:
打开物联网–“新品–”添加设备。
个人理解:产品代表一个完整的产品,设备代表产品上的一个小的功能模块,但模块的功能定义或数据模型(即传感器的温度、气压、电压)是在产品中定义的。
这些创建后,mqtt连接参数直接在设备的信息中有一个MQTT连接参数,不需要像那些网上文章中提到的那样单独做任何计算。
2.软件测试
创建完成后,不要直接去设备上改代码测试。下载软件MQTTX,破平台。用在UOS上没问题。
MQTTX添加了一个连接和几个参数。第一步是设备信息可用。
点击后可以直接订阅一个话题,其实相当于一个消息通道。客户端订阅后,服务器发送消息,客户端会收到。
服务器的主题可以在产品的主题类列中看到。已经有很多现成的题目了,也可以自定义题目。我只想通过服务器获取esp8266上报的温度、气压、电压等信息,客户端不需要订阅。但是在这里,为了让8266推送的json消息格式,我选择以下属性设置订阅一个。
订阅后在设备的调试界面,对产品定义的几个属性做设置,这时候MQTTX应该能收到服务器下发的topic信息,这样就能得到报文的json格式,属性的标识符见产品的功能定义,这里面还可以对产品属性做修改。比如标识符,数据类型,取值范围,布进。除了里面默认有的,还可以自定义功能。
3.设备端代码
设备商代码主要就是:
mqtt客户端创建-》mqtt连接-》mqtt publish(包含温度气压等)-》mqtt:close
3.1 mqtt 客户端创建及连接到服务器
function mqtt_connect()
m = mqtt.Client(mqtt_client_id,30,mqtt_user,mqtt_password)
print(mqtt_client_id)
-- resolv ali iot host ip
sk = net.createConnection(net.TCP, 0)
net.dns.setdnsserver("114.114.114.114", 0)
net.dns.resolve(mqtt_host_dns, function(sk, ip) mqtt_host=ip end)
print("resolved mqtt_host:"..mqtt_host.."n")
sk = nil
print("begin connect mqtt,mqtt_host:"..mqtt_host.."!")
m:connect(mqtt_host, mqtt_port, false,function(m) mqtt_connected = true print("mqtt online") end,
function(m,reason) print("fail with:"..reason) end)
end
3.2 mqtt publish
if count%2 == 0 then
if mqtt_connected then
print("mqtt publish")
-- publish to ali iot server
humi_ali=string.format("%.1f",humi)
temp_ali=string.format("%.1f",temp)
press_ali=string.format("%.1f",press)
voltage_ali=string.format("%.2f",Voltage)
mqttstr="{"method":"thing.service.property.set","id":"1540317865","params":{"CurrentHumidity":"..humi_ali..","CurrentTemperature":"..temp_ali..","Atmosphere":"..press_ali..","WiFiRSSI":"..rssi..","CurrentVoltage":"..voltage_ali..
"},"version":"1.0.0"}"
print("str is:"..mqttstr)
m:publish(mqtt_topic,mqttstr,0,0)
data_send = true
m:close()
elseif send_mqtt then
mqtt_connect()
m:on("offline", function(c)
print("mqtt offline, try connect to "..mqtt_host..":"..mqtt_port)
mqtt_connected = false
end)
end
send_data()
end
这个里面send_data()主要发送的APRS数据,写这一段是纠结的不行,BG6CQ老师原来的代码写了发送aprs mqtt http三类,想删吧又怕搞乱了,不删吧这些逻辑看起来头晕,凑合用吧。
主要就是mqttstr的连接,然后发送完关闭mqtt连接,这个Lua里面的回调函数(函数执行成功后可以将返回的数
据用来做新写的函数参数并在函数执行成功后执行)真是不习惯啊。比如:
sk = net.createConnection(net.TCP, 0)
net.dns.setdnsserver("114.114.114.114", 0)
net.dns.resolve(mqtt_host_dns,
--下面2行就是net.dns.resolve这个函数的回调函数,function(sk, ip) 是函数头,
-- 就一个语句mqtt_host=ip 然后加上 end表示这个回调函数结束,end后面的)是net.dns.resolve这个函数的括号
function(sk, ip)
mqtt_host=ip end)
半吊子改程序就是慢啊,上传后在esp8266上调试也费时间。
调试成功后,上阿里云管理界面可以选调试,能实时收到客户端传上来的报文。
最后在设备的物模型数据里面可以看到我们产品里面定义的属性,值就是我们ESP8266报上来的数据
据说数据可以用微信小程序查看。接下来,就结束了。至于在设备端订阅话题,目前还没想到需要esp8266控制,暂时不做了。为了方便使用,可以订阅topic,通过mqtt更新代码等。反正官方给你定义了这么多话题。
本文章来源于互联网,如有侵权,请联系删除!
在工业4.0和智能制造的时代浪潮下,设备制造商和工厂都在向着数字化转型。利用物联网技术,通过工业PLC进行数据采集和控制,将PLC连接到工业智能网关上,从而实现设备的远程监控和维护,快速及时解决各种故障,节省人工调试的差旅和时间成本。 物通博联PLC远程控制解…