BC26连接阿里云,MQTT协议,AT流程和STM32代码实现

阿里云平台操作

  首先我们要知道BC26连接阿里云是连接阿里云上的某个设备,因此首先需要在阿里云上创建相应的设备。注册阿里云后,打开如下网址链接: 阿里云. 可以使用支付宝登录。登录后进入如下页面:

在这里插入图片描述
  首先需要知道产品和设备的关系,他们是包含关系,比如一个智能家居产品里面包含了多个智能设备。因此需要先创建产品,然后再在产品下创建设备(产品只有一个,设备可以多个)。
在这里插入图片描述
  弹出新建产品页面,填入产品信息:
在这里插入图片描述
  接下来创建设备,并添加到刚才创建的产品中:
在这里插入图片描述
在这里插入图片描述
  查看此设备的三元素,后面使用BC26连接时会用到。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  三元素是:产品密匙(ProductKey)、设备名称(DeviceName)、设备密码(DeviceSecret)。

  注:三元素要替换成你自己设备的,本文中的三元素已经使用不了了。

使用BC26通过AT连接到阿里云

①确认IP地址分配正常

  命令为:

AT+CGPADDR=1

  正常回应为:

+CGPADDR: 1,100.103.51.110

OK

  如果BC26获得了IP地址说明卡和网络肯定没有问题,其他的就不用查询了。如果查询不到模块的IP,可以使用AT+CPIN?查询一下卡是否连接正常,确认模块是否检测到卡。卡一定要使用移动的物联网卡,使用电信卡只能连接电信的云平台。
  使用AT+CSQ查询一下信号强度。

②设置阿里云设备信息

  查询BC26的MQTT手册得知,命令如下:

AT+QMTCFG="aliauth",<TCP_connectID>[,<product_key>,<device_name>,<device_secret>]

  TCP_connectID是MQTT Socket 标识符,范围:0~5。我们这里取0即可。再把前面在阿里云上创建的设备的三元素带入,命令如下:

AT+QMTCFG=ALIAUTH,0,"a1FMz7jnArW","BC26_1","5d3679a63306a03fbf001adb528795e6"

  正常回应为:

OK

③连接阿里云服务器端

  查询BC26的MQTT手册得知,命令如下:

AT+QMTOPEN=<TCP_connectID>,<host_name>,<port>

  TCP_connectID上面取值为0。阿里云的MQTT服务器地址为iot-as-mqtt.cn-shanghai.aliyuncs.com,端口为1883,因此命令如下:

AT+QMTOPEN=0,"iot-as-mqtt.cn-shanghai.aliyuncs.com",1883

  正常回应为:

OK

+QMTOPEN: 0,0

  命令返回含义:

+QMTOPEN: <TCP_connectID>,<result>

<result> 整型。命令执行结果。
-1 打开网络失败
0 打开网络成功

  本命令发出后,要在几秒内执行下面④命令,否则会返回:

+QMTSTAT: 0,1

  含义为连接被服务器断开。此时重新执行本步即可。

④对接阿里云物联网平台创建的设备

  查询BC26的MQTT手册得知,命令如下:

AT+QMTCONN=<TCP_connectID>,<clientID>[,<username>[,<password>]]

  clientID取值设备名称(DeviceName),后面的中括号中的内容可以忽略,于是命令为:

AT+QMTCONN=0,"BC26_1"

  正常回应为:

OK

+QMTCONN: 0,0,0

  命令返回含义:

+QMTCONN: <TCP_connectID>,<result>[,<ret_code>]

<result> 整型。命令执行结果。
0 数据包发送成功且从服务器接收到 ACK
1 数据包重传
2 数据包发送失败
<ret_code> 整型。连接返回码。
0 接受连接
1 拒绝连接:不支持的协议版本
2 拒绝连接:拒绝标识符
3 拒绝连接:服务器不可用
4 拒绝连接:用户名或密码错误
5 拒绝连接:未授权

  此时可以看到阿里云上设备已在线:
在这里插入图片描述

⑤设备的topics订阅

  查询BC26的MQTT手册得知,命令如下:

AT+QMTSUB=<TCP_connectID>,<msgID>,<topic1>,<qos1>[,<topic2>,<qos2>]

