本次实验的目的是将树莓派设置为一个物联网终端,经过微信小程序能够控制树莓派,实现蜂鸣器的开关。html
微信小程序界面以下所示,点击这个开关,就能够控制蜂鸣器。java
项目地址:https://github.com/xiaohuiduan/IotForTecentBeepandroid
在这里我将树莓派接的是GPIO_00
,使用的树莓派是树莓派4B版本。不一样的树莓派的GPIO接口可能不一样,能够根据本身的须要按状况考虑。git
实物图以下所示,VCC——3.3V ,GND ——GND,IO——GPIO_00(低电平触发)github
编程语言使用的是Java,也就是说将使用Java实现腾讯云IOT平台的链接和树莓派GPIO口的控制。使用的IDE是IntelliJ IDEA
。apache
Tecent IOT开发平台的官方参考文档网址:https://cloud.tencent.com/document/product/1081,不过我的以为其文档对于Java SDK的描述不够详细,建议去看其 Demo 源码才能明白其工做流程。编程
腾讯云IOT开发平台的项目结构以下所示:分为两层——项目
和 产品
。在使用其平台的时候,既须要建立project,也须要建立product。json
咱们能够将项目理解为智能家居整个系统,所以在项目中有不少产品,好比说智能空调,智能报警器等等产品。而在空调中有温度、湿度等属性,同时也有着开关等控制器。小程序
而在这篇博客中,项目名称是物联网实训,产品名为树莓派,可是树莓派只有一个功能——控制蜂鸣器。也就是说,没有属性,只有控制器。windows
打开网址: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,而后对其进行开发。
针对于树莓派开发,相信你们听过最多的都是Python开发,使用Python去控制树莓派的GPIO口,可是,由于腾讯提供的平台没有Python的SDK,所以,只能选择Java去控制树莓派的GPIO口。
Pi4j是一个专门用来控制树莓派GPIO口的设备。关于使用安装能够去看树莓派---JAVA操做GPIO(不过基本上比较新的树莓派系统都不须要安装了)。
由于咱们是在Windows平台开发而后在树莓派上面运行Java程序(打包成jar运行),所以须要在树莓派上面安装Java环境(不过通常来讲树莓派都自带了Java环境)。
使用IDEA建立maven项目。
经过上述操做就建立一个Java 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