esp32通过NBIoT模块连入MQTT服务器

这篇具有很好参考价值的文章主要介绍了esp32通过NBIoT模块连入MQTT服务器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


title: esp32通过NBIoT模块连入MQTT服务器
keywords: nbiot,esp32,c++,python,mqtt
tags: [esp32,c++,python,mqtt,nbiot]
categories: [嵌入式,前后端]


esp32通过NBIoT模块连入MQTT服务器

先简单介绍一下

MQTT

(Message Queuing Telemetry Transport),是一种轻量级、开放的发布-订阅式通信协议。它适用于物联网、移动应用和其他带有低带宽或不稳定网络的场景。MQTT遵循“生产者/消费者”模型,其中生产者是发送消息的客户端(称为发布者),而消费者是接收消息的客户端(称为订阅者)。MQTT基于TCP/IP协议栈,它具有简单、可扩展、低开销等特点,且支持多种安全验证机制。

通过这个方式以便于我们管理大量单片机

NB-IoT介绍

NB-IoT 和 AT 指令
NB-IoT(Narrowband Internet of Things)是一种基于蜂窝网络的低功耗广域网(LPWAN)技术,旨在连接各种设备到互联网,特别适合于需要低数据传输率、长电池寿命和远程连接的应用。AT指令是用于控制和配置调制解调器的指令集。在NB-IoT设备中,AT指令用于与模块进行通信,执行操作如连接网络、发送和接收数据等。

搭建一个基于Django的NB-IoT云平台样例涉及到几个步骤:创建Django项目、定义模型来存储从NB-IoT设备接收到的数据、创建视图和URL来处理数据的接收,以及编写相应的NB-IoT设备端代码来发送数据。

从零开始搭建MQTT服务器(python Django)

Linux下安装好Mosquitto与python管理插件

步骤1:安装paho-mqtt

首先,你需要安装paho-mqtt库。可以通过pip安装:

pip install paho-mqtt

步骤2:创建MQTT客户端订阅者

import paho.mqtt.client as mqtt

MQTT_SERVER = "localhost"

MQTT_PATH = "test_channel"

当连接到服务器时的回调函数

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc)) #或可收到字典处理
    client.subscribe(MQTT_PATH)

当从服务器接收到消息时的回调函数

def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect(MQTT_SERVER, 1883, 60)

保持连接,直到收到消息

client.loop_forever()

步骤3:创建MQTT客户端发布者测试

import paho.mqtt.publish as publish

MQTT_SERVER = "localhost"
MQTT_PATH = "test_channel"

publish.single(MQTT_PATH, "{"LED_SW":1}", hostname=MQTT_SERVER)

MQTT服务器配置(使用Mosquitto)
如果你没有MQTT服务器,你可以安装并使用Mosquitto。Mosquitto是一个流行的开源MQTT代理。

安装Mosquitto

在Ubuntu上:

sudo apt-get update
sudo apt-get install mosquitto
sudo apt-get install mosquitto-clients

配置路由

在MQTT的上下文中,“配置路由”通常指的是设置主题(topics)和相关的消息传递逻辑。这通常在客户端进行设置,而不是在MQTT服务器本身上配置。MQTT主题是由斜杠(/)分隔的字符串,客户端可以订阅这些主题,以接收发布到这些主题的消息。例如,如果你有一个关于温度的主题,可以命名为home/living_room/temperature,客户端可以订阅这个主题来获取客厅的温度更新。

通过上面的步骤,你可以创建Python脚本来发布和订阅MQTT消息,从而实现基于MQTT的通信。这可以用于各种应用,例如物联网(IoT)项目、远程传感器数据收集、消息发布/订阅系统等。

对于MQTT协议,默认情况下,它使用TCP协议作为底层的传输层协议。因此,当你在学习配置MQTT服务时,确实需要在你的服务器的安全组(或称作防火墙规则)中开放MQTT所使用的TCP端口。对于MQTT,有两个主要的端口需要考虑:

默认端口:1883是MQTT协议的标准非加密通信端口。
加密通信端口:8883是用于通过TLS/SSL进行加密通信的端口

esp32串口适配NBIoT收发

确定好模块没问题

