Möglicher Lösungsansatz vom Code |
Hiermit könnte man eventuell die Umsetzung mit Javascript realisieren.
Hier sieht man eine Lösung welches es ermöglicht UDP sockets in Javascript zu implementieren.
| // Copyright (c) 2014 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| var Event = require('cordova-plugin-chrome-apps-common.events'); | |
| var platform = cordova.require('cordova/platform'); | |
| var exec = cordova.require('cordova/exec'); | |
| var callbackWithError = require('cordova-plugin-chrome-apps-common.errors').callbackWithError; | |
| var checkBufferSize = function(bufferSize) { | |
| if (bufferSize === null) | |
| return; | |
| if (bufferSize > 65535) { | |
| console.warn('Buffer size exceeds IPv4 UDP 65535 size limit.'); | |
| } | |
| if (bufferSize > 4294967295) { | |
| console.warn('Buffer size exceeds IPv6 UDP 4294967295 size limit.'); | |
| } | |
| }; | |
| exports.create = function(properties, callback) { | |
| if (typeof properties == 'function') { | |
| callback = properties; | |
| properties = {}; | |
| } | |
| var win = callback && function(socketId) { | |
| var createInfo = { | |
| socketId: socketId | |
| }; | |
| callback(createInfo); | |
| }; | |
| checkBufferSize(properties.bufferSize); | |
| exec(win, null, 'ChromeSocketsUdp', 'create', [properties]); | |
| }; | |
| exports.update = function(socketId, properties, callback) { | |
| checkBufferSize(properties.bufferSize); | |
| exec(callback, null, 'ChromeSocketsUdp', 'update', [socketId, properties]); | |
| }; | |
| exports.setPaused = function(socketId, paused, callback) { | |
| exec(callback, null, 'ChromeSocketsUdp', 'setPaused', [socketId, paused]); | |
| }; | |
| exports.bind = function(socketId, address, port, callback) { | |
| var win = callback && function() { | |
| callback(0); | |
| }; | |
| var fail = callback && function(error) { | |
| callbackWithError(error.message, callback, error.resultCode); | |
| }; | |
| exec(win, fail, 'ChromeSocketsUdp', 'bind', [socketId, address, port]); | |
| }; | |
| exports.send = function(socketId, data, address, port, callback) { | |
| var type = Object.prototype.toString.call(data).slice(8, -1); | |
| if (type != 'ArrayBuffer') { | |
| throw new Error('chrome.sockets.udp.send - data is not an ArrayBuffer! (Got: ' + type + ')'); | |
| } | |
| var win = callback && function(bytesSent) { | |
| var sendInfo = { | |
| bytesSent: bytesSent, | |
| resultCode: 0 | |
| }; | |
| callback(sendInfo); | |
| }; | |
| var fail = callback && function(error) { | |
| var sendInfo = { | |
| bytesSent: 0, | |
| resultCode: error.resultCode | |
| }; | |
| callbackWithError(error.message, callback, sendInfo); | |
| }; | |
| exec(win, fail, 'ChromeSocketsUdp', 'send', [socketId, address, port, data]); | |
| }; | |
| exports.close = function(socketId, callback) { | |
| exec(callback, null, 'ChromeSocketsUdp', 'close', [socketId]); | |
| }; | |
| exports.getInfo = function(socketId, callback) { | |
| var win = callback && function(result) { | |
| result.persistent = !!result.persistent; | |
| result.paused = !!result.paused; | |
| callback(result); | |
| }; | |
| exec(win, null, 'ChromeSocketsUdp', 'getInfo', [socketId]); | |
| }; | |
| exports.getSockets = function(callback) { | |
| var win = callback && function(results) { | |
| for (var result in results) { | |
| result.persistent = !!result.persistent; | |
| result.paused = !!result.paused; | |
| } | |
| callback(results); | |
| }; | |
| exec(win, null, 'ChromeSocketsUdp', 'getSockets', []); | |
| }; | |
| exports.setBroadcast = function(socketId, enabled, callback) { | |
| var win = callback && function() { | |
| callback(0); | |
| }; | |
| var fail = callback && function(error) { | |
| callback(error.message, callback, error.resultCode); | |
| }; | |
| exec(win, fail, 'ChromeSocketsUdp', 'setBroadcast', [socketId, enabled]); | |
| }; | |
| exports.joinGroup = function(socketId, address, callback) { | |
| var win = callback && function() { | |
| callback(0); | |
| }; | |
| var fail = callback && function(error) { | |
| callback(error.message, callback, error.resultCode); | |
| }; | |
| exec(win, fail, 'ChromeSocketsUdp', 'joinGroup', [socketId, address]); | |
| }; | |
| exports.leaveGroup = function(socketId, address, callback) { | |
| var win = callback && function() { | |
| callback(0); | |
| }; | |
| var fail = callback && function(error) { | |
| callback(error.message, callback, error.resultCode); | |
| }; | |
| exec(win, fail, 'ChromeSocketsUdp', 'leaveGroup', [socketId, address]); | |
| }; | |
| exports.setMulticastTimeToLive = function(socketId, ttl, callback) { | |
| var win = callback && function() { | |
| callback(0); | |
| }; | |
| var fail = callback && function(error) { | |
| callback(error.message, callback, error.resultCode); | |
| }; | |
| exec(win, fail, 'ChromeSocketsUdp', 'setMulticastTimeToLive', [socketId, ttl]); | |
| }; | |
| exports.setMulticastLoopbackMode = function(socketId, enabled, callback) { | |
| var win = callback && function() { | |
| callback(0); | |
| }; | |
| var fail = callback && function(error) { | |
| callback(error.message, callback, error.resultCode); | |
| }; | |
| exec(win, fail, 'ChromeSocketsUdp', 'setMulticastLoopbackMode', [socketId, enabled]); | |
| }; | |
| exports.getJoinedGroups = function(socketId, callback) { | |
| exec(callback, null, 'ChromeSocketsUdp', 'getJoinedGroups', [socketId]); | |
| }; | |
| exports.onReceive = new Event('onReceive'); | |
| exports.onReceiveError = new Event('onReceiveError'); | |
| function registerReceiveEvents() { | |
| var win = function() { | |
| var info = { | |
| socketId: arguments[0], | |
| data: arguments[1], | |
| remoteAddress: arguments[2], | |
| remotePort: arguments[3] | |
| }; | |
| exports.onReceive.fire(info); | |
| }; | |
| // TODO: speical callback for android, DELETE when multipart result for | |
| // android is avaliable | |
| if (platform.id == 'android') { | |
| win = (function() { | |
| var data; | |
| var call = 0; | |
| return function(arg) { | |
| if (call === 0) { | |
| data = arg; | |
| call++; | |
| } else { | |
| var info = { | |
| socketId: arg.socketId, | |
| data: data, | |
| remoteAddress: arg.remoteAddress, | |
| remotePort: arg.remotePort | |
| }; | |
| call = 0; | |
| exports.onReceive.fire(info); | |
| } | |
| }; | |
| })(); | |
| } | |
| var fail = function(info) { | |
| var error = function() { | |
| exports.onReceiveError.fire(info); | |
| }; | |
| callbackWithError(info.message, error); | |
| }; | |
| exec(win, fail, 'ChromeSocketsUdp', 'registerReceiveEvents', []); | |
| } | |
| require('cordova-plugin-chrome-apps-common.helpers').runAtStartUp(registerReceiveEvents); |