Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
NaotoSakai
Advisor
Advisor

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 , please memo of URL. maybe this URL is like following.
https://xxxxxxx-xxxx-xxxxx-xxxx-xxxxxx.xxxx.cp.iot.sap/yyyyyy-yyyyyy-yyyyyy-yyyyyy-yyyyyyyyyy/iot/co...
Please extract from here as follows.
https://xxxxxxx-xxxx-xxxxx-xxxx-xxxxxx.xxxx.cp.iot.sap/yyyyyy-yyyyyy-yyyyyy-yyyyyy-yyyyyyyyyy/iot/cockpit/#/tenant/zzzzzzzzzz


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.


Login to your sigfox portal.Then move to 'Group' .


Choose your group.Then, Click 'API Access' of left side .
If you don't use API ACEESS feature , click 'New' button.
Please fill in the API Access information box. Name is free.
You must assign 'DEVICE MANAGER[W]' profile.
Then , click 'OK' button.
OK, User id and password are generated . You should use these values for <cnf:apiUsername> and <cnf:apiPassword>.
Memo these values as <SIGFOXAPIUSER> and <SIGFOXAPIPASSWORD>



gatewayAlternateId


You need to swap <GATEWAYALTERNATEID> to your gateway alternate id. It will be use as following on your IoT Service Cockpit.
The number 1122334455667788 is used in the manual, but it is better to make it easy to understand.


 

 

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&amp;soTimeout=60000&amp;verifyHostName=true)?initialReconnectDelay=5000</cnf:connectionString>
<!-- <cnf:connectionString>failover:(nio://<HOSTNAME>:61619?daemon=true&amp;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&amp;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&amp;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.