1
参照bbs.tijos.net中提供的阿里云通讯范例(见附件), 并深入学习和调整, 完成本次实验. 云端设置较多, 因此篇幅较长.
实验工具:
钛极小龟开发板, PC及网络
实验步骤:
1. 注册账号
注册阿里云账号并实名(略)
2. 配置物联网设备
2.1 进入平台
在阿里云控制台中, 点击产品与服务, 在"应用服务"分组下找到"物联网平台"并点击进入.
2.2 创建产品
点击设备管理分组下的"产品"菜单, 并点击右侧"创建产品"按钮, 创建名为tikit600, 版本为高级版的产品.
2.3 创建Topic
点击产品右侧操作栏的"查看"按钮, 进入产品详细页面, 再点击"消息通信"标签, 点击右侧的"定义Topic类"按钮, 增加"/user/data","/user/cmd"两个用户自定Topic,操作权限设置为"发布和订阅".
2.4 创建设备
点击设备管理分组下的"设备"菜单, 创建名为tikit-demo的设备, 保存时弹出参数窗口(ProductKey,DeviceName,DeviceSecret), 复制并先保存下来.
3. 获取MQQT参数
创建设备时获取的参数(ProductKey,DeviceName,DeviceSecret)无法直接用来进行MQQT通信, 需要在程序中进行加工处理.
将参数填写到代码如图所示位置, 并启动此应用, 开发板会将MQQT所需的服务器地址,设备标识,用户名,密码输出, 可在MQQT助手中使用此参数进行连接.
4. 连接实验
在MQQT助手中,根据上一步得出的参数,分别填写到如图位置中,然后点击"连接"按钮.
连接成功后, 发现马上自动断开, 历史记录中提示"连接丢失". 开发板信息中出现"connectionLost"提示.
5. 数据转发
5.1 研究分析
针对第4步实验结果,推测应为阿里云官方限制一个设备只可以有一个终端进行连接,而不同的设备无法使用相同的Topic,因此需要找到一个服务端与设备或设备与设备的数据中转方式.
5.2 规则引擎
研究阿里云物联网产品文档时发现, 规则引擎中有一句描述"可以转发到另一个Topic中实现M2M通信", 推断可以通过规则引擎实现两个设备之间的Topic数据通讯.那是否可以将MQQT助手视为设备进行通讯呢?
5.3 创建设备
创建产品tikit600的设备"controller",同样需记录相关参数(ProductKey,DeviceName,DeviceSecret).此设备自动会从产品中获取Topic, 将要使用的是/controller/user/cmd和/controller/user/data两个Topic
5.4 创建规则
我们需要实现从钛极小龟开发板上传数据到云端, 再从云端获取到MQQT助手, 即从设备tikit-demo传输数据至设备controller中, 因此需设置将数据从/tikit-demo/user/data转发到/controller/user/data的规则, 如图:
创建完毕后返回规则列表, 并点击右侧相应规则的"启动"按钮, 此规则即可生效. 需注意的是规则引擎转发的是Json格式数据.
5.5 获取MQQT参数(控制端)
将设备controller的相关参数填写在程序中(DeviceName,DeviceSecret).运行程序以获取MQQT通讯参数(同步骤3),并在MQQT助手中输入参数进行连接.
5.6 测试转发
程序中参数恢复为tikit-demo设备参数,并将程序中数据包装为Json格式(如"{topicValue:'data'}").
启动开发板程序, 并在MQQT助手中订阅Topic"/a1doaOwDSYv/controller/user/data"(Topic第一个字段为ProductKey),可观察到MQQT助手已实时从云端获取到了开发板上传的传感器数据.
至此,已实现 开发板数据->阿里云端->本地 的数据传输过程.
6. 远程控制
6.1 命令转发
上步已实现了从设备端到控制端的数据传输, 那如何实现控制端发送命令到设备端呢? 显而易见, 仍然要通过规则引擎进行转发, 只是转发的方向与之前相反.
从控制端controller传输指令至设备tikit-demo中, 因此需设置将数据从/controller/user/cmd转发到/tikit-demo/user/cmd的规则并启动, 如图:
6.2 控制实现
开发板程序的MqttClientListener.messageArrived用来接收订阅的Topic数据, 需分析并提取控制端发送的指令, 如下:
当接收到OPEN指令时, 继电器吸合, 外设通电.
当接收到CLOSE指令时, 继电器断开, 外设断电.
启动开发板程序及MQQT助手, 并在MQQT助手中向Topic"/a1doaOwDSYv/controller/user/cmd"发送Json格式的指令"{topicCmd:'OPEN'}", 可看到开发板输出此OPEN指令并获取到的继电器状态变为1,同时可听到开发板继电器吸合的咔嗒声.
在MQQT助手中向Topic"/a1doaOwDSYv/controller/user/cmd"发送Json格式的指令"{topicCmd:'CLOSE'}", 可看到开发板输出此CLOSE指令并获取到的继电器状态变为0,同时可听到开发板继电器断开的咔嗒声.
实验完毕, 本次实验实现了钛极小龟开发板与阿里云端通讯及远程控制的目的.可在阿里云控制台看到两台设备均在线, 且有传输数据.
关键代码:
- MqttConnectOptions connOpts = new MqttConnectOptions();
- connOpts.setCleanSession(true);
- connOpts.setKeepAliveInterval(80);
- connOpts.setUserName(USER_NAME);
- connOpts.setPassword(USER_PASS);
-
-
-
- System.err.println(BROKER);
- System.err.println(CLIENT_ID);
- System.err.println(USER_NAME);
- System.err.println(USER_PASS);
-
-
- connOpts.setAutomaticReconnect(true);
-
- MqttClient mqttClient = new MqttClient(BROKER, CLIENT_ID);
- mqttClient.SetMqttClientListener(new MqttClientListener() {
-
- @Override
- public void unsubscribeCompleted(Object arg0, int arg1, String arg2, int arg3) {
- //System.err.println("unsubscribeCompleted");
- }
-
- @Override
- public void subscribeCompleted(Object arg0, int arg1, String arg2, int arg3) {
- //System.err.println("subscribeCompleted: " + arg2);
- }
-
- @Override
- public void publishCompleted(Object arg0, int arg1, String arg2, int arg3) {
- //System.err.println("publishCompleted: " + arg2);
- }
-
- @Override
- public void onMqttConnectSuccess(Object arg0) {
- //System.err.println("onMqttConnectSuccess");
- }
-
- @Override
- public void onMqttConnectFailure(Object arg0, int arg1) {
- //System.err.println("onMqttConnectFailure");
- }
-
- @Override
- public void messageArrived(Object arg0, String arg1, byte[] payload) {
- if("cmd".equals(arg1.substring(arg1.length() - 3))) {
- String cmd = new String(payload);
- cmd = cmd.substring(13, cmd.length() - 2);
- System.err.println("Received Cmd: " + cmd);
- try {
- if("OPEN".equals(cmd)) {
- relay.turnOn();
- System.err.println("Relay Turn On.");
- } else if("CLOSE".equals(cmd)) {
- relay.turnOff();
- System.err.println("Relay Turn Off.");
- }
- }catch(Exception e) {}
- }
-
- }
-
- @Override
- public void connectionLost(Object arg0) {
- //System.err.println("connectionLost");
- }
-
- @Override
- public void connectComplete(Object arg0, boolean arg1) {
- //System.err.println("connectComplete");
-
- }
- });
- try {
- mqttClient.connect(connOpts, mqttClient);
- } catch (Exception e) {
- e.printStackTrace();
- System.err.println("Connect failed.");
- }
-
- mqttClient.subscribe(TOPIC_CMD, 1);
-
- while(true) {
- // 获取传感器参数并包装为Json格式至变量sensorState
复制代码
|
评分
-
查看全部评分
|