★ご注意
以下は、Microsoft Visual Studio Community 2019 の Xamarin.Forms を使用して、Android・iOS・UWP向けクライアントアプリを開発する場合を想定した WebSocket API のご説明とサンプルプログラムです。
光CTIスマートコネクトサービスは、WebSocket APIを提供します。
※Windows 7SP1 では動作しません。WebSocket API をご利用の際は、 Windows 8、8.1、10 をご使用ください。
(Windows 7SP1 は OSレベルの WebSocketに非対応のため、ご利用いただけません。)
【サンプルプログラムの利用方法】
- サーバーにするパソコンに「光CTIスマートコネクトサービス」をインストールします。
- Microsoft Visual Studio Community 2019 で Xamarin.Formsの新規プロジェクトを作成します。
- NuGetパッケージマネージャーで「System.Net.Websockets」を全プロジェクトにインストールします。
- NuGetパッケージマネージャーで Xamarin.Forms 他を最新の状態に更新しておきます。
- UWPプロジェクトの場合は、機能の「インターネット(クライアント)」と「プライベートネットワーク(クライアントとサーバー)」にチェックを付けます。
- 以下の【クライアントプログラム(Xamarin.Forms用)のサンプルソース① MainPage.xaml】を参考にプログラムを作成します。
- 以下の【クライアントプログラム(Xamarin.Forms用)のサンプルソース② MainPage.xaml.cs】を参考にプログラムを作成します。
- 作成したクライアントプログラム(Xamarin.Forms用)をビルド後、実機(Android・iOS・UWP)上で実行します。
【使用するポート】
- 55963ポート(サービス側のパソコンでオープンが必要です。)
【クライアントプログラム(Xamarin.Forms用)のサンプルソース① MainPage.xaml】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:d="http://xamarin.com/schemas/2014/forms/design" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="ClientWebSocketSample.MainPage"> <StackLayout> <!-- Place new controls here --> <Label Text="Xamarin.Forms WebSocketサンプル" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" /> <Button Text="サービスへ接続" x:Name="サービスへ接続" Clicked="サービスへ接続_Clicked" /> <Button Text="サービスから切断" x:Name="サービスから切断" Clicked="サービスから切断_Clicked" /> </StackLayout> </ContentPage> |
【クライアントプログラム(Xamarin.Forms用)のサンプルソース② MainPage.xaml.cs】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using Xamarin.Forms; using System.Net.WebSockets; using System.Threading; namespace ClientWebSocketSample { // Learn more about making custom code visible in the Xamarin.Forms previewer // by visiting https://aka.ms/xamarinforms-previewer [DesignTimeVisible(false)] public partial class MainPage : ContentPage { private ClientWebSocket _ws = null; public MainPage() { InitializeComponent(); } //光CTIスマートコネクトサービスへ接続 private async void サービスへ接続_Clicked(object sender, EventArgs e) { try { int _cnt = 1; _ws = new ClientWebSocket(); //接続先エンドポイントを指定(光CTIスマートコネクトサービス稼働中PCのIPアドレスで指定する) Uri serverUri = new Uri("ws://192.168.24.36:55963/CTI_SmartConnectService/WebSocket/"); //キープアライブタイマーの間隔を5分に設定 _ws.Options.KeepAliveInterval = TimeSpan.FromSeconds(5 * 60 * 1000); //サービスに接続 await _ws.ConnectAsync(serverUri, CancellationToken.None); while (_ws.State == WebSocketState.Open) { if (_cnt == 1) //1回だけ実行 { _cnt++; //サービスへメッセージを送信 string sendmsg = "Regist('クライアント名')"; ArraySegment<byte> bytesToSend = new ArraySegment<byte>(Encoding.UTF8.GetBytes(sendmsg)); await _ws.SendAsync(bytesToSend, WebSocketMessageType.Text, true, CancellationToken.None); } //サービスからメッセージを受信 ArraySegment<byte> bytesReceived = new ArraySegment<byte>(new byte[1024]); WebSocketReceiveResult result = await _ws.ReceiveAsync(bytesReceived, CancellationToken.None); string recvmsg = Encoding.UTF8.GetString(bytesReceived.Array, 0, result.Count); if (string.IsNullOrEmpty(recvmsg) == false) { await DisplayAlert("サービスからの通知", recvmsg, "OK"); } } } catch (Exception ex) { await DisplayAlert("エラー", ex.Message, "OK"); } } //光CTIスマートコネクトサービスから切断 private async void サービスから切断_Clicked(object sender, EventArgs e) { try { if (_ws != null && _ws.State == WebSocketState.Open) { //サービスへメッセージを送信 string sendmsg = "UnRegist('クライアント名')"; ArraySegment<byte> bytesToSend = new ArraySegment<byte>(Encoding.UTF8.GetBytes(sendmsg)); await _ws.SendAsync(bytesToSend, WebSocketMessageType.Text, true, CancellationToken.None); await DisplayAlert("確認", "光CTIスマートコネクトサービスから切断しました。", "OK"); } } catch (Exception ex) { await DisplayAlert("エラー", ex.Message, "OK"); } } } } |
【実行画面サンプル】
【光CTIスマートコネクトサービスWebSocket API仕様】
アドレス | ws://(サービス実行中のパソコンのIPアドレス):55963/CTI_SmartConnectService/WebSocket/ |
---|---|
バインディング |
customBinding(netHttpBinding からの派生)
|
データ名称 | Send メッセージ | |
---|---|---|
接続中クライアントリストへ登録する | Regist(‘name’) | |
|
||
接続中クライアントリストから登録解除する | UnRegist(‘name’) | |
|
||
キープアライブ(タイムアウトを防ぐため、クライアントから5分間隔で呼び出す)
※調査の結果、本メッセージを送信しなくても接続がキープされているようです。 |
KeepAlive(‘name’) | |
WCFのタイムアウトを防ぐため、クライアントから定期的にキープアライブをコールします。(10分以内に1回コールする必要があります。)
|
データ名称 | CallBack メッセージ | |
---|---|---|
サービスからの通知 | { “title”:”タイトル”, “msg”:”メッセージ”, “tyakusin_nichiji”:”着信日時”, “from”:”相手TEL”, “to”:”着信TEL”, “kokyaku_id”:”顧客ID”, “kokyaku_name”:”顧客名(会社名)”, “tantou_name”:”担当者名”, “syubetsu”:”回線種別” } ※JSON形式 |
|
サービスから着信メッセージ、クライアント生存確認、処理完了通知がコールバックされます。
|