示例#1
0
static void tickHandler(int userVal, xPL_ObjectPtr obj)
{
	static Bool firstTime = TRUE;

	/* Process clock tick update checking */
	if(firstTime){
		firstTime = FALSE;
		xPL_clearMessageNamedValues(xplEventTriggerMessage);
		xPL_addMessageNamedValue(xplEventTriggerMessage, "event", "ready");
		xPL_sendMessage(xplEventTriggerMessage);
	}
	
	if(serialRetryTimer){ /* If this is non-zero, we lost the serial connection, wait retry time and try again */
		serialRetryTimer--;
		if(!serialRetryTimer){
			if(!(serioStuff = serio_open(comPort, COM_BAUD_RATE))){
				debug(DEBUG_UNEXPECTED,"Serial reconnect failed, trying later...");
				serialRetryTimer = SERIAL_RETRY_TIME;
				return;
			}
			else{
				debug(DEBUG_EXPECTED,"Serial reconnect successful");
				if(!xPL_addIODevice(serioHandler, 1234, serio_fd(serioStuff), TRUE, FALSE, FALSE))
					fatal("Could not register serial I/O fd with xPL");
			}
		}
	}

}
示例#2
0
static void doLRRTrigger(String line)
{
	String plist[4];
	int i;

	plist[0] = NULL;

	/* Split the message */


	if(3 == splitString(line, plist, ',', 3)){
		
		/* If OPEN or CANCEL, clear the alarmLRR flag */
		if((!strcmp(plist[2], "OPEN")) || (!strcmp(plist[2], "CANCEL")))
			alarmLRR = FALSE;
			
		/* Try to find a match to an xPL equivalent reporting state */
		for(i = 0; lrrNameMap[i].ademco; i++){
			if(!strcmp(lrrNameMap[i].ademco, plist[2]))
				break;
		}
		if(lrrNameMap[i].ademco){ /* If match */
			xPL_clearMessageNamedValues(xplEventTriggerMessage);
			xPL_addMessageNamedValue(xplEventTriggerMessage, "event", lrrNameMap[i].xpl);
			xPL_sendMessage(xplEventTriggerMessage);
		
			/* Update the alarmLRR bit which reflects the status of all the alarms */
			if(!strcmp(lrrNameMap[i].xpl, "alarm"))
					alarmLRR = TRUE;
		}
	}
	if(plist[0])
		free(plist[0]);
}
示例#3
0
static void doEXPTrigger(String line)
{
	String plist[4];
	int i;
	expMapPtr_t e;
	
	plist[0] = NULL;
	
	/* Do not send zone state changes if armed */
	if(stateBits.armed)
		return;
		
	/* Split the message */
	if(3 == splitString(line, plist, ',', 3)){
		for(e = expMapHead; e ; e = e->next){
			/* debug(DEBUG_EXPECTED,"plist[0]: %s, plist[1]: %s, e->addr: %d, e->channel: %d", plist[0], plist[1], e->addr, e->channel); */
			if((atoi(plist[0]) == e->addr)&&(atoi(plist[1]) == e->channel))
				break;
		}
		if(e){ /* If match */
			i = atoi(plist[2]);
			xPL_clearMessageNamedValues(xplEventTriggerMessage);
			xPL_addMessageNamedValue(xplEventTriggerMessage, "event", i ? "alert" : "normal");
			xPL_addMessageNamedValue(xplEventTriggerMessage, "zone", e->zone);
			xPL_sendMessage(xplEventTriggerMessage);
		}
	}
	if(plist[0])
		free(plist[0]);

}
示例#4
0
文件: xPL-service.c 项目: Gremio/xPL
/* Send an XPL Heartbeat immediatly */
Bool xPL_sendHeartbeat(xPL_ServicePtr theService) {
  xPL_MessagePtr theHeartbeat;

  /* Create the Heartbeat message, if needed */
  if (theService->heartbeatMessage == NULL) {
    /* Configure the heartbeat */
    if (theService->configurableService && !theService->serviceConfigured) {
      theHeartbeat = createHeartbeatMessage(theService, HBEAT_CONFIG);
    } else {
      theHeartbeat = createHeartbeatMessage(theService, HBEAT_NORMAL);
    }

    /* Install a new heartbeat message */
    theService->heartbeatMessage = theHeartbeat;
    xPL_Debug("SERVICE:: Just allocated a new Heartbeat message for the service");
  } else
    theHeartbeat = theService->heartbeatMessage;
    
  /* Send the message */
  if (!xPL_sendMessage(theHeartbeat)) return FALSE;

  /* Update last heartbeat time */
  theService->lastHeartbeatAt = time(NULL); 
  xPL_Debug("Sent Heatbeat message");
  return TRUE;
}
示例#5
0
void sendDevList(xPL_MessagePtr msg) {
	int deviceCount = 0, i;
	char deviceList[128];
	xPL_MessagePtr message = NULL;

	message = xPL_createBroadcastMessage(telldusService, xPL_MESSAGE_STATUS);
	xPL_setSchema(message, "lighting", "devlist");

	xPL_setMessageNamedValue(message, "network", xPL_getMessageNamedValue(msg, "network"));

	if (xPL_strcmpIgnoreCase(xPL_getMessageNamedValue(msg, "network"), "1") == 0) {
		xPL_setMessageNamedValue(message, "status", "ok");
		deviceCount = tdGetNumberOfDevices();
		for( i = 0; i < deviceCount; ++i ) {
			if (i == 0) { /* First */
				strcpy(deviceList, xPL_intToStr(tdGetDeviceId(i)));
			} else {
				strcat(deviceList, ",");
				strcat(deviceList, xPL_intToStr(tdGetDeviceId(i)));
			}
		}

		xPL_setMessageNamedValue(message, "device-count", xPL_intToStr(deviceCount) );
		xPL_setMessageNamedValue(message, "device", deviceList );
	} else {
		xPL_setMessageNamedValue(message, "status", "not-found");
	}

	xPL_sendMessage(message);

	xPL_releaseMessage(message);
}
示例#6
0
int main(void)
{
	char *data;
	long m,n;
	printf("%s%c%c\n",
	"Content-Type:text/html;charset=iso-8859-1",13,10);

//	printf("<h3>Multiplication results</h3>\n");

	data = getenv("QUERY_STRING");

  

	stripSpace(data);
	char schemaclass[500];
	char schematype[500];
	char namedvaluearray[500];
	char name[500];
	char value[500];
	char command[500];
	char varcontent[500];
  char jsoncontent[500];
  char NVelement[500];
//  printf("URL %s<BR>\n",data);
  strcpy(command,data);
  unencode(command);
  findVarInURL(varcontent,data,"xplpacket");
  unencode(varcontent); 
  stripSpace(varcontent);
	
  xPL_initialize(xPL_getParsedConnectionType());
  webgateway = xPL_createService("viknet", "webgateway", "default");  
  xPL_setServiceVersion(webgateway, "1.0");

  
  /* Add a responder for time setting */
  xPL_addServiceListener(webgateway, webgatewayMessageHandler, xPL_MESSAGE_ANY, "security", NULL, NULL);
  xPL_setServiceEnabled(webgateway, TRUE);
  /* Create a message to send */
  xplMessage = xPL_createBroadcastMessage(webgateway, xPL_MESSAGE_COMMAND);

  if (JSONfindObject(schemaclass,varcontent,"msgschemaclass")!=NULL && JSONfindObject(schematype,varcontent,"msgschematype")!=NULL)
    xPL_setSchema(xplMessage, JSONtoString(schemaclass), JSONtoString(schematype));
	else
    xPL_setSchema(xplMessage, "schemaclass", "schematype");	
	
	JSONfindObject(namedvaluearray,varcontent,"namevaluelist");
  int i;
   for (i=0;i<JSONArrayLength(namedvaluearray);i++)
   {
     JSONArrayAt(NVelement,namedvaluearray,i);
	   if ( JSONfindObject(name,NVelement,"name") && JSONfindObject(value,NVelement,"value"))
	   xPL_addMessageNamedValue(xplMessage, JSONtoString(name), JSONtoString(value));	   
   }
   xPL_sendMessage(xplMessage);
//   xPL_processMessages(0);
	return 0;  
}       
示例#7
0
void sendDevInfo(xPL_MessagePtr msg) {
	xPL_MessagePtr message = NULL;
	Bool found = FALSE, deviceCount = tdGetNumberOfDevices();
	int deviceId = 0, methods = 0, i = 0, lastSentCommand, level = 0;
	char *name, buffer[12], *value;

	xPL_strToInt(xPL_getMessageNamedValue(msg, "device"), &deviceId);
	for( i = 0; i < deviceCount; ++i ) {
		if (tdGetDeviceId(i) == deviceId) {
			found = TRUE;
			break;
		}
	}

	message = xPL_createBroadcastMessage(telldusService, xPL_MESSAGE_STATUS);
	xPL_setSchema(message, "lighting", "devinfo");

	xPL_setMessageNamedValue(message, "network", xPL_getMessageNamedValue(msg, "network"));
	xPL_setMessageNamedValue(message, "device", xPL_getMessageNamedValue(msg, "device"));

	if (xPL_strcmpIgnoreCase(xPL_getMessageNamedValue(msg, "network"), "1") == 0 && found == TRUE) {
		lastSentCommand = tdLastSentCommand(deviceId, TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_DIM);
		if (lastSentCommand == TELLSTICK_TURNON) {
			level = 100;
		} else if (lastSentCommand == TELLSTICK_DIM) {
			value = tdLastSentValue(deviceId);
			level = atoi(value);
			free(value);
 			level = round((float)level / 255.0 * 100.0);
			if (level > 100) {
				level = 100;
			} else if (level < 0) {
				level = 0;
			}
		} else {
			level = 0;
		}
		methods = tdMethods(deviceId, TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_DIM);
		name = tdGetName(deviceId);
		sprintf(buffer, "1,%s,0,%i", (methods & TELLSTICK_DIM ? "true" : "false"), level);
		xPL_setMessageNamedValue(message, "status", "ok");
		xPL_setMessageNamedValue(message, "name", name );
		xPL_setMessageNamedValue(message, "report-on-manual", "false" );
		xPL_setMessageNamedValue(message, "channel-count", "1" );
		xPL_setMessageNamedValue(message, "primary-channel", "1" );
		xPL_setMessageNamedValue(message, "channel", buffer );
		xPL_setMessageNamedValue(message, "scene-count", "0" );

		free(name);
	} else {
		xPL_setMessageNamedValue(message, "status", "not-found");
	}

	xPL_sendMessage(message);

	xPL_releaseMessage(message);
}
示例#8
0
文件: xPL-service.c 项目: Gremio/xPL
/* updated and the message sent                                           */
Bool xPL_sendServiceMessage(xPL_ServicePtr theService, xPL_MessagePtr theMessage) {
  if ((theService == NULL) || (theMessage == NULL)) return FALSE;

  /* Insure the message comes from this service */
  theMessage->sourceVendor = theService->serviceVendor;
  theMessage->sourceDeviceID = theService->serviceDeviceID;
  theMessage->sourceInstanceID = theService->serviceInstanceID;

  /* Send it on it's merry way */
  return xPL_sendMessage(theMessage);
}
示例#9
0
static void doZoneList()
{
	zoneMapPtr_t zm;

	xPL_setSchema(xplStatusMessage, "security", "zonelist");

	xPL_clearMessageNamedValues(xplStatusMessage);

	for(zm = zoneMapHead; zm; zm = zm->next){
		xPL_addMessageNamedValue(xplStatusMessage, "zone-list", zm->zone_name);
	}
	if(!xPL_sendMessage(xplStatusMessage))
		debug(DEBUG_UNEXPECTED, "request.zonelist transmission failed");
}
示例#10
0
void sendNetList() {
	xPL_MessagePtr message = NULL;

	message = xPL_createBroadcastMessage(telldusService, xPL_MESSAGE_STATUS);
	xPL_setSchema(message, "lighting", "netlist");

	xPL_setMessageNamedValue(message, "status", "ok");
	xPL_setMessageNamedValue(message, "network", "1");

	/* Broadcast the message */
	xPL_sendMessage(message);

	xPL_releaseMessage(message);
}
示例#11
0
void sendGatewayReadyMessage() {
	xPL_MessagePtr gatewayReadyMessage = NULL;
	/* Create a message to send */
	gatewayReadyMessage = xPL_createBroadcastMessage(telldusService, xPL_MESSAGE_TRIGGER);
	xPL_setSchema(gatewayReadyMessage, "lighting", "gateway");

	/* Install the value and send the message */
	xPL_setMessageNamedValue(gatewayReadyMessage, "report", "gateway-ready");

	/* Broadcast the message */
	xPL_sendMessage(gatewayReadyMessage);

	xPL_releaseMessage(gatewayReadyMessage);
}
示例#12
0
Bool sendMessage(int argc, String argv[]) {
  int argIndex = 0;
  xPL_ServicePtr theService = NULL;
  xPL_MessagePtr theMessage = NULL;
  String delimPtr;

  /* Create service so we can create messages */
  if ((theService = xPL_createService(srcVendor, srcDeviceID, srcInstanceID)) == NULL) {
    fprintf(stderr, "Unable to create xPL service\n");
    return FALSE;
  }

  /* Create an appropriate message */
  if (msgTarget == NULL) {
    if ((theMessage = xPL_createBroadcastMessage(theService, msgType)) == NULL) {
      fprintf(stderr, "Unable to create broadcast message\n");
      return FALSE;
    } 
  } else {
    if ((theMessage = xPL_createTargetedMessage(theService, msgType, tgtVendor, tgtDeviceID, tgtInstanceID)) == NULL) {
      fprintf(stderr, "Unable to create targetted message\n");
      return FALSE;
    }
  }

  /* Install the schema */
  xPL_setSchema(theMessage, msgSchemaClass, msgSchemaType);

  /* Install named values */
  for (argIndex = 1; argIndex < argc; argIndex++) {
    if ((delimPtr = strstr(argv[argIndex], "=")) == NULL) {
      fprintf(stderr, "Improperly formatted name/value pair %s\n", argv[argIndex]);
      return FALSE;
    }

    /* Break them up  and add it */
    *delimPtr++ = '\0';
    xPL_addMessageNamedValue(theMessage, argv[argIndex], delimPtr);
  }

  /* Send the message */
  if (!xPL_sendMessage(theMessage)) {
    fprintf(stderr, "Unable to send xPL message\n");
    return FALSE;
  }

  return TRUE;
}
示例#13
0
文件: xPL-service.c 项目: Gremio/xPL
/* Send an Goodbye XPL Heartbeat immediatly */
Bool xPL_sendGoodbyeHeartbeat(xPL_ServicePtr theService) {
  xPL_MessagePtr theHeartbeat;
  
  /* Create a shutdown message */
  if (theService->configurableService && !theService->serviceConfigured)
    theHeartbeat = createHeartbeatMessage(theService, HBEAT_CONFIG_END);
  else
    theHeartbeat = createHeartbeatMessage(theService, HBEAT_NORMAL_END);
    
  /* Send the message */
  if (!xPL_sendMessage(theHeartbeat)) return FALSE;

  /* Release message */
  xPL_releaseMessage(theHeartbeat);

  xPL_Debug("Sent Goodbye Heatbeat");
  return TRUE;
}
示例#14
0
static void doGateInfo()
{
	int i;
	String ws;
	
	if(!(ws = mallocz(WS_SIZE)))
		MALLOC_ERROR;
	
	

	xPL_setSchema(xplStatusMessage, "security", "gateinfo");

	xPL_clearMessageNamedValues(xplStatusMessage);

	xPL_setMessageNamedValue(xplStatusMessage, "protocol", "ECP");
	xPL_setMessageNamedValue(xplStatusMessage, "description", "ad2usb to xPL bridge");
	xPL_setMessageNamedValue(xplStatusMessage, "version", VERSION);
	xPL_setMessageNamedValue(xplStatusMessage, "author", "Stephen A. Rodgers");
	xPL_setMessageNamedValue(xplStatusMessage, "info-url", "http://xpl.ohnosec.org");
	snprintf(ws, WS_SIZE, "%u", zoneCount);
	xPL_setMessageNamedValue(xplStatusMessage, "zone-count", ws);
	
	/* Build comma delimited command list */
	ws[0] = 0;
	for(i = 0; basicCommandList[i] && (strlen(ws) + strlen(basicCommandList[i]) < WS_SIZE) ; i++){
			strcat(ws, basicCommandList[i]);
			strcat(ws, ",");
	}
	/* Strip comma from end of string if it is there */
	i = strlen(ws);
	if(i)
		i--;
	if(ws[i] == ',')
		ws[i] = 0;
		
	xPL_setMessageNamedValue(xplStatusMessage, "gateway-commands", ws);

	if(!xPL_sendMessage(xplStatusMessage))
		debug(DEBUG_UNEXPECTED, "request.gateinfo transmission failed");
	free(ws);
	
}
示例#15
0
static void doZoneInfo(xPL_MessagePtr theMessage)
{
		const String zone = xPL_getMessageNamedValue(theMessage, "zone");
		zoneMapPtr_t zm;
		if(zone && (zm = zoneLookup(zone))){
			xPL_setSchema(xplStatusMessage, "security", "zoneinfo");
			
			/* Clear the message */
			xPL_clearMessageNamedValues(xplStatusMessage);
			
			/* Fill in the data */
			xPL_addMessageNamedValue(xplStatusMessage, "id", zone);
			xPL_addMessageNamedValue(xplStatusMessage, "zone-type", zm->zone_type);
			xPL_addMessageNamedValue(xplStatusMessage, "alarm-type", zm->alarm_type);
			xPL_addMessageNamedValue(xplStatusMessage, "area-count","0");
			/* Send the message */
			if(!xPL_sendMessage(xplStatusMessage))
				debug(DEBUG_UNEXPECTED, "request.zoneinfo transmission failed");
		}
}
示例#16
0
void doArmDisarm(xPL_MessagePtr theMessage, int cmd)
{
	const String code = xPL_getMessageNamedValue(theMessage, "id");
	
	if(!code) /* If no code, then bail */
		return;
	
	if(cmd < 2){
		if(stateBits.ready){
			serio_printf(serioStuff, "%s%c", code, (cmd == 0) ? '3' : '2');
		}
		else{ /* arming failed, send error trigger message */
			xPL_clearMessageNamedValues(xplEventTriggerMessage);
			xPL_addMessageNamedValue(xplEventTriggerMessage, "event", "error");
			xPL_sendMessage(xplEventTriggerMessage);
		}
	}
	else{ /* disarm */
		serio_printf(serioStuff, "%s1", code);
	}
}
示例#17
0
void sendNetInfo(xPL_MessagePtr msg) {
	xPL_MessagePtr message = NULL;

	message = xPL_createBroadcastMessage(telldusService, xPL_MESSAGE_STATUS);
	xPL_setSchema(message, "lighting", "netinfo");

	xPL_setMessageNamedValue(message, "network", xPL_getMessageNamedValue(msg, "network"));

	if (xPL_strcmpIgnoreCase(xPL_getMessageNamedValue(msg, "network"), "1") == 0) {
		xPL_setMessageNamedValue(message, "status", "ok");
		xPL_setMessageNamedValue(message, "name", hostname );
		xPL_setMessageNamedValue(message, "device-count", xPL_intToStr(tdGetNumberOfDevices()) );
		xPL_setMessageNamedValue(message, "scene-count", "0" );
	} else {
		xPL_setMessageNamedValue(message, "status", "not-found");
	}

	xPL_sendMessage(message);

	xPL_releaseMessage(message);
}
示例#18
0
static void doGateStat()
{
		String status = "disarmed";
		
		xPL_setSchema(xplStatusMessage, "security", "gatestat");
		
		/* Clear the message */
		xPL_clearMessageNamedValues(xplStatusMessage);
		
		/* Fill in the data */
		xPL_addMessageNamedValue(xplStatusMessage, "ac-fail", stateBits.acfail ? "true" : "false");
		xPL_addMessageNamedValue(xplStatusMessage, "low-battery", stateBits.lowbatt ? "true" : "false");
		if(stateBits.alarm)
			status = "alarm";
		else if(stateBits.armed)
			status = "armed";
		xPL_addMessageNamedValue(xplStatusMessage, "status", status);		
		
		/* Send the message */
		if(!xPL_sendMessage(xplStatusMessage))
			debug(DEBUG_UNEXPECTED, "request.gatestat transmission failed");
}
示例#19
0
void sendGatewayInfo() {
	xPL_MessagePtr message = NULL;

	message = xPL_createBroadcastMessage(telldusService, xPL_MESSAGE_STATUS);
	xPL_setSchema(message, "lighting", "gateinfo");

	xPL_setMessageNamedValue(message, "status", "ok");
	xPL_setMessageNamedValue(message, "protocol", "TELLDUS");
	xPL_setMessageNamedValue(message, "description", "xPL to Telldus TellStick gateway");
	xPL_setMessageNamedValue(message, "version", TELLDUS_VERSION);
	xPL_setMessageNamedValue(message, "author", "Telldus Technologies AB");
	xPL_setMessageNamedValue(message, "info-url", "http://www.telldus.se");
	xPL_setMessageNamedValue(message, "net-count", "1");
	xPL_setMessageNamedValue(message, "preferred-net", "1");
	xPL_setMessageNamedValue(message, "scenes-ok", "false");
	xPL_setMessageNamedValue(message, "channels-ok", "false");
	xPL_setMessageNamedValue(message, "fade-rate-ok", "false");

	/* Broadcast the message */
	xPL_sendMessage(message);

	xPL_releaseMessage(message);
}
示例#20
0
int xpl4l_timer(node_t* argXmlConfig)
{
	static init = 1;
    static time_t oldClockTime, oldTickTime;
	time_t t;
    struct tm *ts;
    char       buf[80];

	Bool ret;
	
	if ( init )
	{
		t = 0;
		timer_loadConfig (argXmlConfig);
		init = 0;
		
		clockService = xPL_createService (XPLHAL4L_VENDOR, "clock", HAL4L_hostName);
		xPL_setServiceVersion (clockService, XPLHAL4L_VERSION);

		/* Add a responder for time setting */
		xPL_addServiceListener (clockService, clockServiceHandler, xPL_MESSAGE_ANY, "clock", NULL, NULL);
		
		/* Create a message to send */
		clockTickMessage = xPL_createBroadcastMessage (clockService, xPL_MESSAGE_STATUS);
		
		xPL_setSchema (clockTickMessage, "clock", "update");

		/* Internals messages */
		schedulerTickMessage = createInternalTickMessage();
		xPL_addMessageListener(internalMessageHandler, NULL);
		
		
	}
	
	t = time (NULL);
	ts = localtime(&t);

	if ( timerConfig.clock_enabled && t%timerConfig.clock_interval==0 && t!=oldClockTime)
	{

		strftime(buf, sizeof(buf), "%Y%m%d%H%M%S", ts);
		
		/* Install the value and send the message */
		xPL_setMessageNamedValue (clockTickMessage, "time", buf);
		
		/* Broadcast the message */
		xPL_sendMessage (clockTickMessage);

		oldClockTime = t;
	}

	if ( t%timerConfig.sched_interval==0 && t!=oldTickTime)
	{
		strftime(buf, sizeof(buf), "%a %Y-%m-%d %H:%M:%S %Z", ts);
		
		/* Crée le messageBody si NULL et y ajoute une seule ligne si elle n'existe pas, sinon la met à jour */
		xPL_setMessageNamedValue(schedulerTickMessage, "timestamp", buf);
		strftime(buf, sizeof(buf), "%H:%M", ts);
		xPL_setMessageNamedValue(schedulerTickMessage, "time", buf);
		strftime(buf, sizeof(buf), "%Y", ts);
		xPL_setMessageNamedValue(schedulerTickMessage, "year", buf);
		strftime(buf, sizeof(buf), "%m", ts);
		xPL_setMessageNamedValue(schedulerTickMessage, "month", buf);
		strftime(buf, sizeof(buf), "%Y%m%d", ts);
		xPL_setMessageNamedValue(schedulerTickMessage, "date", buf);
		strftime(buf, sizeof(buf), "%d", ts);
		xPL_setMessageNamedValue(schedulerTickMessage, "day", buf);

		sprintf(buf, "%d", t);
		xPL_setMessageNamedValue(schedulerTickMessage, "epoch", buf);


		
		ret = xPL_dispatchMessageEvent(schedulerTickMessage);

		printf ("Message dispatched = %s\n", ret == TRUE ? "TRUE":"FALSE");
    
		oldTickTime = t;

	}


}
示例#21
0
void pmaxdMessageHandler(xPL_ServicePtr theService, xPL_MessagePtr theMessage, xPL_ObjectPtr userValue) {
  DEBUG(LOG_DEBUG,"Received a pmaxd Message from %s-%s.%s of type %d for %s.%s\n", 
	xPL_getSourceVendor(theMessage), xPL_getSourceDeviceID(theMessage), xPL_getSourceInstanceID(theMessage),
	xPL_getMessageType(theMessage), xPL_getSchemaClass(theMessage), xPL_getSchemaType(theMessage));
	DEBUG(LOG_DEBUG,"xpl message received: %s",xPL_formatMessage(theMessage));    
  DEBUG(LOG_INFO,"command: %s ", xPL_getMessageNamedValue(theMessage, "command"));
        
  if (strcmp("basic",xPL_getSchemaType(theMessage))==0 && xPL_getMessageNamedValue(theMessage, "command")!=NULL )  { 
    if (strcmp("arm-away",xPL_getMessageNamedValue(theMessage, "command"))==0 ) {
      DEBUG(LOG_INFO,"arming away.........");
      sendBuffer(&PowerlinkCommand[Pmax_ARMAWAY]);
    } 
    if (strcmp("arm-home",xPL_getMessageNamedValue(theMessage, "command"))==0 ) {
      DEBUG(LOG_INFO,"arming home........");
      sendBuffer(&PowerlinkCommand[Pmax_ARMHOME]);
    } 
    if (strcmp("disarm",xPL_getMessageNamedValue(theMessage, "command"))==0  )  {
      DEBUG(LOG_INFO,"disarming.....");
      sendBuffer(&PowerlinkCommand[Pmax_DISARM]);
    }
  }
  DEBUG(LOG_INFO,"not a security basic");
  if (strcmp("request",xPL_getSchemaType(theMessage))==0 && xPL_getMessageNamedValue(theMessage, "request")!=NULL )  { 
    DEBUG(LOG_INFO,"a security request");
    if (strcmp("gatestat",xPL_getMessageNamedValue(theMessage, "request"))==0  )  {
      DEBUG(LOG_INFO,"requesting getstat.....");
    
    
      
      sendBuffer(&PowerlinkCommand[Pmax_REQSTATUS]);
      int i;
      for(i=0;i<50;i++) {      
      serialHandler();
      }
      
      if (lastValidSerialIO<(time(NULL)-10))
      { DEBUG(LOG_INFO,"lst serial command too old");}
      else  {
      DEBUG(LOG_INFO,"lst serial recent enough");
      
      /* Create a message to send */
      pmaxdMessage = xPL_createBroadcastMessage(pmaxdService, xPL_MESSAGE_STATUS); 
    
      xPL_setSchema(pmaxdMessage, "security", "gatestat");              // setschema to security.basic
  
      xPL_setMessageNamedValue(pmaxdMessage, "status", gatestat.status);
     /* if (pmaxSystem.xplalarmstatus==AlarmArmed)    
        xPL_setMessageNamedValue(pmaxdMessage, "status", "armed");
      else   
        xPL_setMessageNamedValue(pmaxdMessage, "status", "disarmed"); */
      
      xPL_setMessageNamedValue(pmaxdMessage, "pmaxstatus", gatestat.pmstatus);
      /*if (pmaxSystem.xplpmaxstatus==PmaxArmedAway)
        xPL_setMessageNamedValue(pmaxdMessage, "pmaxstatus", "armed-away");
      if (pmaxSystem.xplpmaxstatus==PmaxArmedHome)  
        xPL_setMessageNamedValue(pmaxdMessage, "pmaxstatus", "armed-home");
      if (pmaxSystem.xplpmaxstatus==PmaxDisarmed)  
        xPL_setMessageNamedValue(pmaxdMessage, "pmaxstatus", "disarmed"); */
      
      /*if (pmaxSystem.readytoarm)        
        xPL_setMessageNamedValue(pmaxdMessage, "readytoarm", "true");
      else
        xPL_setMessageNamedValue(pmaxdMessage, "readytoarm", "false");   
        */
/*           
      
      if (pmaxSystem.status==0 || pmaxSystem.status==1 || pmaxSystem.status==2) {
        xPL_setMessageNamedValue(pmaxdMessage, "status", "disarmed");
        xPL_setMessageNamedValue(pmaxdMessage, "pmaxstatus", "disarmed");
      }      
      if (pmaxSystem.status==4 ||  pmaxSystem.status==10 )  {
        xPL_setMessageNamedValue(pmaxdMessage, "status", "armed");
        xPL_setMessageNamedValue(pmaxdMessage, "pmaxstatus", "armed-home");
      }     
      if (pmaxSystem.status==3 || pmaxSystem.status==5 || pmaxSystem.status==11)  {
        xPL_setMessageNamedValue(pmaxdMessage, "status", "armed");
        xPL_setMessageNamedValue(pmaxdMessage, "pmaxstatus", "armed-away");
      }      
      if ( (pmaxSystem.flags & 0x01)==1 )  {
        xPL_setMessageNamedValue(pmaxdMessage, "readytoarm", "true");
      }
      else  {
        xPL_setMessageNamedValue(pmaxdMessage, "readytoarm", "false");
      } */
      
      /* Broadcast the message */
      DEBUG(LOG_DEBUG,"xpl message sent: %s",xPL_formatMessage(pmaxdMessage));
      xPL_sendMessage(pmaxdMessage);
      }      
    }
    if (strcmp("zonelist",xPL_getMessageNamedValue(theMessage, "request"))==0  )  {
      DEBUG(LOG_INFO,"requesting zonelist.....");
  
      pmaxdMessage = xPL_createBroadcastMessage(pmaxdService, xPL_MESSAGE_STATUS);
      xPL_setSchema(pmaxdMessage, "security", "zonelist");              // setschema to security.basic
      
      char zonelist[256];
      zonelist[0]=0;
      char id[10];
      int i;
      for (i=1;i<=30;i++) {
        if (gatestat.zone[i].enrolled)  {
        //sprintf(id,"%d,",i);
        strcat(zonelist,gatestat.zone[i].info.id);
        strcat(zonelist,","); 
        }
      }
      zonelist[strlen(zonelist)-1]=0;
      DEBUG(LOG_INFO,"zonelist: %s",zonelist);
      xPL_setMessageNamedValue(pmaxdMessage, "zone-list", zonelist);
      DEBUG(LOG_DEBUG,"xpl message sent: %s",xPL_formatMessage(pmaxdMessage)); 
      xPL_sendMessage(pmaxdMessage);   
    }
     
     if (strcmp("zoneinfo",xPL_getMessageNamedValue(theMessage, "request"))==0  )  {
      int zone;
      zone=0;
      char * zonebuffer;
      zonebuffer= xPL_getMessageNamedValue(theMessage, "zone");
  //    sscanf(zonebuffer,"%d",&zone);
     int i; 
      for (i=1;i<=30;i++)
  {
//      pmaxSystem.sensor[i].type=perimeter;
      if (strcmp(gatestat.zone[i].info.id,zonebuffer)==0) break;         
  }
     zone=i; 
      
      
     DEBUG(LOG_INFO,"requesting zoneinfo for zone %s,%d.....",zonebuffer,zone);
          
      pmaxdMessage = xPL_createBroadcastMessage(pmaxdService, xPL_MESSAGE_STATUS);
      xPL_setSchema(pmaxdMessage, "security", "zoneinfo");              // setschema to security.basic
      xPL_setMessageNamedValue(pmaxdMessage, "zone", zonebuffer);
      xPL_setMessageNamedValue(pmaxdMessage, "zone-type", gatestat.zone[zone].info.zonetype);
      
     // if (pmaxSystem.sensor[zone].type==interior  )  xPL_setMessageNamedValue(pmaxdMessage, "zone-type", "interior");
     // if (pmaxSystem.sensor[zone].type==perimeter  )  xPL_setMessageNamedValue(pmaxdMessage, "zone-type", "perimeter");      
      DEBUG(LOG_DEBUG,"xpl message sent: %s",xPL_formatMessage(pmaxdMessage));
      xPL_sendMessage(pmaxdMessage);   
    }
    if (strcmp("zonestat",xPL_getMessageNamedValue(theMessage, "request"))==0  )  {
      int zone;
      zone=0;
      char * zonebuffer;
      zonebuffer=xPL_getMessageNamedValue(theMessage, "zone");
      //sscanf(zonebuffer,"%d",&zone);
       int i; 
      for (i=1;i<=30;i++)
  {
      if (strcmp(gatestat.zone[i].info.id,zonebuffer)==0) break;         
  }
     zone=i; 
      DEBUG(LOG_INFO,"requesting zonestat for zone %s,%d.....",zonebuffer,zone);
          
      pmaxdMessage = xPL_createBroadcastMessage(pmaxdService, xPL_MESSAGE_STATUS);
      xPL_setSchema(pmaxdMessage, "security", "zonestat");              // setschema to security.basic
      xPL_setMessageNamedValue(pmaxdMessage, "zone", zonebuffer);
      
      xPL_setMessageNamedValue(pmaxdMessage, "alert", gatestat.zone[zone].stat.alert); 
      //if (pmaxSystem.sensor[zone].state==SensorClose  )  xPL_setMessageNamedValue(pmaxdMessage, "alert", "false");
      //if (pmaxSystem.sensor[zone].state==SensorOpen  )  xPL_setMessageNamedValue(pmaxdMessage, "alert", "true");

      xPL_setMessageNamedValue(pmaxdMessage, "armed", gatestat.zone[zone].stat.armed);   
      //if (pmaxSystem.sensor[zone].armed  )  xPL_setMessageNamedValue(pmaxdMessage, "armed", "true");
      //else  xPL_setMessageNamedValue(pmaxdMessage, "armed", "false"); 
      
   
     
      xPL_setMessageNamedValue(pmaxdMessage, "alarm", gatestat.zone[zone].stat.alarm);
      xPL_setMessageNamedValue(pmaxdMessage, "state", gatestat.zone[zone].stat.state);
      
      xPL_setMessageNamedValue(pmaxdMessage, "tamper", gatestat.zone[zone].stat.tamper);
      //if (pmaxSystem.sensor[zone].tampered  )  xPL_setMessageNamedValue(pmaxdMessage, "tamper", "true");
      //else  xPL_setMessageNamedValue(pmaxdMessage, "tamper", "false");
      
      xPL_setMessageNamedValue(pmaxdMessage, "low-battery", gatestat.zone[zone].stat.lowbattery); 
      //if (pmaxSystem.sensor[zone].lowbattery  )  xPL_setMessageNamedValue(pmaxdMessage, "low-battery", "true");
      //else  xPL_setMessageNamedValue(pmaxdMessage, "low-battery", "false");  
      DEBUG(LOG_DEBUG,"xpl message sent: %s",xPL_formatMessage(pmaxdMessage));
      xPL_sendMessage(pmaxdMessage);
      
         
    }
  }
  DEBUG(LOG_INFO,"end message handling");
}
示例#22
0
int main(void)
{
  pmaxSystem.status[0]=0;
  pmaxSystem.pmaxstatus[0]=0;
  pmaxSystem.readytoarm[0]=0;
  pmaxSystem.PmaxStatus[0]=0;
  
  int k;
  for (k=0;k<31;k++)
  {
    pmaxSystem.sensor[k].type[0]=0;
    pmaxSystem.sensor[k].alert[0]=0;
    pmaxSystem.sensor[k].PmaxAlarmType[0]=0;
    pmaxSystem.sensor[k].armed[0]=0;                  
    pmaxSystem.sensor[k].alarmed[0]=0;
    pmaxSystem.sensor[k].lowbattery[0]=0;  
    pmaxSystem.sensor[k].enrolled[0]=0;
    pmaxSystem.sensor[k].tampered[0]=0;
    pmaxSystem.sensor[k].id[0]=0;
  } 
  
//	char *data;
	long m,n;
	printf("%s%c%c\n" ,
	"Content-Type:text/html;charset=iso-8859-1",13,10);

	
  xPL_initialize(xPL_getParsedConnectionType());
  webgateway = xPL_createService("viknet", "webgateway", "default");  
  xPL_setServiceVersion(webgateway, "1.0");

  /* Add a responder for time setting */
  xPL_addServiceListener(webgateway, webgatewayMessageHandler, xPL_MESSAGE_ANY, "security", NULL, NULL);
  xPL_setServiceEnabled(webgateway, TRUE);
//  int j;
  
//  for (j=0;j<10;j++)
//  {
  /* Create a message to send */
  xplMessage = xPL_createBroadcastMessage(webgateway, xPL_MESSAGE_COMMAND);
  xPL_setSchema(xplMessage, "security", "request");
  xPL_setMessageNamedValue(xplMessage, "request", "zonelist");	
  xPL_sendMessage(xplMessage);
//  printf("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");
  int i;
  
  
  xplMessage = xPL_createBroadcastMessage(webgateway, xPL_MESSAGE_COMMAND);
  xPL_setSchema(xplMessage, "security", "request");
  xPL_setMessageNamedValue(xplMessage, "request", "gatestat");	
  xPL_sendMessage(xplMessage);
  
  
  for (i=1;i<1000;i++)
  {
    usleep(1000);
    if (nbzone!=0) break;
    xPL_processMessages(0);
  }
  
  
  strcpy(tpzonelist,zonelist);
  char * element;
//  printf("yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n");
//  printf("zone: %d, %s\n",nbzone,zonelist);
//  for (i=0;i<nbzone;i++)  {
//  char * pch;
  element = strtok (tpzonelist,",");
   while (element != NULL)
  {
//    printf ("%s\n",element);
   
   // xplListAt(element,zonelist,i);
  //  sprintf(element,"%d",i);
  //  printf("element: %s\n",element);
    xplMessage = xPL_createBroadcastMessage(webgateway, xPL_MESSAGE_COMMAND);
    xPL_setSchema(xplMessage, "security", "request");
    xPL_setMessageNamedValue(xplMessage, "request", "zoneinfo");	
    xPL_setMessageNamedValue(xplMessage, "zone", element);	
    xPL_sendMessage(xplMessage);
    
    
    xplMessage = xPL_createBroadcastMessage(webgateway, xPL_MESSAGE_COMMAND);
    xPL_setSchema(xplMessage, "security", "request");
    xPL_setMessageNamedValue(xplMessage, "request", "zonestat");	
    xPL_setMessageNamedValue(xplMessage, "zone", element);	
    xPL_sendMessage(xplMessage);
    
    
    usleep(40000);
    xPL_processMessages(0);
    element = strtok (NULL, ",");  
  }
//  printf("zonelist: %s\n",zonelist);
  for (i=0;i<10;i++)
  { 
  usleep(15000);
  xPL_processMessages(0);
  }      
  printf("{ \"status\":\"%s\",\"pmaxstatus\":\"%s\",\"readytoarm\":\"%s\",\"sensor\":[",pmaxSystem.status,pmaxSystem.pmaxstatus,pmaxSystem.readytoarm);
 
// strcpy(tpzonelist,zonelist);
//  element = strtok (tpzonelist,",");
  i=0;
//  while (element != NULL)
  char tmpbuff[200];
  char buff[6000];
  buff[0]=0;
  for (i=0;i<31;i++)
  {
//    printf ("%s\n",element);
    if ( strcmp(pmaxSystem.sensor[i].id,"")!=0 ) { 
    sprintf(tmpbuff,"{\"zone\":\"%s\",\"type\":\"%s\",\"alert\":\"%s\",\"armed\":\"%s\",\"tamper\":\"%s\",\"low-battery\":\"%s\",\"alarm\":\"%s\"},",
    pmaxSystem.sensor[i].id,
    pmaxSystem.sensor[i].type,
    pmaxSystem.sensor[i].alert,
    pmaxSystem.sensor[i].armed,
    pmaxSystem.sensor[i].tampered,
    pmaxSystem.sensor[i].lowbattery,
    pmaxSystem.sensor[i].alarmed);
    strcat(buff,tmpbuff);
    //element = strtok (NULL, ",");
    //if (element!=NULL)
    
    //i++;
    }
  }
  buff[strlen(buff)-1]=0;
  printf("%s",buff);
  printf("]}"); 
  nbzone=0;
  zonelist[0]=0;

//}  
  
	return 0;  
}