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

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

阿里SDK开发

前面我们用开源的mqtt协议库登录了阿里云,其实阿里这边也封装好了linux的开源sdk,我们可以拿sdk来开发,更便捷,更好的数据处理。
获取sdk很简单,物联网平台,文档与工具,link sdk sdk定制。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
生成后代码架构如图。
在这里插入图片描述
大体看了下代码,
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,云端接收成功后发过来的应答。
下图我设置属性后,收到了云端的打印。
在这里插入图片描述
AIOT_DMRECV_PROPERTY_SET 这是对"/sys/+/+/thing/service/property/set"的订阅,用于云端设置设备端的操作。Android App操作时,我在云产品流转里,把Android App上报的topic转发到了设备的这个topic,有个地方要注意,android上报的topic 不能用
thing/event/property/post,云端在流转物模型topic时会做数据处理,设备端是收不到数据的,所以用自定义topic上传数据然后流转。
在这里插入图片描述
为啥收不到数据呢?我看了下,
_dm_recv_property_set_handler 这个hander里处理数据的时候 会取json数据的id 以及params做判断,如果没有这两个key,那么AIOT_DMRECV_PROPERTY_SET这里是收不到数据的。
在这里插入图片描述
在这里插入图片描述
关于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";

云产品中规则如下
在这里插入图片描述
这样,app上报topic时候,就能收到数据了。
在这里插入图片描述
设备端上报属性就简单了,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。

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值