鸿蒙硬件HI3861-MQTT

鸿蒙硬件HI3861-MQTT

鸿蒙其他教程请看https://blog.csdn.net/qq_33259323/category_10520249.html

在使用MQTT前,请看我上一篇文章:鸿蒙硬件HI3861-连接WIFI

https://blog.csdn.net/qq_33259323/article/details/109511005

需要连接WIFI成功之后才能使用MQTT

参考文档:https://bbs.elecfans.com/jishu_2004598_1_1.html

1.移植MQTT

移植前请确保你的项目是编译成功的

点击这个链接下载移植好的PahoMqtt(不要积分免费):链接:https://pan.baidu.com/s/1ohH-kCYjiIOa-PkOxzuyEQ 提取码:gddy 

点击这个链接下载移植好的PahoMqtt(不要积分免费):https://download.csdn.net/download/qq_33259323/13092141,然后把pahomqtt文件夹放到third_party目录下面

打开vendor\hisi\hi3861\hi3861\BUILD.gn 文件,在lite_component("sdk") 中增加      "//third_party/pahomqtt:pahomqtt_static"

之后就编译一下看看是否成功

2.编写测试代码

BUILD.gn

扫描二维码关注公众号,回复: 12453353 查看本文章
static_library("mqtt_test_at") {
    sources = [
        "mqtt_test.c",
        "at_entry.c"
    ]

    include_dirs = [
        "//utils/native/lite/include",
        "//kernel/liteos_m/components/cmsis/2.0",
        "//base/iot_hardware/interfaces/kits/wifiiot_lite",
        "//vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include",
        "//foundation/communication/interfaces/kits/wifi_lite/wifiservice",
        "//third_party/pahomqtt/MQTTPacket/src",
        "//third_party/pahomqtt/MQTTPacket/samples",
        "//vendor/hisi/hi3861/hi3861/components/at/src"
    ]
}

mqtt_test.c

#include <stdio.h>

#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"

#include <unistd.h>
#include "hi_wifi_api.h"
//#include "wifi_sta.h"
#include "lwip/ip_addr.h"
#include "lwip/netifapi.h"

#include "lwip/sockets.h"

#include "MQTTPacket.h"
#include "transport.h"

int mqtt_rc = 0;
int mqtt_sock = 0;
int mqtt_len = 0;
unsigned char mqtt_buf[200];
int mqtt_buflen = sizeof(mqtt_buf);
int mqtt_req_qos = 0;
int mqtt_msgid = 1;
int toStop = 0;
MQTTString topicString = MQTTString_initializer;

void mqtt_exit(void){
	transport_close(mqtt_sock);
	mqtt_rc = mqtt_rc;
	printf("[MQTT] ERROR EXIT\n");
}

void mqtt_task(void){
	while (!toStop){
		char* payload = "hello HarmonyOS 1122321321";
		int payloadlen = strlen(payload);

		if (MQTTPacket_read(mqtt_buf, mqtt_buflen, transport_getdata) == PUBLISH){
			unsigned char dup;
			int qos;
			unsigned char retained;
			unsigned short msgid;
			int payloadlen_in;
			unsigned char* payload_in;
			int rc;
			MQTTString receivedTopic;
			rc = MQTTDeserialize_publish(&dup, &qos, &retained, &msgid, &receivedTopic,
					&payload_in, &payloadlen_in, mqtt_buf, mqtt_buflen);								// 发送数据
			printf("message arrived %.*s\n", payloadlen_in, payload_in);

            mqtt_rc = rc;
        }

		printf("publishing reading\n");
		mqtt_len = MQTTSerialize_publish(mqtt_buf, mqtt_buflen, 0, 0, 0, 0, topicString, (unsigned char*)payload, payloadlen);
        mqtt_rc = transport_sendPacketBuffer(mqtt_sock, mqtt_buf, mqtt_len);

		osDelay(1000);
	}
}

int mqtt_subscribe(char * topic){	// MQTT订阅
	/* subscribe */
	topicString.cstring = topic;
	mqtt_len = MQTTSerialize_subscribe(mqtt_buf, mqtt_buflen, 0, mqtt_msgid, 1, &topicString, &mqtt_req_qos);	// MQTT订阅
	mqtt_rc = transport_sendPacketBuffer(mqtt_sock, mqtt_buf, mqtt_len);									// 传输发送缓冲区
	if (MQTTPacket_read(mqtt_buf, mqtt_buflen, transport_getdata) == SUBACK) 	/* wait for suback */	// 等待订阅返回
	{
		unsigned short submsgid;
		int subcount;
		int granted_qos;

		mqtt_rc = MQTTDeserialize_suback(&submsgid, 1, &subcount, &granted_qos, mqtt_buf, mqtt_buflen);
		if (granted_qos != 0){
			printf("granted qos != 0, %d\n", granted_qos);
			mqtt_exit();
			return 0;
		}

		return 1;
	}else{
		mqtt_exit();
		return 0;
	}
}

int mqtt_init(void){		// MQTT初始化开始连接
	MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
	char *host = "106.13.62.194";		// 地址
	int port = 1883;					// 端口

	
	mqtt_sock = transport_open(host, port);
	if(mqtt_sock < 0){
		return mqtt_sock;
	}

	data.clientID.cstring = "me";			// ClientID
	data.keepAliveInterval = 20;
	data.cleansession = 1;
	data.username.cstring = "testuser";		// 用户名
	data.password.cstring = "testpassword";	// 密码

	printf("[MQTT]Sending to hostname %s port %d\n", host, port);

	mqtt_len = MQTTSerialize_connect(mqtt_buf, mqtt_buflen, &data);		// 开始连接
	mqtt_rc = transport_sendPacketBuffer(mqtt_sock, mqtt_buf, mqtt_len);		// 发送缓冲区

	if (MQTTPacket_read(mqtt_buf, mqtt_buflen, transport_getdata) == CONNACK){	// 等待链接返回
		unsigned char sessionPresent, connack_rc;

		if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, mqtt_buf, mqtt_buflen) != 1 || connack_rc != 0){
			printf("Unable to connect, return code %d\n", connack_rc);
			mqtt_exit();
			return 0;
		}
	}else{
		mqtt_exit();
		return 0;
	}

	return 1;
}


void mqtt_test(void){
	printf("[MQTT]Start MQTT\r\n");
    if(mqtt_init() == 1){
		printf("[MQTT]MQTT Connect\r\n");
		mqtt_subscribe("substopic");		//设置订阅
		mqtt_task();
	}
}

mqtt_test.h

#ifndef __MQTT_TEST_H__
#define __MQTT_TEST_H__

void mqtt_test(void);

#endif /* __MQTT_TEST_H__ */

3.开始测试

只要在主函数中调用mqtt_test.c中的mqtt_test()函数就可以开始测试了

如果有什么问题可以来B站问我

https://space.bilibili.com/309103931

 

猜你喜欢

转载自blog.csdn.net/qq_33259323/article/details/109530970