当前位置:   article > 正文

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

emqx 文件传输

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

部份代码如下;

  1. --- 模块功能:MQTT客户端处理框架
  2. -- @author openLuat
  3. -- @module mqtt.mqttTask
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2018.03.28
  7. module(...,package.seeall)
  8. require"misc"
  9. require"mqtt"
  10. require"mqttOutMsg"
  11. require"mqttInMsg"
  12. local ready = false
  13. --- MQTT连接是否处于激活状态
  14. -- @return 激活状态返回true,非激活状态返回false
  15. -- @usage mqttTask.isReady()
  16. function isReady()
  17. return ready
  18. end
  19. local function print(...)
  20. _G.print("test",...)
  21. end
  22. --启动MQTT客户端任务
  23. sys.taskInit(
  24. function()
  25. local retryConnectCnt = 0
  26. while true do
  27. if not socket.isReady() then
  28. retryConnectCnt = 0
  29. --等待网络环境准备就绪,超时时间是5分钟
  30. sys.waitUntil("IP_READY_IND",300000)
  31. end
  32. if socket.isReady() then
  33. local imei = misc.getImei()
  34. --创建一个MQTT客户端
  35. local mqttClient = mqtt.client(imei,600,"user","password")
  36. --阻塞执行MQTT CONNECT动作,直至成功
  37. --如果使用ssl连接,打开mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"}),根据自己的需求配置
  38. --mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"})
  39. -----------------------------------------------------------------
  40. --请自己添ip ,端口,接入方式
  41. if mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp") then
  42. -----------------------------------------------------------------------
  43. retryConnectCnt = 0
  44. ready = true
  45. --订阅主题
  46. if mqttClient:subscribe({["go-mqtt/sample"]=0, ["go-mqtt/sample"]=1}) then
  47. --循环处理接收和发送的数据
  48. while true do
  49. if not mqttInMsg.proc(mqttClient) then log.error("mqttTask.mqttInMsg.proc error") break end
  50. if not mqttOutMsg.proc(mqttClient) then break end
  51. end
  52. end
  53. ready = false
  54. else
  55. retryConnectCnt = retryConnectCnt+1
  56. end
  57. --断开MQTT连接
  58. mqttClient:disconnect()
  59. if retryConnectCnt>=5 then link.shut() retryConnectCnt=0 end
  60. sys.wait(5000)
  61. else
  62. --进入飞行模式,20秒之后,退出飞行模式
  63. net.switchFly(true)
  64. sys.wait(20000)
  65. net.switchFly(false)
  66. end
  67. end
  68. end
  69. )

 

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

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/eclipse/paho.mqtt.golang"
  6. )
  7. //订阅回调函数;收到消息后会执行它
  8. var f mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
  9. fmt.Printf("TOPIC: %s\n", msg.Topic())
  10. fmt.Printf("MSG: %s\n", msg.Payload())
  11. }
  12. func main() {
  13. //此处我是以ws方式接入的,请添你自己代理服务器的公网ip ,这里只是举例
  14. opts := mqtt.NewClientOptions().AddBroker("ws://127.0.0.1:8083/mqtt")
  15. opts.SetClientID("gotrivial")
  16. opts.SetKeepAlive(2 * time.Second)
  17. opts.SetDefaultPublishHandler(f)
  18. opts.SetPingTimeout(1 * time.Second)
  19. opts.SetCleanSession(false)
  20. c := mqtt.NewClient(opts)
  21. if token := c.Connect(); token.Wait() && token.Error() != nil {
  22. panic(token.Error())
  23. }
  24. //订阅
  25. if token := c.Subscribe("go-mqtt/sample", 2, nil); token.Wait() && token.Error() != nil {
  26. fmt.Println(token.Error())
  27. }
  28. time.Sleep(1 * time.Second)
  29. //发布
  30. if token := c.Publish("go-mqtt/sample", 2, false,"博主的第一篇博客"); token.Wait() && token.Error() != nil {
  31. fmt.Println(token.Error())
  32. }
  33. //取消订阅
  34. if token := c.Unsubscribe("go-mqtt/sample"); token.Wait() && token.Error() != nil {
  35. fmt.Println(token.Error())
  36. }
  37. //关闭链接
  38. c.Disconnect(250)
  39. time.Sleep(20 * time.Second)
  40. }

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/188553
推荐阅读
相关标签
  

闽ICP备14008679号