• 1. 简介

  • 2. 在Ubuntu20.04虚拟机安装mosquitto搭建Broker

  • 2.1 Ubuntu下mosquitto 安装

sudo apt-get install mosquitto
sudo apt-get install mosquitto-clients
sudo apt-get install mosquitto-dev1.2.3.1.2.3.1.2.3.1.2.3.1.2.3.

  • 2.2 安装完成后可以用以下指令查看状态

service mosquitto status1.1.1.1.1.

  • 3.1.2 将pahomqtt添加到hispark_pegasus编译

lite_component("sdk") {
  features = []

  deps = [
    "//build/lite/config/component/cJSON:cjson_static",
    "//device/hisilicon/hispark_pegasus/hi3861_adapter/kal",
    "//third_party/pahomqtt:pahomqtt_static",
  ]
}1.2.3.4.5.6.7.8.9.1.2.3.4.5.6.7.8.9.1.2.3.4.5.6.7.8.9.1.2.3.4.5.6.7.8.9.1.2.3.4.5.6.7.8.9.

  • 3.1.3 修改编译错误

[OHOS ERROR] riscv32-unknown-elf-ld: ohos/libs/libpahomqtt_static.a(libpahomqtt_static.MQTTLiteOS.o): in function `MutexInit':
[OHOS ERROR] MQTTLiteOS.c:(.text.MutexInit+0x0): multiple definition of `MutexInit'; ohos/libs/libdiscovery.a(libdiscovery.os_adapter.o):os_adapter.c:(.text.MutexInit+0x0): first defined here
[OHOS ERROR] riscv32-unknown-elf-ld: ohos/libs/libpahomqtt_static.a(libpahomqtt_static.MQTTLiteOS.o): in function `MutexLock':
[OHOS ERROR] MQTTLiteOS.c:(.text.MutexLock+0x0): multiple definition of `MutexLock'; ohos/libs/libdiscovery.a(libdiscovery.os_adapter.o):os_adapter.c:(.text.MutexLock+0x0): first defined here
[OHOS ERROR] riscv32-unknown-elf-ld: ohos/libs/libpahomqtt_static.a(libpahomqtt_static.MQTTLiteOS.o): in function `MutexUnlock':
[OHOS ERROR] MQTTLiteOS.c:(.text.MutexUnlock+0x0): multiple definition of `MutexUnlock'; ohos/libs/libdiscovery.a(libdiscovery.os_adapter.o):os_adapter.c:(.text.MutexUnlock+0x0): first defined here
[OHOS ERROR] scons: *** [output/bin/Hi3861_wifiiot_app.out] Error 1
[OHOS ERROR] BUILD FAILED!!!!
[OHOS ERROR] Failed building output/bin/Hi3861_wifiiot_app.out: Error 1
[OHOS ERROR] you can check build log in /home/soon/ohos300_iot/out/hispark_pegasus/wifiiot_hispark_pegasus/build.log
[OHOS ERROR] command: "/home/soon/ohostool_101/ninja/ninja -w dupbuild=warn -C /home/soon/ohos300_iot/out/hispark_pegasus/wifiiot_hispark_pegasus" failed
[OHOS ERROR] return code: 1
[OHOS ERROR] execution path: /home/soon/ohos300_iot
soon@soon-u20:~/ohos300_iot $ 

1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.1.2.3.4.5.6.7.8.9.10.11.12.13.14.1.2.3.4.5.6.7.8.9.10.11.12.13.14.1.2.3.4.5.6.7.8.9.10.11.12.13.14.1.2.3.4.5.6.7.8.9.10.11.12.13.14.

MutexInit(Mutex*);MutexLock(Mutex*);MutexUnlock(Mutex*);1.2.3.1.2.3.1.2.3.1.2.3.1.2.3.

MqttMutexInit(Mutex*);MqttMutexLock(Mutex*);MqttMutexUnlock(Mutex*);1.2.3.1.2.3.1.2.3.1.2.3.1.2.3.

  • 3.1.4 其他修改和修改后的代码

        "MQTTClient-C\src\liteOS",
        "//vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include",
        "//kernel/liteos_m/components/cmsis/2.0",1.2.3.1.2.3.1.2.3.1.2.3.1.2.3.

  • 3.2 MQTT控制小车代码的实现

  • 3.2.1 applications\sample\wifi-iot\app\car_mqtt\BUILD.gn 的修改

static_library("car_mqtt") {
    sources = [
        ......
    ]

    include_dirs = [
        ......    
        "//third_party/pahomqtt:pahomqtt_static",
        "//third_party/pahomqtt/MQTTPacket/src",
        "//third_party/pahomqtt/MQTTClient-C/src",
    ]}1.2.3.4.5.6.7.8.9.10.11.12.1.2.3.4.5.6.7.8.9.10.11.12.1.2.3.4.5.6.7.8.9.10.11.12.1.2.3.4.5.6.7.8.9.10.11.12.1.2.3.4.5.6.7.8.9.10.11.12.

  • 3.2.2 MQTT 初始化主题订阅

