首页 > 其他分享 >【星闪技术】WS63E模块连接华为IoT云

【星闪技术】WS63E模块连接华为IoT云

时间:2024-10-22 08:50:20浏览次数:3  
标签:test1 MQTTClient STA IoT WS63E topic MQTT 星闪 message

目录

引言

WS63E对MQTT的支持

程序修改

测试结果

结语


 

引言

在上一篇博文中已经介绍了WiFi的使用。今天介绍一下如何使用MQTT协议连接到华为云上。

WS63E对MQTT的支持

WS63E的代码参考直接提供了MQTT的支持,文档介绍见docs/board/WS63V100 MQTT 开发指南.pdf。MQTT 基于开源组件paho.mqtt.c-1.3.12 实现,详细说明请参考官方说明: https://www.eclipse.org/paho/files/mqttdoc/MQTTClient/html/index.html

在网上也找到一位网友的MQTT例子,值得大家参考:GitHub - chenyunbovo/nearlink_ws63_demo: 用于展示WS63的使用示例

程序修改

华为云平台的设置可以参考我以前的博文:MQTTX连接华为云IoTDA_华为iot mqtt-CSDN博客。在云平台方面,我们仍然使用的是以前配置过的温湿度计。

我在前面的WiFi实例基础上进行修改。主要增加了以下内容:

#include "MQTTClient.h" 
#include "MQTTClientPersistence.h" 
#include "osal_debug.h" 
#include "MQTTClient.h" 
#include "los_memory.h" 
#include "los_task.h" 
 
#define QOS 0 
#define TIMEOUT 10000L 
#define KEEPALIVEINTERVAL 20 
#define CLEANSESSION 1 

#define USE_SSL 0

#define ADDRESS "tcp://xxxx.iotda-device.cn-north-4.myhuaweicloud.com:1883"
#define USERNAME    "xxxxxxx_test1"
#define PASSWORD    "xxxxxxxxxxxxxxx"
#define CLIENTID    "xxxxxxx_test1_0_0_2024102012"


static MQTTClient client;
void publish(MQTTClient client, char *topic, char *payload) ;



static td_u8 g_wifi_state = WIFI_STA_SAMPLE_INIT;

// Define the on_message callback function to print the content of the messages received by the subscribed topic
static int on_message(void *context, char *topicName, int topicLen, MQTTClient_message *message) 
{
    UNUSED(context);
    UNUSED(topicLen);
    char *payload = message->payload;
    printf("Received `%s` from `%s` topic \n", payload, topicName);
    MQTTClient_freeMessage(&message);
    MQTTClient_free(topicName);
    return 1;
}

int mqtt_init(void) 
{
    int rc;
    MQTTResponse ret;
    MQTTClient_init_options ops;
    ops.do_openssl_init = 0;
    MQTTClient_global_init(&ops);
    MQTTClient_createOptions create_opts = { {'M', 'Q', 'C', 'O'}, 0, MQTTVERSION_5 };

    rc = MQTTClient_createWithOptions(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_DEFAULT, NULL, &create_opts);
    if (rc != MQTTCLIENT_SUCCESS) {
        printf("Failed to create mqtt client, return code %d\n", rc);
        return -1;
    }
    // 设置MQTT消息接受回调函数
    MQTTClient_setCallbacks(client, NULL, NULL, on_message, NULL);
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer5;
    conn_opts.username = USERNAME;
    conn_opts.password = PASSWORD;
    MQTTProperties props = MQTTProperties_initializer;
    MQTTProperties willProps = MQTTProperties_initializer;

    
    ret = MQTTClient_connect5(client, &conn_opts, &props, &willProps);
    if (ret.reasonCode == MQTTREASONCODE_SUCCESS) {
        printf("Connected to MQTT Broker!\n");
    } else {
        printf("failed to connect to MQTT Broker, return code %d\n", (int8_t)ret.reasonCode);
        MQTTResponse_free(ret);
        return -1;
    }
    MQTTResponse_free(ret);

    char msg[500];

    sprintf_s(msg, 499, "{ \
                \"services\": [  \
                    {  \
                        \"serviceId\": \"温湿度\",  \
                        \"properties\": {  \
                            \"温度\": %d,  \
                            \"湿度\": %d  \
                        }  \
                    }  \
                ]  \
            }", 12, 76);

    for (int i = 0; i < 5; i++) {
        publish(client, "$oc/devices/XXXX_test1/sys/properties/report", 
            msg);
        (void)osDelay(1000);
    }
    MQTTResponse_free(ret);    

    return 0;
}

void publish(MQTTClient client, char *topic, char *payload) 
{
    MQTTClient_message message = MQTTClient_message_initializer;
    message.payload = payload;
    message.payloadlen = strlen(payload);
    message.qos = QOS;
    message.retained = 0;
    MQTTClient_deliveryToken token;
    MQTTClient_publishMessage5(client, topic, &message, &token);
    MQTTClient_waitForCompletion(client, token, TIMEOUT);
    printf("Send `%s` to topic `%s` \n", payload, topic);
}