<msgID> 整型。数据包的消息标识符。范围: 1~65535<topic> 字符串类型。客户端想要订阅或者退订的主题。最大长度: 255 字节。
<qos> 整型。客户端打算发布消息的 QoS 等级。
0 最多发送一次
1 至少发送一次
2 只发送一次

  我们这里订阅topic为/a1FMz7jnArW/BC26_1/user/get的信息(/product_key/device_name/user/get),具体的topic定义可以去看这里,QoS 等级选择0,因此命令为:

AT+QMTSUB=0,1,"/a1FMz7jnArW/BC26_1/user/get",0

  正常回应为:

OK

+QMTSUB: 0,1,0,1

  命令返回含义:

+QMTSUB: <TCP_connectID>,<msgID>,<result>[,<value>]

<msgID> 整型。数据包的消息标识符。范围: 1~65535<result> 整型。命令执行结果。
0 数据包发送成功且从服务器接收到 ACK
1 数据包重传
2 数据包发送失败
<value><result>=0,则为已确认 QoS 等级的矢量;参数取值 128 表示服务器拒绝订阅;
若<result>=1,则表示数据包重传次数;
若<result>=2,则不显示。

  此时可以在阿里云上看到此设备订阅的Topic:
在这里插入图片描述

⑥发布消息

  查询BC26的MQTT手册得知,命令如下:

AT+QMTPUB=<TCP_connectID>,<msgID>,<qos>,<retain>,<topic>,<msg>

<msgID> 整型。数据包的消息标识符。 范围: 0~65535。只有当<qos>=0 时,该参数值为 0<qos> 整型。客户端想要发布消息的 QoS 等级。
0 最多发送一次
1 最少发送一次
2 只发送一次
<retain> 整型。消息发送到当前订阅者后,服务器是否保存该消息。
0 消息发送到当前订阅者后,服务器不保存消息。
1 消息发送到当前订阅者后,服务器保存消息。
<topic> 字符串类型。待发布主题。 最大长度: 255 字节。
<msg> 字符串类型。待发布消息。 最大长度: 700 字节; 若是在数据模式,最大长度: 1024字节。

  Topic的定义去看这里,msg的内容要符合Alink JSON数据格式,要因此命令为:

AT+QMTPUB=0,1,1,0,"/sys/a1FMz7jnArW/BC26_1/thing/event/property/post","{params:{LightVolt:13.24}}"

  正常回应为:

OK

+QMTPUB: 0,1,0

  命令返回含义:

+QMTPUB: <TCP_connectID>,<msgID>,<result>[,<value>]

