doubao_chat/apps/common/example/network_protocols/mqtts/main.c

718 lines
28 KiB
C

/***********************************MQTTS 测试说明*******************************************
*说明:
* 通过MQTTS协议连接亚马逊, 向亚马逊订阅主题和发布消息
*********************************************************************************************/
#include "system/includes.h"
#include "http/http_cli.h"
#include "mqtt/MQTTClient.h"
#include "app_config.h"
#include "json_c/json_object.h"
#include "json_c/json.h"
#include "fs/fs.h"
#include "json_c/json_tokener.h"
#ifdef USE_MQTTS_TEST
#if 1
#define log_info(x, ...) printf("\n------------[aws_test]###" x "----------------\r\n",##__VA_ARGS__)
#else
#define log_info(...)
#endif
const char ca_pem[] =
"-----BEGIN CERTIFICATE-----\r\n"
"MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\r\n"
"ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\r\n"
"b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\r\n"
"MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\r\n"
"b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\r\n"
"ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\r\n"
"9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw\r\n"
"IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6\r\n"
"VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L\r\n"
"93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm\r\n"
"jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\r\n"
"AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA\r\n"
"A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI\r\n"
"U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs\r\n"
"N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv\r\n"
"o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU\r\n"
"5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy\r\n"
"rqXRfboQnoZsG4q5WTP468SQvvG5\r\n"
"-----END CERTIFICATE-----\r\n";
const char cli_crt[] =
"-----BEGIN CERTIFICATE-----\r\n"
"MIIDWjCCAkKgAwIBAgIVAIe0p5sPF7RDRTjSn0Mi0hSyWGZbMA0GCSqGSIb3DQEB\r\n"
"CwUAME0xSzBJBgNVBAsMQkFtYXpvbiBXZWIgU2VydmljZXMgTz1BbWF6b24uY29t\r\n"
"IEluYy4gTD1TZWF0dGxlIFNUPVdhc2hpbmd0b24gQz1VUzAeFw0yMzAyMDgwNjE2\r\n"
"MTJaFw00OTEyMzEyMzU5NTlaMB4xHDAaBgNVBAMME0FXUyBJb1QgQ2VydGlmaWNh\r\n"
"dGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDB4U5JbPBBeRPT0HRC\r\n"
"on/JJ4C/9TQUdYPWx5SwQMbO+a+fqDL9/dVhOduzgO9PQw0sBJyR+qrEeN6fFnX1\r\n"
"K6Z4xKZVeMEXELXUBi4h3AyBO7fApVCRd57t0a+GvF06TonpdujRRSfiknyw8PgK\r\n"
"gWWEU2iaUCJTz+eNxDVbqMtCKs/9RT1aNZlBubyMbxvw+pLtZGXp2xxytavlEitd\r\n"
"MA/x6Hx7US5XUNqNaekCUKpD+DboU5sG3NW380AxYfgVtFCtKG07rzmSd5rxBwLO\r\n"
"F4qPbWBGEScejXFLPRKWxPV8vk/vSaPS4zW8bC5hnZwT8tO1yRS0gmhB1No950TL\r\n"
"x3b9AgMBAAGjYDBeMB8GA1UdIwQYMBaAFFSCAkS3vvMJDkbND50yyda5CuLjMB0G\r\n"
"A1UdDgQWBBRn/KddKJD4U52Fc7cyTnbKxZ12NDAMBgNVHRMBAf8EAjAAMA4GA1Ud\r\n"
"DwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAQEAfM4onZ8j92AsKrcUcuUX4ZkF\r\n"
"w9angmrtzckuOAm+spDbPU7jz4Krnx6AUz48tbAM8ttCdZOPixPOADdrzz3k3nql\r\n"
"XdG7hIBizuK7AkKuxRcgRKIS9nLSL1Uk0nGGLedZedO5VpFsv3C5yYl8eoaICww2\r\n"
"KgtQ9gBkMiFu1bM5xCkl1zqxunrxPBgOBM2F+tvriJZBNVdDcrWHd9ngJS+m0wve\r\n"
"G5zD1DwW0rKPaXm2rE6RZZ5j2qq1HQPqT3h2LMjkp+IKND1phF6IUCYEy4gF+ZQ/\r\n"
"QHOheyCcQtu+7VY4vHrKBU3watqkx80j85sI0UN9nu+l/1IY1yl4FjuPxmZkVg==\r\n"
"-----END CERTIFICATE-----\r\n";
const char pri_key[] =
"-----BEGIN RSA PRIVATE KEY-----\r\n"
"MIIEpQIBAAKCAQEAweFOSWzwQXkT09B0QqJ/ySeAv/U0FHWD1seUsEDGzvmvn6gy\r\n"
"/f3VYTnbs4DvT0MNLASckfqqxHjenxZ19SumeMSmVXjBFxC11AYuIdwMgTu3wKVQ\r\n"
"kXee7dGvhrxdOk6J6Xbo0UUn4pJ8sPD4CoFlhFNomlAiU8/njcQ1W6jLQirP/UU9\r\n"
"WjWZQbm8jG8b8PqS7WRl6dsccrWr5RIrXTAP8eh8e1EuV1DajWnpAlCqQ/g26FOb\r\n"
"BtzVt/NAMWH4FbRQrShtO685knea8QcCzheKj21gRhEnHo1xSz0SlsT1fL5P70mj\r\n"
"0uM1vGwuYZ2cE/LTtckUtIJoQdTaPedEy8d2/QIDAQABAoIBADdo1uDxO3Da06nT\r\n"
"h4aLvo2Utp0lzO6T70vw2jPNL4Rzo5ezkG86nkMdMAcLMFmsxhTwdHbb9vYTvTwm\r\n"
"RSv+f6NAQHFpA3Y+Flk0MvcGVqSQlqF+HZqVX1yEcu/E4bgKPiv1CfDVHOMKDozb\r\n"
"MWh/Nq4s0FZZ1JWzc2/2xXEeuoh8B/iTbRb6q1GKecA0vSuetchRBnnRGaNPgVel\r\n"
"+CpUBc/ANq7afKOfa6xzokXZ4Lx+mMXNF53psSS1Vtp1dk2JfyTVHzN0MIVlOURO\r\n"
"FYXzy/ccHgphPEESphRg6jxN1/wf4iI1Ilqp1a1786gYzsHfBvvIcAuq06l54e9N\r\n"
"sVa+bVkCgYEA9Cp04lSuRt+daLPhVd/pKAazC8vZLALl00VdyiK9NZMD7xLFe9Ys\r\n"
"z7q+WT2wxMCKYI+zsexHrZAIHI1GfrFou5Cy5Yqo4WctGuG7ee7PGMmStaNVxdyL\r\n"
"gkyZlmtyxBrMReCgy9XNkv6ihC0UwELl3XLBlM+1AY+cUUsuI4/jZj8CgYEAy0bq\r\n"
"2Tm+SkL6W9iTDtto0YF8CU0O7mGG58CLWezy8l/nY63odGVd5P3sxmRfgzxrcRa/\r\n"
"RdAvGQijxXjNlYG2GdJ1F5tUFnyeW4SoGJp87ipy6U9XGnsuh6a2h5s0nJEaADAS\r\n"
"7SY46+29Zx9XzneqWZbSTnEa70oF3MVZzQ+cK8MCgYEA4UurvovUo6ECZfJVIiAR\r\n"
"y9UisOfP5ERoPKHtAO89F4ooPxlbEAF4J9Vwfnfl/CaNiLwQW0Rif0w/r9jMC2s3\r\n"
"8Jp7+EIRwqqpe/x+OOyaO40DyoaERqZSNFDqB1nt8/WmN3Ql6u/FWLWMz9mpJB6W\r\n"
"a9fPt7hQlLgmzPxJ/pZuhZECgYEAj7CjlcXBg1DxFDd1TE1APMgg25pC8bKy3+M1\r\n"
"He3mlfnA4K8v4Ac/Zf0wf9S3x1bQQ/JmZn0QrctzqMUJ3aMBDCO+bV95AyQ39E1D\r\n"
"XZDmupv6+n0A/1EPxQfNgvHtMLdI/9T7q/MWzX8SIXEAaowgOI/qPVSqS3exySsf\r\n"
"nVppdG0CgYEA84qGVfhTlCl4FwP+XYkPm3/yj1e+AIPqUfFrxUfzwu+Ugv1Ti3Cp\r\n"
"+fZBB8M+1LQ9Q3I6MokJu82G4yxsTEGzPoVMjf8EsXC0Zu0a6QFiLOPsiAWadVyD\r\n"
"O0Ya2hjuKye23rBN4Ryf92ON3Icy+ScAHOaXx762SvPf86VVSnkDFVw=\r\n"
"-----END RSA PRIVATE KEY-----\r\n";
#define AWS_IOT_ENDPOINT "ayzsyi76x9sg9-ats.iot.us-west-2.amazonaws.com"
/* #define THING_NAME "test_thing" */
/* #define SHADOW_NAME "123" */
#if 1
#define SHADOW "name/123/"
#else
#define SHADOW ""
#endif
#define TOPIC1 "$aws/things/test_thing/shadow/"SHADOW"delete/accepted"
#define TOPIC2 "$aws/things/test_thing/shadow/"SHADOW"delete/rejected"
#define TOPIC3 "$aws/things/test_thing/shadow/"SHADOW"get/accepted"
#define TOPIC4 "$aws/things/test_thing/shadow/"SHADOW"get/rejected"
#define TOPIC5 "$aws/things/test_thing/shadow/"SHADOW"update/accepted"
#define TOPIC6 "$aws/things/test_thing/shadow/"SHADOW"update/rejected"
#define TOPIC7 "$aws/things/test_thing/shadow/"SHADOW"update/delta"
#define TOPIC8 "$aws/things/test_thing/shadow/"SHADOW"update/documents"
//两种方式读取证书
/* #define USE_SD_FILE */
#ifdef USE_SD_FILE
//读取TF卡中的证书(或资源文件中的证书)
#define CAS_PEM_PATH CONFIG_ROOT_PATH"ca.pem"
#define CLI_PEM_PATH CONFIG_ROOT_PATH"cli.crt"
#define PKEY_PATH CONFIG_ROOT_PATH"pri.key"
#else
//读取代码中的数组证书
#define CAS_PEM_PATH ca_pem
#define CLI_PEM_PATH cli_crt
#define PKEY_PATH pri_key
#endif
#define AWS_MQTT_PORT 8883
#define AWS_QOS QOS0
#define BUF_SIZE 1024*10
static struct Network network;
static struct Client client;
static unsigned char send_buffer[BUF_SIZE];
static unsigned char recv_buffer[BUF_SIZE];
static bool client_connected;
static OS_MUTEX aws_mutex;
static u8 local_net_ret = 2;
void aws_shadow_get_info(void);
void aws_shadow_update_info(void);
//获取状态函数
static void aws_status_get()
{
MQTTMessage message = {0};
message.id = 0;
message.qos = AWS_QOS;
message.retained = false;
message.dup = false;
char topic[] = "$aws/things/test_thing/shadow/"SHADOW"get";
if (client.isconnected) {
MQTTPublish(&client, topic, &message);
}
}
//更新状态函数
static void aws_status_update(char *buf)
{
MQTTMessage message = {0};
message.id = 0;
message.qos = AWS_QOS;
message.retained = false;
message.dup = false;
message.payload = buf;
message.payloadlen = strlen(buf);
char topic[] = "$aws/things/test_thing/shadow/"SHADOW"update";
MQTTPublish(&client, topic, &message);
}
static void callback(MessageData *md)
{
//给字符串一个结束符'\0'
*((char *)md->message->payload + md->message->payloadlen) = 0;
log_info("\n callback buf = %s\n", md->message->payload);
}
//e.g.歌曲播放完毕后回调函数
static void *music_end_handler(int arg) //网络歌曲播放完毕回调函数
{
printf("callback when song end\r\n");
return NULL;
}
//订阅的回调函数, 消息接收函数
static void delta_callback(MessageData *md)
{
os_mutex_pend(&aws_mutex, 0);
int arg = 0;
char *url;
json_object *root_node = NULL, *first_node = NULL, *second_node = NULL, *third_node = NULL;
json_object *state_node = NULL, *report_node = NULL, *music_node = NULL, *light_node = NULL, *voice_node = NULL, *timer_node = NULL, *alarm_node = NULL;
*((char *)md->message->payload + md->message->payloadlen) = 0;
log_info("\n\n\n delta = %s\n\n\n", md->message->payload);
//e.g.do something
#if 0
root_node = json_tokener_parse(md->message->payload);
if (!root_node) {
log_info("%d root_node NULL", __LINE__);
return ;
}
if (json_object_object_get_ex(root_node, "state", &first_node)) {
//create update string
report_node = json_object_new_object();
if (json_object_object_get_ex(first_node, "music", &second_node)) { //音乐主题
music_node = json_object_new_object();
if (json_object_object_get(second_node, "id")) {
arg = json_object_get_int(json_object_object_get(second_node, "id"));
//
if (1) { //success
json_object_object_add(music_node, "id", json_object_new_string("id_num"));
} else {
json_object_object_add(music_node, "id", json_object_new_string("yuanlai"));
}
}
if (json_object_object_get(second_node, "url")) {
//
url = json_object_get_string(json_object_object_get(second_node, "url"));
if (1) { //success
json_object_object_add(music_node, "url", json_object_new_string("url_test"));
} else {
json_object_object_add(music_node, "url", json_object_new_string("yuanlaui"));
}
}
#if 0
if (json_object_object_get(second_node, "name")) {
int num = json_object_get_int(json_object_object_get(second_node, "name"));
printf("num = %d arg = %d ret = %d url = %s\r\n", num, arg, local_net_ret, url);
if (num == 1) {
printf("into net_local_switch\r\n");
local_net_ret = net_local_play_mode_switch(arg); //(本地播放模式 返回 1) 与(网络播放模式 返回 2) 切换 返回当前播放模式 参数为1时切换播放模式,非1不切换
printf("ret = %d\r\n", local_net_ret);
} else if (num == 2) {
if (local_net_ret == 1) {
char buf[] = "STAND-ALONE.mp3";
printf("into local search ,buf = %s\r\n", buf);
local_music_search(buf); //蓝牙点歌,本地搜索歌曲播放
}
} else if (num == 3) {
if (local_net_ret == 1) {
printf("into switch music\r\n");
local_switch_music(arg); //本地切换歌曲 0 上一首 1 下一首
}
} else if (num == 4) {
printf("into stop\r\n");
set_music_play();
} else if (num == 5) {
printf("into step\r\n");
set_music_step(arg);
} else if (num == 6) {
if (local_net_ret == 2) {
printf("into net play music \r\n");
/* net_play_music_file("http://music.163.com/song/media/outer/url?id=512359195.mp3",music_end_handler,0);//通过url 获取网络歌曲, music_end_handler是歌曲播放完成后回调函数 */
net_play_music_file(url, music_end_handler, 0); //通过url 获取网络歌曲, music_end_handler是歌曲播放完成后回调函数
/* net_play_music_file("https://speaker123.s3.us-west-2.amazonaws.com/speaker-admin/batchUpload/speaker-admin/batchUpload/2020-11-19/0d749703-2cd2-46d2-aa19-a35f80b88054.mp3 ",music_end_handler,0);//通过url 获取网络歌曲, music_end_handler是歌曲播放完成后回调函数 */
}
} else if (num == 7) {
if (local_net_ret == 1) {
printf("into get local list\r\n");
local_music_list(); //根据实际情况修改
}
} else if (num == 8) {
if (local_net_ret == 1) {
printf("into get current name\r\n");
printf("current_name = %s\r\n", local_current_name()); //根据实际情况修改
}
} else if (num == 9) {
printf("into volume\r\n");
set_music_volume(arg);
} else if (num == 10) {
printf("into power_off\r\n");
set_power_off();
}
//
if (1) { //success
json_object_object_add(music_node, "name", json_object_new_string("music_name"));
} else {
json_object_object_add(music_node, "name", json_object_new_string("myuanlai"));
}
}
#endif
if (json_object_object_get(second_node, "url")) {
//
if (1) { //success
json_object_object_add(music_node, "url", json_object_new_string("url_test"));
} else {
json_object_object_add(music_node, "url", json_object_new_string("yuanlaui"));
}
}
if (json_object_object_get(second_node, "albumId")) {
//
if (1) { //success
json_object_object_add(music_node, "albumId", json_object_new_string("albumid_test"));
} else {
json_object_object_add(music_node, "albumId", json_object_new_string("yuanlai"));
}
}
if (json_object_object_get(second_node, "albumName")) {
//
if (1) { //success
json_object_object_add(music_node, "albumName", json_object_new_string("213414121"));
} else {
json_object_object_add(music_node, "albumName", json_object_new_string("yuan;lai"));
}
}
json_object_object_add(report_node, "music", music_node);
json_object_put(second_node);
}
if (json_object_object_get_ex(first_node, "light", &second_node)) { //
light_node = json_object_new_object();
if (json_object_object_get(second_node, "color")) {
//
if (1) {
json_object_object_add(light_node, "color", json_object_new_string("red"));
} else {
json_object_object_add(light_node, "color", json_object_new_string("yuanlai"));
}
}
if (json_object_object_get(second_node, "bright")) {
//
if (1) {
json_object_object_add(light_node, "bright", json_object_new_int(15));
} else {
json_object_object_add(light_node, "bright", json_object_new_int(26));
}
}
json_object_object_add(report_node, "light", light_node);
json_object_put(second_node);
}
if (json_object_object_get_ex(first_node, "voice", &second_node)) { //
voice_node = json_object_new_object();
if (json_object_object_get(second_node, "playVolume")) {
//
if (0) {
json_object_object_add(voice_node, "playVolume", json_object_new_string("voluime_num"));
} else {
json_object_object_add(voice_node, "playVolume", json_object_new_string("vyuanlaui"));
}
}
if (json_object_object_get(second_node, "playSwitch")) {
//
if (1) {
json_object_object_add(voice_node, "playSwitch", json_object_new_string("swtich_num"));
} else {
json_object_object_add(voice_node, "playSwitch", json_object_new_string("yuanlaim"));
}
}
json_object_object_add(report_node, "voice", voice_node);
json_object_put(second_node);
}
if (json_object_object_get_ex(first_node, "timer", &second_node)) { //
timer_node = json_object_new_object();
if (json_object_object_get(second_node, "region")) {
//
if (1) {
json_object_object_add(timer_node, "region", json_object_new_int(12));
} else {
json_object_object_add(timer_node, "region", json_object_new_int(8));
}
}
if (json_object_object_get(second_node, "year")) {
//
if (1) {
json_object_object_add(timer_node, "year", json_object_new_int(2002));
} else {
json_object_object_add(timer_node, "year", json_object_new_int(2020));
}
}
if (json_object_object_get(second_node, "month")) {
//
if (1) {
json_object_object_add(timer_node, "month", json_object_new_int(12));
} else {
json_object_object_add(timer_node, "month", json_object_new_int(8));
}
}
if (json_object_object_get(second_node, "day")) {
//
if (1) {
json_object_object_add(timer_node, "day", json_object_new_int(12));
} else {
json_object_object_add(timer_node, "day", json_object_new_int(8));
}
}
if (json_object_object_get(second_node, "second")) {
//
if (1) {
json_object_object_add(timer_node, "second", json_object_new_int(12));
} else {
json_object_object_add(timer_node, "second", json_object_new_int(8));
}
}
json_object_object_add(report_node, "timer", timer_node);
json_object_put(second_node);
}
if (json_object_object_get_ex(first_node, "alarm", &second_node)) { //
alarm_node = json_object_new_object();
if (json_object_object_get(second_node, "year")) {
//
if (1) {
json_object_object_add(alarm_node, "year", json_object_new_int(2002));
} else {
json_object_object_add(alarm_node, "year", json_object_new_int(2020));
}
}
if (json_object_object_get(second_node, "month")) {
//
if (1) {
json_object_object_add(alarm_node, "month", json_object_new_int(12));
} else {
json_object_object_add(alarm_node, "month", json_object_new_int(8));
}
}
if (json_object_object_get(second_node, "day")) {
//
if (1) {
json_object_object_add(alarm_node, "day", json_object_new_int(12));
} else {
json_object_object_add(alarm_node, "day", json_object_new_int(8));
}
}
if (json_object_object_get(second_node, "second")) {
//
if (1) {
json_object_object_add(alarm_node, "second", json_object_new_int(12));
} else {
json_object_object_add(alarm_node, "second", json_object_new_int(8));
}
}
if (json_object_object_get(second_node, "playVolume")) {
//
if (1) {
json_object_object_add(alarm_node, "playVolume", json_object_new_int(12));
} else {
json_object_object_add(alarm_node, "playVolume", json_object_new_int(8));
}
}
if (json_object_object_get(second_node, "bright")) {
//
if (1) {
json_object_object_add(alarm_node, "bright", json_object_new_int(12));
} else {
json_object_object_add(alarm_node, "bright", json_object_new_int(8));
}
}
json_object_object_add(report_node, "alarm", alarm_node);
json_object_put(second_node);
}
third_node = json_object_new_object();
state_node = json_object_new_object();
//在这里拼接update的字符串
json_object_object_add(state_node, "reported", report_node);
json_object_object_add(third_node, "state", state_node);
log_info("report_buf = %s", json_object_get_string(third_node));
//上传更新下状态
aws_status_update(json_object_get_string(third_node));
log_info("status update success!");
}
if (root_node) {
json_object_put(root_node);
}
/* if(third_node){ */
/* json_object_put(third_node); */
/* } */
#endif
os_mutex_post(&aws_mutex);
}
//mqtt连接函数
static int aws_mqtt_connect()
{
char topic[128] = {0};
//1.初始化TLS
NetWorkSetTLS(&network);
//2.初始化回调函数
SetNetworkCb(&network, NULL, NULL);
printf("---%s---%s---%d CA = \n%s PEM = \n%s KEY= \n%s\n\r", __FILE__, __func__, __LINE__, CAS_PEM_PATH, CLI_PEM_PATH, PKEY_PATH);
//3.添加证书
NetWorkSetTLS_key(&network, CAS_PEM_PATH, strlen(CAS_PEM_PATH), CLI_PEM_PATH, strlen(CLI_PEM_PATH), PKEY_PATH, strlen(PKEY_PATH));
//4.连接sock
if (0 != ConnectNetwork(&network, AWS_IOT_ENDPOINT, AWS_MQTT_PORT)) {
printf("---%s---%s---%d \n\r", __FILE__, __func__, __LINE__);
network.disconnect(&network);
return -1;
}
//5.设置连接超时时间
SetNetworkRecvTimeout(&network, 1000);
//6.初始化mqtt
MQTTClient(&client, &network, 1000, send_buffer, BUF_SIZE, recv_buffer, BUF_SIZE);
//7.设置mqtt参数
u8 mac_addr[6];
wifi_get_mac(mac_addr);
char clientid[20] = {0};
sprintf(clientid, "%02x%02x%02x%02x%02x%02x", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
printf("---%s---%s---%d client = %s\n\r", __FILE__, __func__, __LINE__, clientid);
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
data.MQTTVersion = 4;
data.clientID.cstring = clientid;
data.keepAliveInterval = 10;
data.cleansession = 1;
data.willFlag = 0;
//8.连接mqtt
if (0 != MQTTConnect(&client, &data)) {
printf("---%s---%s---%d \n\r", __FILE__, __func__, __LINE__);
network.disconnect(&network);
return -1;
}
//9.订阅主题
//不需要的订阅可以删除
if (0 != MQTTSubscribe(&client, TOPIC3, AWS_QOS, callback)) {
printf("---%s---%s---%d \n\r", __FILE__, __func__, __LINE__);
MQTTDisconnect(&client);
network.disconnect(&network);
return -1;
}
if (0 != MQTTSubscribe(&client, TOPIC4, AWS_QOS, callback)) {
printf("---%s---%s---%d \n\r", __FILE__, __func__, __LINE__);
MQTTDisconnect(&client);
network.disconnect(&network);
return -1;
}
if (0 != MQTTSubscribe(&client, TOPIC5, AWS_QOS, NULL)) {
printf("---%s---%s---%d \n\r", __FILE__, __func__, __LINE__);
MQTTDisconnect(&client);
network.disconnect(&network);
return -1;
}
if (0 != MQTTSubscribe(&client, TOPIC6, AWS_QOS, callback)) {
printf("---%s---%s---%d \n\r", __FILE__, __func__, __LINE__);
MQTTDisconnect(&client);
network.disconnect(&network);
return -1;
}
if (0 != MQTTSubscribe(&client, TOPIC7, AWS_QOS, delta_callback)) {
printf("---%s---%s---%d \n\r", __FILE__, __func__, __LINE__);
MQTTDisconnect(&client);
network.disconnect(&network);
return -1;
}
if (0 != MQTTSubscribe(&client, TOPIC8, AWS_QOS, NULL)) {
printf("---%s---%s---%d \n\r", __FILE__, __func__, __LINE__);
MQTTDisconnect(&client);
network.disconnect(&network);
return -1;
}
/* aws_shadow_get_info(); */
/* aws_shadow_update_info(); */
log_info("success");
client_connected = TRUE;
return 0;
}
//创建mqtt线程
void aws_mqtt_task()
{
#ifdef USE_SD_FILE
while (!storage_device_ready()) {
os_time_dly(10);
puts("wait storage_device_ready ");
}
#endif
u8 rc;
u32 delay_cnt = 0, delay = 500;
os_mutex_create(&aws_mutex);
while (1) {
if (client_connected == FALSE) {
if (delay_cnt) {
--delay_cnt;
os_time_dly(50);
continue;
} else {
if (delay < 16 * 1000) {
delay <<= 1;
}
delay_cnt = delay / 500;
}
aws_mqtt_connect();
} else {
/* int msg[32]; */
/* os_taskq_accept(ARRAY_SIZE(msg), msg); */
rc = MQTTYield(&client, 1000);
if (rc) {
MQTTDisconnect(&client);
network.disconnect(&network);
client_connected = FALSE;
}
}
}
}
//https,暂时用不到
void aws_shadow_get_info(void)
{
int ret;
char url[256] = {0};
/* char buf[1024] = {0}; */
char *buf = (char *)calloc(1, 1024);
http_body_obj http_recv_body = {0};
httpcli_ctx ctx = {0};
http_recv_body.recv_len = 0;
http_recv_body.buf_len = 1024;
http_recv_body.buf_count = 1;
strcpy(url, "https://"AWS_IOT_ENDPOINT"/things/test_thing/shadow?name=123");
http_recv_body.p = buf;
//添加证书
HttpsSetTLS_key(&ctx, CAS_PEM_PATH, CLI_PEM_PATH, PKEY_PATH);
ctx.wait_content_length = 1;
ctx.timeout_millsec = 5000;
ctx.priv = &http_recv_body;
ctx.url = url;
ctx.connection = "close";
ret = httpcli_get(&ctx);
if (ret) {
printf("%s %d , ret = %d\r\n", __func__, __LINE__, ret);
return;
}
if (http_recv_body.p != NULL) {
log_info("http_buf = %s\r\n", (unsigned char *)http_recv_body.p);
}
}
void aws_shadow_update_info(void)
{
int ret;
char url[256] = {0}, buf[1024] = {0};
json_object *root_node = NULL;
http_body_obj http_recv_body = {0};
httpcli_ctx ctx = {0};
http_recv_body.recv_len = 0;
http_recv_body.buf_len = 1024;
http_recv_body.buf_count = 1;
strcpy(url, "https://"AWS_IOT_ENDPOINT"/things/test_thing/shadow?name=123");
http_recv_body.p = buf;
//添加证书
HttpsSetTLS_key(&ctx, CAS_PEM_PATH, CLI_PEM_PATH, PKEY_PATH);
char post_buf[1024] = "{\"state\":{\"color\":\"22\",\"power\":\"on\"}}";
ctx.data_format = "application/json";
ctx.data_len = strlen(post_buf);
ctx.post_data = post_buf;
ctx.wait_content_length = 1;
ctx.timeout_millsec = 5000;
ctx.priv = &http_recv_body;
ctx.url = url;
ctx.connection = "close";
ret = httpcli_post(&ctx);
if (ret) {
printf("%s %d , ret = %d\r\n", __func__, __LINE__, ret);
return;
}
if (http_recv_body.p != NULL) {
log_info("buf = %s\r\n", (unsigned char *)http_recv_body.p);
}
}
//应用程序入口,需要运行在STA模式下
static void c_main()
{
if (thread_fork("aws_mqtt_task", 20, 2048, 512, NULL, aws_mqtt_task, NULL)) {
printf("thread fork fail\n");
}
}
late_initcall(c_main);
#endif