td_s32 example_sta_function(td_void)
{
    td_char ifname[WIFI_IFNAME_MAX_SIZE + 1] = "wlan0"; /* 创建的STA接口名 */
    wifi_sta_config_stru expected_bss = {0}; /* 连接请求信息 */
    struct netif *netif_p = TD_NULL;
    td_u32 wait_count = 0;

    /* 创建STA接口 */
    if (wifi_sta_enable() != 0) {
        return -1;
    }
    PRINT("%s::STA enable succ.\r\n", WIFI_STA_SAMPLE_LOG);

    do {
        (void)osDelay(1); /* 1: 等待10ms后判断状态 */
        if (g_wifi_state == WIFI_STA_SAMPLE_INIT) {
…………
        } else if (g_wifi_state == WIFI_STA_SAMPLE_GET_IP) {
            if (example_check_dhcp_status(netif_p, &wait_count) == 0) {
                mqtt_init();
                break;
            }
            wait_count++;
        }
    } while (1);

    return 0;
}

我在WiFi连上路由器并获得IP后启动了MQTT客户端。客户端连接到华为IoT云,然后定时发布了温湿度信息。绝大多数内容在前面的博文中都已经介绍了,这里就不再赘述了。 

测试结果

程序烧写之后,登录华为云的控制台,就可以看到上传的温湿度信息。

90afa92c29c54f68b58d865121f48d66.png

 设备侧的部分日志如下:

+NOTICE:CONNECTED
drv_soc_ioctl ioctl_cmd->cmd=6.
Srv:548:recive event = 2
APP|[WIFI_STA_SAMPLE]::Connect succ!.
APP|[WIFI_STA_SAMPLE]::DHCP start.
xo update temp:4,diff:0,xo:0x3083c
APP|[WIFI_STA_SAMPLE]::STA DHCP success.
Connecting to serverURI bde4cbe7aa.st1.iotda-device.cn-north-4.myhuaweicloud.com:1883 with MQTT ver
                                                                                                   New socket 0 for bde4cbe7aa.st1.iotda-device.cn-north-4.myhuaweicloud.com:1883, port 1883
                                                                         0 66991e97a559ef622669048e_test1_0_0_2024102012 -> CONNECT version 5 clean: 0 (0)
                                       Posting connack semaphore for client 66991e97a559ef622669048e_test1_0_0_2024102012
      0 66991e97a559ef622669048e_test1_0_0_2024102012 <- CONNACK rc: 0
                                                                      Connected to MQTT Broker!
                                                                                               0 66991e97a559ef622669048e_test1_0_0_2024102012 -> PUBLISH rc: 0
                                            Send `{                 "services": [                      {                          "serviceId": "温湿度",                          "properties": {                              "温度": 12,                              "湿度": 76                          }                      }                  ]              }` to topic `$oc/devices/66991e97a559ef622669048e_test1/sys/properties/report`
                                                                                           APP|[SYS INFO] mem: used:138600, free:223804; log: drop/all[0/0], at_recv 0.
0 66991e97a559ef622669048e_test1_0_0_2024102012 -> PUBLISH rc: 0
                                                                Send `{                 "services": [                      {                          "serviceId": "温湿度",                          "properties": {                              "温度": 12,                              "湿度": 76                          }                      }                  ]              }` to topic `$oc/devices/66991e97a559ef622669048e_test1/sys/properties/report`
                                                                                                               APP|[SYS INFO] mem: used:138600, free:223804; log: drop/all[0/0], at_recv 0.
0 66991e97a559ef622669048e_test1_0_0_2024102012 -> PUBLISH rc: 0
                                                                Send `{                 "services": [                      {                          "serviceId": "温湿度",                          "properties": {                              "温度": 12,                              "湿度": 76                          }                      }                  ]              }` to topic `$oc/devices/66991e97a559ef622669048e_test1/sys/properties/report`
                                                                                                               APP|[SYS INFO] mem: used:138600, free:223804; log: drop/all[0/0], at_recv 0.
0 66991e97a559ef622669048e_test1_0_0_2024102012 -> PUBLISH rc: 0
                                                                Send `{                 "services": [                      {                          "serviceId": "温湿度",                          "properties": {                              "温度": 12,                              "湿度": 76                          }                      }                  ]              }` to topic `$oc/devices/66991e97a559ef622669048e_test1/sys/properties/report`
                                                                                                               APP|[SYS INFO] mem: used:138600, free:223804; log: drop/all[0/0], at_recv 0.

结语