// NB-IOT激活上网AT指令集
String ATcommands[] =
    {
        {"AT+NRB"}, // 模块重启
        {"AT"},
        // {"AT+CPIN?"},     //SIM卡检测
        {"AT+CGSN=1"},  // 查询模组编号
        {"AT+CIMI"},    // 查询国际移动设备身份码
        {"AT+NCCID"},   // 获取NB卡的唯一编码
        {"AT+CGATT=1"}, // 模块连接到基站/模组入网
        {"AT+CSQ"},     // 获取信号强度
        {"AT+CEREG=1"}, // 模组网络注册
        {"AT+CEREG?"},  // 查询模组网络连接状态
        {"AT+CGATT?"}   // 查询模块是否连接到基站
};

通过以上指令确定好模块没问题

连接到服务器

AT+QMTOPEN=0,"你的IP",你的端口
AT+QMTCONN=0,"clientid","mqttusername","mqttpwd"

完成以上两步你就发现你的服务器已经激活了

接下来就是适配的过程(路由,json一系列内容)

主题

以我的举例

//设置mqtt主题topic
    const char* transdatatopic = "v1/devices/me/telemetry";  //	网关/直连设备遥测
    const char* serverpubtopic = "v1/devices/me/rpc/request/+"; //服务端命令下发到设备端

代码示范

代码示范来自学长学姐 感谢学长学姐文章来源地址https://www.toymoban.com/news/detail-854819.html

	const char* mqttServer_ip = "xxxxxxxx";     //ip地址
    const char* mqttServer_Port = "xxxxxx";              //  MQTT 端口号

    //设置mqtt设备名和访问密码
    const char* deviceid = "0";                   //设备唯一标识号
    const char* clientid = "titochan's esp32";    //本设备的名称
    const char* mqttusername = "xxxx";            //使用mqtt协议连接云平台时所用的用户名
    const char* mqttpwd = "xxxx";                 //使用mqtt协议连接云平台时所用的密码

    //云平台的mqtt产品名称、设备名称、设备属性
    const char* productname = "titoTest";
    const char* devicename = "titoTest";

    //设置mqtt主题topic
    const char* transdatatopic = "v1/devices/me/telemetry";  //	网关/直连设备遥测
    const char* serverpubtopic = "v1/devices/me/rpc/request/+"; //服务端命令下发到设备端

