簡體   English   中英

扭曲的AMP服務器未接收到數據

[英]Twisted AMP Server is not receiving data

我在twisted上構建了一個多服務守護程序,該守護程序從django接收命令,而這種情況是

  1. django視圖連接amp服務器
  2. DJango沒有發送命令或AMP沒有收到命令

我的問題是我在做什么錯

我的代碼是:

AMP服務器

from twisted.protocols.amp import AMP, Command, String

class AmpProcessor(Command):
    arguments = [('proto', String()),
                 ('imei', String()),
                 ('ip', String()),
                 ('port', String()),
                 ('cmmd', String())]
    response = [('answer', String())]

class AMPServer(AMP):


    @AmpProcessor.responder
    def processor(self, proto, imei, ip, port, cmmd):
        print cmmd
        self.factories['proto'].clients['ip'].sendMessage(cmmd)
        return {'answer': 'ok'}

TAC文件

import os, sys
import ConfigParser
from twisted.application import internet, service
from twisted.internet import protocol, reactor
from listener.TrackerServer import TrackerFactory
from listener.AMPServer import AMPServer
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.application.internet import StreamServerEndpointService

PROJECT_DIR = os.path.abspath(os.path.dirname(__file__))
sys.path.append(PROJECT_DIR)

path = None
config = ConfigParser.ConfigParser()
config.read('protocols.cfg')

application = service.Application("tracker")

factories = {}

for device in config.get('protocols', 'keys').split(','):
    devicer = config.get(device, 'name')
    factories[devicer] = TrackerFactory(devicer)
    internet.TCPServer(int(config.get(device, 'port')), factories[devicer]).setServiceParent(application)

endpoint = TCP4ServerEndpoint(reactor, 8750)
factory = Factory()
factory.protocol = AMPServer
factory.protocol.factories = factories
ampService = StreamServerEndpointService(endpoint, factory)
ampService.setServiceParent(application)

Django視圖

def send_fence_to_device (request):
    device_fence_id = request.GET['device_fence_id']
    device_id = request.GET['device_id']
    fence_id = request.GET['fence_id']
    fnc = Fence.objects.get(id=fence_id)
    dev = Device.objects.get(id=device_id)
    try:
        devLog = dev.devicelog_set.filter(device_id=device_id, status = True).order_by('created').reverse()[:1].all()[0]
        params = simplejson.loads(fnc.other)
        lttdlgtd = simplejson.loads(fnc.points)
        strCommand = ".geo.%s,%s,%s,%s,%s,%s,%s,%s,%s" % (params['identificator'], fnc.name[:4], round(float(lttdlgtd[0][0]), 4), round(float(lttdlgtd[0][1]), 4), round(float(fnc.radius), 4), params['time_to_arrive'], params['fence_class'], params['tolerance'], 1)
        d = connect()
        def connected(protocol):
            return protocol.callRemote(
                AmpProcessor,
                proto='TELCOMIP',
                imei=devLog.ip,
                ip=devLog.ip,
                port=devLog.port,
                command=strCommand)
        d.addCallback(connected)

        def saved(result):
            return HttpResponse(simplejson.dumps(result), mimetype='application/json')
            #print 'Registration result:', result
        d.addCallback(saved)
        #d.addErrback(err, "Failed to register")

        def finished(ignored):
            reactor.stop()
        d.addCallback(finished)
        reactor.run(installSignalHandlers=0)

        #return HttpResponse(simplejson.dumps(1), mimetype='application/json')
    except:
        return HttpResponse(simplejson.dumps(0), mimetype='application/json')



def connect():
    endpoint = TCP4ClientEndpoint(reactor, "127.0.0.1", 8750)
    factory = Factory()
    factory.protocol = AMP
    return endpoint.connect(factory)


class DeviceUnavailable(Exception):
    pass

class AmpProcessor(Command):
    arguments = [('proto', String()),
                 ('imei', String()),
                 ('ip', String()),
                 ('port', String()),
                 ('cmmd', String())]

    response = [('answer', String())]

    errors = {DeviceUnavailable: 'device-unavailable'}

每個進程只能調用一次reactor.run 我猜您每個請求調用一次send_fence_to_device 這意味着它可能只工作一次,但是所有后續調用都將失敗。

如果您打算在Django應用程序中可靠地使用Twisted,那么Crochet可能會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM