Technical Articles
Setup note for Sigfox – SAP Cloud Platform Internet of Things Cloud Foundry Environment —
Introducing
This is a note when I set up SAP Cloud Platform Internet of Things Cloud Foundry Environment and Sigfox. This is the place where the customer misunderstood when setting up. I think this is useful information and I will publish it.
Java virtual machine
This is a problem you may encounter if you build the “Internet of Things Edge Platform” on Windows. Be sure to use the 64-bit version JVM. In the 32-bit version, even if the hardware has sufficient memory, you cannot start because of a heap memory problem.
config_gateway_rest.xml
Unfortunately, the “config_gateway_rest.xml” file output by “build rest-sigfox” command is difficult to understand.
I prepared a template to make the settings more understandable.
First , please login to your IoT Service cockpit , then move to your tenant.
Then, replace the <HOSTNAME>,<INSTANCENAME>,<TENANTNAME> part in the XML below with the following.
<HOSTNAME> to xxxxxxx-xxxx-xxxxx-xxxx-xxxxxx.xxxx.cp.iot.sap
<INSTANCENAME> to yyyyy-yyyyyy-yyyyyy-yyyyyy-yyyyyyyyy
<TENANTNAME> to zzzzzzzzzz
Sigfox user and password
The user ID and password specified in <cnf:apiUsername> and <cnf:apiPassword> are NOT the ones used when logging in to Sigfox portal (https://backend.sigfox.com).
You must generate this user ID and password on Sigfox portal.
gatewayAlternateId
Template of config_gateway_rest.xml
OK , you can prepare the value of <HOSTNAME>,<INSTANCENAME>,<TENANTNAME>,<SIGFOXAPIUSER>,<SIGFOXAPIPASSWORD>,<GATEWAYALTERNATEID>.
Let’s replace these with the XML below and use it as config_gateway_rest.xml .
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="cnfTransform.xsl"?>
<cnf:configuration xsi:schemaLocation="http://sap.com/iotservices/xsd/config"
xmlns:cnf="http://sap.com/iotservices/xsd/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<cnf:amq>
<cnf:connectors>
<cnf:client>
<cnf:connectionString>failover:(nio+ssl://<HOSTNAME>:61616?daemon=true&soTimeout=60000&verifyHostName=true)?initialReconnectDelay=5000</cnf:connectionString>
<!-- <cnf:connectionString>failover:(nio://<HOSTNAME>:61619?daemon=true&soTimeout=60000)?initialReconnectDelay=5000</cnf:connectionString> -->
<cnf:streamTTL>5000</cnf:streamTTL>
<cnf:TTL>200000</cnf:TTL>
<cnf:soap_over_jms_tmo>60000</cnf:soap_over_jms_tmo>
<cnf:concurrentProducers>5</cnf:concurrentProducers>
<cnf:concurrentConsumers>5</cnf:concurrentConsumers>
<cnf:ackMode>1</cnf:ackMode><!-- AUTO_ACKNOWLEDGE = 1 / SESSION_TRANSACTED
= 0 -->
<cnf:nonPersistent />
<cnf:maxConnections>8</cnf:maxConnections>
</cnf:client>
</cnf:connectors>
</cnf:amq>
<cnf:coreConnection>
<cnf:address>https://<HOSTNAME>/iot/core/api/v1/tenant/<TENANTNAME></cnf:address>
<cnf:timeout>60000</cnf:timeout>
<cnf:authentication>BASIC_AUTH</cnf:authentication>
<cnf:mutual>false</cnf:mutual>
</cnf:coreConnection>
<cnf:gatewayBundle gatewayver="REST">
<cnf:endpoints>
<cnf:cxf lan="true">
<cnf:address dev="gateway"><HOSTNAME></cnf:address>
<cnf:soapPort client_rx_tmo="60000" client_conn_tmo="60000">8170</cnf:soapPort>
</cnf:cxf>
</cnf:endpoints>
<cnf:amq>
<cnf:brokerName>mqtt-bus</cnf:brokerName>
<cnf:connectors>
<cnf:server>
<cnf:transportConnectors>
<cnf:transportConnector name="mqtt-bus-connector"
uri="mqtt+nio+ssl://<HOSTNAME>:61698?needClientAuth=true&transport.soTimeout=60000"/>
</cnf:transportConnectors>
<cnf:defaultTTL>30000</cnf:defaultTTL>
<cnf:expireMessagePeriod>200000</cnf:expireMessagePeriod> <!-- 200 seconds -->
<cnf:pendingMessageLimit>200000</cnf:pendingMessageLimit> <!-- After this, start checking TTL -->
<cnf:stream_expireMessagePeriod>5000</cnf:stream_expireMessagePeriod> <!-- 5 seconds -->
<cnf:stream_pendingMessageLimit>200000</cnf:stream_pendingMessageLimit> <!-- After this, start checking TTL -->
<cnf:offlineDurableSubscriberTimeout>3600000</cnf:offlineDurableSubscriberTimeout> <!-- 1 hour -->
<cnf:offlineDurableSubscriberTaskSchedule>120000
</cnf:offlineDurableSubscriberTaskSchedule> <!-- 2 minutes -->
<cnf:memoryUsage memory="64" store="50000" temp="10000"/> <!-- in mBytes -->
<cnf:destinationPolicies></cnf:destinationPolicies>
</cnf:server>
</cnf:connectors>
</cnf:amq>
<cnf:gateway gatewayAlternateId="<GATEWAYALTERNATEID>">
<cnf:technology>rest</cnf:technology>
<cnf:vendor>sigfox</cnf:vendor>
<cnf:gateway_comm>
<cnf:media>API</cnf:media>
<cnf:useAsServer>true</cnf:useAsServer>
<cnf:jmsConnectionString>failover:(vm://mqtt-bus?waitForStart=30000&create=false)</cnf:jmsConnectionString>
<cnf:socket_host>https://backend.sigfox.com/</cnf:socket_host>
<cnf:socket_port>80</cnf:socket_port>
<cnf:apiUsername><SIGFOXAPIUSER></cnf:apiUsername>
<cnf:apiPassword><SIGFOXAPIPASSWORD></cnf:apiPassword>
<cnf:disableGatewayContentSent>true</cnf:disableGatewayContentSent>
</cnf:gateway_comm>
<cnf:trigger_comm>
<cnf:media>Command</cnf:media>
</cnf:trigger_comm>
<cnf:startSinkAsCoord>true</cnf:startSinkAsCoord>
<cnf:persistTopology>true</cnf:persistTopology>
<cnf:waitBeforeNextWrite>0</cnf:waitBeforeNextWrite>
<cnf:simulData>false</cnf:simulData>
<cnf:defaultRFDWakeUp>7500</cnf:defaultRFDWakeUp>
<cnf:defaultFFDLoadShedding>7500</cnf:defaultFFDLoadShedding>
<cnf:minRouterBufSize>100</cnf:minRouterBufSize>
<cnf:waitBeforeParentRemove>1800</cnf:waitBeforeParentRemove><!-- 30mins:
30*60sec -->
<cnf:periodicalDataReports>
<cnf:periodicalAlternateId>11:22:33:44:55:66:77:88</cnf:periodicalAlternateId>
</cnf:periodicalDataReports>
<cnf:nodePositions>
<cnf:nodePosition>
<!--coord -->
<cnf:posAlternateId>00:0c:29:bb:fe:53:00:00</cnf:posAlternateId>
<cnf:posX>230</cnf:posX>
<cnf:posY>120</cnf:posY>
<cnf:posZ>0</cnf:posZ>
</cnf:nodePosition>
</cnf:nodePositions>
<cnf:defaultValues>
<cnf:defaultSensorTypeAlternateId>1</cnf:defaultSensorTypeAlternateId>
<cnf:positioningSensorAlternateId>0</cnf:positioningSensorAlternateId>
</cnf:defaultValues>
</cnf:gateway>
<cnf:wsnLifecycle>
<cnf:generatePingReq>false</cnf:generatePingReq>
<!--<cnf:strokingTime></cnf:strokingTime> -->
<cnf:rfdVitalityOn>true</cnf:rfdVitalityOn>
<cnf:defaultRfdTolerance>0.50</cnf:defaultRfdTolerance>
<cnf:missingAfterMiss>5</cnf:missingAfterMiss>
<cnf:useRfdStdDeviation>false</cnf:useRfdStdDeviation>
<cnf:samplingTimeout>2000</cnf:samplingTimeout>
<cnf:burstDelta>5000</cnf:burstDelta>
<cnf:reportingTime>120000</cnf:reportingTime>
<cnf:policyType>DATA_TRAINING</cnf:policyType>
</cnf:wsnLifecycle>
<cnf:buffering active="true">
<cnf:queueMaxElement>100000</cnf:queueMaxElement> <!-- max number of element in PriorityBlockingQueue -->
<cnf:bufferTrigger>80</cnf:bufferTrigger> <!-- percentage of the maximum heap size that triggers Gateway buffering -->
<cnf:maxFileDimension>100</cnf:maxFileDimension> <!-- max file dimension * 1000 (2 -> 2KB) -->
<cnf:maxDisk>4096000000</cnf:maxDisk> <!-- space dedicated to buffering file -->
<cnf:saturation>70</cnf:saturation> <!-- percetage of hd use -->
<cnf:checkMemory>false</cnf:checkMemory> <!-- true if you want to flush the buffer once memory is critical -->
</cnf:buffering>
<cnf:propertyMap>key10=Value10
nodeAcceptedByDef=true
</cnf:propertyMap>
</cnf:gatewayBundle>
<cnf:keepAlive>
<cnf:stopSystemOnFault>false</cnf:stopSystemOnFault>
</cnf:keepAlive>
<cnf:security>
<cnf:active>true</cnf:active>
<cnf:useLANendpoints>false</cnf:useLANendpoints>
</cnf:security>
</cnf:configuration>
I have confirmed the run with OTCHCP56_0-70002561 (on Windows) .
Safe life.