thingsboard rpc应用程序控制传感器模拟

这篇博客介绍了如何使用C#和Python通过MQTT协议实现服务器端RPC来控制模拟的温度传感器。C#版本的代码展示了如何订阅和响应RPC请求,包括获取和设置温度值。而Python版本则实现了线程间通信和实时监控。博主指出,C#版本在回传温控器设置到服务器时遇到线程问题,但Python版本能有效解决这个问题。
摘要由CSDN通过智能技术生成

使用服务器端rpc来控制模拟的温度传感器

效果图如下:
在这里插入图片描述
下面把我的设置和代码记录一下:

增加设备

在这里插入图片描述
如果使用服务器端RPC命令,不需要在增加规则链了

增加控制按钮

在这里插入图片描述
注意这里的methond方法
在这里插入图片描述
getvalue setvalue要与代码中对应的接收方法一致

rpc代码(C#使用mqttnet)

主要的代码是下面这些

  public static void Main(string[] args)
        {
                var factory = new MqttFactory();
                mqttClient = factory.CreateMqttClient();

                //创建tcp options 用于连接mqtt
                var options = new MqttClientOptionsBuilder()
                            //clinet的名称
                            .WithClientId("client3")
                            //mqtt broker的服务器地址IP,默认的是1883端口
                            .WithTcpServer("192.168.137.131", 1883)
                            .WithCredentials("FOvUIh5e7sHD4BWKceb2", "")
                            //hivemq的登录用户名
                            .WithUserProperty("FOvUIh5e7sHD4BWKceb2", "")
                            .WithCleanSession()
                            .Build();
                mqttClient.ConnectAsync(options, CancellationToken.None);


                mqttClient.UseConnectedHandler(e =>
                {
                    Console.WriteLine("连接成功");
                    Console.WriteLine("当前连接线程名称:" + Thread.CurrentThread.ManagedThreadId.ToString());
                    mqttClient.SubscribeAsync("v1/devices/me/rpc/request/+");                   

                });
                mqttClient.UseApplicationMessageReceivedHandler(e =>
                {
                    string topic = e.ApplicationMessage.Topic;
                    Console.WriteLine("当前接受线程名称:" + Thread.CurrentThread.ManagedThreadId.ToString());
                    if (topic.StartsWith("v1/devices/me/rpc/request/"))
                    {
                        string requestId = topic.Substring("v1/devices/me/rpc/request/".Length);
                        JObject data = JObject.Parse(Encoding.UTF8.GetString(e.ApplicationMessage.Payload));
                        if (data.GetValue("method").ToString() == "getValue")
                        {
                            var temp = new JObject { { "temperature", temperature } };

                            var message = new MqttApplicationMessageBuilder()
                                .WithTopic("v1/devices/me/rpc/response/" + requestId)
                                .WithPayload(temp.ToString())
                                .WithExactlyOnceQoS()
                                .WithRetainFlag()
                                .Build();
                            //执行发送数据到tb
                            Console.WriteLine(DateTime.Now + "发送数据到tb");

                            mqttClient.PublishAsync(message, CancellationToken.None);

                        }
                        else if (data.GetValue("method").ToString() == "setValue")
                        {
                            string param = data.GetValue("params").ToString();

                            setValue(param);
                        }
                    }
                });
            Console.ReadLine();
        }

其中下面这些就是解析rpc命令的

if (topic.StartsWith("v1/devices/me/rpc/request/"))
                    {
                        string requestId = topic.Substring("v1/devices/me/rpc/request/".Length);
                        JObject data = JObject.Parse(Encoding.UTF8.GetString(e.ApplicationMessage.Payload));
                        if (data.GetValue("method").ToString() == "getValue")
                        {
                            var temp = new JObject { { "temperature", temperature } };

                            var message = new MqttApplicationMessageBuilder()
                                .WithTopic("v1/devices/me/rpc/response/" + requestId)
                                .WithPayload(temp.ToString())
                                .WithExactlyOnceQoS()
                                .WithRetainFlag()
                                .Build();
                            //执行发送数据到tb
                            Console.WriteLine(DateTime.Now + "发送数据到tb");

                            mqttClient.PublishAsync(message, CancellationToken.None);

                        }
                        else if (data.GetValue("method").ToString() == "setValue")
                        {
                            string param = data.GetValue("params").ToString();

                            setValue(param);
                        }
                    }
                });

PS:
这里没有实现将温控器设置的温度值回传到tb中,我感觉是线程的问题,因为我测试郭增加线程来处理数据回传就会导致不能获取到温控器的数据,这两个线程不是一个。
这里的问题留待后面研究。

python 版的mqtt

python版本的mqtt可以实现线程间的通信及实时监控,这里也分享给大家

# -*- coding: utf-8 -*-
"""
Created on Sat Feb  6 14:10:01 2021

"""

# This Program illustrates the Server Side RPC on ThingsBoard IoT Platform
# Paste your ThingsBoard IoT Platform IP and Device access token
# Temperature_Controller_Server_Side_RPC.py : This program illustrates Server side RPC using a Simulated Temperature Controller
import os
import time
import sys
import json
import random
import paho.mqtt.client as mqtt
from threading import Thread

# Thingsboard platform credentials
THINGSBOARD_HOST = '192.168.137.131'       #Change IP Address
ACCESS_TOKEN = 'FOvUIh5e7sHD4BWKceb2'
sensor_data = {'temperature': 25}

