腾讯IOT之树莓派物联网设备

作者: 段小辉


目录

  • [腾讯IOT之树莓派物联网设备]
  • [架构图]
  • [硬件配置]
  • [软件配置]
  • [Tecent IOT 开发平台的使用]
    • [新建项目]
    • [新建产品]
    • [添加自定义功能]
    • [设备开发]
    • [微信小程序配置]
    • [面板配置]
    • [新建设备]
    • [使用设备]
    • [在线调试]
    • [设备日志]
  • [树莓派Java开发]
    • [创建项目]
    • [配置maven文件]
    • [项目文件配置]
    • [代码编写]
    • [代码打包]
  • [程序运行]
    • [微信小程序控制]
  • [总结]
    • [参考]


腾讯IOT之树莓派物联网设备

本次实验的目的是将树莓派 设置为一个物联网终端,通过微信小程序可以控制树莓派,实现蜂鸣器的开关。

微信小程序界面如下所示,点击这个开关,就可以控制蜂鸣器。

项目地址:https://github.com/xiaohuiduan/IotForTecentBeep

架构图

一图胜千言:

硬件配置

  1. 树莓派
  2. 蜂鸣器

在这里将树莓派接的是GPIO_00,使用的树莓派是树莓派4B版本。不同的树莓派的GPIO接口可能不同,可以根据自己的需要按情况考虑。

实物图如下所示,VCC——3.3V ,GND ——GND,IO——GPIO_00(低电平触发)

软件配置

编程语言使用的是Java,也就是说将使用Java实现腾讯云IOT平台的连接和树莓派GPIO口的控制。使用的IDE是IntelliJ IDEA

Tecent IOT 开发平台的使用

Tecent IOT开发平台的官方参考文档网址:https://cloud.tencent.com/document/product/1081,不过个人觉得其文档对于Java SDK的描述不够详细,建议去看其 Demo源码才能明白其工作流程。

腾讯云IOT开发平台的项目结构如下所示:分为两层——项目产品。在使用其平台的时候,既需要创建project,也需要创建product。

们可以将项目 理解为智能家居整个系统,因此在项目中有很多产品 ,比如说智能空调,智能报警器等等产品。而在空调中有温度、湿度等属性 ,同时也有着开关等控制器

而在这篇博客中,项目名称是物联网实训 ,产品名为树莓派 ,但是树莓派只有一个功能 ——控制蜂鸣器。也就是说,没有属性 ,只有控制器

新建项目

打开网址:https://console.cloud.tencent.com/iotexplorer新建项目,项目名称随意就行,创建好项目后,进入项目,然后创建产品。

新建产品

创建产品的选项如下:

  • 设备:因为们是准备将树莓派作为一台设备来使用的,因此,应该选择“设备”,当然,如果是准备将它作为网关,则看着选就行了。
  • 认证方式:认证方式选择密钥认证,这样在代码中间直接写设备的密码就行,比证书稍微方便一点(不过实际上证书方便一点)。
  • 数据协议:使用数据模板即可。

添加自定义功能

物联网设备,之所以叫物联网,是因为大家想把传感器获得的数据放在云端,或者通过云端去控制物联网设备。那么放什么数据,控制什么功能,则需要们去定义。这里选择控制树莓派上面的蜂鸣器,因此只需要定义蜂鸣器即可。

在腾讯IOT中,可以使用新建功能定义这些功能。选择属性 ,数据类型选择布尔型 (因为只有控制蜂鸣器的开/关)。请记住这个标识符beep_switch,这个将在后面的代码中用到。

关于功能类型的不同,可以参考下面的表格。(不过在个人看来,在他的官方 Demo 中,无论是物联设备的数据(比如说温度湿度),还是物联网的控制(比如说灯的开关),它都定义成为了属性。也就是说,尽管 蜂鸣器的开关 是人为下发的控制,但是还是定义为属性。至于事件和行为有什么作用,也不清楚……)

以下来自官方文档

| 功能元素 | 功能描述 | 功能标识符 |

|------|----------------------------------------------------------------------------|--------------|

| 属性 | 用于描述设备的实时状态,支持读取和设置,如模式、亮度、开关等。 | PropertiesId |

| 事件   | 用于描述设备运行时的事件,包括告警、信息和故障等三种事件类型,可添加多个输出参数,如环境传感器检测到空气质量很差,空调异常告警等。          | EventId      |

| 行为 | 用于描述复杂的业务逻辑,可添加多个调用参数和返回参数,用于让设备执行某项特定的任务,例如,开锁动作需要知道是哪个用户在什么时间开锁,锁的状态如何等。 | ActionId |

