luat+emqx+golang物联网系统的数据传输实现

       很多朋友在学习或则工作的时候都是专研某个领域;很多时候,写后端服务的攻城狮们(加班狗)只关心后端数据,前端妹妹们只管做界面,这造成硬件工程师经常抱怨服务器来的数据量太大,他们处理不完(嘿嘿 后端开发们以为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

解压:。。。。。。。。。。。

luat+emqx+golang物联网系统的数据传输实现_第1张图片

进入bin文件夹   emqx console  启动 ( 如图)。

luat+emqx+golang物联网系统的数据传输实现_第2张图片

 

 

代理服务器就这么容易安装好了。

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)
}

运行上述代码 ,可以 看到自己订阅主题了

luat+emqx+golang物联网系统的数据传输实现_第3张图片

好了 数据采集传输部份已实现,关于上传数据的存储和处理,以及对用户提供交互界面等工作就该是web前后端们的工作了。

你可能感兴趣的:(luat+emqx+golang物联网系统的数据传输实现)