def publishValue(client):
    INTERVAL = 2
    print("Thread  Started")
    next_reading = time.time()
    while True:
        client.publish('v1/devices/me/telemetry', json.dumps(sensor_data),1)
        next_reading += INTERVAL
        sleep_time = next_reading - time.time()
        if sleep_time > 0:
            time.sleep(sleep_time)

def read_temperature():
    temp = sensor_data['temperature']
    return temp

# Function will set the temperature value in device
def setValue (params):
    sensor_data['temperature'] = params
    #print("Rx setValue is : ",sensor_data)
    print("Temperature Set : ",params,"C")

# MQTT on_connect callback function
def on_connect(client, userdata, flags, rc):
    print("连接成功")
    #print("rc code:", rc)
    client.subscribe('v1/devices/me/rpc/request/+')

# MQTT on_message callback function
def on_message(client, userdata, msg):
    print('Topic: ' + msg.topic + '\nMessage: ' + str(msg.payload))
    if msg.topic.startswith('v1/devices/me/rpc/request/'):
        requestId = msg.topic[len('v1/devices/me/rpc/request/'):len(msg.topic)]
        #print("requestId : ", requestId)
        data = json.loads(msg.payload)
        if data['method'] == 'getValue':
            #print("getvalue request\n")
            #print("sent getValue : ", sensor_data)
            client.publish('v1/devices/me/rpc/response/' + requestId, json.dumps(sensor_data['temperature']), 1)
        if data['method'] == 'setValue':
            #print("setvalue request\n")
            params = data['params']
            setValue(params)

# create a client instance
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.username_pw_set(ACCESS_TOKEN)
client.connect(THINGSBOARD_HOST,1883,60)

t = Thread(target=publishValue, args=(client,))


try:
    client.loop_start()
    t.start()
    while True:
        pass

except KeyboardInterrupt:
    client.disconnect()
### 回答1: Thingsboard RPC是一个在Thingsboard IoT平台上实现的远程过程调用(RPC)协议。该协议可以通过设备端和服务器端之间的消息传递实现远程操作和数据交换。 通过使用RPC协议,设备端可以请求并获取从Thingsboard服务器中发送的数据、设备配置信息及指令等内容。同时,服务器端也可以通过RPC协议向设备端发送命令控制和操作指令,实现对设备进行远程配置和调试。 Thingsboard RPC通过 WebSocket通信方式实现低延迟的双向通信,并提供多种安全认证机制,如基于令牌的认证和 OAuth 2.0授权认证,以确保通信的安全性和保密性。 由于其灵活性和可扩展性,Thingsboard RPC被广泛用于各种物联网设备连接和数据交互场景,尤其在智能家居、工业生产监控和智能交通等领域得到了广泛应用。 ### 回答2: Thingsboard RPC是一种客户端与Thingsboard服务器之间实现远程过程调用(RPC)的方法。将RPC作为通讯协议可以让设备在向云平台发送指令时变得更加方便易用。它提供了从Thingsboard服务器向设备端发送指令的方法,这些指令可以让设备执行命令、控制参数、查询状态等一系列操作。 在Thingsboard系统中,RPC是基于MQTT协议实现的,这使得在设备和服务器之间进行指令通讯变得更加轻松。对于开发者来讲,使用Thingsboard RPC可以更加方便的编写客户端软件,通过依赖Thingsboard中现有的一些API,实现与设备之间的通信。 Thingsboard RPC的作用十分重要,因为它可以降低设备与云平台之间的耦合性,让设备可以更加自由的与不同的云平台相连接。使用RPC,设备只需要实现特定的通讯协议,然后就可以与Thingsboard建立通讯链路,在云平台上实现远程过程调用。 总的来说,使用Thingsboard RPC可以使设备与云平台之间的通讯更加高效、且易于管理,同时也可以让开发者更加方便的实现针对设备的应用程序。这是一种十分有效的通讯方法,有助于促进IoT设备在各具特色的云平台上实现海量连接。 ### 回答3: Thingsboard RPC是一种在Thingsboard IoT平台上运行的远程过程调用(RPC)协议,它使用了基于HTTP的RESTful API,支持在设备和应用程序之间进行双向通信以及控制和监视设备。 首先,Thingsboard RPC协议主要用于远程控制设备。通过在Thingsboard服务器上定义RPC方法,您可以在物联网设备中远程调用这些方法。这些方法可以用于控制物联网设备上的功能,例如打开闸门、控制灯光等。这种远程控制可以通过HTTP和MQTT协议完成。 其次,Thingsboard RPC还提供了一种机制来监视物联网设备。通过在设备上定义RPC方法,您可以定期将设备状态更新并发送到Thingsboard服务器。这种状态更新可帮助监视设备运行状况,例如检测设备的电量和温度等,以及发现潜在的故障或其他问题。 此外,Thingsboard RPC还可以帮助您构建复杂的工作流程,以便实现更高级别的控制。通过结合Thingsboard的规则引擎和RPC方法,您可以自动化执行流程,例如将安全告警发送给工程师或将数据记录到数据库中。 总而言之,Thingsboard RPC是一个功能强大的远程过程调用协议,可以帮助您控制和监视物联网设备,并实现自动化工作流程。它是Thingsboard IoT平台成功的关键之一,也是许多物联网应用程序所必需的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值