718 lines
28 KiB
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
|