514 lines
21 KiB
C
514 lines
21 KiB
C
|
/*================================================================
|
||
|
Copyright (c) 2020 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
|
||
|
Quectel Wireless Solution Proprietary and Confidential.
|
||
|
=================================================================*/
|
||
|
/*=================================================================
|
||
|
|
||
|
EDIT HISTORY FOR MODULE
|
||
|
|
||
|
This section contains comments describing changes made to the module.
|
||
|
Notice that changes are listed in reverse chronological order.
|
||
|
|
||
|
WHEN WHO WHAT, WHERE, WHY
|
||
|
------------ ------- -------------------------------------------------------------------------------
|
||
|
|
||
|
=================================================================*/
|
||
|
|
||
|
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
#include "ql_api_osi.h"
|
||
|
#include "ql_api_nw.h"
|
||
|
|
||
|
#include "ql_log.h"
|
||
|
#include "ql_api_datacall.h"
|
||
|
#include "ql_mqttclient.h"
|
||
|
|
||
|
#include "ql_ssl.h"
|
||
|
|
||
|
#define QL_MQTT_LOG_LEVEL QL_LOG_LEVEL_INFO
|
||
|
#define QL_MQTT_LOG(msg, ...) QL_LOG(QL_MQTT_LOG_LEVEL, "ql_MQTT", msg, ##__VA_ARGS__)
|
||
|
#define QL_MQTT_LOG_PUSH(msg, ...) QL_LOG_PUSH("ql_MQTT", msg, ##__VA_ARGS__)
|
||
|
static ql_task_t mqtt_task = NULL;
|
||
|
|
||
|
#define MQTT_CLIENT_IDENTITY "quectel_01"
|
||
|
#define MQTT_CLIENT_USER ""
|
||
|
#define MQTT_CLIENT_PASS ""
|
||
|
|
||
|
|
||
|
#define MQTT_CLIENT_ONENET_PRODUCTID "417661"
|
||
|
#define MQTT_CLIENT_ONENET_ACCESSKEY "aggblpDBWoKg2CGdbxp/CVKt9xXWcV162hJ1+Bhzvw4="
|
||
|
#define MQTT_CLIENT_ONENET_DEVICENAME "test_led"
|
||
|
#define MQTT_CLIENT_ONENET_VERSION "2018-10-31"
|
||
|
|
||
|
#define USE_CRT_BUFFER 0
|
||
|
|
||
|
#define MQTT_CLIENT_QUECTEL_URL "mqtt://220.180.239.212:8306"
|
||
|
#define MQTT_CLIENT_ONENET_URL "mqtt://mqtts.heclouds.com:1883" //onenet 的ip地址
|
||
|
|
||
|
#if USE_CRT_BUFFER
|
||
|
#define MQTT_CLIENT_QUECTEL_SSL_URL "mqtts://112.31.84.164:8308"
|
||
|
#else
|
||
|
#define MQTT_CLIENT_QUECTEL_SSL_URL "mqtts://220.180.239.212:8307"
|
||
|
#endif
|
||
|
#define MQTT_CLIENT_ONENET_SSL_URL "mqtts://mqttstls.heclouds.com:8883"//onenet 的ip地址
|
||
|
|
||
|
// publist 的内容
|
||
|
#define MQTT_PUB_MSG0 "{\"id\": 000000,\"dp\": {\"temperatrue\": [{\"v\": 0.001,}],\"power\": [{\"v\": 0.001,}]}}"
|
||
|
#define MQTT_PUB_MSG1 "{\"id\": 111111,\"dp\": {\"temperatrue\": [{\"v\": 1.000,}],\"power\": [{\"v\": 1.001,}]}}"
|
||
|
#define MQTT_PUB_MSG2 "{\"id\": 222222,\"dp\": {\"temperatrue\": [{\"v\": 2.000,}],\"power\": [{\"v\": 2.002,}]}}"
|
||
|
|
||
|
static ql_sem_t mqtt_semp;
|
||
|
static int mqtt_connected = 0;
|
||
|
|
||
|
#if USE_CRT_BUFFER
|
||
|
char *root_ca_crt_buffer= "-----BEGIN CERTIFICATE-----\r\n\
|
||
|
MIIEhDCCAuwCCQDuE1BpeAeMwzANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMC\r\n\
|
||
|
Q04xCzAJBgNVBAgMAkFIMQswCQYDVQQHDAJIRjEQMA4GA1UECgwHUVVFQ1RFTDEL\r\n\
|
||
|
MAkGA1UECwwCU1QxFjAUBgNVBAMMDTExMi4zMS44NC4xNjQxIjAgBgkqhkiG9w0B\r\n\
|
||
|
CQEWE2VkZGllLnpoYW5nQHF1ZWN0ZWwwIBcNMjIwMTI1MDcyMzI3WhgPMjEyMjAx\r\n\
|
||
|
MDEwNzIzMjdaMIGCMQswCQYDVQQGEwJDTjELMAkGA1UECAwCQUgxCzAJBgNVBAcM\r\n\
|
||
|
AkhGMRAwDgYDVQQKDAdRVUVDVEVMMQswCQYDVQQLDAJTVDEWMBQGA1UEAwwNMTEy\r\n\
|
||
|
LjMxLjg0LjE2NDEiMCAGCSqGSIb3DQEJARYTZWRkaWUuemhhbmdAcXVlY3RlbDCC\r\n\
|
||
|
AaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAMt3cjY0eLEDqv8Y7FomA+7N\r\n\
|
||
|
G5ztAbR7+P/WxjPlodqRDZ5HQORkfAr44gAZcWsKoo4DHTInwr9JBbBnETBMnL8+\r\n\
|
||
|
13h1PRp5CfwXKFvjppWYvBZfeTwhWQYbSMKINoS+d1Zl11jg/+ZbSd7Fi0bYq8ip\r\n\
|
||
|
Hbt30H+NANQZP1XQdsCf5/kvn+vXiP4EgJc56JQ9L6ALIF2Q6F3G/PTaYItg463N\r\n\
|
||
|
lv/S+eRi1VMDSs8Qc+DTlVwlgZZJdSlC8Yjr5pVqoyXm8ENKfSTrdhrLiKSWJTz9\r\n\
|
||
|
JUr04E7SJ+CoBAnLYNPHR2y0CFS/15aCa1JbK27ZJ/0cvBvzpWdkcgrDtKIcxNYM\r\n\
|
||
|
9QFPpehb1N4pgqi0NPhCkc/BasfmXUaTwM4ghhi4tQRptKMdTN/kdyC+V5a8Hyhb\r\n\
|
||
|
Nvw5qeJlLJKpgZ9X3HQzuKstKMkxLNuDIzK9TvO7zLowr+0BetUdllq+fDjXQM0M\r\n\
|
||
|
+9P3Xv2VmDwGRkmZ0IjYpDjm+qqGTFVLzzVwEqVD6wIDAQABMA0GCSqGSIb3DQEB\r\n\
|
||
|
CwUAA4IBgQAuNVwkBhd5nyWMmV/ESNxy59Sz+5FcesGclKjs4YocgcKbLD2bS+LN\r\n\
|
||
|
lKk6zenES7Cq6+l3NMAxxh/QhgHUCThAfREzfPXbmiicrUfaudN4YFivpoFwKIAs\r\n\
|
||
|
NczsL9S3FPbzAB4nLDATacc2BK0//aKMOU2t3KLNNomKbzlR+EW3wd0F1GoZ9SY6\r\n\
|
||
|
sCQeLa8Wp1KarOmbvgoFL/DAiTSqjjsU/Lq24dOCCctmG+qXRZxQa4npHD4xJwQJ\r\n\
|
||
|
qzA0JLu4n+DgoJftm1KpvB0wuzTn6M9+wnk5rv/fGc2t4Zra8B4prEReZZVfy65d\r\n\
|
||
|
cb8pBdb20Yrmznj+6DR50X/o/8Qzoyj9XpxtjwF23ql0XPYCI7kB03Ms9euP0btc\r\n\
|
||
|
HFacHapm0qBKx+vWy0V2Qf482OWSbewqaRbud44sErNoKqpqm02yN8PpsCywpFUj\r\n\
|
||
|
UC5G5DzxzYspMzQv/yidti0scMSKFObseZmNGlRYymCWhXnxmoCFjLpw5RnJSB2+\r\n\
|
||
|
cZ/1KFFHHZI=\r\n\
|
||
|
-----END CERTIFICATE-----";
|
||
|
|
||
|
char *client_crt_buffer= "-----BEGIN CERTIFICATE-----\r\n\
|
||
|
MIIEhDCCAuwCCQDuE1BpeAeMwzANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMC\r\n\
|
||
|
Q04xCzAJBgNVBAgMAkFIMQswCQYDVQQHDAJIRjEQMA4GA1UECgwHUVVFQ1RFTDEL\r\n\
|
||
|
MAkGA1UECwwCU1QxFjAUBgNVBAMMDTExMi4zMS44NC4xNjQxIjAgBgkqhkiG9w0B\r\n\
|
||
|
CQEWE2VkZGllLnpoYW5nQHF1ZWN0ZWwwIBcNMjIwMTI1MDcyMzI3WhgPMjEyMjAx\r\n\
|
||
|
MDEwNzIzMjdaMIGCMQswCQYDVQQGEwJDTjELMAkGA1UECAwCQUgxCzAJBgNVBAcM\r\n\
|
||
|
AkhGMRAwDgYDVQQKDAdRVUVDVEVMMQswCQYDVQQLDAJTVDEWMBQGA1UEAwwNMTEy\r\n\
|
||
|
LjMxLjg0LjE2NDEiMCAGCSqGSIb3DQEJARYTZWRkaWUuemhhbmdAcXVlY3RlbDCC\r\n\
|
||
|
AaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAMt3cjY0eLEDqv8Y7FomA+7N\r\n\
|
||
|
G5ztAbR7+P/WxjPlodqRDZ5HQORkfAr44gAZcWsKoo4DHTInwr9JBbBnETBMnL8+\r\n\
|
||
|
13h1PRp5CfwXKFvjppWYvBZfeTwhWQYbSMKINoS+d1Zl11jg/+ZbSd7Fi0bYq8ip\r\n\
|
||
|
Hbt30H+NANQZP1XQdsCf5/kvn+vXiP4EgJc56JQ9L6ALIF2Q6F3G/PTaYItg463N\r\n\
|
||
|
lv/S+eRi1VMDSs8Qc+DTlVwlgZZJdSlC8Yjr5pVqoyXm8ENKfSTrdhrLiKSWJTz9\r\n\
|
||
|
JUr04E7SJ+CoBAnLYNPHR2y0CFS/15aCa1JbK27ZJ/0cvBvzpWdkcgrDtKIcxNYM\r\n\
|
||
|
9QFPpehb1N4pgqi0NPhCkc/BasfmXUaTwM4ghhi4tQRptKMdTN/kdyC+V5a8Hyhb\r\n\
|
||
|
Nvw5qeJlLJKpgZ9X3HQzuKstKMkxLNuDIzK9TvO7zLowr+0BetUdllq+fDjXQM0M\r\n\
|
||
|
+9P3Xv2VmDwGRkmZ0IjYpDjm+qqGTFVLzzVwEqVD6wIDAQABMA0GCSqGSIb3DQEB\r\n\
|
||
|
CwUAA4IBgQAuNVwkBhd5nyWMmV/ESNxy59Sz+5FcesGclKjs4YocgcKbLD2bS+LN\r\n\
|
||
|
lKk6zenES7Cq6+l3NMAxxh/QhgHUCThAfREzfPXbmiicrUfaudN4YFivpoFwKIAs\r\n\
|
||
|
NczsL9S3FPbzAB4nLDATacc2BK0//aKMOU2t3KLNNomKbzlR+EW3wd0F1GoZ9SY6\r\n\
|
||
|
sCQeLa8Wp1KarOmbvgoFL/DAiTSqjjsU/Lq24dOCCctmG+qXRZxQa4npHD4xJwQJ\r\n\
|
||
|
qzA0JLu4n+DgoJftm1KpvB0wuzTn6M9+wnk5rv/fGc2t4Zra8B4prEReZZVfy65d\r\n\
|
||
|
cb8pBdb20Yrmznj+6DR50X/o/8Qzoyj9XpxtjwF23ql0XPYCI7kB03Ms9euP0btc\r\n\
|
||
|
HFacHapm0qBKx+vWy0V2Qf482OWSbewqaRbud44sErNoKqpqm02yN8PpsCywpFUj\r\n\
|
||
|
UC5G5DzxzYspMzQv/yidti0scMSKFObseZmNGlRYymCWhXnxmoCFjLpw5RnJSB2+\r\n\
|
||
|
cZ/1KFFHHZI=\r\n\
|
||
|
-----END CERTIFICATE-----";
|
||
|
|
||
|
char *client_key_buffer= "-----BEGIN RSA PRIVATE KEY-----\r\n\
|
||
|
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\r\n\
|
||
|
-----END RSA PRIVATE KEY-----";
|
||
|
#endif
|
||
|
|
||
|
static void mqtt_state_exception_cb(mqtt_client_t *client)
|
||
|
{
|
||
|
QL_MQTT_LOG("mqtt session abnormal disconnect");
|
||
|
mqtt_connected = 0;
|
||
|
}
|
||
|
|
||
|
static void mqtt_connect_result_cb(mqtt_client_t *client, void *arg, mqtt_connection_status_e status)
|
||
|
{
|
||
|
QL_MQTT_LOG("status: %d", status);
|
||
|
if(status == 0){
|
||
|
mqtt_connected = 1;
|
||
|
}
|
||
|
ql_rtos_semaphore_release(mqtt_semp);
|
||
|
}
|
||
|
|
||
|
static void mqtt_requst_result_cb(mqtt_client_t *client, void *arg,int err)
|
||
|
{
|
||
|
QL_MQTT_LOG("err: %d", err);
|
||
|
|
||
|
ql_rtos_semaphore_release(mqtt_semp);
|
||
|
}
|
||
|
|
||
|
static void mqtt_inpub_data_cb(mqtt_client_t *client, void *arg, int pkt_id, const char *topic, const unsigned char *payload, unsigned short payload_len)
|
||
|
{
|
||
|
QL_MQTT_LOG("topic: %s", topic);
|
||
|
QL_MQTT_LOG("payload: %s", payload);
|
||
|
}
|
||
|
|
||
|
static void mqtt_disconnect_result_cb(mqtt_client_t *client, void *arg,int err){
|
||
|
QL_MQTT_LOG("err: %d", err);
|
||
|
|
||
|
ql_rtos_semaphore_release(mqtt_semp);
|
||
|
}
|
||
|
static void mqtt_app_thread(void * arg)
|
||
|
{
|
||
|
int ret = 0;
|
||
|
int i = 0, run_num = 1;
|
||
|
int profile_idx = 1;
|
||
|
ql_data_call_info_s info;
|
||
|
char ip4_addr_str[16] = {0};
|
||
|
mqtt_client_t mqtt_cli;
|
||
|
uint8_t nSim = 0;
|
||
|
uint16_t sim_cid;
|
||
|
struct mqtt_connect_client_info_t client_info = {0};
|
||
|
char *token = NULL;
|
||
|
int is_user_onenet = 1;
|
||
|
ql_rtos_semaphore_create(&mqtt_semp, 0);
|
||
|
ql_rtos_task_sleep_s(10);
|
||
|
|
||
|
char* client_id = (char*)malloc(256);
|
||
|
char* client_user = (char*)malloc(256);
|
||
|
char* client_pass = (char*)malloc(256);
|
||
|
|
||
|
QL_MQTT_LOG("========== mqtt demo start ==========");
|
||
|
QL_MQTT_LOG("wait for network register done");
|
||
|
|
||
|
while((ret = ql_network_register_wait(nSim, 120)) != 0 && i < 10){
|
||
|
i++;
|
||
|
ql_rtos_task_sleep_s(1);
|
||
|
}
|
||
|
if(ret == 0){
|
||
|
i = 0;
|
||
|
QL_MQTT_LOG("====network registered!!!!====");
|
||
|
}else{
|
||
|
QL_MQTT_LOG("====network register failure!!!!!====");
|
||
|
goto exit;
|
||
|
}
|
||
|
|
||
|
ql_set_data_call_asyn_mode(nSim, profile_idx, 0);
|
||
|
|
||
|
QL_MQTT_LOG("===start data call====");
|
||
|
ret=ql_start_data_call(nSim, profile_idx, QL_PDP_TYPE_IP, "uninet", NULL, NULL, 0);
|
||
|
QL_MQTT_LOG("===data call result:%d", ret);
|
||
|
if(ret != 0){
|
||
|
QL_MQTT_LOG("====data call failure!!!!=====");
|
||
|
}
|
||
|
memset(&info, 0x00, sizeof(ql_data_call_info_s));
|
||
|
|
||
|
ret = ql_get_data_call_info(nSim, profile_idx, &info);
|
||
|
if(ret != 0){
|
||
|
QL_MQTT_LOG("ql_get_data_call_info ret: %d", ret);
|
||
|
ql_stop_data_call(nSim, profile_idx);
|
||
|
goto exit;
|
||
|
}
|
||
|
QL_MQTT_LOG("info->profile_idx: %d", info.profile_idx);
|
||
|
QL_MQTT_LOG("info->ip_version: %d", info.ip_version);
|
||
|
|
||
|
QL_MQTT_LOG("info->v4.state: %d", info.v4.state);
|
||
|
inet_ntop(AF_INET, &info.v4.addr.ip, ip4_addr_str, sizeof(ip4_addr_str));
|
||
|
QL_MQTT_LOG("info.v4.addr.ip: %s\r\n", ip4_addr_str);
|
||
|
|
||
|
inet_ntop(AF_INET, &info.v4.addr.pri_dns, ip4_addr_str, sizeof(ip4_addr_str));
|
||
|
QL_MQTT_LOG("info.v4.addr.pri_dns: %s\r\n", ip4_addr_str);
|
||
|
|
||
|
inet_ntop(AF_INET, &info.v4.addr.sec_dns, ip4_addr_str, sizeof(ip4_addr_str));
|
||
|
QL_MQTT_LOG("info.v4.addr.sec_dns: %s\r\n", ip4_addr_str);
|
||
|
|
||
|
|
||
|
while(run_num <= 100)
|
||
|
{
|
||
|
int test_num = 0;
|
||
|
int case_id = 0;
|
||
|
if(is_user_onenet != 1)
|
||
|
{
|
||
|
case_id = run_num%2;
|
||
|
}
|
||
|
|
||
|
int ret = MQTTCLIENT_SUCCESS;
|
||
|
|
||
|
QL_MQTT_LOG("==============mqtt_client_test[%d]================\n",run_num);
|
||
|
|
||
|
if(QL_DATACALL_SUCCESS != ql_bind_sim_and_profile(nSim, profile_idx, &sim_cid))
|
||
|
{
|
||
|
QL_MQTT_LOG("nSim or profile_idx is invalid!!!!");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if(ql_mqtt_client_init(&mqtt_cli, sim_cid) != MQTTCLIENT_SUCCESS){
|
||
|
QL_MQTT_LOG("mqtt client init failed!!!!");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
QL_MQTT_LOG("mqtt_cli:%d", mqtt_cli);
|
||
|
|
||
|
if(is_user_onenet == 1)
|
||
|
{
|
||
|
client_info.keep_alive = 60;
|
||
|
client_info.pkt_timeout = 5;
|
||
|
client_info.retry_times = 3;
|
||
|
client_info.clean_session = 1;
|
||
|
client_info.will_qos = 0;
|
||
|
client_info.will_retain = 0;
|
||
|
client_info.will_topic = NULL;
|
||
|
client_info.will_msg = NULL;
|
||
|
|
||
|
client_info.client_id = client_id;
|
||
|
client_info.client_user = client_user;
|
||
|
client_info.client_pass = client_pass;
|
||
|
|
||
|
memset((void*)client_info.client_user,0,256);
|
||
|
memset((void*)client_info.client_id,0,256);
|
||
|
memset((void*)client_info.client_pass,0,256);
|
||
|
/*token过期时间(单位为s),请按照实际具体需求计算token过期时间,本例中为当前时刻的一年后过期*/
|
||
|
signed long long expire_time = 24 * 60 * 60 * 365;
|
||
|
token = ql_mqtt_onenet_generate_auth_token(expire_time,MQTT_CLIENT_ONENET_PRODUCTID,MQTT_CLIENT_ONENET_DEVICENAME,MQTT_CLIENT_ONENET_VERSION,MQTT_CLIENT_ONENET_ACCESSKEY);
|
||
|
|
||
|
if(NULL != token) {
|
||
|
memcpy((void*)client_info.client_pass, token, strlen(token));
|
||
|
memcpy((void*)client_info.client_user,MQTT_CLIENT_ONENET_PRODUCTID,strlen(MQTT_CLIENT_ONENET_PRODUCTID));
|
||
|
memcpy((void*)client_info.client_id,MQTT_CLIENT_ONENET_DEVICENAME,strlen(MQTT_CLIENT_ONENET_DEVICENAME));
|
||
|
free(token);
|
||
|
token = NULL;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
QL_MQTT_LOG("clientid_str=%s", client_info.client_id);
|
||
|
QL_MQTT_LOG("username_str=%s", client_info.client_user);
|
||
|
QL_MQTT_LOG("password_str=%s", client_info.client_pass);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
client_info.keep_alive = 60;
|
||
|
client_info.pkt_timeout = 5;
|
||
|
client_info.retry_times = 3;
|
||
|
client_info.clean_session = 1;
|
||
|
client_info.will_qos = 0;
|
||
|
client_info.will_retain = 0;
|
||
|
client_info.will_topic = NULL;
|
||
|
client_info.will_msg = NULL;
|
||
|
client_info.client_id = MQTT_CLIENT_IDENTITY;
|
||
|
client_info.client_user = MQTT_CLIENT_USER;
|
||
|
client_info.client_pass = MQTT_CLIENT_PASS;
|
||
|
}
|
||
|
QL_MQTT_LOG("connect ssl %d onenet mode %d",case_id,is_user_onenet);
|
||
|
if(case_id == 0){
|
||
|
client_info.ssl_cfg = NULL;
|
||
|
if(is_user_onenet == 1)
|
||
|
{
|
||
|
ret = ql_mqtt_connect(&mqtt_cli, MQTT_CLIENT_ONENET_URL, mqtt_connect_result_cb, NULL, (const struct mqtt_connect_client_info_t *)&client_info, mqtt_state_exception_cb);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ret = ql_mqtt_connect(&mqtt_cli, MQTT_CLIENT_QUECTEL_URL , mqtt_connect_result_cb, NULL, (const struct mqtt_connect_client_info_t *)&client_info, mqtt_state_exception_cb);
|
||
|
}
|
||
|
|
||
|
}else{
|
||
|
struct mqtt_ssl_config_t quectel_ssl_cfg = {
|
||
|
.ssl_ctx_id = 1,
|
||
|
#if USE_CRT_BUFFER
|
||
|
.verify_level = MQTT_SSL_VERIFY_SERVER_CLIENT,
|
||
|
.client_cert_type= QL_SSL_CLIENT_CERT_BUFFER,
|
||
|
.cacert_buffer = root_ca_crt_buffer,
|
||
|
.client_cert_path = client_crt_buffer,
|
||
|
.client_key_path = client_key_buffer,
|
||
|
#else
|
||
|
.verify_level = MQTT_SSL_VERIFY_NONE,
|
||
|
.cacert_path = NULL,
|
||
|
.client_cert_path = NULL,
|
||
|
.client_key_path = NULL,
|
||
|
#endif
|
||
|
.client_key_pwd = NULL,
|
||
|
.ssl_version = QL_SSL_VERSION_ALL,
|
||
|
.sni_enable = 0,
|
||
|
.ssl_negotiate_timeout = QL_SSL_NEGOTIATE_TIME_DEF,
|
||
|
.ignore_invalid_certsign = 0,
|
||
|
.ignore_multi_certchain_verify = 0,
|
||
|
.ignore_certitem = MBEDTLS_X509_BADCERT_NOT_TRUSTED|MBEDTLS_X509_BADCERT_EXPIRED|MBEDTLS_X509_BADCERT_FUTURE,
|
||
|
};
|
||
|
struct mqtt_ssl_config_t ontnet_ssl_cfg = {
|
||
|
.ssl_ctx_id = 1,
|
||
|
.verify_level = MQTT_SSL_VERIFY_NONE,
|
||
|
.cacert_path = "UFS:MQTTS-certificate.pem",
|
||
|
.client_cert_path = NULL,
|
||
|
.client_key_path = NULL,
|
||
|
.client_key_pwd = NULL,
|
||
|
.ssl_version = QL_SSL_VERSION_ALL,
|
||
|
.sni_enable = 0,
|
||
|
.ssl_negotiate_timeout = QL_SSL_NEGOTIATE_TIME_DEF,
|
||
|
.ignore_invalid_certsign = 0,
|
||
|
.ignore_multi_certchain_verify = 0,
|
||
|
.ignore_certitem = MBEDTLS_X509_BADCERT_EXPIRED|MBEDTLS_X509_BADCERT_FUTURE,
|
||
|
};
|
||
|
if(is_user_onenet == 1)
|
||
|
{
|
||
|
client_info.ssl_cfg = &ontnet_ssl_cfg;
|
||
|
ret = ql_mqtt_connect(&mqtt_cli, MQTT_CLIENT_ONENET_SSL_URL, mqtt_connect_result_cb, NULL, (const struct mqtt_connect_client_info_t *)&client_info, mqtt_state_exception_cb);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
client_info.ssl_cfg = &quectel_ssl_cfg;
|
||
|
ret = ql_mqtt_connect(&mqtt_cli, MQTT_CLIENT_QUECTEL_SSL_URL, mqtt_connect_result_cb, NULL, (const struct mqtt_connect_client_info_t *)&client_info, mqtt_state_exception_cb);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
if(ret == MQTTCLIENT_WOUNDBLOCK){
|
||
|
QL_MQTT_LOG("====wait connect result");
|
||
|
ql_rtos_semaphore_wait(mqtt_semp, QL_WAIT_FOREVER);
|
||
|
if(mqtt_connected == 0){
|
||
|
ql_mqtt_client_deinit(&mqtt_cli);
|
||
|
break;
|
||
|
}
|
||
|
}else{
|
||
|
QL_MQTT_LOG("===mqtt connect failed ,ret = %d",ret);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
ql_mqtt_set_inpub_callback(&mqtt_cli, mqtt_inpub_data_cb, NULL);
|
||
|
|
||
|
if(is_user_onenet == 1)
|
||
|
{
|
||
|
if(is_user_onenet == 1)
|
||
|
{
|
||
|
if(ql_mqtt_sub_unsub(&mqtt_cli, "$sys/417661/test_led/dp/post/json/+", 1, mqtt_requst_result_cb,NULL, 1) == MQTTCLIENT_WOUNDBLOCK){
|
||
|
QL_MQTT_LOG("======wait subscrible result");
|
||
|
ql_rtos_semaphore_wait(mqtt_semp, QL_WAIT_FOREVER);
|
||
|
}
|
||
|
if(ql_mqtt_publish(&mqtt_cli, "$sys/417661/test_led/dp/post/json",MQTT_PUB_MSG0, strlen(MQTT_PUB_MSG0), 0, 0, mqtt_requst_result_cb,NULL) == MQTTCLIENT_WOUNDBLOCK){
|
||
|
QL_MQTT_LOG("======wait publish result");
|
||
|
ql_rtos_semaphore_wait(mqtt_semp, QL_WAIT_FOREVER);
|
||
|
}
|
||
|
if(ql_mqtt_publish(&mqtt_cli, "$sys/417661/test_led/dp/post/json", MQTT_PUB_MSG1, strlen(MQTT_PUB_MSG1), 1, 0, mqtt_requst_result_cb,NULL) == MQTTCLIENT_WOUNDBLOCK){
|
||
|
QL_MQTT_LOG("======wait publish result");
|
||
|
ql_rtos_semaphore_wait(mqtt_semp, QL_WAIT_FOREVER);
|
||
|
}
|
||
|
// onenet 平台不支持qos2
|
||
|
if(ql_mqtt_sub_unsub(&mqtt_cli,"$sys/417661/test_led/dp/post/json/+", 1, mqtt_requst_result_cb,NULL, 0) == MQTTCLIENT_WOUNDBLOCK){
|
||
|
QL_MQTT_LOG("=====wait unsubscrible result");
|
||
|
ql_rtos_semaphore_wait(mqtt_semp, QL_WAIT_FOREVER);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else{
|
||
|
while(test_num < 10 && mqtt_connected == 1){
|
||
|
if(ql_mqtt_sub_unsub(&mqtt_cli, "test", 1, mqtt_requst_result_cb,NULL, 1) == MQTTCLIENT_WOUNDBLOCK){
|
||
|
QL_MQTT_LOG("======wait subscrible result");
|
||
|
ql_rtos_semaphore_wait(mqtt_semp, QL_WAIT_FOREVER);
|
||
|
}
|
||
|
|
||
|
if(ql_mqtt_publish(&mqtt_cli, "test", "hi, mqtt qos 0", strlen("hi, mqtt qos 0"), 0, 0, mqtt_requst_result_cb,NULL) == MQTTCLIENT_WOUNDBLOCK){
|
||
|
QL_MQTT_LOG("======wait publish result");
|
||
|
ql_rtos_semaphore_wait(mqtt_semp, QL_WAIT_FOREVER);
|
||
|
}
|
||
|
|
||
|
if(ql_mqtt_publish(&mqtt_cli, "test", "hi, mqtt qos 1", strlen("hi, mqtt qos 1"), 1, 0, mqtt_requst_result_cb,NULL) == MQTTCLIENT_WOUNDBLOCK){
|
||
|
QL_MQTT_LOG("======wait publish result");
|
||
|
ql_rtos_semaphore_wait(mqtt_semp, QL_WAIT_FOREVER);
|
||
|
}
|
||
|
|
||
|
if(ql_mqtt_publish(&mqtt_cli, "test", "hi, mqtt qos 2", strlen("hi, mqtt qos 2"), 2, 0, mqtt_requst_result_cb,NULL) == MQTTCLIENT_WOUNDBLOCK){
|
||
|
QL_MQTT_LOG("======wait publish result");
|
||
|
ql_rtos_semaphore_wait(mqtt_semp, QL_WAIT_FOREVER);
|
||
|
}
|
||
|
|
||
|
if(ql_mqtt_sub_unsub(&mqtt_cli, "test", 1, mqtt_requst_result_cb,NULL, 0) == MQTTCLIENT_WOUNDBLOCK){
|
||
|
QL_MQTT_LOG("=====wait unsubscrible result");
|
||
|
ql_rtos_semaphore_wait(mqtt_semp, QL_WAIT_FOREVER);
|
||
|
}
|
||
|
test_num++;
|
||
|
ql_rtos_task_sleep_ms(500);
|
||
|
}
|
||
|
}
|
||
|
if(mqtt_connected == 1 && ql_mqtt_disconnect(&mqtt_cli, mqtt_disconnect_result_cb, NULL) == MQTTCLIENT_WOUNDBLOCK){
|
||
|
QL_MQTT_LOG("=====wait disconnect result");
|
||
|
ql_rtos_semaphore_wait(mqtt_semp, QL_WAIT_FOREVER);
|
||
|
}
|
||
|
QL_MQTT_LOG("==============mqtt_client_test[%d] end=======%x=========\n",run_num,&mqtt_cli);
|
||
|
ql_mqtt_client_deinit(&mqtt_cli);
|
||
|
mqtt_connected = 0;
|
||
|
run_num++;
|
||
|
ql_rtos_task_sleep_s(1);
|
||
|
if(is_user_onenet == 1)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
exit:
|
||
|
if(is_user_onenet == 1)
|
||
|
{
|
||
|
free((void*)client_id);
|
||
|
free((void*)client_user);
|
||
|
free((void*)client_pass);
|
||
|
client_id = NULL;
|
||
|
client_user = NULL;
|
||
|
client_pass = NULL;
|
||
|
}
|
||
|
|
||
|
ql_rtos_semaphore_delete(mqtt_semp);
|
||
|
ql_rtos_task_delete(mqtt_task);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
int ql_mqtt_app_init(void)
|
||
|
{
|
||
|
QlOSStatus err = QL_OSI_SUCCESS;
|
||
|
|
||
|
err = ql_rtos_task_create(&mqtt_task, 16*1024, APP_PRIORITY_ABOVE_NORMAL, "QmqttApp", mqtt_app_thread, NULL, 5);
|
||
|
if(err != QL_OSI_SUCCESS)
|
||
|
{
|
||
|
QL_MQTT_LOG("mqtt_app init failed");
|
||
|
}
|
||
|
|
||
|
return err;
|
||
|
}
|
||
|
|