<msgID> 整型。数据包的消息标识符。 范围: 0~65535。只有当<qos>=0 时,该参数值为 0<result> 整型。命令执行结果。
0 数据包发送成功且从服务器接收 ACK(当<qos>=0 时,发布的消息无需 ACK1 数据包重传
2 数据包发送失败
<value><result>=1,则表示数据包重传次数;
若<result>=02,则不显示。

  此时可以在阿里云上看到发布上去的消息:
在这里插入图片描述

⑦设备从服务器断开

  查询BC26的MQTT手册得知,命令如下:

AT+QMTDISC=<TCP_connectID>

  因此命令为:

AT+QMTDISC=0

  正常回应为:

OK

+QMTDISC: 0,0

  命令返回含义:

+QMTDISC: <TCP_connectID>,<result>

<TCP_connectID> 整型。 MQTT Socket 标识符。范围: 0~5<result> 整型。命令执行结果。
-1 断开连接失败
0 断开连接成功

  此时可以看到阿里云上设备已离线:
在这里插入图片描述

⑧关闭设备网络

  查询BC26的MQTT手册得知,命令如下:

AT+QMTCLOSE=<TCP_connectID>

  因此命令为:

AT+QMTCLOSE=0

  正常回应为:

OK

+QMTCLOSE: 0,0

  命令返回含义:

+QMTCLOSE: <TCP_connectID>,<result>

<TCP_connectID> 整型。 MQTT Socket 标识符。范围: 0~5<result> 整型。命令执行结果。
-1 关闭网络失败
0 关闭网络成功

  此命令和⑦好像只能执行一个,执行了一个再执行另一个,就会返回error。

在STM32单片机上实现

  工程链接AT命令的流程和上面一样,两个主要的函数如下,就是发送AT指令,然后检查接收的模块回应数据对不对。

void  AT_Init(void)
{
    int i;

	Clear_Buffer();
    printf("AT\r\n");
    delay_ms(500);
    printf("AT\r\n");
    delay_ms(500);
    strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK
    while(strx==NULL)
    {
        Clear_Buffer();
        printf("AT\r\n");
        delay_ms(500);
        strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK
    }
    printf("ATE0\r\n"); //关闭回显
    delay_ms(500);
    Clear_Buffer();
    printf("AT+CSQ\r\n"); //检查CSQ
    delay_ms(500);
    /
    printf("AT+CPIN?\r\n");//检查SIM卡是否在位
    delay_ms(500);
    strx=strstr((const char*)RxBuffer,(const char*)"+CPIN: READY");//查看是否返回ready
    while(strx==NULL)
    {
        Clear_Buffer();
        printf("AT+CPIN?\r\n");
        delay_ms(500);
        strx=strstr((const char*)RxBuffer,(const char*)"+CPIN: READY");//检查SIM卡是否在位,等待卡在位,如果卡识别不到,剩余的工作就没法做了
    }
    Clear_Buffer();
    ///
    printf("AT+QMTCLOSE=0\r\n");//断开MQTT连接
    delay_ms(500);
}


void  MQTT_Init(void)
{
	Clear_Buffer();
    printf("AT+CGPADDR=1\r\n");//查看是否获取到IP
    delay_ms(500);
    strx=strstr((const char*)RxBuffer,(const char*)"+CGPADDR:");
    while(strx==NULL)
    {
        Clear_Buffer();
        printf("AT+CGPADDR=1\r\n");
        delay_ms(500);
        strx=strstr((const char*)RxBuffer,(const char*)"+CGPADDR:");
    }
    Clear_Buffer();	
    printf("AT+QMTCFG=ALIAUTH,0,\"a1FMz7jnArW\",\"BC26_1\",\"5d3679a63306a03fbf001adb528795e6\"\r\n");//设置阿里云设备信息
    delay_ms(500);
    strx=strstr((const char*)RxBuffer,(const char*)"OK");
    while(strx==NULL)
    {
        strx=strstr((const char*)RxBuffer,(const char*)"OK");
    }
    Clear_Buffer();	
    printf("AT+QMTOPEN=0,\"iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883\r\n");  //连接阿里云服务器端
    delay_ms(500);
    strx=strstr((const char*)RxBuffer,(const char*)"+QMTOPEN: 0,0");
    while(strx==NULL)
    {
		delay_ms(500);
        strx=strstr((const char*)RxBuffer,(const char*)"+QMTOPEN: 0,0");
    }
    Clear_Buffer();
    printf("AT+QMTCONN=0,\"BC26_1\"\r\n");//对接阿里云物联网平台创建的设备
    delay_ms(500);
    strx=strstr((const char*)RxBuffer,(const char*)"+QMTCONN: 0,0,0");//看下返回状态
    while(strx==NULL)
    {
        strx=strstr((const char*)RxBuffer,(const char*)"+QMTCONN: 0,0,0");//看下返回状态
    }
    Clear_Buffer();
    printf("AT+QMTSUB=0,1,\"/a1FMz7jnArW/BC26_1/user/get\",0\r\n");//订阅个主题
    delay_ms(500);
    strx=strstr((const char*)RxBuffer,(const char*)"+QMTSUB: 0,1,0");//订阅成功
    while(strx==NULL)
    {
        strx=strstr((const char*)RxBuffer,(const char*)"+QMTSUB: 0,1,0");//订阅成功
    }
    Clear_Buffer();
    printf("AT+QMTPUB=0,1,1,0,\"/sys/a1FMz7jnArW/BC26_1/thing/event/property/post\",\"{params:{LightVolt:13.24}}\"\r\n");//发布消息
    delay_ms(500);
    strx=strstr((const char*)RxBuffer,(const char*)"+QMTPUB: 0,1,0");//发布成功
    while(strx==NULL)
    {
        strx=strstr((const char*)RxBuffer,(const char*)"+QMTPUB: 0,1,0");//发布成功
    }
    Clear_Buffer();	
}
### 回答1: 4G模块连接阿里云MQTT协议接入和发送数据涉及以下几个步骤: 1. 初始化4G模块: 首先需要初始化4G模块,包括配置串口通信参数和连接4G网络,确保能够正常访问网络。 2. 配置MQTT连接参数: 使用4G模块提供的AT指令设置MQTT协议连接参数,包括阿里云的服务器地址、端口号、设备ID和设备密钥等信息。可以通过命令行或者编程语言的方式发送AT指令进行配置。 3. 连接阿里云MQTT服务器: 使用4G模块的AT指令建立与阿里云MQTT服务器的连接,可以通过发送CONNECT指令完成连接建立,根据返回结果判断是否连接成功。 4. 发布数据: 连接建立成功后,可以通过4G模块的AT指令发送MQTT PUBLISH消息。首先需要构建MQTT消息体,包括消息主题、消息内容和消息质量等信息。使用AT指令发送PUBLISH指令,将消息体发送到阿里云MQTT服务器。 5. 订阅数据: 同样使用4G模块的AT指令订阅阿里云MQTT服务器上的消息。构建订阅消息的主题,使用AT指令发送SUBSCRIBE指令进行订阅。当服务器有消息发布到订阅主题时,4G模块会接收到消息,可以通过AT指令进行处理。 需要注意的是,上述步骤中的具体AT指令和参数配置根据不同的4G模块厂商和阿里云MQTT协议的版本有所差异。建议查阅具体设备和协议的相关文档,以获取正确的AT指令和参数配置。 以上是使用4G模块连接阿里云MQTT协议接入和发送数据的源码的简要描述,具体代码实现和细节问题可以参考相关文档和资料,根据实际需求进行开发。 ### 回答2: 要实现4G模块连接阿里云MQTT协议接入和发送数据的源码,需要进行以下步骤: 1. 引入相关库:首先需要引入4G模块和MQTT协议相关的库。根据具体的4G模块型号和开发板,可以选择相应的库进行引入。 2. 初始化网络连接:使用4G模块的相关函数,初始化网络连接并获取SIM卡信息。确保SIM卡正常连接网络。 3. 连接阿里云MQTT服务器:使用MQTT库提供的函数,通过阿里云提供的MQTT服务器地址和端口号,建立与服务器的连接。 4. 配置连接参数:设置MQTT连接的一些参数,例如客户端ID、用户名、密码等。这些信息可以在阿里云IoT平台上进行配置和获取。 5. 设置回调函数:在连接成功的回调函数中,编写接收和处理服务器返回数据的代码。可以根据具体需求来解析和处理接收到的数据。 6. 订阅主题:使用MQTT库提供的函数,订阅需要接收的主题。根据实际情况,可以订阅多个主题。 7. 定时发送数据:使用4G模块的相关函数,获取需要发送的数据,并使用MQTT库提供的函数将数据发布到指定的主题。 8. 处理断开连接:在断开连接的回调函数中,编写相应的代码来处理断开连接的情况,例如重新连接或者进行相关提示。 以上是实现4G模块连接阿里云MQTT协议接入和发送数据的源码的基本步骤。具体的源码实现可以参考相关的4G模块和MQTT协议的开发文档,以及阿里云IoT平台上提供的相关示例代码。 ### 回答3: 连接阿里云MQTT协议接入并发送数据需要使用4G模块。以下是示例源码: 1. 导入所需的库文件 ```c #include <HttpClient.h> #include <EasyIOT.h> #include <MQTTClient.h> ``` 2. 设置阿里云MQTT服务器相关参数 ```c const char* server = "<mqtt_server>"; const char* clientId = "<mqtt_client_id>"; const char* username = "<mqtt_username>"; const char* password = "<mqtt_password>"; const int port = 1883; ``` 3. 设置4G模块网络连接参数 ```c const char* apn = "<apn>"; const char* gprsUser = "<gprs_user>"; const char* gprsPass = "<gprs_password>"; ``` 4. 创建MQTT客户端对象并设置回调函数 ```c WiFiClient wifiClient; MQTTClient mqttClient; void handleMqttMessage(String topic, String payload) { // 处理接收到的MQTT消息 } void setup() { // 初始化4G模块 EasyIOT.begin(apn, gprsUser, gprsPass); // 连接WiFi EasyIOT.connectWiFi(); // 设置MQTT服务器参数 mqttClient.begin(server, port, wifiClient); // 设置MQTT回调函数 mqttClient.onMessage(handleMqttMessage); // 连接阿里云MQTT服务器 mqttClient.connect(clientId, username, password); } void loop() { // MQTT客户端保持连接 mqttClient.loop(); // 发送数据到MQTT服务器 String data = "<data_to_send>"; mqttClient.publish("<mqtt_topic>", data); // 延时一段时间 delay(1000); } ``` 以上是一个简单的示例代码,基于Arduino平台,使用了HttpClient、EasyIOT和MQTTClient等库。你需要根据自己的实际情况修改其中的参数。这段代码可以实现4G模块连接阿里云MQTT协议接入并发送数据的功能。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【ql君】qlexcel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值