/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
*/

/**
 * Samples showing use of the IBM Watson IoT Platform connector
 * to publish device events and subscribe to device
 * commands.
 * 
 * <p>The "Quickstart" samples connect to the IBM Watson IoT Platform
 * using its Quickstart feature that does not require device registration.
 * When the samples are run they print out a URL which allows a browser
 * to see the data being sent from this sample.
 * 
 * <p>The other samples connect to your IBM Watson IoT Platform service instance
 * using device and application registrations that you have created with your
 * service instance.
 * 
 * <p>See each sample's Javadoc for more information.
 * 
 * <p>See {@code scripts/connectors/iotp/README} for information about running the samples.
 */
package org.apache.edgent.samples.connectors.iotp;