void setup() {
  //初始化Serial和SerialL610
  Serial.begin(9600);
  SerialNB.begin(9600, SERIAL_8N1, PIN_NB_RX,PIN_NB_TX);

  NB_Attach(1);  //发送AT指令使L610联网
  #ifdef MQTT
    MqttConnect(mqttusername,mqttpwd,clientid,mqttServer_ip,mqttServer_Port,"0","60");  //建立Mqtt连接

    NB_MQTTSub(1,serverpubtopic,0);  //订阅主题
  #endif
}
void loop() {
  #ifdef MQTT // 如果建立MQTT连接,则使用MQTT形式的jsonpayload形式上报数据
  // 读取数据
  bool ledsw=readLedSw();
  // 将数据整理成json格式
  String jsonpayload = "{\"LED_SW";
  jsonpayload = jsonpayload + "\":";
  jsonpayload = jsonpayload + ledsw;
  jsonpayload = jsonpayload + "}";
  NB_MQTTPub(msgID, transdatatopic, 0, 0, jsonpayload);
#endif
}
/*函数名称: MqttConnect
*说明: 通过NB-IoT与云平台建立MQTT连接
*参数: devide_id: 设备唯一标识号  user_name: 云平台对应设备的用户名	 password:云平台对应设备的密钥 ClientIDStr: 云平台对应设备的client_id 
mqttServer_ip:待连接的云平台ip地址  mqttServer_Port:待连接的云平台mqtt协议端口号
CleansessionFlag:遗嘱标志位(0:保留所有订阅主题,1:清楚所有订阅主题) Qos: 服务质量等级(0-2,部分平台不支持QoS 等级 2) Keepalive_Time:心跳保活时间
*返回值:无
*/
void MqttConnect(const char* user_name,const char* password,const char* ClientIDStr, const char* mqttServer_ip,const char* mqttServer_Port,const char* CleansessionFlag ,const char* Keepalive_Time )
{
  // //设置本设备的数据格式、心跳保活时间、断开后是否保留信息设置
  String cmd;
  // cmd = cmd + "AT+QMTCFG=\"dataformat\",1,0,0";  //数据格式设置,send_format和recv_format:可选值0(文本格式)、1(十六进制格式)
  // SendCmdToNB_IoT(cmd,"OK");
  // cmd = "";
  // cmd = cmd + "AT+QMTCFG=\"keepalive\",1,";
  // cmd = cmd + Keepalive_Time;
  // SendCmdToNB_IoT(cmd,"OK");
  // cmd = "";
  // cmd = cmd + "AT+QMTCFG=\"session\",1,";
  // cmd = cmd + CleansessionFlag;
  // SendCmdToNB_IoT(cmd,"OK");

  //再建立mqtt连接
  cmd = "";
  cmd = cmd + "AT+QMTOPEN=0,\"";
  cmd = cmd + mqttServer_ip;
  cmd = cmd + "\",";
  cmd = cmd + mqttServer_Port;
  // SendCmdToNB_IoT(cmd,"+QMTOPEN: 0,0");
  SendCmdToNB_IoT(cmd,"+QMTOPEN: 0,0");

  //最后进行鉴权连接绑定云平台设备
  cmd = "";
  cmd = cmd + "AT+QMTCONN=0,\"";
  cmd = cmd + ClientIDStr;
  cmd = cmd + "\",\"";
  cmd = cmd + user_name;
  cmd = cmd + "\",\"";
  cmd = cmd + password;
  cmd = cmd + "\"";
  SendCmdToNB_IoT(cmd,"+QMTCONN: 0,0,0");

}
/*函数名称: SendCmdToNB_IoT
*说明: esp32向NB-IoT模组发送指令
*参数: data: 要发送的指令  res:期望NB-IoT模组返回的消息
*返回值:无
*/
void SendCmdToNB_IoT(String data,const char* res)
{
  Serial.println(data);
  SerialNB.println(data);  //向SerialNB串口发送数据
  if (data.indexOf("+QMTPUB")){
    char end = (char)0x1A;
    SerialNB.print(end);  //"CTRL+Z"发送数据
  }
  delay(200);
  int i = 0;
  rpy = "";
  while(SerialNB.available())
  {
    rpy=SerialNB.readString();  //读取SerialNB串口缓存数组内的数据保存到rpy中
    //xx指令接收处理程序
    int LED_SWIndex = rpy.indexOf("LED_SW");
    if (LED_SWIndex != -1) {
      String LED_SWValueString = rpy.substring(LED_SWIndex + 7,rpy.indexOf("}"));
      if(LED_SWValueString.toInt()){   //接收到xx启动指令
        digitalWrite(LED_SW, HIGH); //给模拟xx输出高电平,启动
      }else{
        digitalWrite(LED_SW, LOW); //给模拟xx输出高电平,启动
      }
    }

    if(rpy.indexOf(res)>=0)  //在rpy中查找是否存在与res相同的内容,若找到,则返回字符串所在的位置
    {
      Serial.println(rpy);    //打印获取到的回复信息
      break;
    }
    else
    {
      Serial.println("error");
      SerialNB.println(data);
      if (data.indexOf("+QMTPUB")){
        char end = (char)0x1A;
        SerialNB.print(end);  //"CTRL+Z"发送数据
      }
    }
    delay(100);
    i++;
    if(i>5)
      break;
  }
}
/*函数名称: NB_MQTTSub
*说明: 订阅某个主题的消息内容
*参数: msgID: 消息标识符,范围:1-65535  topic: 待订阅的主题	 Qos: 服务质量等级(0-2,部分平台不支持QoS 等级 2)
*返回值:无
*/
void NB_MQTTSub(const int msgID, const char* topic,const int QoS)
{
  String cmd;
  cmd="";
  cmd = cmd + "AT+QMTSUB=0,";
  cmd = cmd + (char)(msgID+'0');
  cmd = cmd + ",\"";
  cmd = cmd + topic;
  cmd = cmd + "\",";
  cmd = cmd + (char)(QoS+'0');
  SendCmdToNB_IoT(cmd,"+QMTSUB: 0,1,0,0");

}