点击下一步,进入设备开发。

设备开发

因为这里使用的是Java SDK进行开发,没有使用模组也没有基于OS开发,因此直接点击下一步。

image-20210106165342612

点击下一步就到了微信小程序配置。 微信小程序配置

腾讯IOT平台相比较于其他平台,有一个很大的特点就是可以很好的支持小程序。也就是说,在开发的阶段,就可以使用小程序去验证设备的功能。并且这个微信小程序不需要自己写样式代码,只需要进行简单的配置,就可以直接从小程序上面看到物联网设备的数据。

因为这里们使用的数据很简单,只有开关,所以随便配置一下面板即可。

面板配置

这里面板类型选择标准面板,简单的配置一下开关即可,效果图如右图所示。

保存退出之后,就进入到新建设备功能页面。 新建设备

新建设备`的意义:创建一个设备代表启动了一个账号(这个设备会提供一个密钥),们的设备使用这个密钥,就可以让们的设备连接腾讯云IOT平台进行数据交互。

从现实意义来说,就是手中有一个树莓派,需要让它连接腾讯云IOT平台,就需要账号密码,所以就需要创建一个设备。

新建设备的步骤如下所示:

使用设备

点击 my_pi ,进入设备管理。

设备管理界面如下所示:

  • 设备信息:这里面是设备的一些基本属性,其中通过设备名称设备密钥,和产品ID就可以唯一定位一个设备,然后对其进行操作。
  • 设备日志:设备日志里面保存着设备的上行和下行数据。
  • 在线调试:通过在线调试,可以模拟设备的行为,或者对设备下发控制命令。

在线调试

可以使用在线的调试功能对物联网设备进行功能下发。(比如说下发开关数据,控制蜂鸣器的开关)

设备日志

可以在设备中看到物联网设备与云平台之间的上行和下行数据。

🆗,以上的所有就是腾讯IOT平台的介绍,通过上面的操作,就可以创建一个设备,获得其name,key,id,然后对其进行开发。

树莓派Java开发

针对于树莓派开发,相信大家听过最多的都是Python开发,使用Python去控制树莓派的GPIO口,但是,因为腾讯提供的平台没有Python的SDK,因此,只能选择Java去控制树莓派的GPIO口。 Pi4j是一个专门用来控制树莓派GPIO口的设备。关于使用安装可以去看树莓派—JAVA操作GPIO(不过基本上比较新的树莓派系统都不需要安装了)。

因为们是在Windows平台开发然后在树莓派上面运行Java程序(打包成jar运行),因此需要在树莓派上面安装Java环境(不过一般来说树莓派都自带了Java环境)。 创建项目

使用IDEA创建maven项目。

通过上述操作就创建一个Java maven项目。 配置maven文件

然后配置maven文件,也就是pom.xml,在其中导入依赖库,以及进行配置。

具体配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <!--注意,此处必须是main()方法对应类的完整路径  -->
                            <mainClass>Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>assembly</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <!--    生成的包名-->
    <groupId>org.example</groupId>
    <artifactId>IotForTecentBeep</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--    添加依赖库-->
    <dependencies>
        <!--        腾讯IOT库-->
        <dependency>
            <groupId>com.tencent.iot.explorer</groupId>
            <artifactId>explorer-device-java</artifactId>
            <version>1.0.0</version>
        </dependency>
        <!--        树莓派GPIO 库-->
        <dependency>
            <groupId>com.pi4j</groupId>
            <artifactId>pi4j-core</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>
</project>

项目文件配置

在项目的目录下面添加data.json文件。

data.json需要存放一些数据。这个数据实际上就是自定义功能的json数据,从页面复制之后粘贴到data.json文件中即可。

代码编写

使用Java编写代码,具体的解释可以看代码中间的注释。不过要注意,需要根据自己的设备情况更改如下的信息。

同时,在这个地方需要根据自己的情况修改。(尽管在云平台中定义的是布尔型数据,但是实际上腾讯云发送过来的是int类型数据。)

在代码中要注意,必须 先订阅(也就是执行subscribeTopic函数),才能够进行接收到平台发送过来的数据。

import com.pi4j.io.gpio.*;
import com.tencent.iot.explorer.device.java.common.Status;
import com.tencent.iot.explorer.device.java.data_template.TXDataTemplateDownStreamCallBack;
import com.tencent.iot.explorer.device.java.mqtt.TXMqttActionCallBack;
import com.tencent.iot.explorer.device.java.server.samples.data_template.DataTemplateSample;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.json.JSONObject;
/**
 * @author XiaoHui
 */
public class Main {
    /**
     * IOT平台URL
     */
    public static String mBrokerURL = "ssl://iotcloud-mqtt.gz.tencentdevices.com:8883";
    /**
     * 产品ID
     */
    public static String mProductID = "64ONICJ3N8";
    /**
     * 设备名称
     */
    public static String mDevName = "my_pi";
    /**
     * 设备密钥
     */
    public static String mDevPSK = "1ktYq8uojYiuJgX7iZxAoQ==";
    /**
     * 储存属性的json文件名
     */
    public static String mJsonFileName = "data.json";
    private static DataTemplateSample mDataTemplateSample;
    /**
     * 获得GPIO的控制器
     */
    public static final GpioController gpio = GpioFactory.getInstance();
    /**
     * GPIO输出,使用GPIO_00 ,默认输出为High
     */
    public static final GpioPinDigitalOutput beep = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_00, "beep", PinState.HIGH);
    public static void main(String[] args) {
        // CallBack 代表的是MQTT协议的回调函数,MyDownCallback代表的是IOT平台下发消息的回调
        mDataTemplateSample = new DataTemplateSample(mBrokerURL, mProductID, mDevName, mDevPSK,
                null, null, new CallBack(), mJsonFileName, new MyDownCallback());
        // 进行连接
        mDataTemplateSample.connect();
        // 进行订阅,只有订阅后,消息才能下发。
        mDataTemplateSample.subscribeTopic();
        mDataTemplateSample.propertyClearControl();
    }
    /**
     * MQTT的回调函数,可以不用管
     */
    public static class CallBack extends TXMqttActionCallBack {
        @Override
        public void onConnectCompleted(Status status, boolean reconnect, Object userContext, String msg) {
        }
        @Override
        public void onConnectionLost(Throwable cause) {
        }
        @Override
        public void onDisconnectCompleted(Status status, Object userContext, String msg) {
        }
        @Override
        public void onPublishCompleted(Status status, IMqttToken token, Object userContext, String errMsg) {
        }
        @Override
        public void onSubscribeCompleted(Status status, IMqttToken asyncActionToken, Object userContext, String errMsg) {
        }
        @Override
        public void onMessageReceived(final String topic, final MqttMessage message) {
        }
    }
    /**
     * 实现下行消息处理的回调接口
     */
    private static class MyDownCallback extends TXDataTemplateDownStreamCallBack {
        @Override
        public void onReplyCallBack(String msg) {
        }
        @Override
        public void onGetStatusReplyCallBack(JSONObject data) {
        }
        /**
         * 在微信小程序点击关闭按钮后,IOT平台会向树莓派发送命令消息,此命令消息会在这这里进行回调
         * beep是低电平触发!!!!!!!!!!!!
         *
         * @param msg 接收到的消息。
         * @return
         */
        @Override
        public JSONObject onControlCallBack(JSONObject msg) {
            // 获得开关的数据,beep_switch是开关的标识符。尽管们在云平台中定义的是布尔型数据,但是实际上腾讯云发送过来的是int类型数据。
            int power = msg.getInt("beep_switch");
            // 打开开关
            if (power == 1) {
                beep.low();
                System.out.println("打开");
                // 关闭蜂鸣器
                beep.high();
                System.out.println("关闭");
            }
            // 返回消息
            JSONObject result = new JSONObject();
            result.put("code", 0);
            result.put("status", "ok");
            return result;
        }
        @Override
        public JSONObject onActionCallBack(String actionId, JSONObject params) {
           return null;
        }
    }
}

代码打包

因为们的代码是在windows上面编译的,因此需要将其编译成jar文件,这个也就是之前配置pom.xml文件的原因。IDEA上面编译还是挺简单的,如下图所示:

经过如上的操作们就将项目编译成了jar包,jar包在target目录下。

程序运行

将编译好的jar文件放到树莓派中,使用VNC或者XShell皆可。然后在jar包文件目录下使用如下命令:

java -jar 包名

此次项目生成的包名为IotForTecentBeep-1.0-SNAPSHOT.jar,因此命令如下所示:

当程序运行起来的时候,就可以在微信小程序或者在线调试工具中对蜂鸣器进行控制。 微信小程序控制

前面说了,可以是用微信小程序对开发的物联网设备进行开发调试,然后在如下的页面得到设备的二维码。

然后打开"腾讯连连"小程序,对二维码进行扫描,即可将设备加入。

点击中间的按钮就可以实现对蜂鸣器的控制了!!!

总结

相比较于上一篇腾讯IOT安卓开发初探,这一次实现消息的下发接收控制。不过有一说一,官方文档是真的坑,连一个比较详细的说明文档都没有,还得自己一个一个Debug,查看为什么消息发送失败,查看为什么没有接收到下发的消息…… GitHub:https://github.com/xiaohuiduan/IotForTecentBeep 参考

  1. 腾讯IOT安卓开发初探
  2. 物联网开发平台使用文档:物联网开发平台 - 文档中心 - 腾讯云 (tencent.com)
  3. Github:iot-device-java
  4. 树莓派4的GPIO接口介绍 – 八色木 (basemu.com)
  5. 树莓派—JAVA操作GPIO

    原文创作:段小辉

    原文链接:https://www.cnblogs.com/xiaohuiduan/p/14260353.html

文章列表

更多推荐

更多
  • .NET人工智能教程-四、使用自然语言理解 什么是 NLU?,自然语言理解的历史,为什么机器很难理解自然语言,语言理解智能服务(LUIS),为 LUIS 获取 Azure 订阅,演示:定义应用,概述,自然语言的复杂性,统计模型作为解决方案是不够的,充满希望的未来,基于 LUIS
    Apache CN

  • .NET人工智能教程-十、人工智能的未来 AI 为什么这么受欢迎?,改进的计算能力,人工智能算法的发明,数据是新的货币,云计算的出现,服务 vs 解决方案?,认知类别,NLU 的挑战和未来,演讲的挑战和未来,搜索的挑战和未来,挑战和建议的未来,AI 优先,智能边缘,将被淘汰的是
    Apache CN

  • .NET人工智能教程-七、与语音 API 交互 与语音互动的方式,入门指南,首先获取 JSON Web 令牌,消费者语音 API,语音合成,定制语音服务,说话人识别,摘要,认知搜索 API,语音识别,语音识别内部,定制声学模型,自定义语言模型,发音数据,自定义语音转文本端点,说话人验
    Apache CN

  • .NET人工智能教程-五、探索认知语言模式 iamfeanggoodgermanyvsargentinafootballliveepic fail,Bing 拼写检查 API,文本分析 API,Web 语言模型(WebLM) API,语言分析 API,概述,这是什么?
    Apache CN

  • .NET人工智能教程-一、人工智能基础入门 真实与虚构,历史和演变,微软和人工智能,基本概念,微软的认知服务,概述,当前的事态,人工智能的商品化,机器学习,语言,演讲,计算机视觉,视力,演讲,语言,知识,搜索, 想象一下,创建一个如此智能的软件,它不仅能理解人类语言,还能理解俚语
    Apache CN

  • .NET人工智能教程-三、使用微软技术构建对话式用户界面 什么是对话式用户界面?,简史,设计原则,微软机器人框架,使用 Bot 框架创建 CUI 应用,概述,一开始:命令行界面(CLI),然后是图形用户界面,UI 又一次进化了:对话式用户界面,艾在《崔》中的角色,崔的陷阱,混合用户界面(CUI
    Apache CN

  • .NET人工智能教程-二、在 Visual Studio 中创建基于人工智能的应用 使用认知服务的先决条件,设置开发环境,获取认知服务的 Azure 订阅密钥,测试 API,创建你的第一个基于人工智能的应用,让你的应用更有趣,概述,步骤 1:设置 Azure 帐户,步骤 2:创建一个新的认知服务帐户,步骤 3:获取订阅
    Apache CN

  • .NET人工智能教程-八、应用搜索产品 搜索无处不在,普及、预测、主动(搜索的三个 p),冰的历史,必应有什么独特之处?,搜索 API,Bing 图像搜索 API,Bing 新闻搜索 API,Bing 视频搜索 API,如何使用 Bing 视频搜索 API,Bing 网络搜索
    Apache CN

  • .NET人工智能教程-九、使用建议 了解基础知识,经常汇集(FBT)的建议,逐项,基于过去历史的建议,这些建议是如何起作用的?,模型和类型,建议构建,经常聚集在一起(FBT)建设,排名,SAR(智能自适应)构建,在构建中设置规则,离线评估,用户界面,摘要, 机器学习无处不
    Apache CN

  • .NET人工智能教程-六、消费和应用 LUIS 规划您的应用,创建 LUIS 应用,添加意图,添加/标记话语,发布您的应用,添加实体,添加短语列表,建议的后续步骤,LUIS 与 Bot 框架的集成,将您的机器人添加到 Skype,概述,机器人应该能做什么?,机器人需要用户提供什么信息
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多