TCP 伝送プロトコルを使用するアクセスサービスを構築し、それを TCP 用の汎用プロトコル SDK のインターフェイスを使用して Alibaba Cloud IoT Platform にブリッジすることができます。
ブートストラップ
com.aliyun.iot.as.bridge.server.BridgeServerBootstrap は、ソケットサーバーとブリッジサービスを起動するためのブートストラップクラスです。 新しい BridgeServerBootstrap が作成された後、設定ファイルに基づきコンポーネントが初期化されます。
例:
BridgeServerBootstrap bootstrap = new BridgeServerBootstrap(new TcpDecoderFactory() {
@Override
public ByteToMessageDecoder newInstance() {
// Return decoder
}
}, new TcpEncoderFactory() {
@Override
public MessageToByteEncoder<? > newInstance() {
// Return encoder
}
}, new TcpBasedProtocolAdaptorHandlerFactory() {
@ Override
public CustomizedTcpBasedProtocolHandler newInstance() {
// Return protocol adapter
}
}, new DefaultDownlinkChannelHandler());
try {
bootstrap.start();
} catch (BootException | ConfigException e) {
// Process boot exception
}
TCP タイプ BridgeServerBootstrap のインスタンス化
- com.aliyun.iot.as.bridge.server.channel.factory.TcpDecoderFactory: アップロードデータをデコードするために、ファクトリメソッドを使って新しいデコーダインスタンスを作成します。 スレッドは安全です。 NULL となることも可能です。
- com.aliyun.iot.as.bridge.server.channel.factory.TcpEncoderFactory: ファクトリメソッドを使用して新しいエンコーダインスタンスを作成し、ダウンストリームデータを TCP プロトコルに適応させるようにエンコードします。 スレッドは安全です。 NULL にすることが可能です。
- com.aliyun.iot.as.bridge.server.channel.factory.TcpBasedProtocolAdaptorHandlerFactory: デコードされたデータをクラウドにアップロードできるように、ファクトリメソッドを使用して、新しいプロトコルアダプタインスタンスを作成し、デコードされたデータを調整します。 スレッドは安全です。 NULL にはできません。
- com.aliyun.iot.as.bridge.core.handler.DownlinkChannelHandler: ダウンストリームデータの配布元。 ユニキャストとブロードキャストをサポートします。 ユニキャストは、デフォルトでデータをデバイスに直接転送します。 ブロードキャスト設定は開発者がカスタマイズする必要があります。 NULL にすることも可能です。 Null は、ダウンストリームデータが許可されていないことを示します。
ソケットサーバーの起動
BridgeServerBootstrap を作成したら、com.aliyun.iot.as.bridge.server.BridgeServerBootstrap.start() を呼び出してソケットサーバーを起動します。
プロトコルのデコード
プロトコルデコード用のコンポーネントは、io.netty.handler.codec.ByteToMessageDecoder から派生しています。 詳細については、『 ByteToMessageDecoder ドキュメント』をご参照ください。
例:
public class SampleDecoder extends ByteToMessageDecoder {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
// The decoding protocol
}
}
プロトコルのエンコード
プロトコルエンコードのためのコンポーネントは、io.netty.handler.codec.MessageToByteEncoder<I> から派生しています。 詳細については、『 MessageToByteEncoder ドキュメント』をご参照ください。
例:
public class SampleEncoder extends MessageToByteEncoder<String>{
@Override
protected void encode(ChannelHandlerContext ctx, String msg, ByteBuf out) throws Exception {
// Protocol encoding
}
}
プロトコルアダプター
コストを削減し、開発の効率を向上させるために、汎用プロトコルサーバー SDK はプロトコルアダプターに、拡張・カスタマイズ可能な基本機能クラス com.aliyun.iot.as.bridge.server.channel.CustomizedTcpBasedProtocolHandler を提供します。 これは Alibaba Cloud IoT Platform にアクセスするための詳細をカプセル化するので、ユーザーはプロトコル関連のビジネスに集中することができます。 プロトコルアダプターはこのクラスから派生しています。
デバイスオンライン
オンラインデバイスのみが IoT Platform との接続を確立したり、IoT Platform に接続リクエストを送信したりできます。 デバイスをオンラインにするには、ローカルセッションの初期化とデバイス認証の 2 つの手順があります。
- セッションの初期化
詳細については、「Core SDK 開発 > デバイスオンライン > セッションの初期化」をご参照ください。
- デバイス認証
ローカルセッションの初期化後、ローカルデバイス認証と Alibaba Cloud IoT Platform オンライン認証を完了させるため、doOnline(ChannelHandlerContext ctx, Session newSession, String originalIdentity, String... credentials) を呼び出します。 認証が成功するとデバイスは IoT Platform と通信でき、認証が失敗するとデバイスは IoT Platform から切断されます。
例:
Session session = Session.newInstance(device, channel); boolean success = doOnline(session, originalIdentity); if (success) { // Successfully got online, and will accept communication requests. } else { // Failed to get online, will reject communication requests and disconnect (if connected). }
デバイスオフライン
デバイスが切断されたとき、または切断する必要があることを検出したときは、デバイスのオフラインアクションを開始する必要があります。 Server SDK を使用すると、デバイスが切断された際自動的にオフラインになるため、他のタスクに集中できます。 デバイスをオフラインにするには、doOffline(Session session) を呼び出します。
データの報告
プロトコルアダプタは、override channelRead(ChannelHandlerContext ctx, Object msg) を使用する必要があります。 これは、すべての機器がデータを報告するための入り口です。 オブジェクト msg は、デコーダーから出力されたデータです。
データの報告には 3 つのステップがあります。データを報告する予定のデバイスを特定し、このデバイスに対応するセッションを見つけ、そして IoT Platform にデータを報告することです。 データを報告するには、以下のインターフェイスを使用します。
- CompletableFuture doPublishAsync(Session session, String topic, byte[] payload, int qos): データは直ちに、非同期的に送信されます。 開発者は future を使って送信結果を取得します。
- CompletableFuture doPublishAsync(Session session, ProtocolMessage protocolMsg): データは直ちに、非同期的に送信されます。 開発者は future を使って送信結果を取得します。
- boolean doPublish(Session session, ProtocolMessage protocolMsg, int timeout): データは非同期的に送信され、応答を待ちます。
- boolean doPublish(Session session, String topic, byte[] payload, int qos, int timeout): データは非同期的に送信され、応答を待ちます。
DeviceIdentity identity = ConfigFactory.getDeviceConfigManager().getDeviviceIdentity(device);
if (identity == null) {
// Devices are not mapped with those registered on IoT Platform. Messages are dropped.
return;
}
Session session = SessionManagerFactory.getInstance().getSession(device);
if (session == null) {
// The device is not online. Please get online or drop messages. Make sure devices are online before reporting data to IoT Platform.
}
boolean success = doPublish(session, topic, payload, 0, 10);
if(success) {
// Data is successfully reported to Alibaba Cloud IoT Platform.
} else {
// Failed to report data to IoT Platform
}
ダウンストリームメッセージング
詳細については、「Core SDK 開発 > ダウンストリームメッセージング」をご参照ください。
SDKは、ダウンストリームデータディストリビューターとして、com.aliyun.iot.as.bridge.core.handler.DefaultDownlinkChannelHandler を提供します。 ユニキャストとブロードキャストをサポートしています。 ユニキャストはデフォルトでクラウドから直接デバイスにデータを転送し、ブロードキャストは開発者が特定の実装をカスタマイズすることを要求します。 カスタマイズはサブクラスを派生させることで実現できます。
import io.netty.channel.Channel;
import Io. netty. Channel. channelfuture;
...
public class SampleDownlinkChannelHandler implements DownlinkChannelHandler {
@Override
public boolean pushToDevice(Session session, String topic, byte[] payload) {
// Obtain communication channel from device's corresponding session.
Channel channel = (Channel) session.getChannel().get();
if (channel ! = null && channel.isWritable()) {
String body = new String(payload, StandardCharsets.UTF_8);
// Send downstream data to devices
ChannelFuture future = channel.pipeline().writeAndFlush(body);
future.addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
return true;
}
return false;
}
@Override
public boolean broadcast(String topic, byte[] payload) {
throw new RuntimeException("not implemented");
}
}