很多朋友在学习或则工作的时候都是专研某个领域;很多时候,写后端服务的攻城狮们(加班狗)只关心后端数据,前端妹妹们只管做界面,这造成硬件工程师经常抱怨服务器来的数据量太大,他们处理不完(嘿嘿 后端开发们以为mcu是 x86--至强);后端开发又吐槽硬件来的数据格式不标准(你们为何不是json);当然术业有专攻,每一个开发人员所做的工作都是值得肯定的。面对物联联网这种需要多种技术配合使用的架构时很多人会懵(尤其是搞硬件开发的对后端逻辑十分陌生)。下边是一个物联网系统的简单实现。
luat:
luat是一款带有常用外设(io,uart,iic,spi)的(2g/4g)通信模组其使用lua脚本开发,内部自己带有mqtt协议(不知道的自行百度或谷歌,此协议优点多多,最舒服的是不会粘包),为了方便我们就别自己用at指令移植mqtt了,假如你使用的设备没有这些协议比如说stm32,arm-linux开发板,你需要移植了;mqtt源码:https://github.com/eclipse/paho.mqtt.c 下边是luat连接emqx代理服务器的代码:(不会lua请移步http://www.runoob.com/lua/lua-tutorial.html)
这是我用官方的一个样例:
https://github.com/123zxl/luat-go
部份代码如下;
--- 模块功能:MQTT客户端处理框架
-- @author openLuat
-- @module mqtt.mqttTask
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.28
module(...,package.seeall)
require"misc"
require"mqtt"
require"mqttOutMsg"
require"mqttInMsg"
local ready = false
--- MQTT连接是否处于激活状态
-- @return 激活状态返回true,非激活状态返回false
-- @usage mqttTask.isReady()
function isReady()
return ready
end
local function print(...)
_G.print("test",...)
end
--启动MQTT客户端任务
sys.taskInit(
function()
local retryConnectCnt = 0
while true do
if not socket.isReady() then
retryConnectCnt = 0
--等待网络环境准备就绪,超时时间是5分钟
sys.waitUntil("IP_READY_IND",300000)
end
if socket.isReady() then
local imei = misc.getImei()
--创建一个MQTT客户端
local mqttClient = mqtt.client(imei,600,"user","password")
--阻塞执行MQTT CONNECT动作,直至成功
--如果使用ssl连接,打开mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"}),根据自己的需求配置
--mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"})
-----------------------------------------------------------------
--请自己添ip ,端口,接入方式
if mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp") then
-----------------------------------------------------------------------
retryConnectCnt = 0
ready = true
--订阅主题
if mqttClient:subscribe({["go-mqtt/sample"]=0, ["go-mqtt/sample"]=1}) then
--循环处理接收和发送的数据
while true do
if not mqttInMsg.proc(mqttClient) then log.error("mqttTask.mqttInMsg.proc error") break end
if not mqttOutMsg.proc(mqttClient) then break end
end
end
ready = false
else
retryConnectCnt = retryConnectCnt+1
end
--断开MQTT连接
mqttClient:disconnect()
if retryConnectCnt>=5 then link.shut() retryConnectCnt=0 end
sys.wait(5000)
else
--进入飞行模式,20秒之后,退出飞行模式
net.switchFly(true)
sys.wait(20000)
net.switchFly(false)
end
end
end
)
emqx:
emqx是我用过的开源mqtt带服务器中最好的它的安装也很简单具体流程看:http://docs.emqtt.cn/zh_CN/latest/install.html 我本人是比较推崇docker安装的,这样方便项目搬迁,部署。以下是我在win10 上使用:
下载:http://emqtt.com/downloads
解压:。。。。。。。。。。。
进入bin文件夹 emqx console 启动 ( 如图)。
代理服务器就这么容易安装好了。
golang(java/Py/c#php 皆可):
golang是门非常容易上手的语言,性能也超级棒(哈哈 我不会其它后端开发语言),我才用它来写后端。golang环境安装就不在这里多说了。我们要使用golang 来订阅和发布mqtt的主题,所以需要mqtt客服端包 :
go get github.com/eclipse/paho.mqtt.golang
由于部分盆友还不会科学上网(fan qiang)会报错 解决方法:https://blog.csdn.net/sudaobo/article/details/72827930
下边是转载于:https://studygolang.com/articles/14452
package main
import (
"fmt"
"time"
"github.com/eclipse/paho.mqtt.golang"
)
//订阅回调函数;收到消息后会执行它
var f mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
fmt.Printf("TOPIC: %s\n", msg.Topic())
fmt.Printf("MSG: %s\n", msg.Payload())
}
func main() {
//此处我是以ws方式接入的,请添你自己代理服务器的公网ip ,这里只是举例
opts := mqtt.NewClientOptions().AddBroker("ws://127.0.0.1:8083/mqtt")
opts.SetClientID("gotrivial")
opts.SetKeepAlive(2 * time.Second)
opts.SetDefaultPublishHandler(f)
opts.SetPingTimeout(1 * time.Second)
opts.SetCleanSession(false)
c := mqtt.NewClient(opts)
if token := c.Connect(); token.Wait() && token.Error() != nil {
panic(token.Error())
}
//订阅
if token := c.Subscribe("go-mqtt/sample", 2, nil); token.Wait() && token.Error() != nil {
fmt.Println(token.Error())
}
time.Sleep(1 * time.Second)
//发布
if token := c.Publish("go-mqtt/sample", 2, false,"博主的第一篇博客"); token.Wait() && token.Error() != nil {
fmt.Println(token.Error())
}
//取消订阅
if token := c.Unsubscribe("go-mqtt/sample"); token.Wait() && token.Error() != nil {
fmt.Println(token.Error())
}
//关闭链接
c.Disconnect(250)
time.Sleep(20 * time.Second)
}
运行上述代码 ,可以 看到自己订阅主题了
好了 数据采集传输部份已实现,关于上传数据的存储和处理,以及对用户提供交互界面等工作就该是web前后端们的工作了。