public static extern OCStackResult OCDoResource(out IntPtr handle,
                                                 OCMethod method,
                                                 [MarshalAs(UnmanagedType.LPStr)] string requestUri,
                                                 OCDevAddr destination,
                                                 IntPtr payload, //OCPayload payload,
                                                 OCConnectivityType connectivityType,
                                                 OCQualityOfService qos,
                                                 OCCallbackData cbData,
                                                 OCHeaderOption options,
                                                 byte numOptions);
        private async Task <ClientResponse <Payload> > SendAsync(string resourceTypeName, Dictionary <string, object> data, OCMethod method)
        {
            var tcs          = new TaskCompletionSource <ClientResponse <Payload> >();
            var callbackData = new OCCallbackData();
            OCClientResponseHandler handler = (context, handle, clientResponse) =>
            {
                GCHandle.FromIntPtr(context).Free();
                if (clientResponse.result > OCStackResult.OC_STACK_RESOURCE_CHANGED)
                {
                    tcs.SetException(new Exception("Resource returned error: " + clientResponse.result.ToString()));
                }
                else
                {
                    tcs.SetResult(new ClientResponse <Payload>(clientResponse));
                }
                return(OCStackApplicationResult.OC_STACK_DELETE_TRANSACTION);
            };
            var gcHandle = GCHandle.Alloc(handler);

            callbackData.cb      = handler;
            callbackData.context = GCHandle.ToIntPtr(gcHandle);

            IntPtr payloadHandle = IntPtr.Zero;

            if (resourceTypeName != null)
            {
                RepPayload payload = new RepPayload(data);

                payload.SetUri(_resourceUri);
                payload.Types.Add(resourceTypeName);
                payloadHandle = payload.AsOCRepPayload();
            }

            var result = OCStack.OCDoResource(out _handle, method, _resourceUri, _address.OCDevAddr, payloadHandle, OCConnectivityType.CT_DEFAULT, OCQualityOfService.OC_LOW_QOS, callbackData, null, 0);

            // if (payloadHandle != IntPtr.Zero)
            //     OCPayloadInterop.OCPayloadDestroy(payloadHandle);
            OCStackException.ThrowIfError(result, "Failed to send to resource");
            var response = await tcs.Task.ConfigureAwait(false);

            return(response);
        }