#include "MQTTClient.h"#define MQTT_BROKER                "192.168.123.230"//改成你的MQTT Broker 地址#define MQTT_PORT                  1883MQTTMessage ackmsg;int needAck = 0;struct opts_struct{
	char* clientid;
	int nodelimiter;
	char* delimiter;
	enum QoS qos;
	char* username;
	char* password;
	char* host;
	int port;
	int showtopics;} opts ={
	(char*)"stdout-subscriber", 0, (char*)"\n", QOS2, NULL, NULL, (char*)MQTT_BROKER, MQTT_PORT, 1};unsigned char buf[100];unsigned char readbuf[100];int car_mqtt(void){
	int rc = 0;
	
	MQTTMessage pubmsg;
	//小车控制主题carControl
	char* topic = "carControl";

	if (strchr(topic, '#') || strchr(topic, '+'))
		opts.showtopics = 1;
	if (opts.showtopics)
		printf("topic is %s\n", topic);

	Network n;
	MQTTClient c;
	//网络初始化
	NetworkInit(&n);
	NetworkConnect(&n, opts.host, opts.port);
	//设置MQTT缓存和启动MQTT线程
	MQTTClientInit(&c, &n, 1000, buf, 100, readbuf, 100);
	MQTTStartTask(&c);
	//设置MQTT相关参数
	MQTTPacket_connectData data = MQTTPacket_connectData_initializer;       
	data.willFlag = 0;
	data.MQTTVersion = 3;
	data.clientID.cstring = opts.clientid;
	data.username.cstring = opts.username;
	data.password.cstring = opts.password;

	data.keepAliveInterval = 10;
	data.cleansession = 1;
	printf("Connecting to %s %d\n", opts.host, opts.port);
	//连接到MQTT服务器
	rc = MQTTConnect(&c, &data);
	printf("Connected %d\n", rc);
    //订阅主题和接收消息
    printf("Subscribing to %s\n", topic);
	rc = MQTTSubscribe(&c, topic, opts.qos, messageArrived);
	printf("Subscribed %d\n", rc);
	//状态变化后发布主题carStatus,消息内容ackmsg.payload
	memset(&ackmsg, '\0', sizeof(ackmsg));
  	ackmsg.payload = (void*)"ACK";
  	ackmsg.payloadlen = strlen((char*)ackmsg.payload);
  	ackmsg.qos = QOS0;
  	ackmsg.retained = 0;
  	ackmsg.dup = 0;	

	while (1)
	{
		if(needAck == 1)//收到消息后,发送主题carStatus并携带状态消息
		{
			needAck = 0;
			printf("Publish carStatus ackmsg %d %s \n", (int)ackmsg.payloadlen, (char*)ackmsg.payload);	
			MQTTPublish(&c, "carStatus", &ackmsg);
		}
		sleep(1);	
	}
	
	printf("Stopping\n");

	MQTTDisconnect(&c);
	NetworkDisconnect(&n);

	return 0;}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.

  • 3.2.1 小车控制代码

void messageArrived(MessageData* md){

	MQTTMessage* message = md->message;

	memset(&ackmsg, '\0', sizeof(ackmsg));
  	ackmsg.qos = QOS0;
  	ackmsg.retained = 0;
  	ackmsg.dup = 0;

	if (opts.showtopics)
		printf("%.*s\t", md->topicName->lenstring.len, md->topicName->lenstring.data);
	if (opts.nodelimiter)
		printf("%.*s\n", (int)message->payloadlen, (char*)message->payload);
	else
		printf("%.*s%s\n", (int)message->payloadlen, (char*)message->payload, opts.delimiter);

    if(strncmp("forward", message->payload, 7)== 0) {
        needAck = 1;
        car_go_forward();
  	    ackmsg.payload = (void*)"forward";
    }
    if(strncmp("back", message->payload, 4) == 0) {
        needAck = 1;
        car_go_back();
  	    ackmsg.payload = (void*)"back";
    }
    if(strncmp("left", message->payload, 4) == 0) {
        needAck = 1;
        car_turn_left();
  	    ackmsg.payload = (void*)"left";
    }
    if(strncmp("right", message->payload, 5) == 0) {
        needAck = 1;
        car_turn_right();
  	    ackmsg.payload = (void*)"right";
    }
    if(strncmp("stop", message->payload, 4) == 0) {
        needAck = 1;
        car_stop();
  	    ackmsg.payload = (void*)"stop";
    }
    if(needAck == 1) {
  	    ackmsg.payloadlen = strlen((char*)ackmsg.payload);
    }}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.

  • 4.编译及测试

  • 4.1 小车控制代码的编译

  • 4.1.1 将car_mqtt解压或者git clone 到applications\sample\wifi-iot\app\路径下

  • 4.1.2 修改applications\sample\wifi-iot\app\BUILD.gn

import("//build/lite/config/component/lite_component.gni")lite_component("app") {
    features = [
        "car_mqtt",
    ]}1.2.3.4.5.6.7.1.2.3.4.5.6.7.1.2.3.4.5.6.7.1.2.3.4.5.6.7.1.2.3.4.5.6.7.

  • 4.1.3 修改WIFI SSID、密码及MQTT Broker IP

#define WIFI_SSID                  "SSIDABCD"//WIFI账号#define WIFI_PW                    "MIMA1234"//WIFI密码#define MQTT_BROKER                "192.168.123.230"//改成你的MQTT Broker 地址#define MQTT_PORT                  1883//改成你的MQTT Broker 端口,默认18831.2.3.4.1.2.3.4.1.2.3.4.1.2.3.4.1.2.3.4.

  • 4.1.4 开启PWM 功能,开启方式如下

 CONFIG_PWM_SUPPORT is not set1.1.1.1.1.

CONFIG_PWM_SUPPORT=y1.1.1.1.1.

  • 4.2 小车控制代码的测试

  • 4.2.1 从串口log查看

  • #开发板漂流计划#小车控制由简入繁之MQTT控制-鸿蒙HarmonyOS技术社区

  • 4.2.2 电脑Windows系统下paho软件发送测试指令