到了这里,关于esp32通过NBIoT模块连入MQTT服务器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 零基础STM32+ESP12F+MQTT连接阿里云服务器完整流程(三、STM32通过代码连接阿里云服务器)

    要想实现通过代码实现STM32连入阿里云服务器,要首先实现使用AT指令通过串口连接阿里云,大家可以参考我之前的两篇文章,链接如下 链接: 零基础STM32+ESP12F+MQTT连接阿里云服务器完整流程(一、给ESP12F烧写AT/MQTT固件) 链接: 零基础STM32+ESP12F+MQTT连接阿里云服务器完整流程(

    2024年02月03日
    浏览(72)
  • 从零开始用Nodejs搭建一个MQTT服务器,并且用stm32通过esp8266进行消息订阅和发布

    最近在做一个物联网项目,需要用到服务器进行数据的存储和数据的请求和发送,之前我用过onenet平台上的http服务,虽然能通过get和post请求进行数据的提交和发送,但是平台上的数据发生改变却不能主动推送给esp8266,与我此次的项目不符合,所以pass。然后我了解了下mqtt协

    2024年02月04日
    浏览(52)
  • esp8266模块--MQTT协议连接服务器实现数据接收和发送+源码

    首先推荐中国移动的代码,我觉得中国移动的代码更为合理:(但是有一些其他的模块在里面) OneNET开发板代码、资料--2020-09-27--标准板、Mini板bug修复 - 开发板专区 - OneNET设备云论坛 (10086.cn) 以及这位b站up做的视频:(wifi模块在p9节) 【挽救小白第一季】STM32+8266+小程序智能

    2024年02月08日
    浏览(63)
  • 基于ESP32搭建物联网服务器十二(使用MQTT协议与ESP32互动)

    在之前的文章中:基于ESP32搭建物联网服务器十一(用WEB页面控制引脚(GPIO)功能)_esp32webserver 控制io_你的幻境的博客-CSDN博客 已经简单地介绍了MQTT协议,对比于其它网络协议,MQTT协议在物联网的开发中,它的特点使它适用于大多数受限的环境。例如网络代价昂贵,带宽低、不可

    2024年02月02日
    浏览(50)
  • 【STM32 x ESP8266】连接阿里云 MQTT 服务器(报文连接)

    具体如何在阿里云创建一个 MQTT 服务器我就不写出来了,可以去百度一下(主要是我忘了,不好演示)。 有关 MQTT 报文的一些标识在我前面的 一篇文章 中讲过,感兴趣的可以去看看( 有关代码部分讲解的内容也在那里 ,这里就不细讲了,主要讲如何连接的) 插一嘴,如果

    2024年02月06日
    浏览(57)
  • STM32 + ESP32(AT固件 MQTT协议) + MQTTX(桌面终端) + (EMQX消息服务器)

    翻出老物件,搭建一个简单的 IOT 开发环境,也算是废物利用了 ,接下来加传感器。 1. STM32  采集数据:      RTOS。      资源相对比较丰富,可以根据项目需求定制。 2. ESP32  网络传输(AT固件 MQTT协议) :     AT:封装好的接口,扩展性不是那么好,业务简单的话将就可以

    2024年02月08日
    浏览(77)
  • ESP32的MQTT AT固件烧录+STM32以ESP32的MQTT AT固件的AT指令连接EMQX下mqtt服务器实现消息订阅和发布

    目录 写在前面 三种方案(利用ESP32连接EMQX下的MQTT) 步骤 ESP32烧录固件并AT指令进行测试。 下载固件  烧录工具下载 烧录固件(选择ESP32)  关于AT 指令与MQTT服务器断开后自动重连MQTT服务器 关于AT指令设置上电自动连接WIFI 关于AT指令设置断开后自动重新连接WIFI STM32对接E

    2023年04月12日
    浏览(49)
  • STM32F103C8T6+ESP-01S+MQTT服务器实现数据上传和接收(一)

    文章目录 STM32F103C8T6+ESP-01S+MQTT服务器实现数据的上传和接收(二) ESP-01S推荐使用安信可官网1471号固件,烧录配置如下图。 请替换其中里面的内容 使用PA9、PA10分别连接ESP8266的RXD、TXD引脚。 由于每次发送的AT指令都会被8266通过串口再发送回来,为了缓解串口的压力,并且更

    2024年04月17日
    浏览(51)
  • 基于 ESP32 通过 SMTP 服务器 来发送电子邮件信息

    电子邮件在全球范围内被用作数字通信的重要组成部分。电子邮件主要用于官方通信目的,因为它最方便、成本效益高、保存记录、覆盖全球且环保。电子邮件是一种非常快捷的通信方式,只是您需要稳定的互联网连接。 在这个项目中,我们将使用ESP32开发板发送电子邮件(

    2024年02月07日
    浏览(86)
  • 基于esp32-cam模块的监控,并自动拍照保存置服务器

    推荐esp教程网站:esp教程网站 ,纯英文,需魔法上网。         Arduino官网:Software | Arduino         建议下载1.8.x版本,不推荐下载2.x版本,1.8.x版本可以使用插件,但是2.x版本有代码补充。         点击后,会弹出两个网页,都选择 JUST DOWNLOAD 。 ​         安装

    2024年04月16日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包