树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制

树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制(四)

阿里SDK开发

前面我们用开源的mqtt协议库登录了阿里云,其实阿里这边也封装好了linux的开源sdk,我们可以拿sdk来开发,更便捷,更好的数据处理。
获取sdk很简单,物联网平台,文档与工具,link sdk sdk定制。
树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制_第1张图片
树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制_第2张图片
树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制_第3张图片
生成后代码架构如图。
树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制_第4张图片
大体看了下代码,
demos里面 mqtt_basic_demo.c,data_model_basic_demo.c 这两个文件对我们很重要。
mqtt_basic_demo.c 是mqtt协议登录阿里云的操作,
data_model_basic_demo.c 是针对mqtt协议的一个封装,很好的接收和发送物模型数据,因为我们云端建立的设备模型就是物模型啊。

看接收云端数据处理函数

static void demo_dm_recv_handler(void *dm_handle, const aiot_dm_recv_t *recv, void *userdata)
{
    //iot_info("demo_dm_recv_handler, type = %d\r\n", recv->type);

    switch (recv->type) {
    }
}    

这里的recv->type定义了几种消息类型
只说两种:
AIOT_DMRECV_GENERIC_REPLY 这是对topic “/sys/+/+/thing/event/+/post_reply” 的订阅,这是设备上报属性时的一个应答,比如设置温度30,云端接收成功后发过来的应答。
下图我设置属性后,收到了云端的打印。
树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制_第5张图片
AIOT_DMRECV_PROPERTY_SET 这是对"/sys/+/+/thing/service/property/set"的订阅,用于云端设置设备端的操作。Android App操作时,我在云产品流转里,把Android App上报的topic转发到了设备的这个topic,有个地方要注意,android上报的topic 不能用
thing/event/property/post,云端在流转物模型topic时会做数据处理,设备端是收不到数据的,所以用自定义topic上传数据然后流转。
树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制_第6张图片
为啥收不到数据呢?我看了下,
_dm_recv_property_set_handler 这个hander里处理数据的时候 会取json数据的id 以及params做判断,如果没有这两个key,那么AIOT_DMRECV_PROPERTY_SET这里是收不到数据的。
树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制_第7张图片
树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制_第8张图片
关于topic的定义,再dm_init的时候就完成了

static const dm_send_topic_map_t g_dm_send_topic_mapping[AIOT_DMMSG_MAX] = {
    {
        "/sys/%s/%s/thing/event/property/post",
        _dm_send_property_post
    },
    {
        "/sys/%s/%s/thing/event/%s/post",
        _dm_send_event_post
    },
    {
        "/sys/%s/%s/thing/service/property/set_reply",
        _dm_send_property_set_reply
    },
    {
        "/sys/%s/%s/thing/service/%s_reply",
        _dm_send_async_service_reply
    },
    {
        "/ext/rrpc/%s/sys/%s/%s/thing/service/%s",
        _dm_send_sync_service_reply
    },
    {
        "/sys/%s/%s/thing/model/up_raw",
        _dm_send_raw_data
    },
    {
        "/ext/rrpc/%s/sys/%s/%s/thing/model/down_raw",
        _dm_send_raw_service_reply
    },
    {
        "/sys/%s/%s/thing/property/desired/get",
        _dm_send_desired_get
    },
    {
        "/sys/%s/%s/thing/property/desired/delete",
        _dm_send_desired_delete
    }
};

static const dm_recv_topic_map_t g_dm_recv_topic_mapping[] = {
    {
        "/sys/+/+/thing/event/+/post_reply",
        _dm_recv_generic_reply_handler,
    },
    {
        "/sys/+/+/thing/service/property/set",
        _dm_recv_property_set_handler,
    },
    {
        "/sys/+/+/thing/service/+",
        _dm_recv_async_service_invoke_handler,
    },
    {
        "/ext/rrpc/+/sys/+/+/thing/service/+",
        _dm_recv_sync_service_invoke_handler,
    },
    {
        "/sys/+/+/thing/model/down_raw",
        _dm_recv_raw_data_handler,
    },
    {
        "/sys/+/+/thing/model/up_raw_reply",
        _dm_recv_raw_data_handler,
    },
    {
        "/ext/rrpc/+/sys/+/+/thing/model/down_raw",
        _dm_recv_raw_sync_service_invoke_handler,
    },
    {
        "/sys/+/+/thing/property/desired/get_reply",
        _dm_recv_generic_reply_handler,
    },
    {
        "/sys/+/+/thing/property/desired/delete_reply",
        _dm_recv_generic_reply_handler,
    },
};

在这里直接返回了。
Android App我自定义了topic

   private final String mPubTopic = "/a1MYNH5rUtw/Android/user/set/raspberrypi/light";

云产品中规则如下
树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制_第9张图片
这样,app上报topic时候,就能收到数据了。
树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制_第10张图片
设备端上报属性就简单了,demo里封装了函数

/* 属性上报函数演示 */
int32_t demo_send_property_post(void *dm_handle, char *params)
{
    aiot_dm_msg_t msg;

    memset(&msg, 0, sizeof(aiot_dm_msg_t));
    msg.type = AIOT_DMMSG_PROPERTY_POST;
    msg.data.property_post.params = params;

    return aiot_dm_send(dm_handle, &msg);
}

我们在主函数while循环里,读取温湿度,光度,然后上报云端。

     cJSON * item =  cJSON_CreateObject();
        pthread_mutex_lock(&m_mutex);
        get_am2320_data(&temp,&himudity);
        pthread_mutex_unlock(&m_mutex);
       
        pthread_mutex_lock(&m_mutex);
        get_light_value(&light_value);
        pthread_mutex_unlock(&m_mutex);

        iot_info("get_am2320_data temp = %d himudity = %d\n",temp,himudity);
        iot_info("get_bh1750_data light = %d\n",light_value);

        cJSON_AddItemToObject(item,"RoomTemp",cJSON_CreateNumber((float)temp/10.0));
        cJSON_AddItemToObject(item,"RoomHumidity",cJSON_CreateNumber((float)himudity/10.0));
        cJSON_AddItemToObject(item,"RoomLight",cJSON_CreateNumber((light_value * 10)/12));

        iot_info("%s\n",cJSON_Print(item));
        demo_send_property_post(dm_handle,cJSON_Print(item));

这里用cJSON处理了下数据,我觉得sdk会有json处理函数,不过懒得找了,费了一天时间弄这玩意,幸好最近不是很忙啊。
一会再看看android 的sdk。

你可能感兴趣的:(树莓派mqtt,物联网,android,linux)