Hi,
I'm trying to query(read from) a TCP Socket or to query a server via an HTTPRequest with no success.
My cr300 code cof TCP socket reading:
TCPOpen (TCPServerIP,TCPServerPort,0,5000,SigfoxCheckHandle,1) CheckMessage = "###STATUS:" + Status.StationName SerialOut(SigfoxCheckHandle,CheckMessage,"",0,0) NBytesAvailable = SerialInChk(SigfoxCheckHandle) SerialInRecord (SigfoxCheckHandle,CheckResponse,43,0,33,NBytesReturned,01)
My server Node.JS code:
if (stringPayload.startsWith('###')) { var campbellMessage = parseCampbellScientificSegment(stringPayload); JSON.stringify(campbellMessage); console.log("sending ack to check message"); socket.write('+SACK:0001!'); }); }
My server Node.JS logs
11/13/2018 11:25:02 AM10.42.196.98 said (string): ###STATUS:79BC31,11548,011.000,CR300-CELL200.Std.07.05,CPU:postIoT_CS475A_modbus.CR300,12.25803,28.6075411/13/2018 11:25:02 AMSuccessfully retrieved device DataLogger Campbell Scientific 79BC3111/13/2018 11:25:02 AMsending ack to check message
But I receive nothing (NAN) in the CheckResponse variable.
NBytesReturned is 0 and NBytesAvailble is -1
If I try to communicate via HttpGet I have nosuccess either:
HGetHeader = "Content-Type:application/json" + CHR(13)+CHR(10)+ "Authorization:Basic my_password_base64_encoded" + CHR(13)+CHR(10) GetHttpUrl = "https://<my domain>/campbellscientific-sigfox/checkSigfoxDevice?deviceId=" + Status.StationName HGetHandle = HTTPGet(GetHttpUrl,HGetResponse,HGetHeader,500)
The same GET requests succeeds in Postman (200OK) but on my CR300 I receive an error
failed to connect on port 443: Routing problem
The url is exacly the same...
Could you please help?
Kind regards, Alessandro
In fact, calling any https address (like for instance https://api.ipify.org/) fails. Why?
If you want the CR300 to "call out" to an HTTPS (TLS-based, secure socket) URL location, then the "Max TLS Server Connections" setting needs to be non-zero. Connect to the datalogger in DevConfig, choose the TLS tab from the Deployment tab and set the "Max TLS Server Connections" setting to something like 5 (and then apply, etc.). You might be able to get it to work with a value like 3, but I would start with 5.
If external clients are going to "call in" to the CR300 using an HTTPS URL, you need to "set/check" the "HTTPS Enabled" checkbox in the Network Services tab on the Deployment tab in DevConfig. And of course, if external clients are calling in to the CR300 using HTTP, then the "HTTP Enabled" checkbox needs to be checked/set as well.
Try all of this first. If that doesn't work we can dig deeper into your socket/serial instructions.
As you suggested, I changed the "Max TLS Server Connections" setting to 5.
Still getting the same Http comms Error on https:
HGetHandle = HTTPGet("https://api.ipify.org",HGetResponse,"")
09:30:00.00 HTTP api.ipify.org Port: 443
09:30:00.20 HTTP connected : api.ipify.org
09:30:00.20 GET / HTTP/1.1
User-Agent: CR300-CELL200.Std.07.05
Host: api.ipify.org
09:30:00.20 HTTP read_line_cmp error: -1
09:30:00.20 HTTP done
09:30:00.20 delete_socketclose
09:30:00.21 HTTP client closed.
09:30:00.37 Recv2
09:30:00.37 Closing handle 115. Connection reset.
09:30:01.23 Recv1 len 12
09:30:03.03 Recv1 len 8
09:30:05.65 Recv1 len 36
09:30:09.21 Recv1 len 12
09:31:03.65 Recv1 len 12
Using this example program:
Public battery_voltage Public http_header As String * 300 Public http_response As String * 1000 Public http_socket As Long Public panel_temperature 'Define Data Tables. DataTable (Test, 1, -1) Sample (1, battery_voltage, FP2) Sample (1, panel_temperature, FP2) EndTable 'Main Program BeginProg Scan (1, Sec, 0, 0) PanelTemp (panel_temperature, _60Hz) Battery (battery_voltage) CallTable Test NextScan SlowSequence Scan(2, Min, 0, 0) http_header = "" http_socket = HTTPGet("https://api.ipify.org/?format=json", http_response, http_header) NextScan EndSequence EndProg
I am able to get a response without issue from api.ipify.org. I am using OS 07.05. I am using the default setting of 0 for Max TLS Server Connections as this setting is only used when the datalogger is acting as the HTTPS server. In my example program, the datalogger is acting as a HTTPS client so the Max TLS Server Connections setting is ignored.
Can you post your entire program and tell us if you are using a CR310 or a CR300 connected to a modem? If you are using a cellular modem, is the modem in PPP mode or serial server mode or is the modem a Campbell Scientific internal modem (ie. CR300-CELL210)?
Hi,
my station's OS version is CR300-CELL200.Std.07.05.
I executed your program and got the same error Http comms Error, so same behavior as I have with my program.
Here is my entire program, I'm replacing my https server call with the ipify url and masking the TCPServerIP address for confidentiality:
'CR300 Series 'Created by Short Cut (4.0) 'Declare Variables and Units Const DistanceArraySize = 2 Const RainMmArraySize = 3 Const SlowScanSigfoCheckInterval = 6 Const SlowScanCS650Interval = 12 Const SlowScanCS475Interval = 6 Const SlowScanKalyxRGInterval = 4 Const SlowScanMain = SlowScanKalyxRGInterval Const SlowScanSigfoxInterval = 12 Const TCPServerIP = "*****************" Const TCPServerPort = 9095 Public CellularActive Public SigfoxMode Public HGetHeader As String * 200 Public HGetResponse As String * 200 Public GetHttpUrl As String * 200 Public HGetHandle Public BattV Public PTemp_C Public CS475(4) Public Rain_mm Public CS650(6) Public CS650_2(6) Public ModbusData(7) As Long Public Result = -1 Public Handle_Kalyx As Long Public Handle_CS650 As Long Public Handle_CS475 As Long Public snd_msg_Kalyx As String * 255 Public snd_msg_2_Kalyx As String * 255 Public snd_msg_CS650 As String * 255 Public snd_msg_2_CS650 As String * 255 Public snd_msg_3_CS650 As String * 255 Public snd_msg_CS475 As String * 255 Public snd_msg_2_CS475 As String * 255 Public DistanceArray(DistanceArraySize) Public CS475Counter = 1 Public RainMmArray(RainMmArraySize) Public KalyxCounter = 1 Public SigfoxModeSwitchCounter = 1 Alias CS475(1)=Stage Alias CS475(2)=Distance Alias CS475(3)=BattV_CS475A Alias CS475(4)=Error_Code Alias CS650(1)=VWC Alias CS650(2)=EC Alias CS650(3)=T Alias CS650(4)=P Alias CS650(5)=PA Alias CS650(6)=VR Alias CS650_2(1)=VWC_2 Alias CS650_2(2)=EC_2 Alias CS650_2(3)=T_2 Alias CS650_2(4)=P_2 Alias CS650_2(5)=PA_2 Alias CS650_2(6)=VR_2 Units BattV=Volts Units PTemp_C=Deg C Units Rain_mm=mm Units Stage=meter Units Distance=meter Units BattV_CS475A=Volts Units Error_Code=Code Units VWC=m^3/m^3 Units EC=dS/m Units T=Deg C Units P=unitless Units PA=nSec Units VR=unitless 'Define Data Tables DataTable(CS475A,True,-1) DataInterval(0,SlowScanCS475Interval,Min,0) Sample(1,Stage,FP2) Sample(1,Distance,FP2) Sample(1,BattV_CS475A,FP2) Sample(1,Error_Code,FP2) EndTable DataTable(Kalyx,True,-1) DataInterval(0,SlowScanKalyxRGInterval,Min,10) Totalize(1,Rain_mm,FP2,False) EndTable DataTable(CS650,True,-1) DataInterval(0,SlowScanCS650Interval,Min,0) Sample(1,VWC,FP2) Sample(1,EC,FP2) Sample(1,T,FP2) Sample(1,P,FP2) Sample(1,PA,FP2) Sample(1,VR,FP2) EndTable DataTable(CS650_2,True,-1) DataInterval(0,SlowScanCS650Interval,Min,0) Sample(1,VWC_2,FP2) Sample(1,EC_2,FP2) Sample(1,T_2,FP2) Sample(1,P_2,FP2) Sample(1,PA_2,FP2) Sample(1,VR_2,FP2) EndTable DataTable(System,True,-1) DataInterval(0,1,Hr,0) Maximum(1,BattV,FP2,False,True) Maximum(1,PTemp_C,FP2,False,True) Minimum(1,BattV,FP2,False,True) Minimum(1,PTemp_C,FP2,False,True) Sample(1,Status.OSVersion,IEEE4) Sample(1,Status.SerialNumber,IEEE4) Sample(1,Status.StartTime,IEEE4) Sample(1,Status.StationName,IEEE4) Sample(1,Status.RunSignature,IEEE4) Sample(1,Status.ProgSignature,IEEE4) Sample(1,Status.LithiumBattery,IEEE4) Sample(1,Status.SkippedScan,IEEE4) EndTable 'Main Program BeginProg 'Switch on Sigfox modem and wait 5 seconds to start main program SW12(1) Delay(0,5,Sec) 'Main Scan (Battery, Panel Temp check and Bucket Rain Gauge reading) Scan (SlowScanMain,min,1,0) 'Default CR300 Datalogger Battery Voltage measurement 'BattV' Battery(BattV) 'Default CR300 Datalogger Processor Temperature measurement 'PTemp_C' PanelTemp(PTemp_C,50) 'Kalyx Bucket Rain Gauge measurement 'Rain_mm' PulseCount(Rain_mm,1,P_SW,2,0,0.2,0) RainMmArray(KalyxCounter) = Rain_mm If KalyxCounter = RainMmArraySize Then KalyxCounter = 1 Else KalyxCounter = KalyxCounter +1 EndIf 'Call Data Tables and Store Data CallTable System CallTable Kalyx If CellularActive Then TCPOpen (TCPServerIP,TCPServerPort,0,5000,Handle_Kalyx,1) snd_msg_Kalyx = "***STATUS:" + Status.StationName + "," + Status.SerialNumber + "," + Status.RevBoard + "," + Status.OsVersion + "," + Status.ProgName + "," + Status.Battery + "," + Status.PanelTemp snd_msg_2_Kalyx = ",KALYXRG:" + Rain_mm + "," + Kalyx.TimeStamp SerialOut(Handle_Kalyx,snd_msg_Kalyx + snd_msg_2_Kalyx,"",0,0) TCPClose(Handle_Kalyx) EndIf NextScan 'SlowSequence (1) Radar Water Level reading SlowSequence Scan(SlowScanCS475Interval,Min,1,0) 'CS475A Radar Water Level Sensor (stage) measurements 'Stage', 'Distance', 'BattV_CS475A' and, 'Error_Code' SDI12Recorder(CS475(),C1,"0","M!",1,0,-1) DistanceArray(CS475Counter) = Distance If CS475Counter = DistanceArraySize Then CS475Counter = 1 Else CS475Counter = CS475Counter +1 EndIf 'Call Data Tables and Store Data CallTable CS475A If BattV_CS475A > 0 Then If CellularActive Then TCPOpen (TCPServerIP,TCPServerPort,0,5000,Handle_CS475,1) snd_msg_CS475 = "***STATUS:" + Status.StationName + "," + Status.SerialNumber + "," + Status.RevBoard + "," + Status.OsVersion + "," + Status.ProgName + "," + Status.Battery + "," + Status.PanelTemp snd_msg_2_CS475 = ",CS475A:" + BattV_CS475A + "," + Distance + "," + Stage + "," + Error_Code + "," + CS475A.TimeStamp SerialOut(Handle_CS475,snd_msg_CS475 + snd_msg_2_CS475,"",0,0) TCPClose(Handle_CS475) EndIf EndIf NextScan 'SlowSequence (2) Sigfox transmission SlowSequence Scan (SlowScanSigfoxInterval,min,1,0) If NOT CellularActive Then If BattV_CS475A > 0 Then SigfoxMode = &B00 ModbusData(1)= Round(DistanceArray(1),2) * 100 ModbusData(2)= Round(DistanceArray(2),2) * 100 ModbusData(3)= Error_Code ModbusData(4)= Round(BattV_CS475A,2) * 100 ModbusData(5)= Round(PTemp_C,2) * 100 ModbusData(6)= Round(BattV,2) * 100 * 4 + SigfoxMode Else ModbusData(1)= Round(RainMmArray(1),2) * 100 ModbusData(2)= Round(RainMmArray(2),2) * 100 ModbusData(3)= Round(RainMmArray(3),2) * 100 ModbusData(4)= Round(EC,3) * 1000 ModbusData(5)= Round(EC_2,3) * 1000 If SigfoxModeSwitchCounter = 2 Then SigfoxMode = &B10 ModbusData(6)= Round(BattV,2) * 100 * 4 + SigfoxMode SigfoxModeSwitchCounter = 1 Else SigfoxMode = &B01 ModbusData(6)= Round(PTemp_C,2) * 100 * 4 + SigfoxMode SigfoxModeSwitchCounter = SigfoxModeSwitchCounter +1 EndIf EndIf ModbusData(7)= 1 'Send to Sigfox ModbusMaster (Result,COMRS232,19200,1,16,ModbusData(),60001,7,3,120,3) EndIf NextScan 'SlowSequence (3) Sigfox check today transmissions SlowSequence Scan (SlowScanSigfoCheckInterval,min,1,0) HGetHeader = "Authorization:Basic ***********************" + CHR(13)+CHR(10) GetHttpUrl = "*********************?deviceId=" + Status.StationName HGetHandle = HTTPGet("https://api.ipify.org",HGetResponse,"") If HGetResponse = "KO" Then CellularActive = True SW12(0) 'Switch Modem sigfox off ElseIf HGetResponse = "OK" Then CellularActive = False SW12(1) 'Switch Modem sigfox on EndIf NextScan 'SlowSequence (4) Water Content Reflectometer reading SlowSequence Scan (SlowScanCS650Interval,min,1,0) 'CS650/655 Water Content Reflectometer measurements 'VWC', 'EC', 'T','P', 'PA', and 'VR' SDI12Recorder(CS650(),C2,"0","M4!",1,0,-1) SDI12Recorder(CS650_2(),C2,"1","M4!",1,0,-1) 'second sensor CallTable CS650 CallTable CS650_2 If CellularActive Then TCPOpen (TCPServerIP,TCPServerPort,0,5000,Handle_CS650,1) snd_msg_CS650 = "***STATUS:" + Status.StationName + "," + Status.SerialNumber + "," + Status.RevBoard + "," + Status.OsVersion + "," + Status.ProgName + "," + Status.Battery + "," + Status.PanelTemp snd_msg_2_CS650 = ",CS650:" + VWC + "," + EC + "," + T + "," + P + "," + PA + "," + VR + "," + CS650.TimeStamp snd_msg_3_CS650 = ",CS650_2:" + VWC_2 + "," + EC_2 + "," + T_2 + "," + P_2 + "," + PA_2 + "," + VR_2 + "," + CS650_2.TimeStamp SerialOut(Handle_CS650,snd_msg_CS650 + snd_msg_2_CS650 + snd_msg_3_CS650,"",0,0) TCPClose(Handle_CS650) EndIf NextScan EndProg