OneNET是中国移动打造的物联网开放平台,支持多种协议接入,比如MQTT、HTTP、CAP等,可实现智能硬件的快速接入,并且有许多开箱即用的功能,比如设备管理、数据存储、场景联动、OTA等,简化了物联网项目开发工作,根据平台指引把设备接入就行,无需开发复杂服务器后台,对学习和实际项目都有很大用处。

下面图是我截取自官网的,我们看一下这个图,可以认为是一个完整的物联网项目框图,分为三个部分:

左边是终端设备,比如ESP32S3,通过协议接入到OneNet平台。

中间是OneNet平台提供的服务,大家看到OneNet平台提供很多功能,如果我们要投入人力开发并落地的话,是要不少的工作量。

第三部分最右边这些是我们大项目应用的数据,比如智慧城市、智慧交通等,都通过API取自观念平台。现在我们注重设备端开发。

MQTT协议接入首先使用connect报文发起连接,connect报文有三个内容需要填充,分别是client ID、username和password。

client ID两种方式,方式一要填的内容比较多,一般针对蜂窝网设备接入。

我们选方式2,只填一个device name

password是经过key计算的token,算法比较复杂,这里不作过多介绍,其算法在官方提供的SDK包中有。实际应用中可以直接用官方提供的Token生成工具生成。

连接ONENET平台示例代码:

esp_err_t wifi_mqtt_init(void)
{
    // WiFi
    fast_wifi_init();
    static char token[256];

    dev_token_generate(token, SIG_METHOD_SHA256, 2074859482, OneNET_PRODUCT_ID, OneNET_DEVICE_ID, OneNET_PRODUCT_KEY);

    ESP_LOGI(TAG, "onemqtt token=%s", token);
    // MQTT
    esp_mqtt_client_config_t mqtt_cfg = {
        .broker.address.uri = broker_uri,
        .broker.address.port = 1883,
        // 可选:.credentials.username / .password / .client_id 等
        .credentials = {
            .username = OneNET_PRODUCT_ID,
            .client_id = OneNET_DEVICE_ID,   // 可选,建议加
        },
        .credentials.authentication = {           // ← 关键:密码在这里
            .password = "version=2018-10-31&res=products%2FODN1dfWSV9%2Fdevices%2FESP32S301&et=2074859482&method=sha256&sign=5gLcxCLfP4Ry2uGu7OLUXRyhWfU8lDsyt2k0z1V0aFY%3D",
        },
    };

    mqtt_client = esp_mqtt_client_init(&mqtt_cfg);
    if (mqtt_client == NULL) {
        ESP_LOGE(TAG, "MQTT 初始化失败");
        return ESP_FAIL;
    }
    // 注册 MQTT 事件回调

    ESP_ERROR_CHECK(esp_mqtt_client_register_event(mqtt_client,
                                                    ESP_EVENT_ANY_ID,
                                                    mqtt_event_handler,
                                                    NULL));
    // 启动 MQTT 客户端(开始连接 Broker)
    ESP_ERROR_CHECK(esp_mqtt_client_start(mqtt_client));

    ESP_LOGI(TAG, "WiFi + MQTT 初始化完成");
    return ESP_OK;
}

初次连接时,连接失败,报错bad username or password

最后发现是跟的教程的博主的token算法出错了,用官方提供的token生成工具生成token后成功连入。

PC端也遇到类似问题,这次原因是client.id没有设置成device_name

PC端成功连接后有数据没成功上报地问题,经查找发现是上报数据中有的没在平台设置,被平台拒绝了。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