当前位置:   article > 正文

阿里物联网套件-设备端SDK学习实践(C版-Linux-MQTT)_linux c树莓派 mqtt 阿里云

linux c树莓派 mqtt 阿里云

设备端快速接入(MQTT)

准备工作

1.一个运行Linux系统的设备(或者虚拟机),本人使用raspbian系统的树莓派B+;
2.创建好产品和设备。前面的实践中已经创建了很多产品和设备,选一个设备使用即可。
3.下载解压相应C版Linux下的SDK

Linux下解压zip压缩包命令
unzip xxx.zip
  • 1
  • 2

4.修改样例程序中的产品、设备参数。

cd iotx-sdk-c/
vim sample/mqtt/mqtt.c
//进入编辑模式(按下i键)
//根据你的产品设备信息修改以下参数
#define PRODUCT_KEY         "<你的产品key>"
#define DEVICE_NAME         "<你的设备名>"
#define DEVICE_ID           "<你的设备ID>"
#define DEVICE_SECRET       "<你的设备秘钥>"
//修改完后保存退出。Esc,然后输入 :wq ,回车确认。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

设备信息可点击设备证书查看
这里写图片描述

5.编译SDK

//在当前顶层目录下(iotx-sdk-c文件夹里)
make clean
make
//编译成功后,在相应目录生成可执行程序。
  • 1
  • 2
  • 3
  • 4

这里写图片描述
高亮的mqtt就是可执行文件。
在执行程序前,设备从未启动过,状态为未激活。
这里写图片描述

6.执行样例程序

//在顶层目录下时
./sample/mqtt/mqtt
  • 1
  • 2

demo就开始跑了,只要前面参数填写正确,设备认证就会通过,然后就是周期性发布消息。测试设备处于在线状态。
这里写图片描述

Ctrl+c停止程序运行,此时设备状态为离线。
这里写图片描述

在控制台的相应设备的Topic列表里面可以看到发布消息数量。
这里写图片描述

7.服务端获取MNS消息
官方链接
根据官方的案例调试可行,不赘述。有点不足就是Demo打印的消息内容不直观,修改见下文处理加密的消息
这里写图片描述

处理加密的消息
加密的payload不方便检查消息内容,所以对demo程序作了修改,解析并解码消息。

方法一。转化消息字符串为JSON对象

//创建消息体的对象类
import java.io.Serializable;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

public class MnsMessage implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private String messagetype;
    private String payload;
    private String messageid;
    private String topic;
    private String devicename;
    private String timestamp;
    public String getMessagetype() {
        return messagetype;
    }
    public void setMessagetype(String messagetype) {
        this.messagetype = messagetype;
    }
    public String getPayload() {
        return payload;
    }
    public void setPayload(String payload) {
        this.payload = payload;
    }
    public String getMessageid() {
        return messageid;
    }
    public void setMessageid(String messageid) {
        this.messageid = messageid;
    }
    public String getTopic() {
        return topic;
    }
    public void setTopic(String topic) {
        this.topic = topic;
    }
    public String getDevicename() {
        return devicename;
    }
    public void setDevicename(String devicename) {
        this.devicename = devicename;
    }
    public String getTimestamp() {
        return timestamp;
    }
    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }
    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

引入相关依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.12</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

测试Demo

public class MNSTest {

    public static void main(String[] args) {

        CloudAccount account = new CloudAccount(
                "******",
                "******",
                "************");

        MNSClient client = account.getMNSClient();
        CloudQueue queue = client.getQueueRef("aliyun-iot-******"); //参数请输入IoT自动创建的队列名称
        while (true) {
            // 获取消息
            Message popMsg = queue.popMessage(10); //长轮询等待时间为10秒
            try {
                if (popMsg != null) {
                    String messageBody = popMsg.getMessageBody();
                    //System.out.println("PopMessage Body: "+ messageBody); //获取原始消息
                    MnsMessage parse = JSON.parseObject(messageBody, MnsMessage.class);
                    System.out.println(parse.toString());
                    System.out.println(new String(Base64.decodeBase64(parse.getPayload()), "UTF-8"));
                    queue.deleteMessage(popMsg.getReceiptHandle()); //从队列中删除消息
                } else {
                    System.out.println("Continuing");
                }
            } catch (Exception e) {
                e.printStackTrace();
                break;
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

输出结果截图(以C-linux下的sample发布的消息)
这里写图片描述

方法二。按字符串解析。并不实用,已废弃

public class MNSTest {

    public static void main(String[] args) {

        CloudAccount account = new CloudAccount(
                "******",
                "******",
                "************");

        MNSClient client = account.getMNSClient();
        CloudQueue queue = client.getQueueRef("aliyun-iot-******"); //参数请输入IoT自动创建的队列名称,
        while (true) {
            // 获取消息
            Message popMsg = queue.popMessage(10); //长轮询等待时间为10秒
            if (popMsg != null) {
                String messageBody = popMsg.getMessageBody();
                System.out.println("PopMessage Body: "
                + messageBody); //获取原始消息
                try {
                    System.out.println(getPayLoad(messageBody));//输出解码后的消息内容
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                queue.deleteMessage(popMsg.getReceiptHandle()); //从队列中删除消息
            } else {
                System.out.println("Continuing");
            }
        }
    }

    //解析获取消息内容,然后解码获取明文
    private static String getPayLoad(String messageBody) throws UnsupportedEncodingException{
        int start = messageBody.indexOf("\"payload\":\"");
        int end = messageBody.indexOf("\",\"messageid");
        int length = "\"payload\":\"".length();
        return new String(Base64.decodeBase64(messageBody.substring(start+length, end)), "UTF-8");

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

测试打印结果:
这里写图片描述
“你好”就是BASE64解码5L2g5aW9得到的。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号