WS63E在WiFi和MQTT的编程和OpenHarmony差不多,所以遇到的问题并不多。WS63E采用的是CMake系统,比OpenHarmony的GN要更熟悉一些。但是它也有个问题,就是有时候稍微修改一下C语言文件,即使不涉及头文件的修改,系统也会从头编译700多个文件,时间偏长,估计是系统在计算文件依赖方面有一些问题。 

 

标签:test1,MQTTClient,STA,IoT,WS63E,topic,MQTT,星闪,message
From: https://blog.csdn.net/bit_mike/article/details/143099884

相关文章

  • 告别繁琐的云平台开发!IoT_CLOUD之【百度云】
    ​众所周知,市面上有很多云平台,阿里云、腾讯云、中移OneNET、华为云、百度云、涂鸦云、Tlink云等等......并且每家云平台都有自己的协议,工程师要移植不同的SDK代码或基于各家的手册文档对接不同的协议,看着都头大!!!为解决繁琐的云平台开发困扰,合宙IoT_CLOUD应运而生,一库打通所有云平......
  • 告别繁琐的云平台开发!IoT_CLOUD之【百度云】
    ​众所周知,市面上有很多云平台,阿里云、腾讯云、中移OneNET、华为云、百度云、涂鸦云、Tlink云等等......并且每家云平台都有自己的协议,工程师要移植不同的SDK代码或基于各家的手册文档对接不同的协议,看着都头大!!!为解决繁琐的云平台开发困扰,合宙IoT_CLOUD应运而生,一库打通所有云平......
  • IoT平台软件:Google Cloud IoT二次开发_JavaSDK使用指南
    JavaSDK使用指南1.环境准备在开始使用GoogleCloudIoT的JavaSDK之前,需要确保您的开发环境已经配置好相关的依赖和工具。以下是环境准备的步骤:1.1安装Java确保您的系统中安装了最新版本的Java开发工具包(JDK)。您可以通过以下命令检查Java版本:java-vers......
  • IoT平台软件:Google Cloud IoT二次开发_Node.jsSDK使用指南
    Node.jsSDK使用指南在本节中,我们将详细介绍如何使用GoogleCloudIoTNode.jsSDK进行二次开发。GoogleCloudIoT提供了丰富的API和SDK,使得开发者可以轻松地与IoT设备进行交互,实现设备管理、数据传输、消息处理等功能。Node.jsSDK是其中一种常用的开发工具,特......
  • IoT平台软件:Google Cloud IoT二次开发_PythonSDK使用指南
    PythonSDK使用指南1.安装GoogleCloudIoTPythonSDK在开始使用GoogleCloudIoTPythonSDK之前,需要先安装相关的依赖库。GoogleCloudIoTCore提供了官方的Python客户端库,这将帮助我们更方便地与GoogleCloudIoTCore进行交互。以下是安装步骤:1.1安装......
  • IoT平台软件:Google Cloud IoT二次开发_RESTfulAPI与gRPC
    RESTfulAPI与gRPCRESTfulAPI原理RESTfulAPI是一种基于HTTP协议的架构风格,用于构建分布式系统中的网络应用程序。它通过一组规则和约束来定义客户端和服务器之间的交互方式,使得系统更加简洁、可扩展和易于理解。RESTfulAPI的设计原则包括:无状态性:每个请求都必......
  • Android 音频采集/音频播放【AudioTrack、AudioRecord】
    项目中遇到需求,采集音频上传至公司编译的sdk内,播放sdk传递过来的音频,所以自行实现了一个采集音频与播放音频的方法代码:importandroid.Manifestimportandroid.app.Activityimportandroid.content.pm.PackageManagerimportandroid.media.AudioFormatimportandroid.me......
  • 通信工程学习:什么是AIOT智能物联网
    AIOT:智能物联网        AIOT智能物联网,即ArtificialIntelligenceofThings(人工智能物联网),是人工智能(AI)与物联网(IoT)技术的深度融合。这一技术通过物联网产生、收集来自不同维度的海量数据,并存储在云端或边缘端,随后利用大数据分析以及更高层次的人工智能技术,实现万物......
  • PatriotCTF2024 Web Impersonate
    源码:#!/usr/bin/envpython3fromflaskimportFlask,request,render_template,jsonify,abort,redirect,sessionimportuuidimportosfromdatetimeimportdatetime,timedeltaimporthashlibapp=Flask(__name__)server_start_time=datetime.now()server_s......
  • 【星闪开发连载】SLE_UUID_Server和SLE_UUID_Client程序测试
    引言前一篇博文介绍了SLE_UUID_Server和SLE_UUID_Client程序的基本结构,这篇介绍如何进行测试,从而实现两块星闪开发板之间的连接。服务器的构建在sdk根目录下(即src目录)打开集成终端台,执行python build.py-cws63-liteos-appmenuconfig命令,会出现选择弹窗。menuconfig这......