精华内容
下载资源
问答
  • 我按照zk权威指南上的代码创建节点:package com.zkstudy;import java.io.IOException;import java.util.Random;import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.KeeperException;import org....

    我按照zk权威指南上的代码创建节点:

    package com.zkstudy;

    import java.io.IOException;

    import java.util.Random;

    import org.apache.zookeeper.CreateMode;

    import org.apache.zookeeper.KeeperException;

    import org.apache.zookeeper.WatchedEvent;

    import org.apache.zookeeper.Watcher;

    import org.apache.zookeeper.ZooDefs.Ids;

    import org.apache.zookeeper.ZooKeeper;

    import org.apache.zookeeper.data.Stat;

    public class Master implements Watcher {

    private ZooKeeper zk = null;

    private String host;

    private String serverId = null;

    private boolean isLeader = false;

    public Master(String host) {

    this.host = host;

    Random radom = new Random();

    serverId = Integer.toHexString(radom.nextInt());

    }

    public void start() {

    try {

    this.zk = new ZooKeeper(host, 15000, this);

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    public void createMaster() {

    while (true) {

    try {

    zk.create("/master", serverId.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);

    isLeader = true;

    break;

    } catch (KeeperException e) {

    e.printStackTrace();

    isLeader = false;

    break;

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    if (checkMaster()) {

    break;

    }

    }

    }

    public boolean checkMaster() {

    while (true) {

    Stat stat = new Stat();

    try {

    byte[] data = zk.getData("/master", false, stat);

    isLeader = new String(data).equals(serverId);

    return true;

    } catch (KeeperException e) {

    e.printStackTrace();

    return false;

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    }

    public void process(WatchedEvent event) {

    System.out.println("watcher thread:---------->" + Thread.currentThread().getId());

    System.out.println("event:---------->" + event);

    }

    public static void main(String[] args) throws InterruptedException {

    Master master = new Master("123.206.28.37:2181");

    master.start();

    master.createMaster();

    if (master.isLeader) {

    System.out.println("i am master");

    }

    System.out.println("main thread:---------->" + Thread.currentThread().getId());

    Thread.sleep(5000);

    }

    }

    然后我运行了两遍。出现了如下问题:

    watcher thread:---------->10

    event:---------->WatchedEvent state:SyncConnected type:None path:null

    org.apache.zookeeper.KeeperException$NodeExistsException: KeeperErrorCode = NodeExists for /master

    main thread:---------->1

    at org.apache.zookeeper.KeeperException.create(KeeperException.java:119)

    at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)

    at org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:783)

    at com.zkstudy.Master.createMaster(Master.java:40)

    at com.zkstudy.Master.main(Master.java:83)

    提示master节点已经存在。

    但是我在命令行里面查看却没有发现master节点:

    [zk: localhost:2181(CONNECTED) 10] ls

    [zk: localhost:2181(CONNECTED) 11] ls /

    [zk, zookeeper]

    [zk: localhost:2181(CONNECTED) 12]

    请问这是为什么呢?zk使用的是单节点,不是伪集群。

    展开全文
  • 在前面的文章里《如何在LoRaWAN网关上设置MQTT的Topic》,我们已经介绍了在RAK瑞科慧联的LoRa网关的网页上,如何设置MQTT的Topic参数,以获取到某应用或所有应用下的某个LoRa节点或所有LoRa节点的信息。 在LoRa网关...

    在前面的文章里《如何在LoRaWAN网关上设置MQTT的Topic》,我们已经介绍了在RAK瑞科慧联的LoRa网关的网页上,如何设置MQTT的Topic参数,以获取到某应用或所有应用下的某个LoRa节点或所有LoRa节点的信息。

    在LoRa网关的网页上设置了MQTT的Topic信息之后,我们就可以在mqtt.fx客户端上进行设置,以订阅到LoRa节点的数据。

    本文介绍在mqtt.fx客户端上如何设置以订阅到LoRa节点的数据。

    如果希望了解LoRa网关的其他获取数据的方式,还可以参见文章《没有互联网,如何本地获取到LoRaWAN的终端数据?》、《两步走,让自己的LoRaWAM网关与阿里云连线》、《超低成本get一项新技能:在阿里云上进行IoT系统开发》、《LoRa节点如何以OTAA方式入网TTN服务器?》、《LoRa节点如何以ABP方式入网TTN服务器?

     

    如图1所示,是mqtt.fx工具的主界面,我们可以在该界面上进行操作,以订阅到LoRa节点的数据。

    mqtt.fx工具的主界面
    图1  mqtt.fx工具的主界面

     

    在图1所示的界面上,点击左上角红色方框圈住的新建按钮,出现图2所示的界面,就可以添加LoRaWAN网关的IP地址(前提:该网关已联网)。

    在图2中所示的输入框中输入LoRaWAN网关的IP地址。

    mqtt工具添加LoRaWAN网关
    图2  mqtt工具添加LoRaWAN网关

     

     

    输入完LoRaWAN网关的IP地址之后,如图3所示,点击Connect按钮,最右侧的黑色圆形变成绿色,说明我们已经成功连接到LoRaWAN网关内置的MQTT服务器。

    利用mqtt工具连接到LoRaWAN网关内置的MQTT服务器
    图3  利用mqtt工具连接到LoRaWAN网关内置的MQTT服务器

     

    点击图4所示的“Subscribe”订阅按钮,在输入框中输入订阅的topic(该输入信息指明了应用及LoRa节点的信息,具体的信息,可以参见我们之前的文章的介绍,如何在LoRaWAN网关上设置MQTT的Topic),需要注意输入的格式,应当按照图4所示的范例进行输入。

    然后,在图4上,再点击输入框右侧的Subscribe按钮,就可以通过mqtt工具开始订阅LoRa节点上报的数据。

    图4   mqtt工具的LoRa节点订阅Topic信息输入界面
    图4   mqtt工具的LoRa节点订阅Topic信息输入界面

     

    本文介绍了在mqtt.fx客户端如何设置,以订阅到LoRa节点的数据。具体如何测试LoRa节点与LoRaWAN网关内置的mqtt服务器之间的数据传输是否正常,请期待我们的下一篇文章。

    展开全文
  • Zoho订阅节点的API包装器。 安装 $ npm install --save zoho-subscriptions 用法 要运行该示例,您必须获取的API密钥和组织ID。 var zohoSubscriptions = require ( 'zoho-subscriptions' ) ; ...
  • NacosWatch支持监听订阅服务节点变化发布事件 问题 spring-cloud-starter-alibaba-nacos-discovery从1.5.0.RELEASE开始对NacosWatch的改动,NacosWatch不再支持自动去监听订阅服务节点变化发布事件,重点是不再...

    NacosWatch不支持监听订阅服务节点变化发布事件

    问题

    spring-cloud-starter-alibaba-nacos-discovery从1.5.0.RELEASE开始对NacosWatch的改动,NacosWatch不再支持自动去监听订阅服务节点变化发布事件,重点是不再自动去处理。

    引入包的对比

    0.9.0之前的版本

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>0.9.0.RELEASE</version>
    </dependency>
    

    1.5.0之后的版本

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>1.5.0.RELEASE</version>
    </dependency>
    

    注意:groupId变成了com.alibaba.cloud,也就是的类的包变成了com.alibaba.cloud,不再是org.springframework.cloud了

    NacosWatch监听方法的变化

    这里我们重点只关注nacosServicesWatch()方法,这个方法是由start()方法以定时任务的方式定时调用。

    0.9.0之前的版本源码

    @Override
    public void start() {
    	if (this.running.compareAndSet(false, true)) {
    	    // 定时任务:默认30秒调用一次nacosServicesWatch()方法
    		this.watchFuture = this.taskScheduler.scheduleWithFixedDelay(this::nacosServicesWatch, this.properties.getWatchDelay());
    	}
    }
    public void nacosServicesWatch() {
    	try {
    		boolean changed = false;
    		NamingService namingService = properties.namingServiceInstance();
    		// 根据默认分组DEFAULT_GROUP,获取注册中心所有的服务信息
    		ListView<String> listView = properties.namingServiceInstance().getServicesOfServer(1, Integer.MAX_VALUE);
    		// 所有服务名称
    		List<String> serviceList = listView.getData();
    
    		// if there are new services found, publish event
    		Set<String> currentServices = new HashSet<>(serviceList);
    		// 移除缓存的服务名
    		currentServices.removeAll(cacheServices);
    		if (currentServices.size() > 0) {
    			changed = true;
    		}
    		// if some services disappear, publish event
    		if (cacheServices.removeAll(new HashSet<>(serviceList)) && cacheServices.size() > 0) {
    			changed = true;
    			for (String serviceName : cacheServices) {
    			    // 移除服务监听
    				namingService.unsubscribe(serviceName, subscribeListeners.get(serviceName));
    				subscribeListeners.remove(serviceName);
    			}
    		}
    		// 更新缓存服务名
    		cacheServices = new HashSet<>(serviceList);
    
    		// subscribe services's node change, publish event if nodes changed
    		for (String serviceName : cacheServices) {
    			if (!subscribeListeners.containsKey(serviceName)) {
    			    // 服务不在监听列表,发布心跳事件
    				EventListener eventListener = event -> NacosWatch.this.publisher.publishEvent(new HeartbeatEvent(NacosWatch.this, nacosWatchIndex.getAndIncrement()));
    				// 服务监听放入列表
    				subscribeListeners.put(serviceName, eventListener);
    				// 订阅监听实例,最后由EventDispatcher添加监听
    				namingService.subscribe(serviceName, eventListener);
    			}
    		}
    
    		if (changed) {
    		    // 有改变,发布心跳事件
    			this.publisher.publishEvent(new HeartbeatEvent(this, nacosWatchIndex.getAndIncrement()));
    		}
    	}
    	catch (Exception e) {
    		log.error("Error watching Nacos Service change", e);
    	}
    }
    

    1.5.0之后的版本源码

    @Override
    public void start() {
    	if (this.running.compareAndSet(false, true)) {
    		EventListener eventListener = listenerMap.computeIfAbsent(buildKey(),
    				event -> new EventListener() {
    					@Override
    					public void onEvent(Event event) {
    						if (event instanceof NamingEvent) {
    							List<Instance> instances = ((NamingEvent) event).getInstances();
    							Optional<Instance> instanceOptional = selectCurrentInstance(instances);
    							instanceOptional.ifPresent(currentInstance -> {resetIfNeeded(currentInstance);});
    						}
    					}
    				});
    
    		NamingService namingService = nacosServiceManager.getNamingService(properties.getNacosProperties());
    		try {
    			namingService.subscribe(properties.getService(), properties.getGroup(), Arrays.asList(properties.getClusterName()), eventListener);
    		}
    		catch (Exception e) {
    			log.error("namingService subscribe failed, properties:{}", properties, e);
    		}
            // 定时任务:默认30秒调用一次nacosServicesWatch()方法
    		this.watchFuture = this.taskScheduler.scheduleWithFixedDelay(this::nacosServicesWatch, this.properties.getWatchDelay());
    	}
    }
    
    public void nacosServicesWatch() {
    	// nacos doesn't support watch now , publish an event every 30 seconds.
    	this.publisher.publishEvent(new HeartbeatEvent(this, nacosWatchIndex.getAndIncrement()));
    }
    

    对比发现,新版本中的nacosServicesWatch()方法只做了一件事,就是发布心跳事件,去掉了旧版本中大堆服务获取、改变、发布监听事件等等。改变原因不清楚,有兴趣可看看源码和github https://github.com/alibaba/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-starters

    根据心跳来监听服务节点变化

    新版本中不再自动监听服务节点变化,我们只能自己来处理了,这里我通过监听心跳事件来定时自动监听服务变化。

    @EventListener(classes = HeartbeatEvent.class)
    public void listenNacosEvent(ApplicationEvent heartbeatEvent) {
    	try {
    		// 根据默认分组查询注册的所有服务名,nacosServiceDiscovery自动注入对象
    		List<String> serviceNameList = nacosServiceDiscovery.getServices();
    		if (CollectionUtils.isEmpty(serviceNameList)) {
    			return;
    		}
    		/**
             * 获取到服务名,就可以根据自己需求来实现自己的功能
    		 * 如,可以缓存一份服务列表,根据需要时再去使用
    		 */
    
    		// 循环所有服务获取服务信息
    		serviceNameList.stream().forEach(serviceName -> {
    			try {
    				// 根据服务名获取服务实例
    				List<ServiceInstance> serviceInstanceList = nacosServiceDiscovery.getInstances(serviceName);
    				// TODO
    			} catch (Exception e) {
    				logger.error("获取服务实例异常!serviceName:{}, {}:{}", serviceName, e.getClass().getName(), e.getMessage());
    			}
    		});
    	} catch (NacosException e) {
    		logger.error("查询注册nacos服务列表异常!{}:{}", e.getClass().getName(), e.getMessage(), e);
    	}
    }
    

    总结

    初次接触nacos,感觉功能很强大 ,换了新版本包发现有功能不生效了,就调试源码,对比发现代码变化不小,查看源码,提供了获取服务名、服务实例等方法,记录一下学习过程和解决问题办法,如有不正确的地方,欢迎指正。

    展开全文
  • 跟踪你的订阅,并显示在Github上 支持语言:English (United States)
  • 测试时发现节点只能订阅不能发布话题,且订阅的话题数据也无法使用。 解决办法 经过查找才发现,是因为自己把发布topic的函数写在main函数中了,这就造成订阅的数据无法被发布的函数使用,因为只能在订阅的回调...

    问题描述

    写了一个节点,要从激光雷达发布的话题中订阅点云信息,并将点云信息处理之后再发布出去。涉及到一个节点同时订阅和发布多个话题。
    测试时发现节点只能订阅,不能发布话题,且订阅的话题数据也无法使用。

    解决办法

    经过查找才发现,是因为自己把发布topic的函数写在main函数中了,这就造成订阅的数据无法被发布的函数使用,因为只能在订阅的回调函数中才能使用该信息。因此我的解决办法是把发布topic的函数 写在了订阅回调中即可。
    参考链接中给出了另一种解决办法:定义了一个类,把publisher和subscriber都放入类中。
    这里我粘贴处第一种方法的代码 想看第二中方法的自行点击链接

    
    ```cpp
    # include<ros/ros.h>
    # include<std_msgs/String.h>
    # include<std_msgs/Float32.h>
    
    // 定义为全局变量
    static ros::Subscriber sub1;
    static ros::Subscriber sub2;
    static ros::Publisher pub1;
    static ros::Publisher pub2;
    
    // 回调函数1
    void callback1(const std_msgs::Float32ConstPtr& flt){
        std_msgs::Float32 pub_flt;
        pub_flt.data = flt->data+0.4;
        pub1.publish(pub_flt);
    
        std::cout<<"receive flt:"<<flt->data<<std::endl;
        std::cout<<"publish flt:"<<pub_flt.data<<std::endl;
    };
    
    // 回调函数2
    void callback2(const std_msgs::StringConstPtr& str){
        std_msgs::String str_msg;
        str_msg.data = str->data+" hahaha";
        pub2.publish(str_msg);
    
        std::cout<<"receive str:"<<str->data<<std::endl;
        std::cout<<"publish str:"<<str_msg.data<<std::endl;
    }
    
    
    int main(int argc, char *argv[])
    {
        // 初始化ROS并指定节点名称
        ros::init(argc, argv, "subscribe_publish2");
        // 创建节点句柄
        ros::NodeHandle nh;
        
        // 利用节点句柄对sub和pub初始化
        sub1 = nh.subscribe("topic_flt",1,callback1);
        sub2 = nh.subscribe("topic_str",1,callback2);
        pub1 = nh.advertise<std_msgs::Float32>("processed_flt", 1);
        pub2 = nh.advertise<std_msgs::String>("processed_str",1);
    
        // 循环执行
        ros::spin();
        return 0;
    }
    

    另外 如何想要设置发布和订阅不同的频率 可以使用pubrate函数

      ros::Rate pub_rate(50);
      //让其在主题“/cmd_vel”发布速度控制消息,启智ROS的核心节点会从这个主题获取vel_pub发布的消息,并控制机器人底盘执行消息包里的速度值。
      vel_pub.publish(vel_cmd);
        //循环等待回调函数
      pub_rate.sleep();
    

    参考资料

    http://zhaoxuhui.top/blog/2019/10/20/ros-note-7.html

    展开全文
  • 2.1、连接OPC UA服务器,浏览所有节点信息 2.2、OpcUaHelper帮助类的常用方法 2.2.1、连接OPC UA服务器方法 2.2.2、读取OPC UA服务器的节点数据 2.2.3、读取OPC UA服务器中节点信息 三、运行测试 3.1、自己写...
  • import java.util.List; import org.I0Itec.zkclient.IZkChildListener; import org.I0Itec.zkclient.ZkClient; /** * * @ClassName: Get_Children_...* @Description: TODO(ZkClient获取节点列表) * @author *
  • C# 读写opc ua服务器,浏览所有节点,读写节点,读历史数据,调用方法,订阅,批量订阅操作 OPC UA简介 OPC是应用于工业通信的,在windows环境的下一种通讯技术,原有的通信技术难以满足日益复杂的环境,在可扩展...
  • ZooKeeper 使用 ZKClient 获取节点列表

    千次阅读 2015-10-27 21:20:00
    为什么80%的码农都做了架构师?>>> ...
  • javascript获取节点

    2013-02-20 23:03:35
    里面包含兼容ie和火狐的代码,如添加事件,由class属性得到节点,jquery1.7,是学习的好资料
  • 结合redis订阅和发布消息,解决websocket多节点问题 单节点和多节点下,websocket会出现什么问题呢?看如下两个对比图: 这时候你会发现有部分连接在ws node2节点上用户收到消息推送。而且websocket的session...
  • openwrt 中的设备节点自动创建

    千次阅读 2019-07-17 15:13:35
    通常在linux 系统中,自动创建设备节点,需要udev 或 mdev 。 但是在openwrt 中并没有 udev 和 mdev ,但它任然可以自动创建设备节点,那么它的设备节点是怎么有自动创建的呢? ...
  • 三、在LoRaWAN网络中,如何通过MQTT订阅获取到LoRa节点的数据? 结语 前言 尽管现在云服务器已经比较成熟,比如阿里云或者腾讯云,但是,在物联网领域的一些特定的工业应用场景下,用户可能更希望能够将数据...
  • opencv获取相机图像并发布ROS节点

    千次阅读 2018-07-21 12:41:29
     ROS是最普遍使用的机器人系统之一,提供了各种功能包,仿真环境,模型,可视化工具等,项目开发提供方便,加速开发流程,opencv是流行的计算机视觉库,两者的交互十分重要。 一、opencv获取图像  opencv使用...
  • 在收到来自主题的消息之前,AWS会致电您的终端节点,要求您确认订阅。 在标头中,您可以检测到是否是预订,询问x-amz-sns-message-type标头值是否等于SubscriptionConfirmation 。 您可以获取要调用的URL,以在正文...
  • 在开发客户端之前,需要使用本窗口来进行查看服务器的节点状态,因为在请求服务器的节点数据之前,必须知道节点的名称,而节点的名称可以通过这个窗口获取。以下演示实例化操作 OpcUaHelper.Forms.FormBrowseServer ...
  • ROS节点

    千次阅读 2019-12-28 16:25:22
    从程序角度来说,node就是一个可执行文件(通常C++编译生成的可执行文件、Python脚本)被执行,加载到了内存之中 从功能角度来说,通常一个node负责者机器人的某一个单独的功能。由于机器人的功能模块非常...
  • 摄像头树莓派第二代摄像头,roskinetic版本,ubuntu系统. 参考文档链接: http://www.ncnynl.com/archives/201611/1067.html http://blog.csdn.net/u013832707/article/details/54340410 ...
  • 总算搞通ROS的服务节点订阅发布消息主题了。可以实习那几个东西。 记录一下吧,首先要一个工作空间。 在当前系统用户的home目录下的.bashrc文件中添加source /opt/ros/jade/setup.bash,才能运行ros相关的命令。 ...
  • 利用Realsense-ros订阅topic获取D435i深度值 利用Realsense-ros订阅相关话题获取与RGB图对齐的深度图及任意指定一点的深度值的代码请移步: 链接: ...
  • web_video_server包的主要功能是,在ROS系统中,比如某些话题发布了图像、视频的话题,通过这个功能包可以订阅这些话题,然后对图像压缩,通过网络传输出去,这样我们就可以通过网络的方式获取到这些图像和话题。...
  • 节点转换

    千次阅读 2018-01-19 11:36:20
    getLocation 获取当前触点位置。 getLocationX 获取当前触点 X 轴位置。 getLocationY 获取当前触点 Y 轴位置。 getPreviousLocation 获取触点在上一次事件时的位置对象,对象包含 x 和 y 属性。 ...
  • 【Kafka】消息订阅框架Kafka

    千次阅读 2019-01-10 20:00:38
    消息订阅框架Kafka基本原理及环境搭建。
  • // 需要用message_filter容器对两个话题的数据发布进行初始化,这里不能指定回调函数 message_filters::Subscriber<sensor_msgs::Imu> sub_imu_accel(n,IMU_TOPIC_ACCEL,2000,ros::TransportHints().tcpNoDelay...
  • 文章目录系列文章目录前言节点选择器——提取信息的方法1. 提取信息的方法2. 总结 前言 Beautiful Soup是一个API简单、功能强大、支持多种解析器,能够实现编码转化的解析工具。本教程就用来介绍Beautiful Soup的...
  • 以前使用的是Ros2似乎并关心订阅和发布的先后顺序, 似乎都可以收到消息. 这个问题后面再确认下, 今天也记录下. 因为计算机上已经没有Ros2的环境了, 所以这个问题暂时搁置, 等有机会的确认下, 不过如果有解决办法...
  • 如何制作订阅地址

    千次阅读 2021-03-22 14:28:53
    如何制作订阅地址 准备条件 github:https://github.com Base64编码:https://tool.oschina.net/encrypt?type=3 节点信息 步骤 1、登录Github 2、创建仓库 3、整理节点信息 整理节点信息,以“,”或者 ...
  • tron波场节点搭建

    千次阅读 2021-09-04 11:28:38
    配置:32核 32G 1.5T以上,centos 7 ... 下载最新全节点包 进入到项目地址,下载fullnode.jar,当前最新版本地址 项目地址: https://github.com/tronprotocol/java-tron 当前最新版本下载地址 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,942
精华内容 27,576
关键字:

为什么不能获取订阅节点