腾讯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开发,因此直接点击下一步。

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

微信小程序配置

腾讯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("打开");
} else {
// 关闭蜂鸣器
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

腾讯IOT之树莓派物联网设备的更多相关文章

  1. 基于Azure IoT开发.NET物联网应用系列-全新的Azure IoT架构

    物联网技术已经火了很多年了,业界各大厂商都有各自成熟的解决方案.我们公司主要搞新能源汽车充电,充电桩就是物联网技术的最大应用,车联网.物联网.互联网三网合一.2017年的时候重点研究过Azure Io ...

  2. 物联网设备是如何被破解的?分析一种篡改IoT固件内容的攻击方式

    随着智能硬件进入到人们的生活,人们的生活质量开始有逐步的提高,人们与智能硬件之间的联系更加紧密.同时,智能硬件的安全问题也必须引起高度重视,因为其直接影响到人身安全.社会安全和国家安全.   大家是否 ...

  3. 安天透过北美DDoS事件解读IoT设备安全——Mirai的主要感染对象是linux物联网设备,包括:路由器、网络摄像头、DVR设备,入侵主要通过telnet端口进行流行密码档暴力破解,或默认密码登陆,下载DDoS功能的bot,运行控制物联网设备

    安天透过北美DDoS事件解读IoT设备安全 安天安全研究与应急处理中心(安天CERT)在北京时间10月22日下午启动高等级分析流程,针对美国东海岸DNS服务商Dyn遭遇DDoS攻击事件进行了跟进分析. ...

  4. 【阿里云IoT+YF3300】6.物联网设备报警配置

    纵然5G时代已经在时代的浪潮中展现出了它的身影,但是就目前的物联网环境中,网络问题仍旧是一个比较突出的硬伤.众所周知,在当前的物联网规划中,与其说是实现万物互联,倒不如说是行业指标数据监控.对于一些特 ...

  5. 腾讯IOT安卓开发初探

    目录 腾讯IOT 安卓开发初探 Tecent IOT 开发平台的使用 新建项目 创建产品 添加自定义功能 设备开发 微信小程序配置 面板配置 新建设备 使用设备 安卓开发 前置配置 data.json ...

  6. 云中树莓派(3):通过 AWS IoT 控制树莓派上的 Led

    云中树莓派(1):环境准备 云中树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示 云中树莓派(3):通过 AWS IoT 控制树莓派上的Led 云中树莓派(4):利用声音传感 ...

  7. 阿里云重磅推出物联网设备身份认证Link ID²

     2018年12月19日,阿里云宣布推出新版物联网设备身份认证Link ID²及物联网安全运营中心Link SOC,护航万物智联.   随着越来越多的设备连接到网络中,随之而来的安全问题越来越突出. ...

  8. 基于Coravel定时任务之物联网设备数量统计

    目录 基于Coravel定时任务之物联网设备数量统计 1 应用背景 2 对比各家定时库 2.1 TaskScheduler 2.2 Fluent Scheduler 2.3 Quartz.net 2. ...

  9. 如何用webgl(three.js)搭建处理3D隧道、3D桥梁、3D物联网设备、3D高速公路、三维隧道桥梁设备监控-第十一课

    开篇废话: 跟之前的文章一样,开篇之前,总要写几句废话,大抵也是没啥人看仔细文字,索性我也想到啥就聊啥吧. 这次聊聊疫情,这次全国多地的疫情挺严重的,本人身处深圳,深圳这几日报导都是几十几十的新增病例 ...

随机推荐

  1. secret_key伪造session来进行越权

    从swpuctf里面的一道ctf题目来讲解secret_key伪造session来进行越权. 以前没有遇到过这种题目,这次遇到了之后查了一些资料把它做了出来,记录一下知识点. 参考资料 http:// ...

  2. [BJDCTF 2nd]假猪套天下第一 && [BJDCTF2020]Easy MD5

    [BJDCTF 2nd]假猪套天下第一 假猪套是一个梗吗? 进入题目,是一个登录界面,输入admin的话会返回错误,登录不成功,其余用户可以正常登陆 以为是注入,简单测试了一下没有什么效果 抓包查看信 ...

  3. java中的反射(三)

    目录 一.反射 1.class类 2.访问字段 3.调用方法 4.调用构造方法 5.获取继承对象 6.动态代理 二.sping中的反射 本篇转自:https://depp.wang/2020/05/0 ...

  4. Newbe.ObjectVisitor 0.4.4 发布,模型验证器上线

    Newbe.Claptrap 0.4.4 发布,模型验证器上线. 更新内容 完全基于表达式树的模型验证器 本版本,我们带来了基于表达式树实现的模型验证器.并实现了很多内置的验证方法. 我们罗列了与 F ...

  5. MySQL的验证方式

    mysql8之后root用户的密码验证方式修改了,mysql8的加密方式为caching_sha2_passoword,而navicat连接所用的方式为native_password. 使用命令mys ...

  6. JDK11 下载安装与配置环境变量

    1.jdk11本身也包含jre,不需要安装jre,低版本需要安装jre 2.jdk下载地址:https://www.oracle.com/technetwork/java/javase/downloa ...

  7. 精尽Spring MVC源码分析 - HandlerMapping 组件(一)之 AbstractHandlerMapping

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  8. jenkins 配置任务

    新建筑任务 ""imuke 建一个自由风格的 要执行python .py程序,我们需要把.py所在的目录设置进去 如果保存的是在svn,需要把他的地址放进去 如图: 设置自动构建时 ...

  9. Flink开发中的问题

    1. 流与批处理的区别 流处理系统 流处理系统,其节点间数据传输的标准模型是:当一条数据被处理完成后,序列化到缓存中,然后立刻通过网络传输到下一个节点,由下一个节点继续处理. 批处理系统 批处理系统, ...

  10. phpstorm ext-json is missing in composer.json