简体   繁体   English

扭曲的AMP服务器未接收到数据

[英]Twisted AMP Server is not receiving data

I have built a multiservice daemon on twisted, which one receive command from a django, and that happen is 我在twisted上构建了一个多服务守护程序,该守护程序从django接收命令,而这种情况是

  1. The django view connect the amp server django视图连接amp服务器
  2. DJango doesnt sent the command or AMP is not receiving the command DJango没有发送命令或AMP没有收到命令

My question is What I am doing wrong 我的问题是我在做什么错

My code is: 我的代码是:

AMP Server 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 File 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 View 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'}

You can only call reactor.run once per process. 每个进程只能调用一次reactor.run I am guessing that you are calling send_fence_to_device once per request. 我猜您每个请求调用一次send_fence_to_device This means that it may work once, but all subsequent calls will fail. 这意味着它可能只工作一次,但是所有后续调用都将失败。

If you are set on using Twisted reliably inside a Django application, Crochet might help. 如果您打算在Django应用程序中可靠地使用Twisted,那么Crochet可能会有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM